devterm_keyboard_mini.ino 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "keyboard.h"
  2. #include "keys.h"
  3. #include "trackball.h"
  4. #include "devterm.h"
  5. #include "tickwaiter.h"
  6. #include <USBComposite.h>
  7. #define SER_NUM_STR "20230307"
  8. USBHID HID;
  9. DEVTERM dev_term;
  10. const uint8_t reportDescription[] = {
  11. HID_CONSUMER_REPORT_DESCRIPTOR(),
  12. HID_KEYBOARD_REPORT_DESCRIPTOR(),
  13. HID_JOYSTICK_REPORT_DESCRIPTOR(),
  14. HID_MOUSE_REPORT_DESCRIPTOR()
  15. };
  16. static const uint32_t LOOP_INTERVAL_MS = 0;
  17. static TickWaiter<LOOP_INTERVAL_MS> waiter;
  18. HardwareTimer timer(1);
  19. //HardwareTimer ctrl_timer(4);
  20. void setup() {
  21. USBComposite.setManufacturerString("ClockworkPI");
  22. USBComposite.setProductString("uConsole");
  23. USBComposite.setSerialString(SER_NUM_STR);
  24. dev_term.Keyboard = new HIDKeyboard(HID);
  25. dev_term.Joystick = new HIDJoystick(HID);
  26. dev_term.Mouse = new HIDMouse(HID);
  27. dev_term.Consumer = new HIDConsumer(HID);
  28. dev_term.Keyboard->setAdjustForHostCapsLock(false);
  29. dev_term.state = new State();
  30. dev_term.Keyboard_state.layer = 0;
  31. dev_term.Keyboard_state.prev_layer = 0;
  32. dev_term.Keyboard_state.fn_on = 0;
  33. dev_term.Keyboard_state.sf_on = 0;
  34. //dev_term.Keyboard_state.shift = 0;
  35. dev_term.Keyboard_state.backlight = 0;
  36. dev_term.Keyboard_state.lock = 0;
  37. dev_term.Keyboard_state.ctrl.lock = 0;
  38. dev_term.Keyboard_state.ctrl.time = 0;
  39. dev_term.Keyboard_state.ctrl.begin = 0;
  40. dev_term.Keyboard_state.shift.lock = 0;
  41. dev_term.Keyboard_state.shift.time = 0;
  42. dev_term.Keyboard_state.shift.begin = 0;
  43. dev_term.Keyboard_state.alt.lock = 0;
  44. dev_term.Keyboard_state.alt.time = 0;
  45. dev_term.Keyboard_state.alt.begin = 0;
  46. dev_term.Keyboard_state.fn.lock = 0;
  47. dev_term.Keyboard_state.fn.time = 0;
  48. dev_term.Keyboard_state.fn.begin = 0;
  49. dev_term._Serial = new USBCompositeSerial;
  50. HID.begin(*dev_term._Serial,reportDescription, sizeof(reportDescription));
  51. while(!USBComposite);//wait until usb port been plugged in to PC
  52. keyboard_init(&dev_term);
  53. keys_init(&dev_term);
  54. trackball_init(&dev_term);
  55. //dev_term._Serial->println("setup done");
  56. pinMode(PD2,INPUT);// switch 2 in back
  57. timer.setPeriod(KEYBOARD_LED_PWM_PERIOD);
  58. timer.resume();
  59. /*
  60. ctrl_timer.setPeriod(20*1000);
  61. ctrl_timer.attachInterrupt(1,ctrl_timer_handler);
  62. ctrl_timer.refresh();
  63. ctrl_timer.resume();
  64. */
  65. pinMode(PA8,PWM);
  66. pwmWrite(PA8,0);
  67. delay(1000);
  68. }
  69. #define LOCK_TIME 50
  70. //DO NOT USE dev_term._Serial->println(""); in timer interrupt function,will block
  71. void check_keyboard_lock(KEYBOARD_LOCK*lock){
  72. if( lock->begin >0) {
  73. lock->time++;
  74. if( lock->time>=LOCK_TIME && lock->time<200){
  75. lock->lock = 1;
  76. }
  77. if( lock->time > 200){
  78. if(lock->begin != _FN_KEY) {
  79. dev_term.Keyboard->release(lock->begin);
  80. }
  81. lock->time = 0;
  82. lock->lock = 0;
  83. lock->begin = 0;
  84. }
  85. }
  86. }
  87. #define LOCK_TIME 50
  88. void ctrl_timer_handler(void) {
  89. check_keyboard_lock(&dev_term.Keyboard_state.ctrl);
  90. check_keyboard_lock(&dev_term.Keyboard_state.shift);
  91. check_keyboard_lock(&dev_term.Keyboard_state.alt);
  92. check_keyboard_lock(&dev_term.Keyboard_state.fn);
  93. }
  94. void loop() {
  95. dev_term.delta = waiter.waitForNextTick();
  96. dev_term.state->tick(dev_term.delta);
  97. trackball_task(&dev_term);
  98. keys_task(&dev_term); //keys above keyboard
  99. keyboard_task(&dev_term);
  100. }