Simple USBHost library for Nucleo F446RE/F411RE/F401RE FRDM-KL46Z/KL25Z/F64F LPC4088/LPC1768

Dependencies:   FATFileSystem

Dependents:   F401RE-BTstack_example F401RE-USBHostMSD_HelloWorld

Fork of KL46Z-USBHost by Norimasa Okamoto

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers USBHostRSSI.h Source File

USBHostRSSI.h

00001 // Simple USBHost Bluetooth RSSI for FRDM-KL46Z
00002 #pragma once
00003 #include "USBHost.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 #pragma pack(push,1)
00029 struct BD_ADDR {
00030     uint8_t addr[6];
00031     void set(char* s) {
00032         char* p = s;
00033         for(int i = 5; i >= 0; i--) {
00034             addr[i] =  strtol(p, &p, 16);
00035             if (*p == ':') {
00036                 p++;
00037             }
00038         }
00039     }
00040     void str(char* buf, size_t size) {
00041         snprintf(buf, size, "%02X:%02X:%02X:%02X:%02X:%02X", addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]);
00042     }
00043     void str_mask(char* buf, size_t size) {
00044         snprintf(buf, size, "%02X:%02X:%02X:xx:xx:xx", addr[5], addr[4], addr[3]);
00045     }
00046     bool eq(BD_ADDR* a) {
00047         return memcmp(addr, a->addr, 6) == 0;
00048     }
00049     bool eq_vendor(BD_ADDR* a) {
00050         return memcmp(addr+3, a->addr+3, 3) == 0;
00051     }
00052 };
00053 
00054 struct inquiry_info {
00055     BD_ADDR bdaddr;
00056     uint8_t page_scan_repetition_mode;
00057     uint8_t reserved[2];
00058     uint8_t dev_class[3];
00059     uint16_t clock_offset;
00060 };
00061 
00062 struct inquiry_with_rssi_info {       // offset
00063     BD_ADDR bdaddr;                   // +0
00064     uint8_t page_scan_repetition_mode;// +6
00065     uint8_t reserved[1];              // +7
00066     uint8_t class_of_device[3];       // +8
00067     uint16_t clock_offset;            // +11
00068     int8_t rssi;                      // +13
00069 };                                    // +14
00070 
00071 struct extended_inquiry_info {
00072     BD_ADDR bdaddr;
00073     uint8_t page_scan_repetition_mode;
00074     uint8_t reserved[1];
00075     uint8_t class_of_device[3];
00076     uint16_t clock_offset;
00077     int8_t rssi;
00078     uint8_t extended_inquiry_response[240];
00079 };
00080 
00081 struct hci_event {
00082     uint8_t evt;
00083     uint8_t len;
00084     uint8_t status;
00085     union {
00086         uint16_t op;
00087         uint8_t data[];
00088     } c;
00089 };
00090 #pragma pack(pop)
00091 
00092 class USBHostRSSI : public IUSBEnumerator {
00093 public:
00094 
00095     /**
00096     * Constructor
00097     */    
00098     USBHostRSSI();
00099 
00100     /**
00101      * Try to connect a BT device
00102      *
00103      * @return true if connection was successful
00104      */
00105     bool connect();
00106 
00107     /**
00108     * Check if a mouse is connected
00109     *
00110     * @returns true if a BT is connected
00111     */
00112     bool connected();
00113 
00114     void attachEvent(void (*ptr)(inquiry_with_rssi_info* info)) {
00115         if (ptr != NULL) {
00116             onUpdate = ptr;
00117         }
00118     }
00119     //Report* report;
00120 
00121 protected:
00122     //From IUSBEnumerator
00123     virtual void setVidPid(uint16_t vid, uint16_t pid);
00124     virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol); //Must return true if the interface should be parsed
00125     virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
00126 
00127 private:
00128     USBHost * host;
00129     USBDeviceConnected * dev;
00130     USBEndpoint * int_in;
00131     bool dev_connected;
00132     bool bluetooth_device_found;
00133     int bluetooth_intf;
00134 
00135     void rxHandler();
00136     void (*onUpdate)(inquiry_with_rssi_info* info);
00137     uint8_t int_buf[64];
00138     int seq;
00139     void event(uint8_t* data, int size);
00140     USB_TYPE cmdSend(uint16_t op);
00141     USB_TYPE cmdSend(uint16_t op, const char* fmt, ...);
00142     USB_TYPE cmdSendSub(uint16_t op, const uint8_t* data, int size);
00143     void init();
00144 };
00145