keymap.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. // this is the style you want to emulate.
  2. // This is the canonical layout file for the Quantum project. If you want to add another keyboard,
  3. #include QMK_KEYBOARD_H
  4. #include "keymap_jis2us.h"
  5. #include "action_pseudo_lut.h"
  6. #include "keymap_jp.h"
  7. #ifdef SSD1306OLED
  8. #include "ssd1306.h"
  9. #endif
  10. // Each layer gets a name for readability, which is then used in the keymap matrix below.
  11. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
  12. // Layer names don't all need to be of the same length, obviously, and you can also skip them
  13. // entirely and just use numbers.
  14. enum comet46_layers {
  15. _QWERTY,
  16. _LOWER,
  17. _RAISE,
  18. _PSEUDO_US,
  19. _PSEUDO_US_LOWER,
  20. _PSEUDO_US_RAISE,
  21. _ADJUST
  22. };
  23. enum custom_keycodes {
  24. QWERTY = SAFE_RANGE,
  25. PSEUDO_US,
  26. JIS2US,
  27. };
  28. // JIS keycodes
  29. #define KC_JZHT JP_ZHTG // hankaku/zenkaku|kanzi
  30. #define KC_JCIR JP_CIRC // ^, ~
  31. #define KC_JAT JP_AT // @, `
  32. #define KC_JLBR JP_LBRC // [, {
  33. #define KC_JCOL JP_COLN // :, *
  34. #define KC_JRBR JP_RBRC // ], }
  35. #define KC_JBSL JP_BSLS // \, _
  36. #define KC_JMHE JP_MHEN // muhenkan
  37. #define KC_JHEN JP_HENK // henkan
  38. #define KC_JKAN JP_KANA // katakana/hiragana|ro-mazi
  39. #define KC_JMKA JP_MKANA //kana on MacOSX
  40. #define KC_JMEI JP_MEISU //eisu on MacOSX
  41. #define KC_JAMP JP_AMPR // &
  42. #define KC_JQUO JP_QUOT // '
  43. #define KC_JLPR JP_LPRN // (
  44. #define KC_JRPR JP_RPRN // )
  45. #define KC_JEQL JP_EQL // =
  46. #define KC_JTIL JP_TILD // ~
  47. #define KC_JPIP JP_PIPE // |
  48. #define KC_JGRV JP_GRV // `
  49. #define KC_JLCB JP_LCBR // {
  50. #define KC_JPLU JP_PLUS // +
  51. #define KC_JAST JP_ASTR // *
  52. #define KC_JRCB JP_RCBR // }
  53. #define KC_JUND JP_UNDS // _
  54. // Layer related keycodes
  55. #define KC_LWR MO(_LOWER)
  56. #define KC_RSE MO(_RAISE)
  57. #define KC_P_LW MO(_PSEUDO_US_LOWER)
  58. #define KC_P_RS MO(_PSEUDO_US_RAISE)
  59. #define KC_QWRT QWERTY
  60. #define KC_P_US PSEUDO_US
  61. #define KC_J2US JIS2US
  62. // Special keycodes
  63. #define KC_SPCT CTL_T(KC_SPC)
  64. #define KC_ENSF SFT_T(KC_ENT)
  65. #define KC_CAEC MT(MOD_LCTL | MOD_LALT, KC_ESC)
  66. #define KC_CSTB C_S_T(KC_TAB)
  67. #define KC_IMON ALT_T(KC_F13)
  68. #define KC_IMOF GUI_T(KC_F14)
  69. #define KC_CAD LCA(KC_DEL)
  70. #define KC_RST RESET
  71. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  72. [_QWERTY] = LAYOUT(
  73. //,----+----+----+----+----+----+ +----+----+----+----+----+----.
  74. KC_CAEC, KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P ,KC_DEL ,
  75. //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
  76. KC_CSTB, KC_A , KC_S , KC_D , KC_F , KC_G ,KC_LPRN, KC_RPRN, KC_H , KC_J , KC_K , KC_L ,KC_SCLN,KC_BSPC,
  77. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  78. KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B ,KC_LBRC, KC_RBRC, KC_N , KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_QUOT,
  79. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  80. KC_IMOF,KC_LWR ,KC_SPCT, KC_ENSF,KC_RSE ,KC_IMON
  81. // +----+----+---/ \---+----+----+
  82. ),
  83. [_LOWER] = LAYOUT(
  84. //,----+----+----+----+----+----+ +----+----+----+----+----+----.
  85. _______,KC_EXLM, KC_AT ,KC_HASH,KC_DLR ,KC_PERC, KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,_______,
  86. //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
  87. _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_GRV ,KC_BSLS,KC_MINS,KC_EQL ,KC_LBRC,KC_RBRC,_______,
  88. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  89. _______, KC_F7 , KC_F8 , KC_F9 , KC_F10, KC_F11, KC_F12, KC_TILD,KC_PIPE,KC_UNDS,KC_PLUS,KC_LCBR,KC_RCBR,_______,
  90. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  91. _______,_______,_______, _______,_______,_______
  92. // +----+----+---/ \---+----+----+
  93. ),
  94. [_RAISE] = LAYOUT(
  95. //,----+----+----+----+----+----+ +----+----+----+----+----+----.
  96. _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 ,_______,
  97. //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
  98. _______,_______,_______,_______,_______,_______,_______, XXXXXXX,KC_LEFT,KC_DOWN, KC_UP ,KC_RGHT,KC_END ,_______,
  99. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  100. _______,_______,_______,_______,_______,_______,_______, KC_HOME,XXXXXXX,KC_PGDN,KC_PGUP,XXXXXXX,XXXXXXX,_______,
  101. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  102. _______,_______,_______, _______,_______,_______
  103. // +----+----+---/ \---+----+----+
  104. ),
  105. [_PSEUDO_US] = LAYOUT(
  106. //,----+----+----+----+----+----+ +----+----+----+----+----+----.
  107. KC_CAEC, KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P ,KC_DEL ,
  108. //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
  109. KC_CSTB, KC_A , KC_S , KC_D , KC_F , KC_G ,KC_JLPR, KC_JRPR, KC_H , KC_J , KC_K , KC_L ,KC_J2US,KC_BSPC,
  110. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  111. KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B ,KC_J2US, KC_J2US, KC_N , KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_J2US,
  112. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  113. KC_IMOF,KC_P_LW,KC_SPCT, KC_ENSF,KC_P_RS,KC_IMON
  114. // +----+----+---/ \---+----+----+
  115. ),
  116. [_PSEUDO_US_LOWER] = LAYOUT(
  117. //,----+----+----+----+----+----+ +----+----+----+----+----+----.
  118. _______,KC_EXLM,KC_JAT ,KC_HASH,KC_DLR ,KC_PERC, KC_JCIR,KC_JAMP,KC_JAST,KC_JLPR,KC_JRPR,_______,
  119. //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
  120. _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_JGRV,KC_JBSL,KC_MINS,KC_JEQL,KC_JLBR,KC_JRBR,_______,
  121. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  122. _______, KC_F7 , KC_F8 , KC_F9 , KC_F10, KC_F11, KC_F12, KC_JTIL,KC_JPIP,KC_JUND,KC_JPLU,KC_JLCB,KC_JRCB,_______,
  123. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  124. _______,_______,_______, _______,_______,_______
  125. // +----+----+---/ \---+----+----+
  126. ),
  127. [_PSEUDO_US_RAISE] = LAYOUT(
  128. //,----+----+----+----+----+----+ +----+----+----+----+----+----.
  129. _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 ,_______,
  130. //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
  131. _______,_______,_______,_______,_______,_______,KC_JZHT, XXXXXXX,KC_LEFT,KC_DOWN, KC_UP ,KC_RGHT,KC_END ,_______,
  132. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  133. _______,_______,_______,_______,_______,_______,_______, KC_HOME,XXXXXXX,KC_PGDN,KC_PGUP,XXXXXXX,XXXXXXX,_______,
  134. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  135. _______,_______,_______, _______,_______,_______
  136. // +----+----+---/ \---+----+----+
  137. ),
  138. [_ADJUST] = LAYOUT(
  139. //,----+----+----+----+----+----+ +----+----+----+----+----+----.
  140. _______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
  141. //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
  142. _______,_______,_______,_______,_______,_______,KC_CAD , KC_QWRT,_______,_______,_______,_______,_______,_______,
  143. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  144. _______,_______,_______,_______,_______,_______,KC_RST , KC_P_US,_______,_______,_______,_______,_______,_______,
  145. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  146. _______,_______,_______, _______,_______,_______
  147. // +----+----+---/ \---+----+----+
  148. )
  149. };
  150. uint32_t layer_state_set_user(uint32_t state) {
  151. switch (biton32(state)) {
  152. case _PSEUDO_US_LOWER:
  153. case _PSEUDO_US_RAISE:
  154. return update_tri_layer_state(state, _PSEUDO_US_RAISE, _PSEUDO_US_LOWER, _ADJUST);
  155. break;
  156. default:
  157. return update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
  158. break;
  159. }
  160. }
  161. //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
  162. #ifdef SSD1306OLED
  163. // You need to add source files to SRC in rules.mk when using OLED display functions
  164. void set_keylog(uint16_t keycode);
  165. const char *read_keylog(void);
  166. const char *read_modifier_state(void);
  167. const char *read_host_led_state(void);
  168. void matrix_init_user(void) {
  169. iota_gfx_init(false); // turns on the display
  170. }
  171. void matrix_scan_user(void) {
  172. iota_gfx_task(); // this is what updates the display continuously
  173. }
  174. void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
  175. if (memcmp(dest->display, source->display, sizeof(dest->display))) {
  176. memcpy(dest->display, source->display, sizeof(dest->display));
  177. dest->dirty = true;
  178. }
  179. }
  180. void render_status(struct CharacterMatrix *matrix) {
  181. // Layer state
  182. char layer_str[22];
  183. matrix_write(matrix, "Layer: ");
  184. uint8_t layer = biton32(layer_state);
  185. uint8_t default_layer = biton32(eeconfig_read_default_layer());
  186. switch (layer) {
  187. case _QWERTY:
  188. switch (default_layer) {
  189. case _QWERTY:
  190. snprintf(layer_str, sizeof(layer_str), "Qwerty");
  191. break;
  192. case _PSEUDO_US:
  193. snprintf(layer_str, sizeof(layer_str), "Psuedo_US");
  194. break;
  195. default:
  196. snprintf(layer_str, sizeof(layer_str), "Undef-%d", default_layer);
  197. break;
  198. }
  199. break;
  200. case _RAISE:
  201. snprintf(layer_str, sizeof(layer_str), "Raise");
  202. break;
  203. case _LOWER:
  204. snprintf(layer_str, sizeof(layer_str), "Lower");
  205. break;
  206. case _PSEUDO_US_RAISE:
  207. snprintf(layer_str, sizeof(layer_str), "P_US_Raise");
  208. break;
  209. case _PSEUDO_US_LOWER:
  210. snprintf(layer_str, sizeof(layer_str), "P_US_Lower");
  211. break;
  212. case _ADJUST:
  213. snprintf(layer_str, sizeof(layer_str), "Adjust");
  214. break;
  215. default:
  216. snprintf(layer_str, sizeof(layer_str), "Undef-%d", layer);
  217. }
  218. matrix_write_ln(matrix, layer_str);
  219. // Last entered keycode
  220. matrix_write_ln(matrix, read_keylog());
  221. // Modifier state
  222. matrix_write_ln(matrix, read_modifier_state());
  223. // Host Keyboard LED Status
  224. matrix_write(matrix, read_host_led_state());
  225. }
  226. void iota_gfx_task_user(void) {
  227. struct CharacterMatrix matrix;
  228. #if DEBUG_TO_SCREEN
  229. if (debug_enable) {
  230. return;
  231. }
  232. #endif
  233. matrix_clear(&matrix);
  234. render_status(&matrix);
  235. matrix_update(&display, &matrix);
  236. }
  237. #endif//SSD1306OLED
  238. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  239. #ifdef SSD1306OLED
  240. if (record->event.pressed) {
  241. set_keylog(keycode);
  242. }
  243. #endif
  244. switch (keycode) {
  245. case QWERTY:
  246. if (record->event.pressed) {
  247. set_single_persistent_default_layer(_QWERTY);
  248. }
  249. break;
  250. case PSEUDO_US:
  251. if (record->event.pressed) {
  252. set_single_persistent_default_layer(_PSEUDO_US);
  253. }
  254. break;
  255. case JIS2US:
  256. action_pseudo_lut(record, _QWERTY, keymap_jis2us);
  257. break;
  258. }
  259. return true;
  260. }