1 #include QMK_KEYBOARD_H
2 #include "bootloader.h"
5 #include "split_util.h"
10 #include "oled_helper.h"
12 extern keymap_config_t keymap_config;
14 #ifdef RGBLIGHT_ENABLE
15 //Following line allows macro to read current RGB settings
16 extern rgblight_config_t rgblight_config;
19 extern uint8_t is_master;
21 // Each layer gets a name for readability, which is then used in the keymap matrix below.
22 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
23 // Layer names don't all need to be of the same length, obviously, and you can also skip them
24 // entirely and just use numbers.
32 enum custom_keycodes {
46 #define KC_LOWER LOWER
47 #define KC_RAISE RAISE
49 #define KC______ KC_TRNS
50 #define KC_XXXXX KC_NO
51 #define KC_KANJI KANJI
54 #define KC_LRST RGBRST
55 #define KC_LTOG RGB_TOG
56 #define KC_LHUI RGB_HUI
57 #define KC_LHUD RGB_HUD
58 #define KC_LSAI RGB_SAI
59 #define KC_LSAD RGB_SAD
60 #define KC_LVAI RGB_VAI
61 #define KC_LVAD RGB_VAD
62 #define KC_LMOD RGB_MOD
63 #define KC_KNRM AG_NORM
64 #define KC_KSWP AG_SWAP
66 #define KC_TBSF LSFT_T(KC_TAB)
67 // #define KC_SPSF LSFT_T(KC_SPC)
68 #define KC_ALAP LALT_T(KC_APP)
70 #define KC_CODO TD(TD_CODO)
71 // #define KC_MNUB TD(TD_MNUB)
73 qk_tap_dance_action_t tap_dance_actions[] = {
74 [TD_CODO] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_DOT),
75 // [TD_MNUB] = ACTION_TAP_DANCE_DOUBLE(KC_MINS, LSFT(KC_RO)),
78 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
79 [_BASE] = LAYOUT_kc( \
80 //,-----------------------------------------. ,-----------------------------------------.
81 ESC, Q, W, E, R, T, Y, U, I, O, P, MINS,\
82 //|------+------+------+------+------+------| |------+------+------+------+------+------|
83 TBSF, A, S, D, F, G, H, J, K, L, UP, ENT,\
84 //|------+------+------+------+------+------| |------+------+------+------+------+------|
85 LCTRL, Z, X, C, V, B, N, M, CODO, LEFT, DOWN, RGHT,\
86 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
87 LGUI, LOWER, BSPC, SPC, RAISE, ALAP \
88 //`--------------------' `--------------------'
91 [_LOWER] = LAYOUT_kc( \
92 //,-----------------------------------------. ,-----------------------------------------.
93 _____, F1, F2, F3, F4, F5, XXXXX, MINS, EQL, JYEN, LBRC, RBRC,\
94 //|------+------+------+------+------+------| |------+------+------+------+------+------|
95 _____, F6, F7, F8, F9, F10, XXXXX, XXXXX, XXXXX, SCLN, QUOT, BSLS,\
96 //|------+------+------+------+------+------| |------+------+------+------+------+------|
97 _____, F11, F12, TAB, KANJI, ENT, XXXXX, XXXXX, COMM, DOT, SLSH, RO,\
98 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
99 _____, _____, DEL, _____, _____, APP \
100 //`--------------------' `--------------------'
103 [_RAISE] = LAYOUT_kc( \
104 //,-----------------------------------------. ,-----------------------------------------.
105 _____, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, PSLS,\
106 //|------+------+------+------+------+------| |------+------+------+------+------+------|
107 _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, QUOT, 4, 5, 6, PPLS, PAST,\
108 //|------+------+------+------+------+------| |------+------+------+------+------+------|
109 _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, 0, 1, 2, 3, DOT, PMNS,\
110 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
111 _____, _____, BSPC, _____, _____, LALT \
112 //`--------------------' `--------------------'
115 [_ADJUST] = LAYOUT_kc( \
116 //,-----------------------------------------. ,-----------------------------------------.
117 _____, RST, LRST, KNRM, KSWP, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
118 //|------+-------+------+------+------+-----| |------+------+------+------+------+------|
119 _____, LTOG, LHUI, LSAI, LVAI, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, PGUP, XXXXX,\
120 //|------+-------+------+------+------+-----| |------+------+------+------+------+------|
121 _____, LMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, HOME, PGDN, END,\
122 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
123 _____, _____, XXXXX, _____, _____, XXXXX \
124 //`--------------------' `--------------------'
129 #define L_LOWER (1<<_LOWER)
130 #define L_RAISE (1<<_RAISE)
131 #define L_ADJUST (1<<_ADJUST)
132 #define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
140 #define LAYER_DISPLAY_MAX 5
141 const LAYER_DISPLAY_NAME layer_display_name[LAYER_DISPLAY_MAX] = {
143 {L_BASE + 1, "Base"},
146 {L_ADJUST_TRI, "Adjust"}
149 static inline const char* get_leyer_status(void) {
151 for (uint8_t i = 0; i < LAYER_DISPLAY_MAX; ++i) {
152 if (layer_state == 0 && layer_display_name[i].state == default_layer_state) {
154 return layer_display_name[i].name;
155 } else if (layer_state != 0 && layer_display_name[i].state == layer_state) {
157 return layer_display_name[i].name;
164 static char layer_status_buf[24] = "Layer state ready.\n";
165 static inline void update_keymap_status(void) {
167 snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "OS:%s Layer:%s\n",
168 keymap_config.swap_lalt_lgui? "win" : "mac", get_leyer_status());
171 static inline void render_keymap_status(struct CharacterMatrix *matrix) {
173 matrix_write(matrix, layer_status_buf);
176 #define UPDATE_KEYMAP_STATUS() update_keymap_status()
177 #define RENDER_KEYMAP_STATUS(a) render_keymap_status(a)
181 #define UPDATE_KEYMAP_STATUS()
182 #define RENDER_KEYMAP_STATUS(a)
186 static inline void update_change_layer(bool pressed, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
188 pressed ? layer_on(layer1) : layer_off(layer1);
189 IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2) ? layer_on(layer3) : layer_off(layer3);
192 int RGB_current_mode;
193 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
195 UPDATE_KEY_STATUS(keycode, record);
200 update_change_layer(record->event.pressed, _LOWER, _RAISE, _ADJUST);
203 update_change_layer(record->event.pressed, _RAISE, _LOWER, _ADJUST);
206 if (record->event.pressed) {
207 if (keymap_config.swap_lalt_lgui == false) {
208 register_code(KC_LANG2);
210 SEND_STRING(SS_LALT("`"));
213 unregister_code(KC_LANG2);
216 #ifdef RGBLIGHT_ENABLE
218 if (record->event.pressed) {
219 rgblight_mode(RGB_current_mode);
221 RGB_current_mode = rgblight_config.mode;
225 if (record->event.pressed) {
226 eeconfig_update_rgblight_default();
228 RGB_current_mode = rgblight_config.mode;
237 UPDATE_KEYMAP_STATUS();
241 void matrix_init_user(void) {
242 #ifdef RGBLIGHT_ENABLE
243 RGB_current_mode = rgblight_config.mode;
245 //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
247 iota_gfx_init(!has_usb()); // turns on the display
251 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
254 void matrix_scan_user(void) {
255 iota_gfx_task(); // this is what updates the display continuously
258 static inline void matrix_update(struct CharacterMatrix *dest,
259 const struct CharacterMatrix *source) {
260 if (memcmp(dest->display, source->display, sizeof(dest->display))) {
261 memcpy(dest->display, source->display, sizeof(dest->display));
266 static inline void render_status(struct CharacterMatrix *matrix) {
269 RENDER_LED_STATUS(matrix);
270 RENDER_KEYMAP_STATUS(matrix);
271 UPDATE_LOCK_STATUS();
272 RENDER_LOCK_STATUS(matrix);
273 RENDER_KEY_STATUS(matrix);
276 void iota_gfx_task_user(void) {
277 struct CharacterMatrix matrix;
285 matrix_clear(&matrix);
287 render_status(&matrix);
289 RENDER_LOGO(&matrix);
292 matrix_update(&display, &matrix);