You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

KeyboardParser.h 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #ifndef __kbdrptparser_h_
  2. #define __kbdrptparser_h_
  3. class KbdRptParser : public KeyboardReportParser {
  4. protected:
  5. virtual uint8_t HandleLockingKeys(HID *hid, uint8_t key);
  6. virtual void OnControlKeysChanged(uint8_t before, uint8_t after);
  7. virtual void OnKeyDown(uint8_t mod, uint8_t key);
  8. virtual void OnKeyUp(uint8_t mod, uint8_t key);
  9. virtual void OnKeyPressed(uint8_t key);
  10. private:
  11. void PrintKey(uint8_t mod, uint8_t key);
  12. };
  13. uint8_t KbdRptParser::HandleLockingKeys(HID *hid, uint8_t key) {
  14. uint8_t old_keys = kbdLockingKeys.bLeds;
  15. switch (key) {
  16. case UHS_HID_BOOT_KEY_NUM_LOCK:
  17. Serial.println(F("Num lock"));
  18. kbdLockingKeys.kbdLeds.bmNumLock = ~kbdLockingKeys.kbdLeds.bmNumLock;
  19. break;
  20. case UHS_HID_BOOT_KEY_CAPS_LOCK:
  21. Serial.println(F("Caps lock"));
  22. kbdLockingKeys.kbdLeds.bmCapsLock = ~kbdLockingKeys.kbdLeds.bmCapsLock;
  23. break;
  24. case UHS_HID_BOOT_KEY_SCROLL_LOCK:
  25. Serial.println(F("Scroll lock"));
  26. kbdLockingKeys.kbdLeds.bmScrollLock = ~kbdLockingKeys.kbdLeds.bmScrollLock;
  27. break;
  28. }
  29. if (old_keys != kbdLockingKeys.bLeds && hid) {
  30. BTHID *pBTHID = reinterpret_cast<BTHID *> (hid); // A cast the other way around is done in BTHID.cpp
  31. pBTHID->setLeds(kbdLockingKeys.bLeds); // Update the LEDs on the keyboard
  32. }
  33. return 0;
  34. };
  35. void KbdRptParser::PrintKey(uint8_t m, uint8_t key) {
  36. MODIFIERKEYS mod;
  37. *((uint8_t*)&mod) = m;
  38. Serial.print((mod.bmLeftCtrl == 1) ? F("C") : F(" "));
  39. Serial.print((mod.bmLeftShift == 1) ? F("S") : F(" "));
  40. Serial.print((mod.bmLeftAlt == 1) ? F("A") : F(" "));
  41. Serial.print((mod.bmLeftGUI == 1) ? F("G") : F(" "));
  42. Serial.print(F(" >"));
  43. PrintHex<uint8_t>(key, 0x80);
  44. Serial.print(F("< "));
  45. Serial.print((mod.bmRightCtrl == 1) ? F("C") : F(" "));
  46. Serial.print((mod.bmRightShift == 1) ? F("S") : F(" "));
  47. Serial.print((mod.bmRightAlt == 1) ? F("A") : F(" "));
  48. Serial.println((mod.bmRightGUI == 1) ? F("G") : F(" "));
  49. };
  50. void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key) {
  51. Serial.print(F("DN "));
  52. PrintKey(mod, key);
  53. uint8_t c = OemToAscii(mod, key);
  54. if (c)
  55. OnKeyPressed(c);
  56. };
  57. void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) {
  58. MODIFIERKEYS beforeMod;
  59. *((uint8_t*)&beforeMod) = before;
  60. MODIFIERKEYS afterMod;
  61. *((uint8_t*)&afterMod) = after;
  62. if (beforeMod.bmLeftCtrl != afterMod.bmLeftCtrl)
  63. Serial.println(F("LeftCtrl changed"));
  64. if (beforeMod.bmLeftShift != afterMod.bmLeftShift)
  65. Serial.println(F("LeftShift changed"));
  66. if (beforeMod.bmLeftAlt != afterMod.bmLeftAlt)
  67. Serial.println(F("LeftAlt changed"));
  68. if (beforeMod.bmLeftGUI != afterMod.bmLeftGUI)
  69. Serial.println(F("LeftGUI changed"));
  70. if (beforeMod.bmRightCtrl != afterMod.bmRightCtrl)
  71. Serial.println(F("RightCtrl changed"));
  72. if (beforeMod.bmRightShift != afterMod.bmRightShift)
  73. Serial.println(F("RightShift changed"));
  74. if (beforeMod.bmRightAlt != afterMod.bmRightAlt)
  75. Serial.println(F("RightAlt changed"));
  76. if (beforeMod.bmRightGUI != afterMod.bmRightGUI)
  77. Serial.println(F("RightGUI changed"));
  78. };
  79. void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key) {
  80. Serial.print(F("UP "));
  81. PrintKey(mod, key);
  82. };
  83. void KbdRptParser::OnKeyPressed(uint8_t key) {
  84. Serial.print(F("ASCII: "));
  85. Serial.println((char)key);
  86. };
  87. #endif