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 {
49 // Fillers to make layering more clear
50 #define _______ KC_TRNS
54 #define DL_BAS DF(_BASE)
55 #define DL_BASE DF(_BAS_E)
56 #define ML_LOW MO(_LOWER)
57 #define ML_LOWE MO(_LOW_E)
58 #define ML_RAI MO(_RAISE)
59 #define ML_RAIE MO(_RAI_E)
60 #define ML_ADJ MO(_ADJUST)
63 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
65 * ,-----------------------------------------. ,-----------------------------------------.
66 * | Esc | 1! | 2" | 3# | 4$ | 5% | | 6& | 7' | 8( | 9) | 0 | -= |
67 * |------+------+------+------+------+------| |------+------+------+------+------+------|
68 * | KANJI| Q | W | E | R | T | | Y | U | I | O | P | @` |
69 * |------+------+------+------+------+------| |------+------+------+------+------+------|
70 * | Tab | A | S | D | F | G | | H | J | K | L | ;+ | :* |
71 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
72 * | Shift| Z | X | C | V | B | N | B | N | M | ,< | .> | Up |Enter |
73 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
74 * | Ctrl | GUI | Alt |Adjust|Lower |Space |Bksp |Space |Space |Raise | APP | Left | Down |Right |
75 * `-------------------------------------------------------------------------------------------------'
78 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, \
79 JP_ZHTG, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, \
80 KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_COLN, \
81 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, \
82 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 \
85 /* Qwerty JIS Exchange L and R
86 * ,-----------------------------------------. ,-----------------------------------------.
87 * | 6& | 7' | 8( | 9) | 0 | -= | | Esc | 1! | 2" | 3# | 4$ | 5% |
88 * |------+------+------+------+------+------| |------+------+------+------+------+------|
89 * | Y | U | I | O | P | @` | | Tab | Q | W | E | R | T |
90 * |------+------+------+------+------+------| |------+------+------+------+------+------|
91 * | H | J | K | L | ;+ | :* | | | A | S | D | F | G |
92 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
93 * | N | M | ,< | .> | /? | Up |Enter |KANJI | Shift| Z | X | C | V | B |
94 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
95 * |Space |Raise | }] | APP | Left | Down |Right |Adjust| Ctrl | GUI | Alt | [{ |Lower | Bksp |
96 * `-------------------------------------------------------------------------------------------------'
99 KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, \
100 KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, \
101 KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_COLN, XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, \
102 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, \
103 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 \
107 * ,-----------------------------------------. ,-----------------------------------------.
108 * | | | | | | | | | | | -= | ^~ | \| |
109 * |------+------+------+------+------+------| |------+------+------+------+------+------|
110 * | | | | | | | | | | | | @` | [{ |
111 * |------+------+------+------+------+------| |------+------+------+------+------+------|
112 * | | | | | | | | | | | ;+ | :* | ]} |
113 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
114 * | | | | | | | | | | | ,< | .> | /? | \_ |
115 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
116 * | | | | | | | Del | | | | | | | |
117 * `-------------------------------------------------------------------------------------------------'
120 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, JP_CIRC, JP_YEN, \
121 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, JP_AT, JP_LBRC, \
122 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SCLN, JP_COLN, JP_RBRC, \
123 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, JP_BSLS, \
124 _______, _______, _______, _______, XXXXXXX, XXXXXXX, KC_DEL, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
127 /* Lower JIS Exchange L and R
128 * ,-----------------------------------------. ,-----------------------------------------.
129 * | | | | -= | ^~ | \| | | | | | | | |
130 * |------+------+------+------+------+------| |------+------+------+------+------+------|
131 * | | | | | @` | [{ | | | | | | | |
132 * |------+------+------+------+------+------| |------+------+------+------+------+------|
133 * | | | | ;+ | :* | ]} | | | | | | | |
134 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
135 * | | ,< | .> | /? | \_ |PageUp| | | | | | | | |
136 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
137 * | | | | | Home |PageDn| End | | | | | | | Del |
138 * `-------------------------------------------------------------------------------------------------'
141 _______, XXXXXXX, XXXXXXX, KC_MINS, JP_CIRC, JP_YEN, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
142 _______, XXXXXXX, XXXXXXX, XXXXXXX, JP_AT, JP_LBRC, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
143 _______, XXXXXXX, XXXXXXX, KC_SCLN, JP_COLN, JP_RBRC, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
144 _______, KC_COMM, KC_DOT, KC_SLSH, JP_BSLS, KC_PGUP, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
145 _______, _______, XXXXXXX, _______, KC_HOME, KC_PGDN, KC_END, _______, _______, _______, _______, XXXXXXX, _______, KC_DEL \
149 * ,-----------------------------------------. ,-----------------------------------------.
150 * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
151 * |------+------+------+------+------+------| |------+------+------+------+------+------|
152 * | | | | | | | | |MsWhL |MsWhU | Home |PageUp| F12 |
153 * |------+------+------+------+------+------| |------+------+------+------+------+------|
154 * | | | | | | | | |MsWhR |MsWhD | End |PageDn| |
155 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
156 * | | | | | | | | | | |MsBtn1|MsBtn2| MsUp | |
157 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
158 * | | | | | | | | | | | |MsLeft|MsDown|MsRght|
159 * `-------------------------------------------------------------------------------------------------'
162 _______, KC_F1 , KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, \
163 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, KC_F12, \
164 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXXXX, \
165 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, KC_MS_U, XXXXXXX, \
166 _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R \
169 /* Raise JIS Exchange L and R
170 * ,-----------------------------------------. ,-----------------------------------------.
171 * | F6 | F7 | F8 | F9 | F10 | F11 | | | F1 | F2 | F3 | F4 | F5 |
172 * |------+------+------+------+------+------| |------+------+------+------+------+------|
173 * | | | |MsWhL |MsWhU | F12 | | | | | | | |
174 * |------+------+------+------+------+------| |------+------+------+------+------+------|
175 * | | | |MsWhR |MsWhD | | | | | | | | |
176 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
177 * | | | |MsBtn1|MsBtn2| MsUp | | | | | | | | |
178 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
179 * | | | | |MsLeft|MsDown|MsRght| | | | | | | |
180 * `-------------------------------------------------------------------------------------------------'
183 KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_F1 , KC_F2, KC_F3, KC_F4, KC_F5, \
184 XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_F12, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
185 XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
186 XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, KC_MS_U, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
187 _______, _______, XXXXXXX, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, XXXXXXX, _______, XXXXXXX \
190 /* Adjust (Lower + Raise) Common map for Normal and Exchange
191 * ,-----------------------------------------. ,-----------------------------------------.
192 * | | Reset|RGBRST| | | | | | Reset|RGBRST| | | |
193 * |------+------+------+------+------+------| |------+------+------+------+------+------|
194 * | |ModNrm|ModExc| Mac | Win | | | |ModNrm|ModExc| Mac | Win | |
195 * |------+------+------+------+------+------| |------+------+------+------+------|------+
196 * | |RGB ON| HUE+ | SAT+ | VAL+ | | | |RGB ON| HUE+ | SAT+ | VAL+ | |
197 * |------+------+------+------+------+------+------+------+------+------+------+------+------|------+
198 * | | MODE | HUE- | SAT- | VAL- | | | | | MODE | HUE- | SAT- | VAL- | |
199 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
200 * | | | | | | | | | | | | | | |
201 * `-------------------------------------------------------------------------------------------------'
203 [_ADJUST] = LAYOUT( \
204 XXXXXXX, RESET, RGBRST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, RGBRST, XXXXXXX, XXXXXXX, XXXXXXX, \
205 XXXXXXX, DL_BAS, DL_BASE, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, DL_BAS, DL_BASE, AG_NORM, AG_SWAP, XXXXXXX, \
206 XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, \
207 XXXXXXX, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, \
208 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
213 #error "undefined keymaps"
217 char keylog[24] = {};
218 const char code_to_name[60] = {
219 ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
220 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
221 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
222 '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
223 'R', 'E', 'B', 'T', ' ', '-', ' ', '@', ' ', ' ',
224 ' ', ';', ':', ' ', ',', '.', '/', ' ', ' ', ' '};
226 static inline void set_keylog(uint16_t keycode, keyrecord_t *record)
229 uint8_t leds = host_keyboard_leds();
233 name = code_to_name[keycode];
237 snprintf(keylog, sizeof(keylog), "\n%dx%d %2x %c %c %c %c",
238 record->event.key.row,
239 record->event.key.col,
242 (leds & (1<<USB_LED_NUM_LOCK)) ? 'N' : ' ',
243 (leds & (1<<USB_LED_CAPS_LOCK)) ? 'C' : ' ',
244 (leds & (1<<USB_LED_SCROLL_LOCK)) ? 'S' : ' '
249 #ifdef RGBLIGHT_ENABLE
250 #define RGBLIGHT(mode) rgblight_mode(mode)
252 #define RGBLIGHT(mode)
255 // define variables for reactive RGB
256 int RGB_current_mode;
257 #ifdef ADJUST_MACRO_ENABLE
258 // Setting ADJUST layer RGB back to default
259 void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
260 if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
261 RGBLIGHT(RGB_current_mode);
267 #define ADJUST_MACRO(layer1, layer2, layer3) update_tri_layer_RGB(layer1, layer2, layer3)
269 #define ADJUST_MACRO(layer1, layer2, layer3)
272 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
274 if (record->event.pressed) {
275 set_keylog(keycode, record);
280 #ifdef RGBLIGHT_ENABLE
281 //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
283 if (record->event.pressed) {
284 rgblight_mode(RGB_current_mode);
286 RGB_current_mode = rgblight_config.mode;
292 if (record->event.pressed) {
293 if (keymap_config.swap_lalt_lgui==false) {
294 register_code(KC_LANG2);
296 SEND_STRING(SS_LALT("`"));
299 unregister_code(KC_LANG2);
303 if (record->event.pressed) {
304 if(keymap_config.swap_lalt_lgui==false){
305 register_code(KC_LANG1);
307 SEND_STRING(SS_LALT("`"));
310 unregister_code(KC_LANG1);
314 #ifdef RGBLIGHT_ENABLE
316 if (record->event.pressed) {
317 eeconfig_update_rgblight_default();
319 RGB_current_mode = rgblight_config.mode;
330 void matrix_init_user(void) {
331 #ifdef RGBLIGHT_ENABLE
332 RGB_current_mode = rgblight_config.mode;
334 //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
336 iota_gfx_init(!has_usb()); // turns on the display
340 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
343 void matrix_scan_user(void) {
344 iota_gfx_task(); // this is what updates the display continuously
347 static inline void matrix_update(struct CharacterMatrix *dest,
348 const struct CharacterMatrix *source) {
349 if (memcmp(dest->display, source->display, sizeof(dest->display))) {
350 memcpy(dest->display, source->display, sizeof(dest->display));
355 //assign the right code to your layers for OLED display
357 #define L_LOWER (1<<_LOWER)
358 #define L_RAISE (1<<_RAISE)
359 #define L_ADJUST (1<<_ADJUST)
360 #define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
361 #define L_LOW_E (1<<_LOW_E)
362 #define L_RAI_E (1<<_RAI_E)
363 #define L_ADJUST_TRIE (L_ADJUST|L_RAI_E|L_LOW_E)
365 const char helix_logo[]={
366 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
367 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
368 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,
371 static inline void render_logo(struct CharacterMatrix *matrix) {
373 matrix_write(matrix, helix_logo);
376 const char mac_win_logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}};
378 static inline void render_status(struct CharacterMatrix *matrix) {
381 // Render to mode icon
382 if(keymap_config.swap_lalt_lgui==false){
383 matrix_write(matrix, mac_win_logo[0][0]);
384 matrix_write_P(matrix, PSTR("\n"));
385 matrix_write(matrix, mac_win_logo[0][1]);
387 matrix_write(matrix, mac_win_logo[1][0]);
388 matrix_write_P(matrix, PSTR("\n"));
389 matrix_write(matrix, mac_win_logo[1][1]);
392 #ifdef RGBLIGHT_ENABLE
393 snprintf(buf, sizeof(buf), " LED mode:%d", (short)RGB_current_mode);
394 matrix_write(matrix, buf);
397 // 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
398 matrix_write_P(matrix, PSTR("\nLayer: "));
399 switch (layer_state) {
401 matrix_write_P(matrix, default_layer_state == (1UL<<_BAS_E) ? PSTR("BaseEx") : PSTR("Base"));
404 matrix_write_P(matrix, PSTR("Raise"));
407 matrix_write_P(matrix, PSTR("RaiseEx"));
410 matrix_write_P(matrix, PSTR("Lower"));
413 matrix_write_P(matrix, PSTR("LowerEx"));
418 matrix_write_P(matrix, PSTR("Adjust"));
421 snprintf(buf, sizeof(buf), "%d", (short)layer_state);
422 matrix_write(matrix, buf);
425 matrix_write(matrix, keylog);
428 void iota_gfx_task_user(void) {
429 struct CharacterMatrix matrix;
437 matrix_clear(&matrix);
439 render_status(&matrix);
441 render_logo(&matrix);
444 matrix_update(&display, &matrix);