keymap.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #include QMK_KEYBOARD_H
  2. #ifdef PROTOCOL_LUFA
  3. #include "lufa.h"
  4. #include "split_util.h"
  5. #endif
  6. #ifdef SSD1306OLED
  7. #include "ssd1306.h"
  8. #endif
  9. extern keymap_config_t keymap_config;
  10. extern uint8_t is_master;
  11. // Each layer gets a name for readability, which is then used in the keymap matrix below.
  12. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
  13. // Layer names don't all need to be of the same length, obviously, and you can also skip them
  14. // entirely and just use numbers.
  15. enum custom_keycodes {
  16. QWERTY = SAFE_RANGE,
  17. LOWER,
  18. RAISE
  19. };
  20. enum macro_keycodes {
  21. KC_SAMPLEMACRO,
  22. };
  23. // common
  24. #define KC_ KC_TRNS
  25. #define KC_XXXX KC_NO
  26. #define KC_RST RESET
  27. #define KC_VD KC__VOLDOWN
  28. #define KC_VU KC__VOLUP
  29. // layer
  30. #define KC_L_SPC LT(_LOWER, KC_SPC)
  31. #define KC_R_ENT LT(_RAISE, KC_ENT)
  32. // shift_t
  33. #define KC_S_TAB LSFT_T(KC_TAB)
  34. #define KC_S_ESC LSFT_T(KC_ESC)
  35. #define KC_S_JA LSFT_T(KC_LANG1)
  36. #define KC_S_EN LSFT_T(KC_LANG2)
  37. // cmd_t
  38. #define KC_M_F LCMD_T(KC_F)
  39. #define KC_M_D LCMD_T(KC_D)
  40. #define KC_M_J LCMD_T(KC_J)
  41. #define KC_M_K LCMD_T(KC_K)
  42. // ctl_t
  43. #define KC_C_S LCTL_T(KC_S)
  44. #define KC_C_L LCTL_T(KC_L)
  45. #define KC_C_BS LCTL_T(KC_BSPC)
  46. // alt_t
  47. #define KC_A_D ALT_T(KC_D)
  48. #define KC_A_K ALT_T(KC_K)
  49. #define KC_A_Z ALT_T(KC_Z)
  50. #define KC_A_SL ALT_T(KC_SLSH)
  51. #define KC_A_DEL ALT_T(KC_DEL)
  52. // cmd+shift_t
  53. #define KC_MS_Q SCMD_T(KC_Q)
  54. #define KC_MS_A SCMD_T(KC_A)
  55. #define KC_MS_S SCMD_T(KC_S)
  56. #define KC_MS_SC SCMD_T(KC_SCLN)
  57. #define KC_MS_ESC SCMD_T(KC_ESC)
  58. //
  59. #define KC_MR RCMD(KC_R)
  60. #define KC_MF RCMD(KC_F)
  61. #define KC_MW RCMD(KC_W)
  62. #define KC_MX RCMD(KC_X)
  63. #define KC_MC RCMD(KC_C)
  64. #define KC_MV RCMD(KC_V)
  65. #define KC_MTAB RCMD(KC_TAB)
  66. #define KC_MSF RCMD(RSFT(KC_F))
  67. #define KC_MSR RCMD(RSFT(KC_R))
  68. #define KC_MST RCMD(RSFT(KC_T))
  69. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  70. // M_ = LCMD_T(
  71. // A_ = ALT_T(
  72. // C_ = LCTL_T(
  73. // MS_ = SMD_T(
  74. // R_ = LT(_RAISE
  75. // L_ = LT(_LOWER
  76. [_QWERTY] = LAYOUT_kc( \
  77. //,----+----+----+----+----+----. ,----+----+----+----+----+----.
  78. ESC , Q , W , E , R , T , Y , U , I , O , P ,MINS,
  79. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  80. S_TAB, A ,C_S , D ,M_F , G , H ,M_J , K ,C_L ,SCLN,S_ESC,
  81. //|----+----+----+----+----+----+ |----+----+----+----+----+----|
  82. , Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, ,
  83. //`----+----+----+----+----+----/ \----+----+----+----+----+----'
  84. A_DEL,S_EN,L_SPC,C_BS, C_BS,R_ENT,S_JA,A_DEL
  85. // `----+----+----+----' `----+----+----+----'
  86. ),
  87. // \ ^ ! & | @ = + * % -
  88. // ( # $ " ' ~ ← ↓ ↑ → ` )
  89. // { [ ] }
  90. [_RAISE] = LAYOUT_kc( \
  91. //,----+----+----+----+----+----. ,----+----+----+----+----+----.
  92. ,BSLS,CIRC,EXLM,AMPR,PIPE, AT ,EQL ,PLUS,ASTR,PERC,MINS,
  93. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  94. LPRN,HASH,DLR ,DQT ,QUOT,TILD, LEFT,DOWN, UP ,RGHT,GRV ,RPRN,
  95. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  96. , , , ,LCBR,LBRC, RBRC,RCBR, , , , ,
  97. //`----+----+----+----+----+----/ \----+----+----+----+----+----'
  98. , ,BSPC, , , , ,RST
  99. // `----+----+----+----' `----+----+----+----'
  100. ),
  101. [_LOWER] = LAYOUT_kc( \
  102. //,----+----+----+----+----+----. ,----+----+----+----+----+----.
  103. , , ,MSF ,MSR ,MST , ,EQL ,PLUS,ASTR,PERC,MINS,
  104. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  105. , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , ,
  106. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  107. , , , , , , , ,COMM,DOT ,SLSH, ,
  108. //`----+----+----+--+-+----+----/ \----+----+----+----+----+----'
  109. RST , , , , ,DEL , ,
  110. // `----+----+----+----' `----+----+----+----'
  111. ),
  112. };
  113. void matrix_init_user(void) {
  114. //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
  115. #ifdef SSD1306OLED
  116. iota_gfx_init(!has_usb()); // turns on the display
  117. #endif
  118. }
  119. //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
  120. #ifdef SSD1306OLED
  121. // When add source files to SRC in rules.mk, you can use functions.
  122. const char *read_layer_state(void);
  123. const char *read_logo(void);
  124. void set_keylog(uint16_t keycode, keyrecord_t *record);
  125. const char *read_keylog(void);
  126. const char *read_keylogs(void);
  127. // const char *read_mode_icon(bool swap);
  128. // const char *read_host_led_state(void);
  129. // void set_timelog(void);
  130. // const char *read_timelog(void);
  131. void matrix_scan_user(void) {
  132. iota_gfx_task();
  133. }
  134. void matrix_render_user(struct CharacterMatrix *matrix) {
  135. if (is_master) {
  136. // If you want to change the display of OLED, you need to change here
  137. matrix_write_ln(matrix, read_layer_state());
  138. matrix_write_ln(matrix, read_keylog());
  139. matrix_write_ln(matrix, read_keylogs());
  140. //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
  141. //matrix_write_ln(matrix, read_host_led_state());
  142. //matrix_write_ln(matrix, read_timelog());
  143. } else {
  144. matrix_write(matrix, read_logo());
  145. }
  146. }
  147. void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
  148. if (memcmp(dest->display, source->display, sizeof(dest->display))) {
  149. memcpy(dest->display, source->display, sizeof(dest->display));
  150. dest->dirty = true;
  151. }
  152. }
  153. void iota_gfx_task_user(void) {
  154. struct CharacterMatrix matrix;
  155. matrix_clear(&matrix);
  156. matrix_render_user(&matrix);
  157. matrix_update(&display, &matrix);
  158. }
  159. #endif//SSD1306OLED
  160. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  161. if (record->event.pressed) {
  162. #ifdef SSD1306OLED
  163. set_keylog(keycode, record);
  164. #endif
  165. // set_timelog();
  166. }
  167. switch (keycode) {
  168. case QWERTY:
  169. if (record->event.pressed) {
  170. set_single_persistent_default_layer(_QWERTY);
  171. }
  172. return false;
  173. break;
  174. case LOWER:
  175. if (record->event.pressed) {
  176. layer_on(_LOWER);
  177. } else {
  178. layer_off(_LOWER);
  179. }
  180. return false;
  181. break;
  182. case RAISE:
  183. if (record->event.pressed) {
  184. layer_on(_RAISE);
  185. } else {
  186. layer_off(_RAISE);
  187. }
  188. return false;
  189. break;
  190. }
  191. return true;
  192. }