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.

layer.c 3.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "keymap_skel.h"
  2. #include "usb_keyboard.h"
  3. #include "debug.h"
  4. #include "timer.h"
  5. #include "layer.h"
  6. /*
  7. * LAYER_ENTER_DELAY: prevent from moving new layer
  8. * press release
  9. * Fn key sate ____|~~~~~~~~~~~~~~~~~~~|_______________
  10. *
  11. * enter_delay |======|
  12. * new layer
  13. * Layer sw ___________|~~~~~~~~~~~~|_______________
  14. */
  15. #define LAYER_ENTER_DELAY 10
  16. /*
  17. * LAYER_SEND_FN_TERM: send keycode if release key in this term
  18. * press release(send)
  19. * Fn key state ____|~~~~~~~~~~~~~|_______________
  20. * press | release(not send)
  21. * Fn key state ____|~~~~~~~~~~~~~|~~~~~~|__________
  22. * | |
  23. * send_fn_term |=============o==| x
  24. */
  25. #define LAYER_SEND_FN_TERM 30
  26. static uint8_t current_layer = 0;
  27. static bool layer_used = false;
  28. uint8_t layer_get_keycode(uint8_t row, uint8_t col)
  29. {
  30. uint8_t code = keymap_get_keycode(current_layer, row, col);
  31. // normal key or mouse key
  32. if ((IS_KEY(code) || IS_MOUSE(code)))
  33. layer_used = true;
  34. return code;
  35. }
  36. void layer_switching(uint8_t fn_bits)
  37. {
  38. // layer switching
  39. static uint8_t last_bits = 0;
  40. static uint8_t last_mod = 0;
  41. static uint16_t last_timer = 0;
  42. //uint16_t now_timer;
  43. if (fn_bits == last_bits) {
  44. // switch layer when specific time elapsed
  45. if (current_layer != keymap_fn_layer(fn_bits) &&
  46. timer_elapsed(last_timer) > LAYER_ENTER_DELAY) {
  47. current_layer = keymap_fn_layer(fn_bits);
  48. debug("time_elapsed: "); debug_hex16(timer_elapsed(last_timer)); debug("\n");
  49. debug("switch layer: "); debug_hex(current_layer); debug("\n");
  50. }
  51. } else if (fn_bits == 0) {
  52. // send key when Fn key is released without using the layer and within specific time
  53. if ((!layer_used || current_layer != keymap_fn_layer(last_bits)) &&
  54. timer_elapsed(last_timer) < LAYER_SEND_FN_TERM) {
  55. uint8_t code = keymap_fn_keycode(last_bits);
  56. if (code != KB_NO) {
  57. if (IS_MOD(code)) {
  58. keyboard_modifier_keys = last_mod | MOD_BIT(code);
  59. } else {
  60. keyboard_keys[0] = code;
  61. keyboard_modifier_keys = last_mod;
  62. }
  63. usb_keyboard_send();
  64. usb_keyboard_print();
  65. usb_keyboard_clear();
  66. }
  67. }
  68. last_bits = 0;
  69. last_mod = 0;
  70. layer_used = false;
  71. current_layer = 0; // default layer
  72. } else if ((fn_bits & (fn_bits - 1)) == 0) {
  73. // switch layer when just one Fn Key is pressed
  74. if (!usb_keyboard_has_key()) {
  75. last_bits = fn_bits;
  76. last_mod = keyboard_modifier_keys;
  77. last_timer = timer_read();
  78. debug("last_bits: "); debug_bin(last_bits); debug("\n");
  79. debug("last_mod: "); debug_hex(last_mod); debug("\n");
  80. debug("last_timer: "); debug_hex16(last_timer); debug("\n");
  81. }
  82. }
  83. }