BTstack for Nucleo F401RE/FRDM-KL46Z example program

Dependencies:   F401RE-USBHost mbed

The usage is the same as KL46Z-BTstack_example.
使い方はKL46Z-BTstack_exampleと同じです。
/media/uploads/va009039/f401re-btstack.jpg

Committer:
va009039
Date:
Mon Jun 09 09:03:25 2014 +0000
Revision:
0:a05a07cd6fdf
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:a05a07cd6fdf 1 #include "mbed.h"
va009039 0:a05a07cd6fdf 2 #include <btstack/run_loop.h>
va009039 0:a05a07cd6fdf 3 #include <btstack/hci_cmds.h>
va009039 0:a05a07cd6fdf 4 #include "hci.h"
va009039 0:a05a07cd6fdf 5 #include "l2cap.h"
va009039 0:a05a07cd6fdf 6 #include "debug.h"
va009039 0:a05a07cd6fdf 7 #include "bd_addr.h" // class bd_addr
va009039 0:a05a07cd6fdf 8 Serial pc(USBTX, USBRX);
va009039 0:a05a07cd6fdf 9
va009039 0:a05a07cd6fdf 10 #if defined(TARGET_NUCLEO_F401RE)
va009039 0:a05a07cd6fdf 11 DigitalOut led1(LED1);
va009039 0:a05a07cd6fdf 12 int led2 = 0;
va009039 0:a05a07cd6fdf 13 #define LED_ON 0
va009039 0:a05a07cd6fdf 14 #define LED_OFF 1
va009039 0:a05a07cd6fdf 15 #elif defined(TARGET_KL46Z)||defined(TARGET_KL25Z)
va009039 0:a05a07cd6fdf 16 DigitalOut led1(LED1), led2(LED2);
va009039 0:a05a07cd6fdf 17 #define LED_ON 0
va009039 0:a05a07cd6fdf 18 #define LED_OFF 1
va009039 0:a05a07cd6fdf 19 #else
va009039 0:a05a07cd6fdf 20 #error "target error"
va009039 0:a05a07cd6fdf 21 #endif
va009039 0:a05a07cd6fdf 22
va009039 0:a05a07cd6fdf 23 #define INQUIRY_INTERVAL 15
va009039 0:a05a07cd6fdf 24
va009039 0:a05a07cd6fdf 25 bd_addr addr;
va009039 0:a05a07cd6fdf 26
va009039 0:a05a07cd6fdf 27 static void hid_process_packet(uint8_t* report, int size)
va009039 0:a05a07cd6fdf 28 {
va009039 0:a05a07cd6fdf 29 if (report[0] == 0xa1 && report[1] == 0x02) {
va009039 0:a05a07cd6fdf 30 led1 = (report[2] & 0x01) ? LED_ON : LED_OFF; // left
va009039 0:a05a07cd6fdf 31 led2 = (report[2] & 0x02) ? LED_ON : LED_OFF; // right
va009039 0:a05a07cd6fdf 32 //led2 = (report[2] & 0x04) ? LED_ON : LED_OFF; // center
va009039 0:a05a07cd6fdf 33 }
va009039 0:a05a07cd6fdf 34 hexdump(report, size);
va009039 0:a05a07cd6fdf 35 }
va009039 0:a05a07cd6fdf 36
va009039 0:a05a07cd6fdf 37 static void l2cap_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
va009039 0:a05a07cd6fdf 38
va009039 0:a05a07cd6fdf 39 if (packet_type == HCI_EVENT_PACKET && packet[0] == L2CAP_EVENT_CHANNEL_OPENED){
va009039 0:a05a07cd6fdf 40 if (packet[2]) {
va009039 0:a05a07cd6fdf 41 log_info("Connection failed\n");
va009039 0:a05a07cd6fdf 42 return;
va009039 0:a05a07cd6fdf 43 }
va009039 0:a05a07cd6fdf 44 log_info("Connected\n");
va009039 0:a05a07cd6fdf 45 }
va009039 0:a05a07cd6fdf 46 if (packet_type == L2CAP_DATA_PACKET){
va009039 0:a05a07cd6fdf 47 // handle input
va009039 0:a05a07cd6fdf 48 log_info("HID report, size %u\n", size);
va009039 0:a05a07cd6fdf 49 hid_process_packet(packet, size);
va009039 0:a05a07cd6fdf 50 }
va009039 0:a05a07cd6fdf 51 }
va009039 0:a05a07cd6fdf 52
va009039 0:a05a07cd6fdf 53 static void packet_handler(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
va009039 0:a05a07cd6fdf 54 if (packet_type == HCI_EVENT_PACKET) {
va009039 0:a05a07cd6fdf 55 switch (packet[0]) {
va009039 0:a05a07cd6fdf 56 case BTSTACK_EVENT_STATE:
va009039 0:a05a07cd6fdf 57 // bt stack activated, get started - set local name
va009039 0:a05a07cd6fdf 58 if (packet[2] == HCI_STATE_WORKING) {
va009039 0:a05a07cd6fdf 59 hci_send_cmd(&hci_write_authentication_enable, 1);
va009039 0:a05a07cd6fdf 60 }
va009039 0:a05a07cd6fdf 61 break;
va009039 0:a05a07cd6fdf 62
va009039 0:a05a07cd6fdf 63 case HCI_EVENT_INQUIRY_RESULT:
va009039 0:a05a07cd6fdf 64 // ignore none mouses
va009039 0:a05a07cd6fdf 65 if ((packet[12] & 0x80) != 0x80 || packet[13] != 0x25) break;
va009039 0:a05a07cd6fdf 66 addr.data(&packet[3]);
va009039 0:a05a07cd6fdf 67 log_info("Mouse addr: %s\n", addr.to_str());
va009039 0:a05a07cd6fdf 68 hci_send_cmd(&hci_inquiry_cancel);
va009039 0:a05a07cd6fdf 69 break;
va009039 0:a05a07cd6fdf 70
va009039 0:a05a07cd6fdf 71 case HCI_EVENT_INQUIRY_COMPLETE:
va009039 0:a05a07cd6fdf 72 log_info("No mouse found :(\n");
va009039 0:a05a07cd6fdf 73 break;
va009039 0:a05a07cd6fdf 74
va009039 0:a05a07cd6fdf 75 case HCI_EVENT_LINK_KEY_REQUEST:
va009039 0:a05a07cd6fdf 76 // deny link key request
va009039 0:a05a07cd6fdf 77 hci_send_cmd(&hci_link_key_request_negative_reply, addr.data());
va009039 0:a05a07cd6fdf 78 break;
va009039 0:a05a07cd6fdf 79
va009039 0:a05a07cd6fdf 80 case HCI_EVENT_PIN_CODE_REQUEST:
va009039 0:a05a07cd6fdf 81 // inform about pin code request
va009039 0:a05a07cd6fdf 82 log_info("Enter 0000\n");
va009039 0:a05a07cd6fdf 83 hci_send_cmd(&hci_pin_code_request_reply, addr.data(), 4, "0000");
va009039 0:a05a07cd6fdf 84 break;
va009039 0:a05a07cd6fdf 85
va009039 0:a05a07cd6fdf 86 case HCI_EVENT_COMMAND_COMPLETE:
va009039 0:a05a07cd6fdf 87 if (COMMAND_COMPLETE_EVENT(packet, hci_write_authentication_enable)){
va009039 0:a05a07cd6fdf 88 log_info("Inquiry\n");
va009039 0:a05a07cd6fdf 89 hci_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0);
va009039 0:a05a07cd6fdf 90 }
va009039 0:a05a07cd6fdf 91 if (COMMAND_COMPLETE_EVENT(packet, hci_inquiry_cancel) ) {
va009039 0:a05a07cd6fdf 92 // inq successfully cancelled
va009039 0:a05a07cd6fdf 93 log_info("Connecting\n");
va009039 0:a05a07cd6fdf 94 l2cap_create_channel_internal(NULL, l2cap_packet_handler, addr.data(), PSM_HID_INTERRUPT, 150);
va009039 0:a05a07cd6fdf 95 }
va009039 0:a05a07cd6fdf 96 break;
va009039 0:a05a07cd6fdf 97 }
va009039 0:a05a07cd6fdf 98 }
va009039 0:a05a07cd6fdf 99 }
va009039 0:a05a07cd6fdf 100
va009039 0:a05a07cd6fdf 101 int main(void){
va009039 0:a05a07cd6fdf 102 //pc.baud(921600);
va009039 0:a05a07cd6fdf 103 log_info("%s\n", __FILE__);
va009039 0:a05a07cd6fdf 104
va009039 0:a05a07cd6fdf 105 // init LEDs
va009039 0:a05a07cd6fdf 106 led1 = LED_OFF;
va009039 0:a05a07cd6fdf 107 led2 = LED_OFF;
va009039 0:a05a07cd6fdf 108
va009039 0:a05a07cd6fdf 109 // GET STARTED
va009039 0:a05a07cd6fdf 110 run_loop_init(RUN_LOOP_EMBEDDED);
va009039 0:a05a07cd6fdf 111
va009039 0:a05a07cd6fdf 112 // init HCI
va009039 0:a05a07cd6fdf 113 hci_transport_t* transport = hci_transport_usb_instance();
va009039 0:a05a07cd6fdf 114 remote_device_db_t* remote_db = (remote_device_db_t *)&remote_device_db_memory;
va009039 0:a05a07cd6fdf 115 hci_init(transport, NULL, NULL, remote_db);
va009039 0:a05a07cd6fdf 116
va009039 0:a05a07cd6fdf 117 // init L2CAP
va009039 0:a05a07cd6fdf 118 l2cap_init();
va009039 0:a05a07cd6fdf 119 l2cap_register_packet_handler(packet_handler);
va009039 0:a05a07cd6fdf 120
va009039 0:a05a07cd6fdf 121 // turn on!, send RESET command
va009039 0:a05a07cd6fdf 122 hci_power_control(HCI_POWER_ON);
va009039 0:a05a07cd6fdf 123
va009039 0:a05a07cd6fdf 124 // go!
va009039 0:a05a07cd6fdf 125 run_loop_execute();
va009039 0:a05a07cd6fdf 126
va009039 0:a05a07cd6fdf 127 return 0;
va009039 0:a05a07cd6fdf 128 }