diff --git a/libraries/HID/src/HID.cpp b/libraries/HID/src/HID.cpp index 3dd85fc10..b1bd1e8d8 100644 --- a/libraries/HID/src/HID.cpp +++ b/libraries/HID/src/HID.cpp @@ -133,25 +133,48 @@ bool HID_::setup(USBSetup& setup) } if (request == HID_SET_REPORT) { - //uint8_t reportID = setup.wValueL; - //uint16_t length = setup.wLength; - //uint8_t data[length]; + uint8_t reportID = setup.wValueL; + uint16_t length = setup.wLength; + uint8_t data[length]; // Make sure to not read more data than USB_EP_SIZE. // You can read multiple times through a loop. // The first byte (may!) contain the reportID on a multreport. //USB_RecvControl(data, length); + if ((reportID == 2) && (length == 2)) + { + if (2 == USB_RecvControl(data, length)) + { + _keyboardLedsStatus = data[1]; + if (keyboardLedsStatusReportCallback != 0) + { + keyboardLedsStatusReportCallback(); + } + return true; + } + } } } return false; } +uint8_t HID_::getKeyboardLedsStatus(void) +{ + return _keyboardLedsStatus; +} + +void HID_::setKeyboardLedsStatusReportCallback(void (*callback) (void) ) +{ + keyboardLedsStatusReportCallback = callback; +} + HID_::HID_(void) : PluggableUSBModule(1, 1, epType), rootNode(NULL), descriptorSize(0), protocol(HID_REPORT_PROTOCOL), idle(1) { epType[0] = EP_TYPE_INTERRUPT_IN; PluggableUSB().plug(this); + setKeyboardLedsStatusReportCallback( NULL ); } int HID_::begin(void) diff --git a/libraries/HID/src/HID.h b/libraries/HID/src/HID.h index 93c4bd5b4..b33e64625 100644 --- a/libraries/HID/src/HID.h +++ b/libraries/HID/src/HID.h @@ -95,7 +95,9 @@ class HID_ : public PluggableUSBModule int begin(void); int SendReport(uint8_t id, const void* data, int len); void AppendDescriptor(HIDSubDescriptor* node); - + uint8_t getKeyboardLedsStatus(void); + void setKeyboardLedsStatusReportCallback(void (*callback) (void) ); + protected: // Implementation of the PluggableUSBModule int getInterface(uint8_t* interfaceCount); @@ -111,6 +113,8 @@ class HID_ : public PluggableUSBModule uint8_t protocol; uint8_t idle; + uint8_t _keyboardLedsStatus; + void (*keyboardLedsStatusReportCallback) (void); }; // Replacement for global singleton.