BTstack for Nucleo F401RE/FRDM-KL46Z example program
Dependencies: F401RE-USBHost mbed
main.cpp
00001 #include "mbed.h" 00002 #include <btstack/run_loop.h> 00003 #include <btstack/hci_cmds.h> 00004 #include "hci.h" 00005 #include "l2cap.h" 00006 #include "debug.h" 00007 #include "bd_addr.h" // class bd_addr 00008 Serial pc(USBTX, USBRX); 00009 00010 #if defined(TARGET_NUCLEO_F401RE) 00011 DigitalOut led1(LED1); 00012 int led2 = 0; 00013 #define LED_ON 0 00014 #define LED_OFF 1 00015 #elif defined(TARGET_KL46Z)||defined(TARGET_KL25Z) 00016 DigitalOut led1(LED1), led2(LED2); 00017 #define LED_ON 0 00018 #define LED_OFF 1 00019 #else 00020 #error "target error" 00021 #endif 00022 00023 #define INQUIRY_INTERVAL 15 00024 00025 bd_addr addr; 00026 00027 static void hid_process_packet(uint8_t* report, int size) 00028 { 00029 if (report[0] == 0xa1 && report[1] == 0x02) { 00030 led1 = (report[2] & 0x01) ? LED_ON : LED_OFF; // left 00031 led2 = (report[2] & 0x02) ? LED_ON : LED_OFF; // right 00032 //led2 = (report[2] & 0x04) ? LED_ON : LED_OFF; // center 00033 } 00034 hexdump(report, size); 00035 } 00036 00037 static void l2cap_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 00038 00039 if (packet_type == HCI_EVENT_PACKET && packet[0] == L2CAP_EVENT_CHANNEL_OPENED){ 00040 if (packet[2]) { 00041 log_info("Connection failed\n"); 00042 return; 00043 } 00044 log_info("Connected\n"); 00045 } 00046 if (packet_type == L2CAP_DATA_PACKET){ 00047 // handle input 00048 log_info("HID report, size %u\n", size); 00049 hid_process_packet(packet, size); 00050 } 00051 } 00052 00053 static void packet_handler(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 00054 if (packet_type == HCI_EVENT_PACKET) { 00055 switch (packet[0]) { 00056 case BTSTACK_EVENT_STATE: 00057 // bt stack activated, get started - set local name 00058 if (packet[2] == HCI_STATE_WORKING) { 00059 hci_send_cmd(&hci_write_authentication_enable, 1); 00060 } 00061 break; 00062 00063 case HCI_EVENT_INQUIRY_RESULT: 00064 // ignore none mouses 00065 if ((packet[12] & 0x80) != 0x80 || packet[13] != 0x25) break; 00066 addr.data(&packet[3]); 00067 log_info("Mouse addr: %s\n", addr.to_str()); 00068 hci_send_cmd(&hci_inquiry_cancel); 00069 break; 00070 00071 case HCI_EVENT_INQUIRY_COMPLETE: 00072 log_info("No mouse found :(\n"); 00073 break; 00074 00075 case HCI_EVENT_LINK_KEY_REQUEST: 00076 // deny link key request 00077 hci_send_cmd(&hci_link_key_request_negative_reply, addr.data()); 00078 break; 00079 00080 case HCI_EVENT_PIN_CODE_REQUEST: 00081 // inform about pin code request 00082 log_info("Enter 0000\n"); 00083 hci_send_cmd(&hci_pin_code_request_reply, addr.data(), 4, "0000"); 00084 break; 00085 00086 case HCI_EVENT_COMMAND_COMPLETE: 00087 if (COMMAND_COMPLETE_EVENT(packet, hci_write_authentication_enable)){ 00088 log_info("Inquiry\n"); 00089 hci_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0); 00090 } 00091 if (COMMAND_COMPLETE_EVENT(packet, hci_inquiry_cancel) ) { 00092 // inq successfully cancelled 00093 log_info("Connecting\n"); 00094 l2cap_create_channel_internal(NULL, l2cap_packet_handler, addr.data(), PSM_HID_INTERRUPT, 150); 00095 } 00096 break; 00097 } 00098 } 00099 } 00100 00101 int main(void){ 00102 //pc.baud(921600); 00103 log_info("%s\n", __FILE__); 00104 00105 // init LEDs 00106 led1 = LED_OFF; 00107 led2 = LED_OFF; 00108 00109 // GET STARTED 00110 run_loop_init(RUN_LOOP_EMBEDDED); 00111 00112 // init HCI 00113 hci_transport_t* transport = hci_transport_usb_instance(); 00114 remote_device_db_t* remote_db = (remote_device_db_t *)&remote_device_db_memory; 00115 hci_init(transport, NULL, NULL, remote_db); 00116 00117 // init L2CAP 00118 l2cap_init(); 00119 l2cap_register_packet_handler(packet_handler); 00120 00121 // turn on!, send RESET command 00122 hci_power_control(HCI_POWER_ON); 00123 00124 // go! 00125 run_loop_execute(); 00126 00127 return 0; 00128 }
Generated on Thu Jul 14 2022 08:49:57 by 1.7.2