hid_device: report connect/disconnect, track l2cap cids

This commit is contained in:
Matthias Ringwald 2017-04-26 21:50:47 +02:00
parent 2fa56ea6fd
commit 0316aa6f75

View File

@ -52,16 +52,21 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <inttypes.h>
#include "btstack.h" #include "btstack.h"
#ifdef HAVE_POSIX_STDIN #ifdef HAVE_POSIX_STDIN
#include "stdin_support.h" #include "stdin_support.h"
#endif #endif
uint8_t hid_service_buffer[200]; uint8_t hid_service_buffer[250];
const char hid_device_name[] = "BTstack HID Keyboard"; const char hid_device_name[] = "BTstack HID Keyboard";
static btstack_packet_callback_registration_t hci_event_callback_registration; static btstack_packet_callback_registration_t hci_event_callback_registration;
// hid device state
static uint16_t hid_control_cid;
static uint16_t hid_interrupt_cid;
// from USB HID Specification 1.1, Appendix B.1 // from USB HID Specification 1.1, Appendix B.1
const uint8_t hid_descriptor_keyboard_boot_mode[] = { const uint8_t hid_descriptor_keyboard_boot_mode[] = {
@ -125,6 +130,7 @@ void hid_create_sdp_record(
uint8_t hid_boot_device, uint8_t hid_boot_device,
const uint8_t * hid_descriptor, uint16_t hid_descriptor_size, const uint8_t * hid_descriptor, uint16_t hid_descriptor_size,
const char *device_name); const char *device_name);
void hid_create_sdp_record( void hid_create_sdp_record(
uint8_t *service, uint8_t *service,
uint32_t service_record_handle, uint32_t service_record_handle,
@ -280,12 +286,68 @@ static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callbac
} }
#endif #endif
static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * event, uint16_t event_size){ static int hid_connected(void){
return hid_control_cid && hid_interrupt_cid;
}
static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * packet, uint16_t packet_size){
UNUSED(channel); UNUSED(channel);
UNUSED(event_size); UNUSED(packet_size);
int connected_before;
switch (packet_type){ switch (packet_type){
case HCI_EVENT_PACKET: case HCI_EVENT_PACKET:
switch (event[0]){ switch (packet[0]){
case HCI_EVENT_USER_CONFIRMATION_REQUEST:
// ssp: inform about user confirmation request
log_info("SSP User Confirmation Request with numeric value '%06"PRIu32"'\n", hci_event_user_confirmation_request_get_numeric_value(packet));
log_info("SSP User Confirmation Auto accept\n");
break;
// into HID Device/Server
case L2CAP_EVENT_INCOMING_CONNECTION:
switch (l2cap_event_incoming_connection_get_psm(packet)){
case PSM_HID_CONTROL:
case PSM_HID_INTERRUPT:
l2cap_accept_connection(channel);
break;
default:
l2cap_decline_connection(channel);
break;
}
break;
case L2CAP_EVENT_CHANNEL_OPENED:
if (packet[2]) return;
connected_before = hid_connected();
switch (l2cap_event_channel_opened_get_psm(packet)){
case PSM_HID_CONTROL:
hid_control_cid = l2cap_event_channel_opened_get_local_cid(packet);
log_info("HID Control opened, cid 0x%02x", hid_control_cid);
break;
case PSM_HID_INTERRUPT:
hid_interrupt_cid = l2cap_event_channel_opened_get_local_cid(packet);
log_info("HID Interrupt opened, cid 0x%02x", hid_interrupt_cid);
break;
default:
break;
}
if (!connected_before && hid_connected()){
printf("HID Connected\n");
}
break;
case L2CAP_EVENT_CHANNEL_CLOSED:
connected_before = hid_connected();
if (l2cap_event_channel_closed_get_local_cid(packet) == hid_control_cid){
log_info("HID Control closed");
hid_control_cid = 0;
}
if (l2cap_event_channel_closed_get_local_cid(packet) == hid_interrupt_cid){
log_info("HID Interrupt closed");
hid_interrupt_cid = 0;
}
if (connected_before && !hid_connected()){
printf("HID Disconnected\n");
}
break;
default: default:
break; break;
} }
@ -316,11 +378,12 @@ int btstack_main(int argc, const char * argv[]){
gap_discoverable_control(1); gap_discoverable_control(1);
gap_set_class_of_device(0x2540); gap_set_class_of_device(0x2540);
gap_set_local_name(hid_device_name);
// L2CAP // L2CAP
l2cap_init(); l2cap_init();
l2cap_register_service(packet_handler, PSM_HID_INTERRUPT, 100, LEVEL_0);
// HID Device / Server l2cap_register_service(packet_handler, PSM_HID_CONTROL, 100, LEVEL_0);
// SDP Server // SDP Server
sdp_init(); sdp_init();