first release for keyboard
Fork of F401RE-USBHost by
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Tue Jul 12 2022 21:43:28 by 1.7.2