diff --git a/example/hid_keyboard_demo.c b/example/hid_keyboard_demo.c index 1e6e84ab4..9fd035263 100644 --- a/example/hid_keyboard_demo.c +++ b/example/hid_keyboard_demo.c @@ -91,7 +91,7 @@ const uint8_t hid_descriptor_keyboard_boot_mode[] = { 0x95, 0x08, // Report Count (8) 0x81, 0x03, // Input (Constant, Variable, Absolute) - // LED report + // LED report + padding 0x95, 0x05, // Report Count (5) 0x75, 0x01, // Report Size (1) @@ -100,8 +100,6 @@ const uint8_t hid_descriptor_keyboard_boot_mode[] = { 0x29, 0x05, // Usage Maxium (Kana) 0x91, 0x02, // Output (Data, Variable, Absolute) - // LED padding - 0x95, 0x01, // Report Count (1) 0x75, 0x03, // Report Size (3) 0x91, 0x03, // Output (Constant, Variable, Absolute) @@ -256,6 +254,20 @@ void hid_create_sdp_record( de_add_number(service, DE_BOOL, DE_SIZE_8, hid_boot_device); } +static int send_keycode; +static int send_modifier; + +static void send_key(int modifier, int keycode){ + send_keycode = keycode; + send_modifier = modifier; + l2cap_request_can_send_now_event(hid_interrupt_cid); +} + +static void send_report(int modifier, int keycode){ + uint8_t report[] = { 0xa1, modifier, 0, 0, keycode, 0, 0, 0, 0, 0}; + l2cap_send(hid_interrupt_cid, &report[0], sizeof(report)); +} + #ifdef HAVE_POSIX_STDIN // prototypes @@ -278,11 +290,39 @@ static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callbac UNUSED(callback_type); char cmd = btstack_stdin_read(); - switch (cmd){ - default: - show_usage(); - break; + // switch (cmd){ + // default: + // show_usage(); + // break; + // } + + // naive translation + if (cmd >= 'a' && cmd <= 'z'){ + send_key(0, cmd - 'a' + 0x04); + return; } + if (cmd >= 'A' && cmd <= 'Z'){ + send_key(2, cmd - 'A' + 0x04); + return; + } + if (cmd == '0'){ + send_key(0, 0x27); + return; + } + if (cmd == 127){ + send_key(0, 0x2a); + return; + } + if (cmd == ' '){ + send_key(0, 0x2c); + return; + } + if (cmd >= '1' && cmd <= '9'){ + send_key(0, cmd - '1' + 0x1e); + return; + } + + show_usage(); } #endif @@ -348,6 +388,15 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * pack printf("HID Disconnected\n"); } break; + case L2CAP_EVENT_CAN_SEND_NOW: + if (send_keycode){ + send_report(send_modifier, send_keycode); + send_keycode = 0; + send_modifier = 0; + l2cap_request_can_send_now_event(hid_interrupt_cid); + } else { + send_report(0, 0); + } default: break; }