1 #include QMK_KEYBOARD_H
3 #include "bootloader.h"
6 #include "split_util.h"
12 // * If you want to recognize that you pressed the Adjust key with the Lower / Raise key you can enable this comment out. However, the binary size may be over. *
13 // #define ADJUST_MACRO_ENABLE
15 // * If you want to use the Kana key you can enable this comment out. However, the binary size may be over. *
16 // #define KANA_ENABLE
18 extern keymap_config_t keymap_config;
20 #ifdef RGBLIGHT_ENABLE
21 //Following line allows macro to read current RGB settings
22 extern rgblight_config_t rgblight_config;
25 extern uint8_t is_master;
27 // Each layer gets a name for readability, which is then used in the keymap matrix below.
28 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
29 // Layer names don't all need to be of the same length, obviously, and you can also skip them
30 // entirely and just use numbers.
41 enum custom_keycodes {
50 #define DL_BAS DF(_BASE)
51 #define DL_BASE DF(_BAS_E)
52 #define ML_LOW MO(_LOWER)
53 #define ML_LOWE MO(_LOW_E)
54 #define ML_RAI MO(_RAISE)
55 #define ML_RAIE MO(_RAI_E)
56 #define ML_ADJ MO(_ADJUST)
59 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
61 * ,-----------------------------------------. ,-----------------------------------------.
62 * | Esc | 1! | 2" | 3# | 4$ | 5% | | 6& | 7' | 8( | 9) | 0 | -= |
63 * |------+------+------+------+------+------| |------+------+------+------+------+------|
64 * | KANJI| Q | W | E | R | T | | Y | U | I | O | P | @` |
65 * |------+------+------+------+------+------| |------+------+------+------+------+------|
66 * | Tab | A | S | D | F | G | | H | J | K | L | ;+ | :* |
67 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
68 * | Shift| Z | X | C | V | B | N | B | N | M | ,< | .> | Up |Enter |
69 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
70 * | Ctrl | GUI | Alt |Adjust|Lower |Space |Bksp |Space |Space |Raise | APP | Left | Down |Right |
71 * `-------------------------------------------------------------------------------------------------'
74 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, \
75 JP_ZHTG, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, \
76 KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_COLN, \
77 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENT, \
78 KC_LCTL, KC_LALT, KC_LGUI, ML_ADJ, ML_LOW, KC_SPC, KC_BSPC, KC_SPC, KC_SPC, ML_RAI, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT \
81 /* Qwerty JIS Exchange L and R
82 * ,-----------------------------------------. ,-----------------------------------------.
83 * | 6& | 7' | 8( | 9) | 0 | -= | | Esc | 1! | 2" | 3# | 4$ | 5% |
84 * |------+------+------+------+------+------| |------+------+------+------+------+------|
85 * | Y | U | I | O | P | @` | | Tab | Q | W | E | R | T |
86 * |------+------+------+------+------+------| |------+------+------+------+------+------|
87 * | H | J | K | L | ;+ | :* | | | A | S | D | F | G |
88 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
89 * | N | M | ,< | .> | /? | Up |Enter |KANJI | Shift| Z | X | C | V | B |
90 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
91 * |Space |Raise | }] | APP | Left | Down |Right |Adjust| Ctrl | GUI | Alt | [{ |Lower | Bksp |
92 * `-------------------------------------------------------------------------------------------------'
95 KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, \
96 KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, \
97 KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_COLN, XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, \
98 KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_ENT, JP_ZHTG, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, \
99 KC_SPC, ML_RAIE, JP_RBRC, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT, ML_ADJ, KC_LCTL, KC_LALT, KC_LGUI, JP_LBRC, ML_LOWE, KC_BSPC \
103 * ,-----------------------------------------. ,-----------------------------------------.
104 * | | | | | | | | | | | -= | ^~ | \| |
105 * |------+------+------+------+------+------| |------+------+------+------+------+------|
106 * | | | | | | | | | | | | @` | [{ |
107 * |------+------+------+------+------+------| |------+------+------+------+------+------|
108 * | | | | | | | | | | | ;+ | :* | ]} |
109 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
110 * | | | | | | | | | | | ,< | .> | /? | \_ |
111 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
112 * | | | | | | | Del | | | | | | | |
113 * `-------------------------------------------------------------------------------------------------'
116 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, JP_CIRC, JP_YEN, \
117 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, JP_AT, JP_LBRC, \
118 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SCLN, JP_COLN, JP_RBRC, \
119 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, JP_BSLS, \
120 _______, _______, _______, _______, XXXXXXX, XXXXXXX, KC_DEL, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
123 /* Lower JIS Exchange L and R
124 * ,-----------------------------------------. ,-----------------------------------------.
125 * | | | | -= | ^~ | \| | | | | | | | |
126 * |------+------+------+------+------+------| |------+------+------+------+------+------|
127 * | | | | | @` | [{ | | | | | | | |
128 * |------+------+------+------+------+------| |------+------+------+------+------+------|
129 * | | | | ;+ | :* | ]} | | | | | | | |
130 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
131 * | | ,< | .> | /? | \_ |PageUp| | | | | | | | |
132 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
133 * | | | | | Home |PageDn| End | | | | | | | Del |
134 * `-------------------------------------------------------------------------------------------------'
137 _______, XXXXXXX, XXXXXXX, KC_MINS, JP_CIRC, JP_YEN, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
138 _______, XXXXXXX, XXXXXXX, XXXXXXX, JP_AT, JP_LBRC, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
139 _______, XXXXXXX, XXXXXXX, KC_SCLN, JP_COLN, JP_RBRC, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
140 _______, KC_COMM, KC_DOT, KC_SLSH, JP_BSLS, KC_PGUP, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
141 _______, _______, XXXXXXX, _______, KC_HOME, KC_PGDN, KC_END, _______, _______, _______, _______, XXXXXXX, _______, KC_DEL \
145 * ,-----------------------------------------. ,-----------------------------------------.
146 * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
147 * |------+------+------+------+------+------| |------+------+------+------+------+------|
148 * | | | | | | | | |MsWhL |MsWhU | Home |PageUp| F12 |
149 * |------+------+------+------+------+------| |------+------+------+------+------+------|
150 * | | | | | | | | |MsWhR |MsWhD | End |PageDn| |
151 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
152 * | | | | | | | | | | |MsBtn1|MsBtn2| MsUp | |
153 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
154 * | | | | | | | | | | | |MsLeft|MsDown|MsRght|
155 * `-------------------------------------------------------------------------------------------------'
158 _______, KC_F1 , KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, \
159 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, KC_F12, \
160 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXXXX, \
161 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, KC_MS_U, XXXXXXX, \
162 _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R \
165 /* Raise JIS Exchange L and R
166 * ,-----------------------------------------. ,-----------------------------------------.
167 * | F6 | F7 | F8 | F9 | F10 | F11 | | | F1 | F2 | F3 | F4 | F5 |
168 * |------+------+------+------+------+------| |------+------+------+------+------+------|
169 * | | | |MsWhL |MsWhU | F12 | | | | | | | |
170 * |------+------+------+------+------+------| |------+------+------+------+------+------|
171 * | | | |MsWhR |MsWhD | | | | | | | | |
172 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
173 * | | | |MsBtn1|MsBtn2| MsUp | | | | | | | | |
174 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
175 * | | | | |MsLeft|MsDown|MsRght| | | | | | | |
176 * `-------------------------------------------------------------------------------------------------'
179 KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_F1 , KC_F2, KC_F3, KC_F4, KC_F5, \
180 XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_F12, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
181 XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
182 XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, KC_MS_U, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
183 _______, _______, XXXXXXX, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, XXXXXXX, _______, XXXXXXX \
186 /* Adjust (Lower + Raise) Common map for Normal and Exchange
187 * ,-----------------------------------------. ,-----------------------------------------.
188 * | | Reset|RGBRST| | | | | | Reset|RGBRST| | | |
189 * |------+------+------+------+------+------| |------+------+------+------+------+------|
190 * | |ModNrm|ModExc| Mac | Win | | | |ModNrm|ModExc| Mac | Win | |
191 * |------+------+------+------+------+------| |------+------+------+------+------|------+
192 * | |RGB ON| HUE+ | SAT+ | VAL+ | | | |RGB ON| HUE+ | SAT+ | VAL+ | |
193 * |------+------+------+------+------+------+------+------+------+------+------+------+------|------+
194 * | | MODE | HUE- | SAT- | VAL- | | | | | MODE | HUE- | SAT- | VAL- | |
195 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
196 * | | | | | | | | | | | | | | |
197 * `-------------------------------------------------------------------------------------------------'
199 [_ADJUST] = LAYOUT( \
200 XXXXXXX, RESET, RGBRST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, RGBRST, XXXXXXX, XXXXXXX, XXXXXXX, \
201 XXXXXXX, DL_BAS, DL_BASE, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, DL_BAS, DL_BASE, AG_NORM, AG_SWAP, XXXXXXX, \
202 XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, \
203 XXXXXXX, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, \
204 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
209 #error "undefined keymaps"
213 char keylog[24] = {};
214 const char code_to_name[60] = {
215 ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
216 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
217 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
218 '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
219 'R', 'E', 'B', 'T', ' ', '-', ' ', '@', ' ', ' ',
220 ' ', ';', ':', ' ', ',', '.', '/', ' ', ' ', ' '};
222 static inline void set_keylog(uint16_t keycode, keyrecord_t *record)
225 uint8_t leds = host_keyboard_leds();
229 name = code_to_name[keycode];
233 snprintf(keylog, sizeof(keylog), "\n%dx%d %2x %c %c %c %c",
234 record->event.key.row,
235 record->event.key.col,
238 (leds & (1<<USB_LED_NUM_LOCK)) ? 'N' : ' ',
239 (leds & (1<<USB_LED_CAPS_LOCK)) ? 'C' : ' ',
240 (leds & (1<<USB_LED_SCROLL_LOCK)) ? 'S' : ' '
245 #ifdef RGBLIGHT_ENABLE
246 #define RGBLIGHT(mode) rgblight_mode(mode)
248 #define RGBLIGHT(mode)
251 // define variables for reactive RGB
252 int RGB_current_mode;
253 #ifdef ADJUST_MACRO_ENABLE
254 // Setting ADJUST layer RGB back to default
255 void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
256 if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
257 RGBLIGHT(RGB_current_mode);
263 #define ADJUST_MACRO(layer1, layer2, layer3) update_tri_layer_RGB(layer1, layer2, layer3)
265 #define ADJUST_MACRO(layer1, layer2, layer3)
268 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
270 if (record->event.pressed) {
271 set_keylog(keycode, record);
276 #ifdef RGBLIGHT_ENABLE
277 //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
279 if (record->event.pressed) {
280 rgblight_mode(RGB_current_mode);
282 RGB_current_mode = rgblight_config.mode;
288 if (record->event.pressed) {
289 if (keymap_config.swap_lalt_lgui==false) {
290 register_code(KC_LANG2);
292 SEND_STRING(SS_LALT("`"));
295 unregister_code(KC_LANG2);
299 if (record->event.pressed) {
300 if(keymap_config.swap_lalt_lgui==false){
301 register_code(KC_LANG1);
303 SEND_STRING(SS_LALT("`"));
306 unregister_code(KC_LANG1);
310 #ifdef RGBLIGHT_ENABLE
312 if (record->event.pressed) {
313 eeconfig_update_rgblight_default();
315 RGB_current_mode = rgblight_config.mode;
326 void matrix_init_user(void) {
327 #ifdef RGBLIGHT_ENABLE
328 RGB_current_mode = rgblight_config.mode;
330 //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
332 iota_gfx_init(!has_usb()); // turns on the display
336 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
339 void matrix_scan_user(void) {
340 iota_gfx_task(); // this is what updates the display continuously
343 static inline void matrix_update(struct CharacterMatrix *dest,
344 const struct CharacterMatrix *source) {
345 if (memcmp(dest->display, source->display, sizeof(dest->display))) {
346 memcpy(dest->display, source->display, sizeof(dest->display));
351 //assign the right code to your layers for OLED display
353 #define L_LOWER (1<<_LOWER)
354 #define L_RAISE (1<<_RAISE)
355 #define L_ADJUST (1<<_ADJUST)
356 #define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
357 #define L_LOW_E (1<<_LOW_E)
358 #define L_RAI_E (1<<_RAI_E)
359 #define L_ADJUST_TRIE (L_ADJUST|L_RAI_E|L_LOW_E)
361 const char helix_logo[]={
362 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
363 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
364 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,
367 static inline void render_logo(struct CharacterMatrix *matrix) {
369 matrix_write(matrix, helix_logo);
372 const char mac_win_logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}};
374 static inline void render_status(struct CharacterMatrix *matrix) {
377 // Render to mode icon
378 if(keymap_config.swap_lalt_lgui==false){
379 matrix_write(matrix, mac_win_logo[0][0]);
380 matrix_write_P(matrix, PSTR("\n"));
381 matrix_write(matrix, mac_win_logo[0][1]);
383 matrix_write(matrix, mac_win_logo[1][0]);
384 matrix_write_P(matrix, PSTR("\n"));
385 matrix_write(matrix, mac_win_logo[1][1]);
388 #ifdef RGBLIGHT_ENABLE
389 snprintf(buf, sizeof(buf), " LED mode:%d", (short)RGB_current_mode);
390 matrix_write(matrix, buf);
393 // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below
394 matrix_write_P(matrix, PSTR("\nLayer: "));
395 switch (layer_state) {
397 matrix_write_P(matrix, default_layer_state == (1UL<<_BAS_E) ? PSTR("BaseEx") : PSTR("Base"));
400 matrix_write_P(matrix, PSTR("Raise"));
403 matrix_write_P(matrix, PSTR("RaiseEx"));
406 matrix_write_P(matrix, PSTR("Lower"));
409 matrix_write_P(matrix, PSTR("LowerEx"));
414 matrix_write_P(matrix, PSTR("Adjust"));
417 snprintf(buf, sizeof(buf), "%d", (short)layer_state);
418 matrix_write(matrix, buf);
421 matrix_write(matrix, keylog);
424 void iota_gfx_task_user(void) {
425 struct CharacterMatrix matrix;
433 matrix_clear(&matrix);
435 render_status(&matrix);
437 render_logo(&matrix);
440 matrix_update(&display, &matrix);