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

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
13 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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 uint16_t PROGMEM fn_actions[] = {
  47. ACTION_LAYER_TO_DEFAULT_ON_RELEASED, // Fn0
  48. ACTION_LAYER_SET_ON_PRESSED(1), // Fn1
  49. ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // Fn2
  50. ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // Fn3
  51. //ACTION_LAYER_SET_ON_PRESSED(3), // Fn4
  52. ACTION_FUNCTION(0x01, 0xA), // Fn4
  53. ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // Fn5
  54. ACTION_LMODS_TAP(MOD_BIT(KC_LCTL), KC_BSPC), // Fn6
  55. ACTION_RMODS_TAP(MOD_BIT(KC_RCTL), KC_ENT), // Fn7
  56. ACTION_LMODS_TAP(MOD_BIT(KC_LSFT), ONE_SHOT), // Fn8
  57. ACTION_LAYER_SET_ON_RELEASED_TAP_TOGGLE(1), // Fn9
  58. ACTION_LAYER_BIT_TAP_TOGGLE(1), // Fn10
  59. };
  60. static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  61. /* Layer 0: Default Layer
  62. * ,-----------------------------------------------------------.
  63. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|
  64. * |-----------------------------------------------------------|
  65. * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs|
  66. * |-----------------------------------------------------------|
  67. * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return |
  68. * |-----------------------------------------------------------|
  69. * |Shift | Z| X| C| V| B| N| M| ,| .|Fn2|Shift |Fn1|
  70. * `-----------------------------------------------------------'
  71. * |Gui|Alt |Fn5 |Alt |Fn4|
  72. * `-------------------------------------------'
  73. */
  74. KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \
  75. TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \
  76. FN6, A, S, D, F, G, H, J, K, L, FN3, QUOT,FN7, \
  77. FN8, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN10, \
  78. LGUI,LALT, FN5, RALT,FN4),
  79. /* Layer 1: HHKB mode (HHKB Fn)
  80. * ,-----------------------------------------------------------.
  81. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  82. * |-----------------------------------------------------------|
  83. * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs|
  84. * |-----------------------------------------------------------|
  85. * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter |
  86. * |-----------------------------------------------------------|
  87. * |Shift | | | | | | +| -|End|PgD|Dow|Shift |Fn0|
  88. * `-----------------------------------------------------------'
  89. * |Gui |Alt |Space |Alt |xxx|
  90. * `--------------------------------------------'
  91. */
  92. KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
  93. CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, BSPC, \
  94. LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \
  95. LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN10, \
  96. LGUI,LALT, SPC, RALT,RGUI),
  97. /* Layer 2: Vi mode (Slash)
  98. * ,-----------------------------------------------------------.
  99. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  100. * |-----------------------------------------------------------|
  101. * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs|
  102. * |-----------------------------------------------------------|
  103. * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return |
  104. * |-----------------------------------------------------------|
  105. * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | |
  106. * `-----------------------------------------------------------'
  107. * |Gui|Alt |Space |Alt |Gui|
  108. * `-------------------------------------------'
  109. */
  110. KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
  111. TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \
  112. LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \
  113. LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN0, RSFT,NO, \
  114. LGUI,LALT, SPC, RALT,RGUI),
  115. /* Layer 3: Mouse mode (Semicolon)
  116. * ,-----------------------------------------------------------.
  117. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  118. * |-----------------------------------------------------------|
  119. * |Tab |MwL|MwU|McU|MwD|MwR|MwL|MwD|MwU|MwR| | | |Backs|
  120. * |-----------------------------------------------------------|
  121. * |Contro| |McL|McD|McR| |McL|McD|McU|McR|Fn0| |Return |
  122. * |-----------------------------------------------------------|
  123. * |Shift |Mb4|Mb5|Mb1|Mb2|Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | |
  124. * `-----------------------------------------------------------'
  125. * |Gui |Alt |Mb1 |Alt |Fn0|
  126. * `--------------------------------------------'
  127. * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
  128. */
  129. KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
  130. TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \
  131. LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, QUOT,ENT, \
  132. LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,NO, \
  133. LGUI,LALT, BTN1, RALT,FN0),
  134. /* Layer 4: Matias half keyboard style (Space)
  135. * ,-----------------------------------------------------------.
  136. * | -| 0| 9| 8| 7| 6| 5| 4| 3| 2| 1| | | |Esc|
  137. * |-----------------------------------------------------------|
  138. * |Backs| P| O| I| U| Y| T| R| E| W| Q| | |Tab |
  139. * |-----------------------------------------------------------|
  140. * |Contro| ;| L| K| J| H| G| F| D| S| A|Con|Control |
  141. * |-----------------------------------------------------------|
  142. * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | |
  143. * `-----------------------------------------------------------'
  144. * |Gui |Alt | Fn0 |Alt |Gui|
  145. * `--------------------------------------------'
  146. */
  147. KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \
  148. BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \
  149. LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \
  150. LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \
  151. LGUI,LALT, FN0, RALT,RGUI),
  152. /* Layer5: another Mouse mode (Space) */
  153. KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
  154. TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \
  155. LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, NO, ENT, \
  156. LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \
  157. LGUI,LALT, FN0, RALT,RGUI),
  158. };
  159. #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
  160. /* legacy interface */
  161. uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) { return 0; }
  162. uint8_t keymap_fn_layer(uint8_t fn_bits) { return 0; }
  163. uint8_t keymap_fn_keycode(uint8_t fn_bits) { return 0; }
  164. action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) {
  165. /* convert from legacy keycode to action */
  166. uint8_t key = KEYCODE(layer, row, col);
  167. action_t action;
  168. switch (key) {
  169. case KC_A ... KC_EXSEL:
  170. case KC_LCTRL ... KC_LGUI:
  171. case KC_RCTRL ... KC_RGUI:
  172. action.code = ACTION_KEY(key);
  173. break;
  174. case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE:
  175. action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key));
  176. break;
  177. case KC_AUDIO_MUTE ... KC_WWW_FAVORITES:
  178. action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(key));
  179. break;
  180. case KC_MS_UP ... KC_MS_ACCEL2:
  181. action.code = ACTION_MOUSEKEY(key);
  182. break;
  183. /* TODO
  184. case KC_LCTRL ... KC_LGUI:
  185. action.code = ACTION_LMODS(MOD_BIT(key));
  186. break;
  187. case KC_RCTRL ... KC_RGUI:
  188. action.code = ACTION_RMODS(MOD_BIT(key)>>4);
  189. break;
  190. */
  191. case KC_FN0 ... FN_MAX:
  192. if (FN_INDEX(key) < sizeof(fn_actions) / sizeof(fn_actions[0])) {
  193. action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]);
  194. } else {
  195. action.code = ACTION_NO;
  196. }
  197. break;
  198. case KC_NO ... KC_UNDEFINED:
  199. default:
  200. action.code = ACTION_NO;
  201. break;
  202. }
  203. return action;
  204. }
  205. // TODO: how to define action function
  206. void action_call_function(keyevent_t event, uint8_t id)
  207. {
  208. // '(' Shift+9
  209. if (event.pressed) {
  210. register_code(KC_LSHIFT);
  211. register_code(KC_9);
  212. debug("action_call_function: pressed: id: "); debug_hex(id); debug("\n");
  213. } else {
  214. unregister_code(KC_9);
  215. unregister_code(KC_LSHIFT);
  216. debug("action_call_function: released: id: "); debug_hex(id); debug("\n");
  217. }
  218. }