From bc5a28b8a73222a4aa40b279141445b09527b16f Mon Sep 17 00:00:00 2001 From: NicoHood Date: Sun, 25 Oct 2015 08:33:23 +0100 Subject: [PATCH] Improved Keyboard API a bit --- src/HID-APIs/ImprovedKeylayouts.h | 4 +++ src/HID-APIs/KeyboardAPI.h | 8 ++--- src/HID-APIs/KeyboardAPI.hpp | 48 ++++++++++++++++++---------- src/HID-APIs/TeensyKeylayouts.h | 2 -- src/MultiReport/ImprovedKeyboard.cpp | 4 +-- src/MultiReport/ImprovedKeyboard.h | 2 +- src/SingleReport/BootKeyboard.cpp | 4 +-- src/SingleReport/BootKeyboard.h | 2 +- 8 files changed, 45 insertions(+), 29 deletions(-) diff --git a/src/HID-APIs/ImprovedKeylayouts.h b/src/HID-APIs/ImprovedKeylayouts.h index 1b9363b..1f0eb8a 100644 --- a/src/HID-APIs/ImprovedKeylayouts.h +++ b/src/HID-APIs/ImprovedKeylayouts.h @@ -128,6 +128,10 @@ enum KeyboardKeycode : uint8_t { KEY_LEFT_ARROW = 0x50, KEY_DOWN_ARROW = 0x51, KEY_UP_ARROW = 0x52, + KEY_RIGHT = 0x4F, // Alias + KEY_LEFT = 0x50, // Alias + KEY_DOWN = 0x51, // Alias + KEY_UP = 0x52, // Alias KEY_NUM_LOCK = 0x53, KEYPAD_DIVIDE = 0x54, KEYPAD_MULTIPLY = 0x55, diff --git a/src/HID-APIs/KeyboardAPI.h b/src/HID-APIs/KeyboardAPI.h index 1c6f5e3..1a96dde 100644 --- a/src/HID-APIs/KeyboardAPI.h +++ b/src/HID-APIs/KeyboardAPI.h @@ -72,13 +72,13 @@ public: inline size_t remove(KeyboardModifier k); inline size_t remove(ConsumerKeycode k); - inline void releaseAll(void); - inline void removeAll(void); - inline void send_now(void); + inline size_t releaseAll(void); + inline size_t removeAll(void); + inline int send(void); inline void wakeupHost(void); // Sending is public in the base class for advanced users. - virtual void SendReport(void* data, int length) = 0; + virtual int SendReport(void* data, int length) = 0; protected: HID_KeyboardReport_Data_t _keyReport; diff --git a/src/HID-APIs/KeyboardAPI.hpp b/src/HID-APIs/KeyboardAPI.hpp index 6486133..b28eea5 100644 --- a/src/HID-APIs/KeyboardAPI.hpp +++ b/src/HID-APIs/KeyboardAPI.hpp @@ -85,7 +85,7 @@ size_t KeyboardAPI::press(uint8_t k) // Press key and send report to host auto ret = add(k); if(ret){ - send_now(); + send(); } return ret; } @@ -96,7 +96,7 @@ size_t KeyboardAPI::press(KeyboardKeycode k) // Press key and send report to host auto ret = add(k); if(ret){ - send_now(); + send(); } return ret; } @@ -107,7 +107,7 @@ size_t KeyboardAPI::press(KeyboardModifier k) // Press modifier key and send report to host auto ret = add(k); if(ret){ - send_now(); + send(); } return ret; } @@ -118,7 +118,7 @@ size_t KeyboardAPI::press(ConsumerKeycode k) // Press key and send report to host auto ret = add(k); if(ret){ - send_now(); + send(); } return ret; } @@ -174,8 +174,8 @@ size_t KeyboardAPI::add(KeyboardModifier k) size_t KeyboardAPI::add(ConsumerKeycode k) { + // No 2 byte keys are supported if(k > 0xFF){ - // No 2 byte keys are supported setWriteError(); return 0; } @@ -192,7 +192,7 @@ size_t KeyboardAPI::release(uint8_t k) // Release key and send report to host auto ret = remove(k); if(ret){ - send_now(); + send(); } return ret; } @@ -203,7 +203,7 @@ size_t KeyboardAPI::release(KeyboardKeycode k) // Release key and send report to host auto ret = remove(k); if(ret){ - send_now(); + send(); } return ret; } @@ -214,7 +214,7 @@ size_t KeyboardAPI::release(KeyboardModifier k) // Release modifier key and send report to host auto ret = remove(k); if(ret){ - send_now(); + send(); } return ret; } @@ -225,7 +225,7 @@ size_t KeyboardAPI::release(ConsumerKeycode k) // Release key and send report to host auto ret = remove(k); if(ret){ - send_now(); + send(); } return ret; } @@ -281,8 +281,8 @@ size_t KeyboardAPI::remove(KeyboardModifier k) size_t KeyboardAPI::remove(ConsumerKeycode k) { + // No 2 byte keys are supported if(k > 0xFF){ - // No 2 byte keys are supported return 0; } @@ -293,23 +293,37 @@ size_t KeyboardAPI::remove(ConsumerKeycode k) } -void KeyboardAPI::releaseAll(void) +size_t KeyboardAPI::releaseAll(void) { // Release all keys - removeAll(); - send_now(); + auto ret = removeAll(); + if(ret){ + send(); + } + return ret; } -void KeyboardAPI::removeAll(void) +size_t KeyboardAPI::removeAll(void) { // Release all keys - memset(&_keyReport, 0x00, sizeof(_keyReport)); + uint8_t ret = 0; + for (uint8_t i = 0; i < sizeof(_keyReport.keys); i++) + { + // Is a key in the list or did we found an empty slot? + if(_keyReport.keys[i]){ + ret++; + } + + _keyReport.keys[i] = KEY_RESERVED; + } + return ret; } -void KeyboardAPI::send_now(void){ - SendReport(&_keyReport, sizeof(_keyReport)); +int KeyboardAPI::send(void){ + // TODO set write error if usb send fails/disconnected? + return SendReport(&_keyReport, sizeof(_keyReport)); } diff --git a/src/HID-APIs/TeensyKeylayouts.h b/src/HID-APIs/TeensyKeylayouts.h index f91749a..c6d8c91 100644 --- a/src/HID-APIs/TeensyKeylayouts.h +++ b/src/HID-APIs/TeensyKeylayouts.h @@ -550,8 +550,6 @@ extern "C"{ #define SHIFT_MASK 0x0040 #define ALTGR_MASK 0x0080 #define DEADKEYS_MASK 0x0700 -#define SHIFT_MASK 0x0100 -#define ALTGR_MASK 0x0200 #define CIRCUMFLEX_BITS 0x0300 #define ACUTE_ACCENT_BITS 0x0400 #define GRAVE_ACCENT_BITS 0x0500 diff --git a/src/MultiReport/ImprovedKeyboard.cpp b/src/MultiReport/ImprovedKeyboard.cpp index d77472b..3ca0ae9 100644 --- a/src/MultiReport/ImprovedKeyboard.cpp +++ b/src/MultiReport/ImprovedKeyboard.cpp @@ -70,9 +70,9 @@ Keyboard_::Keyboard_(void) HID().AppendDescriptor(&node); } -void Keyboard_::SendReport(void* data, int length) +int Keyboard_::SendReport(void* data, int length) { - HID().SendReport(HID_REPORTID_KEYBOARD, data, length); + return HID().SendReport(HID_REPORTID_KEYBOARD, data, length); } Keyboard_ Keyboard; diff --git a/src/MultiReport/ImprovedKeyboard.h b/src/MultiReport/ImprovedKeyboard.h index 7feca85..86ff6c9 100644 --- a/src/MultiReport/ImprovedKeyboard.h +++ b/src/MultiReport/ImprovedKeyboard.h @@ -37,7 +37,7 @@ public: Keyboard_(void); protected: - virtual inline void SendReport(void* data, int length) override; + virtual inline int SendReport(void* data, int length) override; }; extern Keyboard_ Keyboard; diff --git a/src/SingleReport/BootKeyboard.cpp b/src/SingleReport/BootKeyboard.cpp index f8d0f24..bcc6904 100644 --- a/src/SingleReport/BootKeyboard.cpp +++ b/src/SingleReport/BootKeyboard.cpp @@ -156,8 +156,8 @@ uint8_t BootKeyboard_::getProtocol(void){ return protocol; } -void BootKeyboard_::SendReport(void* data, int length){ - USB_Send(pluggedEndpoint | TRANSFER_RELEASE, data, length); +int BootKeyboard_::SendReport(void* data, int length){ + return USB_Send(pluggedEndpoint | TRANSFER_RELEASE, data, length); } BootKeyboard_ BootKeyboard; diff --git a/src/SingleReport/BootKeyboard.h b/src/SingleReport/BootKeyboard.h index b7066f9..484b0d1 100644 --- a/src/SingleReport/BootKeyboard.h +++ b/src/SingleReport/BootKeyboard.h @@ -50,7 +50,7 @@ protected: uint8_t leds; - virtual void SendReport(void* data, int length) override; + virtual int SendReport(void* data, int length) override; }; extern BootKeyboard_ BootKeyboard;