watch using the RSSI of Bluetooth

Dependencies:   BaseUsbHost ConfigFile EthernetInterface HTTPClient-long mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers UsbBt2.h Source File

UsbBt2.h

00001 // UsbBt2.cpp 2013/1/19
00002 #ifndef USB_BT2_H
00003 #define USB_BT2_H
00004 #include <stdarg.h>
00005 
00006 #define HCI_OP_INQUIRY               0x0401
00007 #define HCI_OP_INQUIRY_CANCEL        0x0402
00008 #define HCI_OP_PERIODIC_INQUIRY      0x0403
00009 #define HCI_OP_EXIT_PERIODIC_INQUIRY 0x0404
00010 #define HCI_OP_REMOTE_NAME_REQ       0x0419
00011 #define HCI_OP_RESET                 0x0c03
00012 #define HCI_OP_WRITE_LOCAL_NAME      0x0c13
00013 #define HCI_OP_WRITE_SCAN_ENABLE     0x0c1a
00014 #define HCI_OP_WRITE_CLASS_OF_DEV    0x0c24
00015 #define HCI_OP_WRITE_INQUIRY_MODE    0x0c45
00016 #define HCI_OP_READ_EXTENDED_INQUIRY_RESPONSE  0x0c51
00017 #define HCI_OP_WRITE_EXTENDED_INQUIRY_RESPONSE 0x0c52
00018 #define HCI_OP_READ_BD_ADDR          0x1009
00019 
00020 #define HCI_EV_INQUIRY_COMPLETE         0x01
00021 #define HCI_EV_INQUIRY_RESULT           0x02
00022 #define HCI_EV_REMOTE_NAME              0x07
00023 #define HCI_EV_CMD_COMPLETE             0x0e
00024 #define HCI_EV_CMD_STATUS               0x0f
00025 #define HCI_EV_INQUIRY_RESULT_WITH_RSSI 0x22
00026 #define HCI_EV_EXTENDED_INQUIRY_RESULT  0x2f
00027 
00028 
00029 #define VERBOSE(...) do{printf(__VA_ARGS__);} while(0);
00030 
00031 #pragma push
00032 #pragma pack(1)
00033 struct BD_ADDR {
00034     uint8_t addr[6];
00035     void set(char* s) {
00036         char* p = s;
00037         for(int i = 5; i >= 0; i--) {
00038             addr[i] =  strtol(p, &p, 16);
00039             if (*p == ':') {
00040                 p++;
00041             }
00042         }
00043     }
00044     void str(char* buf, size_t size) {
00045         snprintf(buf, size, "%02X:%02X:%02X:%02X:%02X:%02X", addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]);
00046     }
00047 };
00048 
00049 typedef struct {
00050     BD_ADDR bdaddr;
00051     uint8_t page_scan_repetition_mode;
00052     uint8_t reserved[2];
00053     uint8_t dev_class[3];
00054     uint16_t clock_offset;
00055 } inquiry_info;
00056 
00057 typedef struct {
00058     BD_ADDR bdaddr;
00059     uint8_t page_scan_repetition_mode;
00060     uint8_t reserved[1];
00061     uint8_t class_of_device[3];
00062     uint16_t clock_offset;
00063     int8_t rssi;
00064 } inquiry_with_rssi_info;
00065 
00066 typedef struct {
00067     BD_ADDR bdaddr;
00068     uint8_t page_scan_repetition_mode;
00069     uint8_t reserved[1];
00070     uint8_t class_of_device[3];
00071     uint16_t clock_offset;
00072     int8_t rssi;
00073     uint8_t extended_inquiry_response[240];
00074 } extended_inquiry_info;
00075 
00076 typedef struct {
00077     uint8_t evt;
00078     uint8_t len;
00079     uint8_t status;
00080     union {
00081         uint16_t op;
00082         uint8_t data[];
00083     } c;
00084 } hci_event;
00085 #pragma pop
00086 
00087 class bthci {
00088 public:
00089     bthci(ControlEp* ctlEp = NULL);
00090     static bool check(ControlEp* ctlEp);
00091     int cmdSend(uint16_t op);
00092     int cmdSend(uint16_t op, const char* fmt, ...);
00093     int cmdSend(uint16_t op, const uint8_t* data, int size);
00094     int eventReceive(uint8_t* buf, int size, int millisec=osWaitForever);
00095     int AclSend(uint8_t* buf, int size, int millisec=osWaitForever);
00096     int AclReceive(uint8_t* buf, int size, int millisec=osWaitForever);
00097 private:
00098     int ParseConfiguration(ControlEp* ctlEp);
00099     ControlEp* m_ctlEp;
00100     InterruptEp* m_pEpIntIn;
00101     BulkEp* m_pEpBulkIn;
00102     BulkEp* m_pEpBulkOut;
00103     uint8_t m_buf[255];
00104 };
00105 
00106 #endif //USB_BT2_H