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 11KB

13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
13 jaren geleden
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /*
  2. * Keymap for PFU HHKB Pro
  3. */
  4. #include <stdbool.h>
  5. #include <avr/pgmspace.h>
  6. #include "usb_keyboard.h"
  7. #include "usb_keycodes.h"
  8. #include "matrix.h"
  9. #include "keymap.h"
  10. #include "print.h"
  11. #include "debug.h"
  12. #define FN_KEYCODE(fn) (pgm_read_byte(&fn_keycode[(fn)]))
  13. #define FN_LAYER(fn) (pgm_read_byte(&fn_layer[(fn)]))
  14. #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
  15. #define KEYMAP( \
  16. R3C1, R3C0, R0C0, R1C0, R1C1, R2C0, R2C1, R4C0, R4C1, R6C0, R6C1, R7C0, R7C1, R5C0, R5C1, \
  17. R3C2, R0C1, R0C2, R1C3, R1C2, R2C3, R2C2, R4C2, R4C3, R6C2, R6C3, R7C3, R7C2, R5C2, \
  18. R3C3, R0C4, R0C3, R1C4, R1C5, R2C4, R2C5, R4C5, R4C4, R6C5, R6C4, R7C4, R5C3, \
  19. R3C4, R0C5, R0C6, R0C7, R1C6, R1C7, R2C6, R4C6, R6C6, R7C6, R7C5, R5C5, R5C4, \
  20. R3C5, R3C6, R3C7, R5C7, R5C6 \
  21. ) \
  22. { \
  23. { R0C0, R0C1, R0C2, R0C3, R0C4, R0C5, R0C6, R0C7 }, \
  24. { R1C0, R1C1, R1C2, R1C3, R1C4, R1C5, R1C6, R1C7 }, \
  25. { R2C0, R2C1, R2C2, R2C3, R2C4, R2C5, R2C6, KB_NO }, \
  26. { R3C0, R3C1, R3C2, R3C3, R3C4, R3C5, R3C6, R3C7 }, \
  27. { R4C0, R4C1, R4C2, R4C3, R4C4, R4C5, R4C6, KB_NO }, \
  28. { R5C0, R5C1, R5C2, R5C3, R5C4, R5C5, R5C6, R5C7 }, \
  29. { R6C0, R6C1, R6C2, R6C3, R6C4, R6C5, R6C6, KB_NO }, \
  30. { R7C0, R7C1, R7C2, R7C3, R7C4, R7C5, R7C6, KB_NO } \
  31. }
  32. static int onbit(uint8_t bits);
  33. static int current_layer = 0;
  34. static bool layer_used = false;
  35. /* layer to change into while Fn key pressed */
  36. static const int PROGMEM fn_layer[] = { 0, 1, 2, 3, 4, 0, 0, 0 };
  37. /* keycode to sent when Fn key released without using layer keys. */
  38. static const uint8_t PROGMEM fn_keycode[] = {
  39. KB_NO, // FN_0 [NOT USED]
  40. KB_NO, // FN_1 layer 1
  41. KB_QUOTE, // FN_2 layer 2
  42. KB_SCOLON, // FN_3 layer 3
  43. KB_SPACE, // FN_4 layer 4 [NOT USED]
  44. KB_NO, // FN_5 [NOT USED]
  45. KB_NO, // FN_6 [NOT USED]
  46. KB_NO // FN_7 [NOT USED]
  47. };
  48. static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  49. /* Layer 0: Default Layer
  50. * ,-----------------------------------------------------------.
  51. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|
  52. * |-----------------------------------------------------------|
  53. * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs|
  54. * |-----------------------------------------------------------|
  55. * |Contro| A| S| D| F| G| H| J| K| L|Fn3|Fn2|Return |
  56. * |-----------------------------------------------------------|
  57. * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn1|
  58. * `-----------------------------------------------------------'
  59. * |Gui|Alt |Space |Alt |Gui|
  60. * `-------------------------------------------'
  61. */
  62. KEYMAP(KB_ESC, KB_1, KB_2, KB_3, KB_4, KB_5, KB_6, KB_7, KB_8, KB_9, KB_0, KB_MINS,KB_EQL, KB_BSLS,KB_GRV, \
  63. KB_TAB, KB_Q, KB_W, KB_E, KB_R, KB_T, KB_Y, KB_U, KB_I, KB_O, KB_P, KB_LBRC,KB_RBRC,KB_BSPC, \
  64. KB_LCTL,KB_A, KB_S, KB_D, KB_F, KB_G, KB_H, KB_J, KB_K, KB_L, FN_3, FN_2, KB_ENT, \
  65. KB_LSFT,KB_Z, KB_X, KB_C, KB_V, KB_B, KB_N, KB_M, KB_COMM,KB_DOT, KB_SLSH,KB_RSFT,FN_1, \
  66. KB_LGUI,KB_LALT,KB_SPC, KB_RALT,KB_RGUI),
  67. /* Layer 1: HHKB mode (HHKB Fn)
  68. * ,-----------------------------------------------------------.
  69. * |Pow| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  70. * |-----------------------------------------------------------|
  71. * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs|
  72. * |-----------------------------------------------------------|
  73. * |Contro| | | | | | *| /|Hom|PgU|Lef|Rig|Enter |
  74. * |-----------------------------------------------------------|
  75. * |Shift | | | | | | +| -|End|PgD|Dow|Shift |xxx|
  76. * `-----------------------------------------------------------'
  77. * |Gui |Alt |Space |Alt |Gui|
  78. * `--------------------------------------------'
  79. */
  80. KEYMAP(KB_PWR, KB_F1, KB_F2, KB_F3, KB_F4, KB_F5, KB_F6, KB_F7, KB_F8, KB_F9, KB_F10, KB_F11, KB_F12, KB_INS, KB_DEL, \
  81. KB_CAPS,KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_PSCR,KB_SLCK,KB_BRK, KB_UP, KB_NO, KB_BSPC, \
  82. KB_LCTL,KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KP_ASTR,KP_SLSH,KB_HOME,KB_PGUP,KB_LEFT,KB_RGHT,KB_ENT, \
  83. KB_LSFT,KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KP_PLUS,KP_MINS,KB_END, KB_PGDN,KB_DOWN,KB_RSFT,FN_1, \
  84. KB_LGUI,KB_LALT,KB_SPC, KB_RALT,KB_RGUI),
  85. /* Layer 2: Vi mode (Quote/Rmeta)
  86. * ,-----------------------------------------------------------.
  87. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  88. * |-----------------------------------------------------------|
  89. * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs|
  90. * |-----------------------------------------------------------|
  91. * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| |xxx|Return |
  92. * |-----------------------------------------------------------|
  93. * |Shift | | | | | | | | | | |Shift | |
  94. * `-----------------------------------------------------------'
  95. * |Gui|Alt |Sapce |Alt |Gui|
  96. * `-------------------------------------------'
  97. */
  98. KEYMAP(KB_ESC, KB_F1, KB_F2, KB_F3, KB_F4, KB_F5, KB_F6, KB_F7, KB_F8, KB_F9, KB_F10, KB_F11, KB_F12, KB_INS, KB_DEL, \
  99. KB_TAB, KB_HOME,KB_PGDN,KB_UP, KB_PGUP,KB_END, KB_HOME,KB_PGDN,KB_PGUP,KB_END, KB_NO, KB_NO, KB_NO, KB_BSPC, \
  100. KB_LCTL,KB_NO, KB_LEFT,KB_DOWN,KB_RGHT,KB_NO, KB_LEFT,KB_DOWN,KB_UP, KB_RGHT,KB_NO, FN_2, KB_ENT, \
  101. KB_LSFT,KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_RSFT,KB_NO, \
  102. KB_LGUI,KB_LALT,KB_SPC, KB_RALT,KB_RGUI),
  103. /* Layer 3: Mouse mode (Semicolon)
  104. * ,-----------------------------------------------------------.
  105. * |Esc| | | | | | | | | | | | | | |
  106. * |-----------------------------------------------------------|
  107. * |Tab |MwL|MwU|McU|MwD|MwL|MwR|MwD|MwU|MwR| | | |Backs|
  108. * |-----------------------------------------------------------|
  109. * |Contro| |McL|McD|McR| |McL|McD|McU|McR|xxx| |Return |
  110. * |-----------------------------------------------------------|
  111. * |Shift | | | | | |Mb2|Mb1|Mb2|Mb3| |Shift | |
  112. * `-----------------------------------------------------------'
  113. * |Gui |Alt |Mb1 |Alt |Gui|
  114. * `--------------------------------------------'
  115. * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
  116. */
  117. KEYMAP(KB_ESC, KB_F1, KB_F2, KB_F3, KB_F4, KB_F5, KB_F6, KB_F7, KB_F8, KB_F9, KB_F10, KB_F11, KB_F12, KB_INS, KB_DEL, \
  118. KB_TAB, MS_WH_L,MS_WH_U,MS_UP, MS_WH_D,MS_WH_R,MS_WH_L,MS_WH_D,MS_WH_U,MS_WH_R,KB_NO, KB_NO, KB_NO, KB_BSPC, \
  119. KB_LCTL,KB_NO, MS_LEFT,MS_DOWN,MS_RGHT,KB_NO, MS_LEFT,MS_DOWN,MS_UP, MS_RGHT,FN_3, KB_NO, KB_ENT, \
  120. KB_LSFT,KB_NO, MS_DOWN,KB_NO, KB_NO, KB_NO, MS_BTN2,MS_BTN1,MS_BTN2,MS_BTN3,KB_NO, KB_RSFT,KB_NO, \
  121. KB_LGUI,KB_LALT,MS_BTN1,KB_RALT,KB_RGUI),
  122. /* Layer 4: Matias half keyboard style (Space)
  123. * ,-----------------------------------------------------------.
  124. * | -| 0| 9| 8| 7| 6| 5| 4| 3| 2| 1| | | |Esc|
  125. * |-----------------------------------------------------------|
  126. * |Backs| P| O| I| U| Y| T| R| E| W| Q| | |Tab |
  127. * |-----------------------------------------------------------|
  128. * |Contro| ;| L| K| J| H| G| F| D| S| A|Con|Control |
  129. * |-----------------------------------------------------------|
  130. * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | |
  131. * `-----------------------------------------------------------'
  132. * |Gui |Alt |xxxxxxxxxxxxxxxxxxxxxxx|Alt |Gui|
  133. * `--------------------------------------------'
  134. */
  135. KEYMAP(KB_MINS,KB_0, KB_9, KB_8, KB_7, KB_6, KB_5, KB_4, KB_3, KB_2, KB_1, KB_NO, KB_NO, KB_NO, KB_ESC, \
  136. KB_BSPC,KB_P, KB_O, KB_I, KB_U, KB_Y, KB_T, KB_R, KB_E, KB_W, KB_Q, KB_NO, KB_NO, KB_TAB, \
  137. KB_LCTL,KB_SCLN,KB_L, KB_K, KB_J, KB_H, KB_G, KB_F, KB_D, KB_S, KB_A, KB_RCTL,KB_RCTL, \
  138. KB_LSFT,KB_SLSH,KB_DOT, KB_COMM,KB_M, KB_N, KB_B, KB_V, KB_C, KB_X, KB_Z, KB_RSFT,KB_NO, \
  139. KB_LGUI,KB_LALT,FN_4, KB_RALT,KB_RGUI)
  140. };
  141. uint8_t keymap_get_keycode(int row, int col)
  142. {
  143. return keymap_get_keycodel(current_layer, row, col);
  144. }
  145. uint8_t keymap_get_keycodel(int layer, int row, int col)
  146. {
  147. uint8_t code = KEYCODE(layer, row, col);
  148. // normal key or mouse key
  149. if (IS_KEY(code) || IS_MOUSE(code))
  150. layer_used = true;
  151. return code;
  152. }
  153. inline
  154. int keymap_get_layer(void)
  155. {
  156. return current_layer;
  157. }
  158. inline
  159. int keymap_set_layer(int layer)
  160. {
  161. current_layer = layer;
  162. return current_layer;
  163. }
  164. inline
  165. bool keymap_is_special_mode(int fn_bits)
  166. {
  167. return (keyboard_modifier_keys == (BIT_LCTRL | BIT_LSHIFT | BIT_LALT | BIT_LGUI));
  168. }
  169. void keymap_fn_proc(int fn_bits)
  170. {
  171. // layer switching
  172. static int last_bits = 0;
  173. static uint8_t last_mod = 0;
  174. if (usb_keyboard_has_key() || fn_bits == last_bits) {
  175. // do nothing during press other than Fn key
  176. return;
  177. } else if (fn_bits == 0) {
  178. // send key when Fn key is released without using the layer
  179. if (!layer_used) {
  180. uint8_t code = FN_KEYCODE(onbit(last_bits));
  181. if (code != KB_NO) {
  182. if (IS_MOD(code)) {
  183. keyboard_modifier_keys = last_mod | 1<<(code & 0x07);
  184. } else {
  185. keyboard_keys[0] = code;
  186. keyboard_modifier_keys = last_mod;
  187. }
  188. usb_keyboard_send();
  189. usb_keyboard_print();
  190. usb_keyboard_clear();
  191. }
  192. }
  193. last_bits = 0;
  194. last_mod = 0;
  195. layer_used = false;
  196. keymap_set_layer(0); // default layer
  197. } else if ((fn_bits & (fn_bits - 1)) == 0) {
  198. // switch layer when just one Fn Key is pressed
  199. last_bits = fn_bits;
  200. last_mod = keyboard_modifier_keys;
  201. layer_used = false;
  202. keymap_set_layer(FN_LAYER(onbit(fn_bits)));
  203. debug("layer: "); phex(current_layer); debug("(");
  204. debug_bin(last_bits); debug(")\n");
  205. debug("last_mod: "); debug_hex(last_mod); debug("\n");
  206. }
  207. }
  208. static int onbit(uint8_t bits)
  209. {
  210. int n = 0;
  211. if (bits >> 4) { bits >>= 4; n += 4;}
  212. if (bits >> 2) { bits >>= 2; n += 2;}
  213. if (bits >> 1) { bits >>= 1; n += 1;}
  214. return n;
  215. }