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.

keymap.c 9.6KB

13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /*
  2. * keymap for HHKB pro
  3. */
  4. #include <stdbool.h>
  5. #include <avr/pgmspace.h>
  6. #include "matrix.h"
  7. #include "keymap.h"
  8. #include "usb_keyboard.h"
  9. int current_layer = 0;
  10. bool key_sent = false;
  11. /*
  12. * Layer0(Default Layer)
  13. * ,-----------------------------------------------------------.
  14. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|
  15. * |-----------------------------------------------------------|
  16. * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs|
  17. * |-----------------------------------------------------------|
  18. * |Contro| A| S| D| F| G| H| J| K| L| ;| '|Return |
  19. * |-----------------------------------------------------------|
  20. * |Shift | Z| X| C| V| B| N| M| ,| .| /|Fn2 |Fn1|
  21. * `-----------------------------------------------------------'
  22. * |Gui|Alt |Space |Fn3 |Gui|
  23. * `-------------------------------------------'
  24. *
  25. * Layer1(Fn) HHKB mode
  26. * ,-----------------------------------------------------------.
  27. * |Pow| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  28. * |-----------------------------------------------------------|
  29. * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs|
  30. * |-----------------------------------------------------------|
  31. * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter |
  32. * |-----------------------------------------------------------|
  33. * |Shift | | | | | | +| -|End|PgD|Dow|Shift |xxx|
  34. * `-----------------------------------------------------------'
  35. * |Gui |Alt |Space |Alt |Gui|
  36. * `--------------------------------------------'
  37. *
  38. * Layer3(RALT) vi mode
  39. * ,-----------------------------------------------------------.
  40. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  41. * |-----------------------------------------------------------|
  42. * |Tab | | | | | |Hom|PgD|PgUlEnd| | | |Backs|
  43. * |-----------------------------------------------------------|
  44. * |Contro| | | | | |Lef|Dow|Up |Rig| | |Return |
  45. * |-----------------------------------------------------------|
  46. * |Shift | | | | | |McL|McD|McU|McR|Mb1|Mb2 | |
  47. * `-----------------------------------------------------------'
  48. * |Gui|Alt |Sapce |xxxxx|Mb3|
  49. * `-------------------------------------------'
  50. *
  51. * Layer4(semicolon) mouse mode
  52. * ,-----------------------------------------------------------.
  53. * |Esc| | | | | | | | | | | | | | |
  54. * |-----------------------------------------------------------|
  55. * |Tab | | | | | |MwL|MwD|MwU|MwR| | | |Backs|
  56. * |-----------------------------------------------------------|
  57. * |Contro| | | | | |McL|McD|McU|McR|xxx| |Return |
  58. * |-----------------------------------------------------------|
  59. * |Shift | | | | | | |Mb1|Mb2|Mb3| |Shift | |
  60. * `-----------------------------------------------------------'
  61. * |Gui |Alt |Mb1 |Alt |Gui|
  62. * `--------------------------------------------'
  63. *
  64. * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
  65. */
  66. /* keycode sent when Fn key released without using layer keys. */
  67. static const uint8_t PROGMEM FnKey[] = {
  68. KB_NO, // this must be KB_NO. (not used)
  69. KB_NO, // FN_1
  70. KB_RALT, // FN_2
  71. KB_SCOLON, // FN_3
  72. };
  73. static const uint8_t PROGMEM Keymap[][MATRIX_ROWS][MATRIX_COLS] = {
  74. /* plain keymap
  75. {
  76. { KB_2, KB_Q, KB_W, KB_S, KB_A, KB_Z, KB_X, KB_C },
  77. { KB_3, KB_4, KB_R, KB_E, KB_D, KB_F, KB_V, KB_B },
  78. { KB_5, KB_6, KB_Y, KB_T, KB_G, KB_H, KB_N, KB_NO },
  79. { KB_1, KB_ESCAPE, KB_TAB, KB_LCTRL, KB_LSHIFT, KB_LGUI, KB_LALT, KB_SPACE },
  80. { KB_7, KB_8, KB_U, KB_I, KB_K, KB_J, KB_M, KB_NO },
  81. { KB_BSLASH, KB_GRAVE, KB_BSPACE, KB_ENTER, FN_1, KB_RSHIFT, KB_RGUI, KB_RALT },
  82. { KB_9, KB_0, KB_O, KB_P, KB_SCOLON, KB_L, KB_COMMA, KB_NO },
  83. { KB_MINUS, KB_EQUAL, KB_RBRACKET,KB_LBRACKET,KB_QUOTE, KB_SLASH, KB_DOT, KB_NO },
  84. },
  85. */
  86. // 0: default
  87. {
  88. { KB_2, KB_Q, KB_W, KB_S, KB_A, KB_Z, KB_X, KB_C },
  89. { KB_3, KB_4, KB_R, KB_E, KB_D, KB_F, KB_V, KB_B },
  90. { KB_5, KB_6, KB_Y, KB_T, KB_G, KB_H, KB_N, KB_NO },
  91. { KB_1, KB_ESCAPE, KB_TAB, KB_LCTRL, KB_LSHIFT, KB_LGUI, KB_LALT, KB_SPACE },
  92. { KB_7, KB_8, KB_U, KB_I, KB_K, KB_J, KB_M, KB_NO },
  93. { KB_BSLASH, KB_GRAVE, KB_BSPACE, KB_ENTER, FN_1, KB_RSHIFT, KB_RGUI, FN_2 },
  94. { KB_9, KB_0, KB_O, KB_P, FN_3, KB_L, KB_COMMA, KB_NO },
  95. { KB_MINUS, KB_EQUAL, KB_RBRACKET,KB_LBRACKET,KB_QUOTE, KB_SLASH, KB_DOT, KB_NO },
  96. },
  97. // 1: FN_1 HHKB mode(Fn)
  98. {
  99. { KB_F2, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO },
  100. { KB_F3, KB_F4, KB_NO, KB_NO, KB_MUTE, KB_F20, KB_NO, KB_NO },
  101. { KB_F5, KB_F6, KB_NO, KB_NO, KB_NO, KP_ASTERISK,KP_PLUS, KB_NO },
  102. { KB_F1, KB_POWER, KB_CAPSLOCK,KB_LCTRL, KB_LSHIFT, KB_LGUI, KB_LALT, KB_SPACE },
  103. { KB_F7, KB_F8, KB_NO, KB_PSCREEN, KB_HOME, KP_SLASH, KB_MINUS, KB_NO },
  104. { KB_INSERT, KB_DELETE, KB_BSPACE, KP_ENTER, KB_NO, KB_RSHIFT, KB_RGUI, KB_RALT },
  105. { KB_F9, KB_F10, KB_SCKLOCK, KB_BREAK, KB_LEFT, KB_PGUP, KB_END, KB_NO },
  106. { KB_F11, KB_F12, KB_NO, KB_UP, KB_RIGHT, KB_DOWN, KB_PGDOWN, KB_NO },
  107. },
  108. // 2: FN_2 vi mode(RALT)
  109. {
  110. { KB_F2, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO },
  111. { KB_F3, KB_F4, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO },
  112. { KB_F5, KB_F6, KB_HOME, KB_NO, KB_NO, KB_LEFT, MS_LEFT, KB_NO },
  113. { KB_F1, KB_ESCAPE, KB_TAB, KB_LCTRL, KB_LSHIFT, KB_LGUI, KB_LALT, KB_SPACE },
  114. { KB_F7, KB_F8, KB_PGDOWN, KB_PGUP, KB_UP, KB_DOWN, MS_DOWN, KB_NO },
  115. { KB_INSERT, KB_DELETE, KB_BSPACE, KB_ENTER, KB_NO, MS_BTN2, MS_BTN3, KB_NO },
  116. { KB_F9, KB_F10, KB_END, KB_NO, KB_NO, KB_RIGHT, MS_UP, KB_NO },
  117. { KB_F11, KB_F12, MS_WH_UP, MS_WH_DOWN, KB_NO, MS_BTN1, MS_RIGHT, KB_NO },
  118. },
  119. // 3: FN_3 vi mouse mode(SCOLON)
  120. {
  121. { KB_F2, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO },
  122. { KB_F3, KB_F4, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO },
  123. { KB_F5, KB_F6, MS_WH_LEFT, KB_NO, KB_NO, MS_LEFT, KB_NO, KB_NO },
  124. { KB_F1, KB_ESCAPE, KB_TAB, KB_LCTRL, KB_LSHIFT, KB_LGUI, KB_LALT, MS_BTN1 },
  125. { KB_F7, KB_F8, MS_WH_DOWN, MS_WH_UP, MS_UP, MS_DOWN, MS_BTN1, KB_NO },
  126. { KB_NO, KB_NO, KB_BSPACE, KB_ENTER, KB_NO, KB_RSHIFT, KB_RGUI, KB_RALT },
  127. { KB_F9, KB_F10, MS_WH_RIGHT,KB_NO, KB_NO, MS_RIGHT, MS_BTN2, KB_NO },
  128. { KB_F11, KB_F12, KB_NO, KB_NO, KB_NO, KB_NO, MS_BTN3, KB_NO },
  129. },
  130. };
  131. uint8_t get_keycode(int layer, int row, int col)
  132. {
  133. if (row >= MATRIX_ROWS)
  134. return KB_NO;
  135. if (col >= MATRIX_COLS)
  136. return KB_NO;
  137. return pgm_read_byte(&Keymap[layer][row][col]);
  138. }
  139. int get_layer(void) {
  140. // keep modifier state when Fn key pressed
  141. static uint8_t preserved_modifiers = 0;
  142. int layer = 0;
  143. uint8_t modifiers = 0;
  144. for (int row = 0; row < MATRIX_ROWS; row++) {
  145. for (int col = 0; col < MATRIX_ROWS; col++) {
  146. if (matrix[row] & 1<<col) continue; // NOT pressed
  147. uint8_t code = get_keycode(0, row, col);
  148. if (code == FN_1) layer = 1;
  149. else if (code == FN_2) layer = 2;
  150. else if (code == FN_3) layer = 3;
  151. else if (code == FN_4) layer = 4;
  152. else if (KB_LCTRL <= code && code <= KB_RGUI)
  153. modifiers |= 1<<(code & 0x07);
  154. }
  155. }
  156. // TODO: this logic should go anywhere
  157. // TODO: need timeout for key_sent
  158. // send key when Fn key reloeased without used
  159. if (layer != current_layer) {
  160. if (layer == 0 && !key_sent) {
  161. uint8_t code = pgm_read_byte(&FnKey[current_layer]);
  162. if (code) {
  163. // send modifiers when Fn key pressed.
  164. keyboard_modifier_keys = preserved_modifiers;
  165. for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO;
  166. if (KB_LCTRL <= code && code <= KB_RGUI) {
  167. keyboard_modifier_keys |= 1<<(code & 0x07);
  168. } else {
  169. keyboard_keys[0] = code;
  170. }
  171. usb_keyboard_send();
  172. }
  173. }
  174. current_layer = layer;
  175. key_sent = false;
  176. preserved_modifiers = modifiers;
  177. }
  178. return current_layer;
  179. }