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

11 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
11 years ago
11 years ago
13 years ago
13 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /*
  2. Copyright 2011,2012,2013 Jun Wako <[email protected]>
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. /*
  15. * Keymap for PFU HHKB Pro
  16. */
  17. #include <stdint.h>
  18. #include <stdbool.h>
  19. #include <avr/pgmspace.h>
  20. #include "host.h"
  21. #include "keycode.h"
  22. #include "print.h"
  23. #include "debug.h"
  24. #include "util.h"
  25. #include "action.h"
  26. #include "keymap.h"
  27. // Convert physical keyboard layout to matrix array.
  28. // This is a macro to define keymap easily in keyboard layout form.
  29. #define KEYMAP( \
  30. K31, K30, K00, K10, K11, K20, K21, K40, K41, K60, K61, K70, K71, K50, K51, \
  31. K32, K01, K02, K13, K12, K23, K22, K42, K43, K62, K63, K73, K72, K52, \
  32. K33, K04, K03, K14, K15, K24, K25, K45, K44, K65, K64, K74, K53, \
  33. K34, K05, K06, K07, K16, K17, K26, K46, K66, K76, K75, K55, K54, \
  34. K35, K36, K37, K57, K56 \
  35. ) \
  36. { \
  37. { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
  38. { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
  39. { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_NO }, \
  40. { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \
  41. { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_NO }, \
  42. { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \
  43. { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_NO }, \
  44. { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_NO } \
  45. }
  46. static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  47. /* Layer 0: Default Layer
  48. * ,-----------------------------------------------------------.
  49. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|
  50. * |-----------------------------------------------------------|
  51. * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs|
  52. * |-----------------------------------------------------------|
  53. * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return |
  54. * |-----------------------------------------------------------|
  55. * |Shift | Z| X| C| V| B| N| M| ,| .|Fn2|Shift |Fn1|
  56. * `-----------------------------------------------------------'
  57. * |Gui|Alt |Fn5 |Alt |Fn4|
  58. * `-------------------------------------------'
  59. */
  60. KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \
  61. TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \
  62. FN6, A, S, D, F, G, H, J, K, L, FN3, QUOT,FN7, \
  63. FN8, Z, X, C, V, B, N, M, COMM,DOT, FN2, FN12,FN10, \
  64. LGUI,LALT, FN5, RALT,FN4),
  65. /* Layer 1: HHKB mode (HHKB Fn)
  66. * ,-----------------------------------------------------------.
  67. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  68. * |-----------------------------------------------------------|
  69. * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs|
  70. * |-----------------------------------------------------------|
  71. * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter |
  72. * |-----------------------------------------------------------|
  73. * |Shift | | | | | | +| -|End|PgD|Dow|Shift |Fn0|
  74. * `-----------------------------------------------------------'
  75. * |Gui |Alt |Space |Alt |xxx|
  76. * `--------------------------------------------'
  77. */
  78. KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
  79. CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, BSPC, \
  80. LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \
  81. LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN10, \
  82. LGUI,LALT, SPC, RALT,RGUI),
  83. /* Layer 2: Vi mode (Slash)
  84. * ,-----------------------------------------------------------.
  85. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  86. * |-----------------------------------------------------------|
  87. * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs|
  88. * |-----------------------------------------------------------|
  89. * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return |
  90. * |-----------------------------------------------------------|
  91. * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | |
  92. * `-----------------------------------------------------------'
  93. * |Gui|Alt |Space |Alt |Gui|
  94. * `-------------------------------------------'
  95. */
  96. KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
  97. TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \
  98. LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \
  99. LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN0, RSFT,NO, \
  100. LGUI,LALT, SPC, RALT,RGUI),
  101. /* Layer 3: Mouse mode (Semicolon)
  102. * ,-----------------------------------------------------------.
  103. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  104. * |-----------------------------------------------------------|
  105. * |Tab |MwL|MwU|McU|MwD|MwR|MwL|MwD|MwU|MwR| | | |Backs|
  106. * |-----------------------------------------------------------|
  107. * |Contro| |McL|McD|McR| |McL|McD|McU|McR|Fn0| |Return |
  108. * |-----------------------------------------------------------|
  109. * |Shift |Mb4|Mb5|Mb1|Mb2|Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | |
  110. * `-----------------------------------------------------------'
  111. * |Gui |Alt |Mb1 |Alt |Fn0|
  112. * `--------------------------------------------'
  113. * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
  114. */
  115. KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
  116. TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \
  117. LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, QUOT,ENT, \
  118. LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,NO, \
  119. LGUI,LALT, BTN1, RALT,FN0),
  120. /* Layer 4: Matias half keyboard style (Space)
  121. * ,-----------------------------------------------------------.
  122. * | -| 0| 9| 8| 7| 6| 5| 4| 3| 2| 1| | | |Esc|
  123. * |-----------------------------------------------------------|
  124. * |Backs| P| O| I| U| Y| T| R| E| W| Q| | |Tab |
  125. * |-----------------------------------------------------------|
  126. * |Contro| ;| L| K| J| H| G| F| D| S| A|Con|Control |
  127. * |-----------------------------------------------------------|
  128. * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | |
  129. * `-----------------------------------------------------------'
  130. * |Gui |Alt | Fn0 |Alt |Gui|
  131. * `--------------------------------------------'
  132. */
  133. KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \
  134. BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \
  135. LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \
  136. LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \
  137. LGUI,LALT, FN0, RALT,RGUI),
  138. /* Layer5: another Mouse mode (Space) */
  139. KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
  140. TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \
  141. LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, NO, ENT, \
  142. LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \
  143. LGUI,LALT, FN0, RALT,RGUI),
  144. };
  145. /* id for user defined functions */
  146. enum function_id {
  147. LSHIFT_LPAREN,
  148. RSHIFT_RPAREN,
  149. };
  150. /*
  151. * Fn action definition
  152. */
  153. static const uint16_t PROGMEM fn_actions[] = {
  154. ACTION_LAYER_RETURN_DEFAULT, // FN0
  155. ACTION_LAYER_SET(1), // FN1
  156. ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // FN2
  157. ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // FN3
  158. ACTION_LAYER_SET(3), // FN4
  159. ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // FN5
  160. ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC), // FN6
  161. ACTION_RMOD_TAP_KEY(KC_RCTL, KC_ENT), // FN7
  162. ACTION_LMOD_ONESHOT(KC_LSFT), // FN8 Oneshot Shift
  163. ACTION_LAYER_SET_ON_RELEASED_TAP_TOGGLE(1), // FN9
  164. ACTION_LAYER_BIT_TAP_KEY(1, KC_GRV), // FN10
  165. //ACTION_LAYER_BIT(1), // FN10
  166. //ACTION_LAYER_BIT_TAP_TOGGLE(1), // FN10
  167. ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // FN11
  168. ACTION_FUNCTION_TAP(RSHIFT_RPAREN), // FN12
  169. };
  170. /*
  171. * user defined action function
  172. */
  173. void keymap_call_function(keyrecord_t *record, uint8_t id)
  174. {
  175. keyevent_t event = record->event;
  176. uint8_t tap_count = record->tap_count;
  177. debug("action_call_function: ");
  178. if (event.pressed) debug("pressed"); else debug("released");
  179. debug(" id: "); debug_hex(id);
  180. debug(" tap_count: "); debug_dec(tap_count);
  181. debug("\n");
  182. switch (id) {
  183. case LSHIFT_LPAREN:
  184. // LShft + tap '('
  185. if (event.pressed) {
  186. if (tap_count == 0) {
  187. add_mods(MOD_BIT(KC_LSHIFT));
  188. } else {
  189. if (waiting_buffer_has_anykey_pressed()) {
  190. // ad hoc: set 0 to cancel tap
  191. record->tap_count = 0;
  192. add_mods(MOD_BIT(KC_LSHIFT));
  193. } else {
  194. // NOTE to avoid conflicting command key bind(LShift+RShift)
  195. //register_code(KC_LSHIFT);
  196. //register_code(KC_9);
  197. host_add_mods(MOD_BIT(KC_LSHIFT));
  198. host_add_key(KC_9);
  199. host_send_keyboard_report();
  200. }
  201. }
  202. } else {
  203. if (tap_count == 0) {
  204. del_mods(MOD_BIT(KC_LSHIFT));
  205. } else {
  206. //unregister_code(KC_9);
  207. //unregister_code(KC_LSHIFT);
  208. host_del_mods(MOD_BIT(KC_LSHIFT));
  209. host_del_key(KC_9);
  210. host_send_keyboard_report();
  211. }
  212. }
  213. break;
  214. case RSHIFT_RPAREN:
  215. // RShift + tap ')'
  216. if (event.pressed) {
  217. if (tap_count == 0) {
  218. add_mods(MOD_BIT(KC_RSHIFT));
  219. } else {
  220. if (waiting_buffer_has_anykey_pressed()) {
  221. // ad hoc: set 0 to cancel tap
  222. record->tap_count = 0;
  223. add_mods(MOD_BIT(KC_RSHIFT));
  224. } else {
  225. //register_code(KC_RSHIFT);
  226. //register_code(KC_0);
  227. host_add_mods(MOD_BIT(KC_RSHIFT));
  228. host_add_key(KC_0);
  229. host_send_keyboard_report();
  230. }
  231. }
  232. } else {
  233. if (tap_count == 0) {
  234. del_mods(MOD_BIT(KC_RSHIFT));
  235. } else {
  236. //unregister_code(KC_0);
  237. //unregister_code(KC_RSHIFT);
  238. host_del_mods(MOD_BIT(KC_RSHIFT));
  239. host_del_key(KC_0);
  240. host_send_keyboard_report();
  241. }
  242. }
  243. break;
  244. }
  245. }
  246. /* convert keycode to action */
  247. action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) {
  248. uint8_t key = (pgm_read_byte(&keymaps[(layer)][(row)][(col)]));
  249. action_t action;
  250. switch (key) {
  251. case KC_A ... KC_EXSEL:
  252. action.code = ACTION_KEY(key);
  253. break;
  254. case KC_LCTRL ... KC_LGUI:
  255. action.code = ACTION_LMOD(key);
  256. break;
  257. case KC_RCTRL ... KC_RGUI:
  258. action.code = ACTION_RMOD(key);
  259. break;
  260. case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE:
  261. action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key));
  262. break;
  263. case KC_AUDIO_MUTE ... KC_WWW_FAVORITES:
  264. action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(key));
  265. break;
  266. case KC_MS_UP ... KC_MS_ACCEL2:
  267. action.code = ACTION_MOUSEKEY(key);
  268. break;
  269. case KC_FN0 ... KC_FN31:
  270. if (FN_INDEX(key) < sizeof(fn_actions) / sizeof(fn_actions[0])) {
  271. action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]);
  272. } else {
  273. action.code = ACTION_NO;
  274. }
  275. break;
  276. case KC_NO ... KC_UNDEFINED:
  277. default:
  278. action.code = ACTION_NO;
  279. break;
  280. }
  281. return action;
  282. }