2
0

keymap.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #include QMK_KEYBOARD_H
  2. #include "bootloader.h"
  3. #ifdef PROTOCOL_LUFA
  4. #include "lufa.h"
  5. #include "split_util.h"
  6. #endif
  7. #ifdef SSD1306OLED
  8. #include "ssd1306.h"
  9. #endif
  10. extern keymap_config_t keymap_config;
  11. #ifdef RGBLIGHT_ENABLE
  12. //Following line allows macro to read current RGB settings
  13. extern rgblight_config_t rgblight_config;
  14. #endif
  15. extern uint8_t is_master;
  16. // Each layer gets a name for readability, which is then used in the keymap matrix below.
  17. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
  18. // Layer names don't all need to be of the same length, obviously, and you can also skip them
  19. // entirely and just use numbers.
  20. #define _QWERTY 0
  21. #define _LOWER 3
  22. #define _RAISE 4
  23. #define _ADJUST 16
  24. enum custom_keycodes {
  25. QWERTY = SAFE_RANGE,
  26. LOWER,
  27. RAISE,
  28. ADJUST,
  29. BACKLIT,
  30. RGBRST
  31. };
  32. enum macro_keycodes {
  33. KC_SAMPLEMACRO,
  34. };
  35. #define KC______ KC_TRNS
  36. #define KC_XXXXX KC_NO
  37. #define KC_LOWER LOWER
  38. #define KC_RAISE RAISE
  39. #define KC_RST RESET
  40. #define KC_LRST RGBRST
  41. #define KC_LTOG RGB_TOG
  42. #define KC_LHUI RGB_HUI
  43. #define KC_LHUD RGB_HUD
  44. #define KC_LSAI RGB_SAI
  45. #define KC_LSAD RGB_SAD
  46. #define KC_LVAI RGB_VAI
  47. #define KC_LVAD RGB_VAD
  48. #define KC_LMOD RGB_MOD
  49. #define KC_SFCPS SFT_T(KC_CAPS)
  50. #define KC_CTLTB CTL_T(KC_TAB)
  51. #define KC_GUIEI GUI_T(KC_LANG2)
  52. #define KC_ALTKN ALT_T(KC_LANG1)
  53. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  54. [_QWERTY] = LAYOUT_kc( \
  55. //,-----------------------------------------. ,-----------------------------------------.
  56. ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,\
  57. //|------+------+------+------+------+------| |------+------+------+------+------+------|
  58. SFCPS, A, S, D, F, G, H, J, K, L, SCLN, QUOT,\
  59. //|------+------+------+------+------+------| |------+------+------+------+------+------|
  60. CTLTB, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT,\
  61. //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
  62. GUIEI, LOWER, ENT, SPC, RAISE, ALTKN \
  63. //`--------------------' `--------------------'
  64. ),
  65. [_LOWER] = LAYOUT_kc( \
  66. //,-----------------------------------------. ,-----------------------------------------.
  67. GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC,\
  68. //|------+------+------+------+------+------| |------+------+------+------+------+------|
  69. SFCPS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, ENT,\
  70. //|------+------+------+------+------+------| |------+------+------+------+------+------|
  71. CTLTB, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, RSFT,\
  72. //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
  73. GUIEI, LOWER, ENT, SPC, RAISE, ALTKN \
  74. //`--------------------' `--------------------'
  75. ),
  76. [_RAISE] = LAYOUT_kc( \
  77. //,-----------------------------------------. ,-----------------------------------------.
  78. TAB, EXLM, AT, HASH, DLR, PERC, CIRC, AMPR, ASTR, LPRN, RPRN, BSPC,\
  79. //|------+------+------+------+------+------| |------+------+------+------+------+------|
  80. SFCPS, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, MINS, EQL, LCBR, RCBR, PIPE, BSLS,\
  81. //|------+------+------+------+------+------| |------+------+------+------+------+------|
  82. CTLTB, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, UNDS, PLUS, LBRC, RBRC, SLSH, RSFT,\
  83. //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
  84. GUIEI, LOWER, ENT, SPC, RAISE, ALTKN \
  85. //`--------------------' `--------------------'
  86. ),
  87. [_ADJUST] = LAYOUT_kc( \
  88. //,-----------------------------------------. ,-----------------------------------------.
  89. RST, LRST, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
  90. //|------+------+------+------+------+------| |------+------+------+------+------+------|
  91. LTOG, LHUI, LSAI, LVAI, XXXXX, XXXXX, LEFT, DOWN, UP, RIGHT, XXXXX, XXXXX,\
  92. //|------+------+------+------+------+------| |------+------+------+------+------+------|
  93. LMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, BRID, BRIU, VOLD, VOLU, MUTE, XXXXX,\
  94. //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
  95. GUIEI, LOWER, ENT, SPC, RAISE, ALTKN \
  96. //`--------------------' `--------------------'
  97. )
  98. };
  99. int RGB_current_mode;
  100. // Setting ADJUST layer RGB back to default
  101. void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
  102. if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
  103. layer_on(layer3);
  104. } else {
  105. layer_off(layer3);
  106. }
  107. }
  108. void matrix_init_user(void) {
  109. #ifdef RGBLIGHT_ENABLE
  110. RGB_current_mode = rgblight_config.mode;
  111. #endif
  112. //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
  113. #ifdef SSD1306OLED
  114. iota_gfx_init(!has_usb()); // turns on the display
  115. #endif
  116. }
  117. //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
  118. #ifdef SSD1306OLED
  119. // When add source files to SRC in rules.mk, you can use functions.
  120. const char *read_layer_state(void);
  121. const char *read_logo(void);
  122. void set_keylog(uint16_t keycode, keyrecord_t *record);
  123. const char *read_keylog(void);
  124. const char *read_keylogs(void);
  125. // const char *read_mode_icon(bool swap);
  126. // const char *read_host_led_state(void);
  127. // void set_timelog(void);
  128. // const char *read_timelog(void);
  129. void matrix_scan_user(void) {
  130. iota_gfx_task();
  131. }
  132. void matrix_render_user(struct CharacterMatrix *matrix) {
  133. if (is_master) {
  134. // If you want to change the display of OLED, you need to change here
  135. matrix_write_ln(matrix, read_layer_state());
  136. matrix_write_ln(matrix, read_keylog());
  137. matrix_write_ln(matrix, read_keylogs());
  138. //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
  139. //matrix_write_ln(matrix, read_host_led_state());
  140. //matrix_write_ln(matrix, read_timelog());
  141. } else {
  142. matrix_write(matrix, read_logo());
  143. }
  144. }
  145. void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
  146. if (memcmp(dest->display, source->display, sizeof(dest->display))) {
  147. memcpy(dest->display, source->display, sizeof(dest->display));
  148. dest->dirty = true;
  149. }
  150. }
  151. void iota_gfx_task_user(void) {
  152. struct CharacterMatrix matrix;
  153. matrix_clear(&matrix);
  154. matrix_render_user(&matrix);
  155. matrix_update(&display, &matrix);
  156. }
  157. #endif//SSD1306OLED
  158. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  159. if (record->event.pressed) {
  160. #ifdef SSD1306OLED
  161. set_keylog(keycode, record);
  162. #endif
  163. // set_timelog();
  164. }
  165. switch (keycode) {
  166. case LOWER:
  167. if (record->event.pressed) {
  168. layer_on(_LOWER);
  169. update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
  170. } else {
  171. layer_off(_LOWER);
  172. update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
  173. }
  174. return false;
  175. break;
  176. case RAISE:
  177. if (record->event.pressed) {
  178. layer_on(_RAISE);
  179. update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
  180. } else {
  181. layer_off(_RAISE);
  182. update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
  183. }
  184. return false;
  185. break;
  186. case ADJUST:
  187. if (record->event.pressed) {
  188. layer_on(_ADJUST);
  189. } else {
  190. layer_off(_ADJUST);
  191. }
  192. return false;
  193. break;
  194. case RGB_MOD:
  195. #ifdef RGBLIGHT_ENABLE
  196. if (record->event.pressed) {
  197. rgblight_mode(RGB_current_mode);
  198. rgblight_step();
  199. RGB_current_mode = rgblight_config.mode;
  200. }
  201. #endif
  202. return false;
  203. break;
  204. case RGBRST:
  205. #ifdef RGBLIGHT_ENABLE
  206. if (record->event.pressed) {
  207. eeconfig_update_rgblight_default();
  208. rgblight_enable();
  209. RGB_current_mode = rgblight_config.mode;
  210. }
  211. #endif
  212. break;
  213. }
  214. return true;
  215. }