BTstack Bluetooth stack

Dependencies:   mbed USBHost

USBホストライブラリを変更しました。

  • Bluetoothマウス(VGP-BMS33)での動作を確認しました。mouse_demo.cpp
Committer:
va009039
Date:
Fri Mar 22 22:35:57 2013 +0000
Revision:
2:871b41f4789e
Parent:
1:b657594559be
change to single thread

Who changed what in which revision?

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