From b4a91ecf4e46ee533563fd759e26dd249bf6b4de Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 20 Jun 2014 14:39:49 +0900 Subject: [PATCH] Add LED indicator support in mbed --- protocol/mbed/HIDKeyboard.cpp | 43 +++++++++++++++++++++++------------ protocol/mbed/HIDKeyboard.h | 4 ++++ protocol/mbed/mbed_driver.cpp | 2 +- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/protocol/mbed/HIDKeyboard.cpp b/protocol/mbed/HIDKeyboard.cpp index f40c2d2f..947077cd 100644 --- a/protocol/mbed/HIDKeyboard.cpp +++ b/protocol/mbed/HIDKeyboard.cpp @@ -17,6 +17,10 @@ bool HIDKeyboard::sendReport(report_keyboard_t report) { return true; } +uint8_t HIDKeyboard::leds() { + return led_state; +} + bool HIDKeyboard::USBCallback_setConfiguration(uint8_t configuration) { if (configuration != DEFAULT_CONFIGURATION) { return false; @@ -228,29 +232,40 @@ bool HIDKeyboard::USBCallback_request() { } // Process class-specific requests -/* if (transfer->setup.bmRequestType.Type == CLASS_TYPE) { - switch (transfer->setup.bRequest) - { - case SET_REPORT: - // First byte will be used for report ID - //outputReport.data[0] = transfer->setup.wValue & 0xff; - //outputReport.length = transfer->setup.wLength + 1; - outputReport.length = transfer->setup.wLength; + switch (transfer->setup.bRequest) { + case SET_REPORT: + // LED indicator + // TODO: check Interface and Report length? + // if (transfer->setup.wIndex == INTERFACE_KEYBOAD) { } + // if (transfer->setup.wLength == 1) - //transfer->remaining = sizeof(outputReport.data) - 1; - //transfer->ptr = &outputReport.data[1]; - transfer->remaining = sizeof(outputReport.data); - transfer->ptr = &outputReport.data[0]; + transfer->remaining = 1; + //transfer->ptr = ?? what ptr should be set when OUT(not used?) transfer->direction = HOST_TO_DEVICE; - transfer->notify = true; + transfer->notify = true; /* notify with USBCallback_requestCompleted */ success = true; default: break; } } -*/ return success; } + +void HIDKeyboard::USBCallback_requestCompleted(uint8_t * buf, uint32_t length) +{ + if (length > 0) { + CONTROL_TRANSFER *transfer = getTransferPtr(); + if (transfer->setup.bmRequestType.Type == CLASS_TYPE) { + switch (transfer->setup.bRequest) { + case SET_REPORT: + led_state = buf[0]; + break; + default: + break; + } + } + } +} diff --git a/protocol/mbed/HIDKeyboard.h b/protocol/mbed/HIDKeyboard.h index 4ebe610a..c537e5ec 100644 --- a/protocol/mbed/HIDKeyboard.h +++ b/protocol/mbed/HIDKeyboard.h @@ -11,6 +11,7 @@ public: HIDKeyboard(uint16_t vendor_id = 0xFEED, uint16_t product_id = 0xabed, uint16_t product_release = 0x0001); bool sendReport(report_keyboard_t report); + uint8_t leds(void); protected: uint16_t reportLength; virtual bool USBCallback_setConfiguration(uint8_t configuration); @@ -22,6 +23,9 @@ protected: virtual uint8_t * configurationDesc(); //virtual uint8_t * deviceDesc(); virtual bool USBCallback_request(); + virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length); +private: + uint8_t led_state; }; #endif diff --git a/protocol/mbed/mbed_driver.cpp b/protocol/mbed/mbed_driver.cpp index 333f8e37..6c7b16e2 100644 --- a/protocol/mbed/mbed_driver.cpp +++ b/protocol/mbed/mbed_driver.cpp @@ -24,7 +24,7 @@ host_driver_t mbed_driver = { static uint8_t keyboard_leds(void) { - return 0; + return keyboard.leds(); } static void send_keyboard(report_keyboard_t *report) {