Improved Keyboard API a bit

This commit is contained in:
NicoHood 2015-10-25 08:33:23 +01:00
parent 82ac20e3a0
commit bc5a28b8a7
8 changed files with 45 additions and 29 deletions

View file

@ -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,

View file

@ -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;

View file

@ -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));
}

View file

@ -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

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;