(NKRO) Keyboard improvements

This commit is contained in:
NicoHood 2015-09-20 10:55:13 +02:00
parent 3d86fb20d4
commit b617fb0b3d
6 changed files with 127 additions and 89 deletions

View file

@ -4,7 +4,7 @@
NKROKeyboard example NKROKeyboard example
Press a button to press a lot of keys at the same time. Press a button to hold a lot of keys at the same time.
NKRO can push 113 keys at the same time, NKRO can push 113 keys at the same time,
the other Keyboards only 6 keys + 8 modifiers! the other Keyboards only 6 keys + 8 modifiers!
@ -26,36 +26,24 @@ void setup() {
} }
void loop() { void loop() {
// Press a lot of keys at the same time // Hold a lot of keys at the same time
if (!digitalRead(pinButton)) { if (!digitalRead(pinButton)) {
digitalWrite(pinLed, HIGH); digitalWrite(pinLed, HIGH);
NKROKeyboard.press('a'); // Do not press to many at once or some OS will have problems.
NKROKeyboard.press('b'); // Note that the resulting pressed order might differ,
NKROKeyboard.press('c'); // because all keys are pressed at the same time.
NKROKeyboard.press('d'); NKROKeyboard.addKeyToReport('0');
NKROKeyboard.press('e'); NKROKeyboard.addKeyToReport('1');
NKROKeyboard.press('f'); NKROKeyboard.addKeyToReport('2');
NKROKeyboard.press('g'); NKROKeyboard.addKeyToReport('3');
NKROKeyboard.press('h'); NKROKeyboard.addKeyToReport('4');
NKROKeyboard.press('i'); NKROKeyboard.addKeyToReport('5');
NKROKeyboard.press('j'); NKROKeyboard.addKeyToReport('6');
NKROKeyboard.press('k'); NKROKeyboard.addKeyToReport('7');
NKROKeyboard.press('l'); NKROKeyboard.addKeyToReport('8');
NKROKeyboard.press('m'); NKROKeyboard.addKeyToReport('9');
NKROKeyboard.press('n'); NKROKeyboard.send_now();
NKROKeyboard.press('o');
NKROKeyboard.press('p');
NKROKeyboard.press('q');
NKROKeyboard.press('r');
NKROKeyboard.press('s');
NKROKeyboard.press('t');
NKROKeyboard.press('u');
NKROKeyboard.press('v');
NKROKeyboard.press('w');
NKROKeyboard.press('x');
NKROKeyboard.press('y');
NKROKeyboard.press('z');
// Release all keys and hit enter // Release all keys and hit enter
NKROKeyboard.releaseAll(); NKROKeyboard.releaseAll();

View file

@ -25,7 +25,9 @@ getLeds KEYWORD2
pressKeycode KEYWORD2 pressKeycode KEYWORD2
releaseKeycode KEYWORD2 releaseKeycode KEYWORD2
writeKeycode KEYWORD2 writeKeycode KEYWORD2
addKeyToReport KEYWORD2
addKeycodeToReport KEYWORD2 addKeycodeToReport KEYWORD2
removeKeyFromReport KEYWORD2
removeKeycodeFromReport KEYWORD2 removeKeycodeFromReport KEYWORD2
write_unicode KEYWORD2 write_unicode KEYWORD2

View file

@ -111,6 +111,10 @@ void Keyboard_::sendReport(HID_KeyboardReport_Data_t* keys)
SendReport(keys,sizeof(HID_KeyboardReport_Data_t)); SendReport(keys,sizeof(HID_KeyboardReport_Data_t));
} }
void Keyboard_::send_now(void){
sendReport(&_keyReport);
}
#if defined(HID_KEYBOARD_LEDS_ENABLED) #if defined(HID_KEYBOARD_LEDS_ENABLED)
void Keyboard_::setReportData(const void* data, int len){ void Keyboard_::setReportData(const void* data, int len){
// Save led state // Save led state
@ -130,43 +134,11 @@ uint8_t Keyboard_::getLeds(void){
// call release(), releaseAll(), or otherwise clear the report and resend. // call release(), releaseAll(), or otherwise clear the report and resend.
size_t Keyboard_::press(uint8_t k) size_t Keyboard_::press(uint8_t k)
{ {
uint8_t i; size_t ret = addKeyToReport(k);
if (k >= 136) { // it's a non-printing key (not a modifier) if(ret){
k = k - 136; sendReport(&_keyReport);
} else if (k >= 128) { // it's a modifier key
_keyReport.modifiers |= (1<<(k-128));
k = 0;
} else { // it's a printing key
k = pgm_read_byte(_asciimap + k);
if (!k) {
setWriteError();
return 0;
}
if (k & SHIFT) { // it's a capital letter or other character reached with shift
_keyReport.modifiers |= 0x02; // the left shift modifier
k = k ^ SHIFT;
}
} }
return ret;
// Add k to the key report only if it's not already present
// and if there is an empty slot.
if (_keyReport.keys[0] != k && _keyReport.keys[1] != k &&
_keyReport.keys[2] != k && _keyReport.keys[3] != k &&
_keyReport.keys[4] != k && _keyReport.keys[5] != k) {
for (i=0; i<6; i++) {
if (_keyReport.keys[i] == 0x00) {
_keyReport.keys[i] = k;
break;
}
}
if (i == 6) {
setWriteError();
return 0;
}
}
sendReport(&_keyReport);
return 1;
} }
// release() takes the specified key out of the persistent key report and // release() takes the specified key out of the persistent key report and
@ -229,6 +201,28 @@ size_t Keyboard_::pressKeycode(uint8_t k)
sendReport(&_keyReport); sendReport(&_keyReport);
} }
size_t Keyboard_::addKeyToReport(uint8_t k)
{
if (k >= 136) { // it's a non-printing key (not a modifier)
k = k - 136;
} else if (k >= 128) { // it's a modifier key
_keyReport.modifiers |= (1<<(k-128));
k = 0;
} else { // it's a printing key
k = pgm_read_byte(_asciimap + k);
if (!k) {
setWriteError();
return 0;
}
if (k & SHIFT) { // it's a capital letter or other character reached with shift
_keyReport.modifiers |= 0x02; // the left shift modifier
k = k ^ SHIFT;
}
}
return addKeycodeToReport(k);
}
size_t Keyboard_::addKeycodeToReport(uint8_t k) size_t Keyboard_::addKeycodeToReport(uint8_t k)
{ {
uint8_t index = 0; uint8_t index = 0;
@ -283,6 +277,27 @@ size_t Keyboard_::releaseKeycode(uint8_t k)
sendReport(&_keyReport); sendReport(&_keyReport);
} }
size_t Keyboard_::removeKeyFromReport(uint8_t k)
{
if (k >= 136) { // it's a non-printing key (not a modifier)
k = k - 136;
} else if (k >= 128) { // it's a modifier key
_keyReport.modifiers &= ~(1<<(k-128));
k = 0;
} else { // it's a printing key
k = pgm_read_byte(_asciimap + k);
if (!k) {
return 0;
}
if (k & SHIFT) { // it's a capital letter or other character reached with shift
_keyReport.modifiers &= ~(0x02); // the left shift modifier
k = k ^ SHIFT;
}
}
return removeKeycodeFromReport(k);
}
size_t Keyboard_::removeKeycodeFromReport(uint8_t k) size_t Keyboard_::removeKeycodeFromReport(uint8_t k)
{ {
uint8_t indexA; uint8_t indexA;

View file

@ -68,11 +68,14 @@ public:
size_t press(uint8_t k); size_t press(uint8_t k);
size_t release(uint8_t k); size_t release(uint8_t k);
void releaseAll(void); void releaseAll(void);
void send_now(void);
size_t writeKeycode(uint8_t k); size_t writeKeycode(uint8_t k);
size_t pressKeycode(uint8_t k); size_t pressKeycode(uint8_t k);
size_t releaseKeycode(uint8_t k); size_t releaseKeycode(uint8_t k);
size_t addKeyToReport(uint8_t k);
size_t addKeycodeToReport(uint8_t k); size_t addKeycodeToReport(uint8_t k);
size_t removeKeyFromReport(uint8_t k);
size_t removeKeycodeFromReport(uint8_t k); size_t removeKeycodeFromReport(uint8_t k);
#if defined(HID_KEYBOARD_LEDS_ENABLED) #if defined(HID_KEYBOARD_LEDS_ENABLED)

View file

@ -116,6 +116,10 @@ void NKROKeyboard_::sendReport(HID_NKROKeyboardReport_Data_t* keys)
SendReport(keys, sizeof(HID_NKROKeyboardReport_Data_t)); SendReport(keys, sizeof(HID_NKROKeyboardReport_Data_t));
} }
void NKROKeyboard_::send_now(void){
sendReport(&_keyReport);
}
#if defined(HID_KEYBOARD_LEDS_ENABLED) #if defined(HID_KEYBOARD_LEDS_ENABLED)
void NKROKeyboard_::setReportData(const void* data, int len){ void NKROKeyboard_::setReportData(const void* data, int len){
// Save led state // Save led state
@ -134,31 +138,11 @@ uint8_t NKROKeyboard_::getLeds(void){
// call release(), releaseAll(), or otherwise clear the report and resend. // call release(), releaseAll(), or otherwise clear the report and resend.
size_t NKROKeyboard_::press(uint8_t k) size_t NKROKeyboard_::press(uint8_t k)
{ {
// it's a non-printing key (not a modifier) size_t ret = addKeyToReport(k);
if (k >= 136) if(ret){
k = k - 136; sendReport(&_keyReport);
// it's a modifier key
else if (k >= 128)
k = k - 128;
// it's a printing key
else {
k = pgm_read_byte(_asciimap + k);
if (!k)
return 0;
// it's a capital letter or other character reached with shift
if (k & SHIFT) {
// the left shift modifier
_keyReport.modifiers |= 0x02;
k = k ^ SHIFT;
}
} }
return ret;
addKeycodeToReport(k);
sendReport(&_keyReport);
return 1;
} }
// release() takes the specified key out of the persistent key report and // release() takes the specified key out of the persistent key report and
@ -189,7 +173,7 @@ size_t NKROKeyboard_::release(uint8_t k)
} }
removeKeycodeFromReport(k); removeKeycodeFromReport(k);
sendReport(&_keyReport); sendReport(&_keyReport);
return 1; return 1;
} }
@ -221,6 +205,28 @@ size_t NKROKeyboard_::pressKeycode(uint8_t k)
sendReport(&_keyReport); sendReport(&_keyReport);
} }
size_t NKROKeyboard_::addKeyToReport(uint8_t k)
{
if (k >= 136) { // it's a non-printing key (not a modifier)
k = k - 136;
} else if (k >= 128) { // it's a modifier key
_keyReport.modifiers |= (1<<(k-128));
k = 0;
} else { // it's a printing key
k = pgm_read_byte(_asciimap + k);
if (!k) {
setWriteError();
return 0;
}
if (k & SHIFT) { // it's a capital letter or other character reached with shift
_keyReport.modifiers |= 0x02; // the left shift modifier
k = k ^ SHIFT;
}
}
return addKeycodeToReport(k);
}
size_t NKROKeyboard_::addKeycodeToReport(uint8_t k) size_t NKROKeyboard_::addKeycodeToReport(uint8_t k)
{ {
// keymap key // keymap key
@ -252,6 +258,27 @@ size_t NKROKeyboard_::releaseKeycode(uint8_t k)
sendReport(&_keyReport); sendReport(&_keyReport);
} }
size_t NKROKeyboard_::removeKeyFromReport(uint8_t k)
{
if (k >= 136) { // it's a non-printing key (not a modifier)
k = k - 136;
} else if (k >= 128) { // it's a modifier key
_keyReport.modifiers &= ~(1<<(k-128));
k = 0;
} else { // it's a printing key
k = pgm_read_byte(_asciimap + k);
if (!k) {
return 0;
}
if (k & SHIFT) { // it's a capital letter or other character reached with shift
_keyReport.modifiers &= ~(0x02); // the left shift modifier
k = k ^ SHIFT;
}
}
return removeKeycodeFromReport(k);
}
size_t NKROKeyboard_::removeKeycodeFromReport(uint8_t k) size_t NKROKeyboard_::removeKeycodeFromReport(uint8_t k)
{ {
// keymap key // keymap key

View file

@ -67,11 +67,14 @@ public:
size_t press(uint8_t k); size_t press(uint8_t k);
size_t release(uint8_t k); size_t release(uint8_t k);
void releaseAll(void); void releaseAll(void);
void send_now(void);
size_t writeKeycode(uint8_t k); size_t writeKeycode(uint8_t k);
size_t pressKeycode(uint8_t k); size_t pressKeycode(uint8_t k);
size_t releaseKeycode(uint8_t k); size_t releaseKeycode(uint8_t k);
size_t addKeyToReport(uint8_t k);
size_t addKeycodeToReport(uint8_t k); size_t addKeycodeToReport(uint8_t k);
size_t removeKeyFromReport(uint8_t k);
size_t removeKeycodeFromReport(uint8_t k); size_t removeKeycodeFromReport(uint8_t k);
#if defined(HID_KEYBOARD_LEDS_ENABLED) #if defined(HID_KEYBOARD_LEDS_ENABLED)