BTstack for Nucleo F401RE/FRDM-KL46Z example program

Dependencies:   F401RE-USBHost mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }