Keyboard firmwares for Atmel AVR and Cortex-M
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.

пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
пре 13 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "keymap_skel.h"
  2. #include "usb_keyboard.h"
  3. #include "debug.h"
  4. #include "timer.h"
  5. #include "layer.h"
  6. /*
  7. * Parameters:
  8. * enter_delay |=======|
  9. * send_fn_term |================|
  10. *
  11. * Fn key processing cases:
  12. * 1. release Fn after send_fn_term.
  13. * Layer sw ___________|~~~~~~~~~~~|___
  14. * Fn press ___|~~~~~~~~~~~~~~~~~~~|___
  15. * Fn send ___________________________
  16. *
  17. * 2. release Fn in send_fn_term.(not layer used)
  18. * Layer sw ___________|~~~~~~|________
  19. * Fn press ___|~~~~~~~~~~~~~~|________
  20. * Fn key send __________________|~|______
  21. * other key press ___________________________
  22. * other key send ___________________________
  23. *
  24. * 3. release Fn in send_fn_term.(layer used)
  25. * Layer sw ___________|~~~~~~|________
  26. * Fn press ___|~~~~~~~~~~~~~~|________
  27. * Fn key send ___________________________
  28. * Fn send ___________________________
  29. * other key press _____________|~~|__________
  30. * other key send _____________|~~|__________
  31. *
  32. * 4. press other key in ENTER_DELAY.
  33. * Layer sw ___________________________
  34. * Fn key press ___|~~~~~~~~~|_____________
  35. * Fn key send ______|~~~~~~|_____________
  36. * other key press ______|~~~|________________
  37. * other key send _______|~~|________________
  38. *
  39. * 5. press Fn while press other key.
  40. * Layer sw ___________________________
  41. * Fn key press ___|~~~~~~~~~|_____________
  42. * Fn key send ___|~~~~~~~~~|_____________
  43. * other key press ~~~~~~~|___________________
  44. * other key send ~~~~~~~|___________________
  45. */
  46. // LAYER_ENTER_DELAY: prevent from moving new layer
  47. #define LAYER_ENTER_DELAY 10
  48. // LAYER_SEND_FN_TERM: send keycode if release key in this term
  49. #define LAYER_SEND_FN_TERM 40
  50. static uint8_t current_layer = 0;
  51. static bool layer_used = false;
  52. uint8_t layer_get_keycode(uint8_t row, uint8_t col)
  53. {
  54. uint8_t code = keymap_get_keycode(current_layer, row, col);
  55. // normal key or mouse key
  56. if ((IS_KEY(code) || IS_MOUSE(code))) {
  57. layer_used = true;
  58. }
  59. return code;
  60. }
  61. void layer_switching(uint8_t fn_bits)
  62. {
  63. // layer switching
  64. static uint8_t new_layer = 0;
  65. static uint8_t last_bits = 0;
  66. static uint8_t last_mods = 0;
  67. static uint16_t last_timer = 0;
  68. if (fn_bits == last_bits) { // Fn key is not changed
  69. if (current_layer != new_layer) {
  70. // not switch layer yet
  71. if (timer_elapsed(last_timer) > LAYER_ENTER_DELAY) {
  72. debug("Fn case: 1,2,3(switch layer)\n");
  73. // case: 1,2,3
  74. // switch layer after LAYER_ENTER_DELAY elapse
  75. current_layer = new_layer;
  76. debug("timer_elapsed: "); debug_hex16(timer_elapsed(last_timer)); debug("\n");
  77. debug("switch layer: "); debug_hex(current_layer); debug("\n");
  78. } else if (usb_keyboard_has_key()) {
  79. debug("Fn case: 4(send Fn first, then add Fn to report)\n");
  80. // case: 4
  81. // send only Fn key first
  82. usb_keyboard_swap_report();
  83. usb_keyboard_clear_report();
  84. usb_keyboard_add_code(keymap_fn_keycode(last_bits));
  85. usb_keyboard_set_mods(last_mods);
  86. usb_keyboard_send();
  87. usb_keyboard_swap_report();
  88. // add Fn key to send with other keys
  89. usb_keyboard_add_code(keymap_fn_keycode(last_bits));
  90. // cancel layer switching
  91. new_layer = 0;
  92. }
  93. } else {
  94. if (fn_bits && new_layer == 0) {
  95. // case: 4,5
  96. // send Fn key
  97. usb_keyboard_add_code(keymap_fn_keycode(last_bits));
  98. }
  99. }
  100. } else { // Fn key is changed
  101. if (fn_bits == 0) { // Fn key is released(falling edge)
  102. if (!layer_used && timer_elapsed(last_timer) < LAYER_SEND_FN_TERM) {
  103. debug("Fn case: 2(send Fn)\n");
  104. // send Fn key (case: 2[no layer used],3)
  105. usb_keyboard_swap_report();
  106. usb_keyboard_clear_report();
  107. usb_keyboard_add_code(keymap_fn_keycode(last_bits));
  108. usb_keyboard_set_mods(last_mods);
  109. usb_keyboard_send();
  110. usb_keyboard_swap_report();
  111. }
  112. debug("Fn case: 1,2,3,4,5(return to default layer)\n");
  113. // return to default layer(case: 1,2,3,4,5)
  114. new_layer = 0;
  115. current_layer = 0;
  116. } else { // Fn Key is pressed(rising edge)
  117. if (!usb_keyboard_has_key()) {
  118. debug("Fn case: 1,2,3,4(ready for switching layer)\n");
  119. // ready for switching layer(case: 1,2,3,4)
  120. new_layer = keymap_fn_layer(fn_bits);
  121. } else {
  122. debug("Fn case: 5(add Fn to report)\n");
  123. // add Fn key to send with other keys(case: 5)
  124. usb_keyboard_add_code(keymap_fn_keycode(fn_bits));
  125. }
  126. }
  127. layer_used = false;
  128. last_bits = fn_bits;
  129. last_mods = usb_keyboard_mods;
  130. last_timer = timer_read();
  131. debug("new_layer: "); debug_hex(new_layer); debug("\n");
  132. debug("last_bits: "); debug_bin(last_bits); debug("\n");
  133. debug("last_mods: "); debug_hex(last_mods); debug("\n");
  134. debug("last_timer: "); debug_hex16(last_timer); debug("\n");
  135. }
  136. }