diff --git a/cores/rp2040/RP2040USB.cpp b/cores/rp2040/RP2040USB.cpp index a864b464..729cf5e8 100644 --- a/cores/rp2040/RP2040USB.cpp +++ b/cores/rp2040/RP2040USB.cpp @@ -383,6 +383,7 @@ void __USBStart() { // Invoked when received GET_REPORT control request // Application must fill buffer report's content and return its length. // Return zero will cause the stack to STALL request +extern "C" uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) __attribute__((weak)); extern "C" uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) { // TODO not implemented (void) instance; @@ -396,6 +397,7 @@ extern "C" uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, h // Invoked when received SET_REPORT control request or // received data on OUT endpoint ( Report ID = 0, Type = 0 ) +extern "C" void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) __attribute__((weak)); extern "C" void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) { // TODO set LED based on CAPLOCK, NUMLOCK etc... (void) instance; diff --git a/libraries/HID_Keyboard b/libraries/HID_Keyboard index 74c3b2fe..68d47029 160000 --- a/libraries/HID_Keyboard +++ b/libraries/HID_Keyboard @@ -1 +1 @@ -Subproject commit 74c3b2fee7da9170a608e7458d4c08c6d8104fa9 +Subproject commit 68d4702949cf373be251de6936d71aff7dc9f5a4 diff --git a/libraries/Keyboard/examples/KeyboardPassword/KeyboardPassword.ino b/libraries/Keyboard/examples/KeyboardPassword/KeyboardPassword.ino index cabc18bc..b9c95abf 100644 --- a/libraries/Keyboard/examples/KeyboardPassword/KeyboardPassword.ino +++ b/libraries/Keyboard/examples/KeyboardPassword/KeyboardPassword.ino @@ -3,8 +3,20 @@ #include +void ledCB(bool numlock, bool capslock, bool scrolllock, bool compose, bool kana, void *cbData) { + (void) numlock; + (void) scrolllock; + (void) compose; + (void) kana; + (void) cbData; + digitalWrite(LED_BUILTIN, capslock ? HIGH : LOW); +} + void setup() { Serial.begin(115200); + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, LOW); + Keyboard.onLED(ledCB); Keyboard.begin(); delay(5000); Serial.printf("Arduino USB Password Typer\n"); diff --git a/libraries/Keyboard/src/Keyboard.cpp b/libraries/Keyboard/src/Keyboard.cpp index 114b49d9..0caebf19 100644 --- a/libraries/Keyboard/src/Keyboard.cpp +++ b/libraries/Keyboard/src/Keyboard.cpp @@ -46,4 +46,14 @@ void Keyboard_::sendReport(KeyReport* keys) { tud_task(); } +extern "C" void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) { + (void) report_id; + (void) instance; + + if ((report_type == HID_REPORT_TYPE_OUTPUT) && (bufsize > 0) && (Keyboard._ledCB)) { + uint8_t const kbd_leds = buffer[0]; + Keyboard._ledCB(kbd_leds & KEYBOARD_LED_NUMLOCK, kbd_leds & KEYBOARD_LED_CAPSLOCK, kbd_leds & KEYBOARD_LED_SCROLLLOCK, kbd_leds & KEYBOARD_LED_COMPOSE, kbd_leds & KEYBOARD_LED_KANA, Keyboard._ledCBdata); + } +} + Keyboard_ Keyboard; diff --git a/libraries/Keyboard/src/Keyboard.h b/libraries/Keyboard/src/Keyboard.h index 16024772..118a81c4 100644 --- a/libraries/Keyboard/src/Keyboard.h +++ b/libraries/Keyboard/src/Keyboard.h @@ -28,6 +28,7 @@ class Keyboard_ : public HID_Keyboard { protected: virtual void sendReport(KeyReport* keys) override; + public: Keyboard_(void); }; diff --git a/libraries/KeyboardBT/examples/BTKeyboardPassword/BTKeyboardPassword.ino b/libraries/KeyboardBT/examples/BTKeyboardPassword/BTKeyboardPassword.ino index bef04aaf..dd869c11 100644 --- a/libraries/KeyboardBT/examples/BTKeyboardPassword/BTKeyboardPassword.ino +++ b/libraries/KeyboardBT/examples/BTKeyboardPassword/BTKeyboardPassword.ino @@ -3,9 +3,22 @@ #include +void ledCB(bool numlock, bool capslock, bool scrolllock, bool compose, bool kana, void *cbData) { + (void) numlock; + (void) scrolllock; + (void) compose; + (void) kana; + (void) cbData; + digitalWrite(LED_BUILTIN, capslock ? HIGH : LOW); +} + void setup() { Serial.begin(115200); KeyboardBT.begin("PicoW Password"); + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, LOW); + KeyboardBT.onLED(ledCB); + KeyboardBT.begin(); delay(5000); Serial.printf("Arduino USB Password Typer\n"); Serial.printf("Press BOOTSEL to enter your super-secure(not!) password\n\n"); diff --git a/libraries/KeyboardBT/src/KeyboardBT.cpp b/libraries/KeyboardBT/src/KeyboardBT.cpp index a83b4418..305cae85 100644 --- a/libraries/KeyboardBT/src/KeyboardBT.cpp +++ b/libraries/KeyboardBT/src/KeyboardBT.cpp @@ -36,6 +36,15 @@ KeyboardBT_::KeyboardBT_(void) { static const uint8_t desc_keyboard[] = {TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(REPORT_ID))}; +static void _hidReportCB(uint16_t cid, hid_report_type_t report_type, uint16_t report_id, int report_size, uint8_t *report) { + (void) cid; + (void) report_id; + if ((report_type == HID_REPORT_TYPE_OUTPUT) && (report_size > 0) && (KeyboardBT._ledCB)) { + uint8_t const kbd_leds = report[0]; + KeyboardBT._ledCB(kbd_leds & KEYBOARD_LED_NUMLOCK, kbd_leds & KEYBOARD_LED_CAPSLOCK, kbd_leds & KEYBOARD_LED_SCROLLLOCK, kbd_leds & KEYBOARD_LED_COMPOSE, kbd_leds & KEYBOARD_LED_KANA, KeyboardBT._ledCBdata); + } +} + void KeyboardBT_::begin(const char *localName, const char *hidName, const uint8_t *layout) { if (!localName) { localName = "PicoW BT Keyboard"; @@ -44,6 +53,9 @@ void KeyboardBT_::begin(const char *localName, const char *hidName, const uint8_ hidName = localName; } _asciimap = layout; + // Required because the hid_report_type_t overlap in BTStack and TUSB + auto *fcn = (void (*)(short unsigned int, hid_report_type_t_bt, short unsigned int, int, unsigned char*))_hidReportCB; + hid_device_register_report_data_callback(fcn); PicoBluetoothHID.startHID(localName, hidName, 0x2540, 33, desc_keyboard, sizeof(desc_keyboard)); }