2 #include "bootloader.h"
3 #include "action_layer.h"
7 #include "split_util.h"
9 #include "LUFA/Drivers/Peripheral/TWI.h"
17 // * 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. *
18 // #define ADJUST_MACRO_ENABLE
20 // * If you want to use the Kana key you can enable this comment out. However, the binary size may be over. *
21 // #define KANA_ENABLE
23 extern keymap_config_t keymap_config;
25 #ifdef RGBLIGHT_ENABLE
26 //Following line allows macro to read current RGB settings
27 extern rgblight_config_t rgblight_config;
30 extern uint8_t is_master;
32 // Each layer gets a name for readability, which is then used in the keymap matrix below.
33 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
34 // Layer names don't all need to be of the same length, obviously, and you can also skip them
35 // entirely and just use numbers.
46 enum custom_keycodes {
62 #define JP_CFTD KC_EQL // ^ and ~ Circumflex (Hat) and Tilde
63 #define JP_ATBQ KC_LBRC // @ and ` Atmark and Back-quote
64 #define JP_CLAS KC_QUOT // : and * Colon and Asterisk
65 #define JP_BSVL KC_JYEN // \ and | Back slash and and Vertical-line)
66 #define JP_LBRC KC_RBRC // [ and { Left-bracket
67 #define JP_RBRC KC_BSLS // ] and } Right-bracket
68 #define JP_BSUS KC_RO // \ and _ Back slash and Under-score
70 // Fillers to make layering more clear
71 #define _______ KC_TRNS
75 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
77 * ,-----------------------------------------. ,-----------------------------------------.
78 * | Esc | 1! | 2" | 3# | 4$ | 5% | | 6& | 7' | 8( | 9) | 0 | -= |
79 * |------+------+------+------+------+------| |------+------+------+------+------+------|
80 * | KANJI| Q | W | E | R | T | | Y | U | I | O | P | @` |
81 * |------+------+------+------+------+------| |------+------+------+------+------+------|
82 * | Tab | A | S | D | F | G | | H | J | K | L | ;+ | :* |
83 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
84 * | Shift| Z | X | C | V | B | N | B | N | M | ,< | .> | Up |Enter |
85 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
86 * | Ctrl | GUI | Alt |Adjust|Lower |Space |Bksp |Space |Space |Raise | APP | Left | Down |Right |
87 * `-------------------------------------------------------------------------------------------------'
90 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, \
91 EISU, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_ATBQ, \
92 KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_CLAS, \
93 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, \
94 KC_LCTL, KC_LALT, KC_LGUI, ADJUST, LOWER, KC_SPC, KC_BSPC, KC_SPC, KC_SPC, RAISE, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT \
97 /* Qwerty JIS Exchange L and R
98 * ,-----------------------------------------. ,-----------------------------------------.
99 * | 6& | 7' | 8( | 9) | 0 | -= | | Esc | 1! | 2" | 3# | 4$ | 5% |
100 * |------+------+------+------+------+------| |------+------+------+------+------+------|
101 * | Y | U | I | O | P | @` | | Tab | Q | W | E | R | T |
102 * |------+------+------+------+------+------| |------+------+------+------+------+------|
103 * | H | J | K | L | ;+ | :* | | | A | S | D | F | G |
104 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
105 * | N | M | ,< | .> | /? | Up |Enter |KANJI | Shift| Z | X | C | V | B |
106 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
107 * |Space |Raise | }] | APP | Left | Down |Right |Adjust| Ctrl | GUI | Alt | [{ |Lower | Bksp |
108 * `-------------------------------------------------------------------------------------------------'
111 KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, \
112 KC_Y, KC_U, KC_I, KC_O, KC_P, JP_ATBQ, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, \
113 KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_CLAS, XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, \
114 KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_ENT, EISU, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, \
115 KC_SPC, RAI_E, JP_RBRC, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT, ADJUST, KC_LCTL, KC_LALT, KC_LGUI, JP_LBRC, LOW_E, KC_BSPC \
119 * ,-----------------------------------------. ,-----------------------------------------.
120 * | | | | | | | | | | | -= | ^~ | \| |
121 * |------+------+------+------+------+------| |------+------+------+------+------+------|
122 * | | | | | | | | | | | | @` | [{ |
123 * |------+------+------+------+------+------| |------+------+------+------+------+------|
124 * | | | | | | | | | | | ;+ | :* | ]} |
125 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
126 * | | | | | | | | | | | ,< | .> | /? | \_ |
127 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
128 * | | | | | | | Del | | | | | | | |
129 * `-------------------------------------------------------------------------------------------------'
132 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, JP_CFTD, JP_BSVL, \
133 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, JP_ATBQ, JP_LBRC, \
134 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SCLN, JP_CLAS, JP_RBRC, \
135 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, JP_BSUS, \
136 _______, _______, _______, _______, XXXXXXX, XXXXXXX, KC_DEL, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
139 /* Lower JIS Exchange L and R
140 * ,-----------------------------------------. ,-----------------------------------------.
141 * | | | | -= | ^~ | \| | | | | | | | |
142 * |------+------+------+------+------+------| |------+------+------+------+------+------|
143 * | | | | | @` | [{ | | | | | | | |
144 * |------+------+------+------+------+------| |------+------+------+------+------+------|
145 * | | | | ;+ | :* | ]} | | | | | | | |
146 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
147 * | | ,< | .> | /? | \_ |PageUp| | | | | | | | |
148 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
149 * | | | | | Home |PageDn| End | | | | | | | Del |
150 * `-------------------------------------------------------------------------------------------------'
153 _______, XXXXXXX, XXXXXXX, KC_MINS, JP_CFTD, JP_BSVL, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
154 _______, XXXXXXX, XXXXXXX, XXXXXXX, JP_ATBQ, JP_LBRC, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
155 _______, XXXXXXX, XXXXXXX, KC_SCLN, JP_CLAS, JP_RBRC, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
156 _______, KC_COMM, KC_DOT, KC_SLSH, JP_BSUS, KC_PGUP, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
157 _______, _______, XXXXXXX, _______, KC_HOME, KC_PGDN, KC_END, _______, _______, _______, _______, XXXXXXX, _______, KC_DEL \
161 * ,-----------------------------------------. ,-----------------------------------------.
162 * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
163 * |------+------+------+------+------+------| |------+------+------+------+------+------|
164 * | | | | | | | | F12 | | | | Home |PageUp|
165 * |------+------+------+------+------+------| |------+------+------+------+------+------|
166 * | | | | | | | | | | | | End |PageDn|
167 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
168 * | |MsBtn1|MsBtn2| | | | | | | | | | MsUp | |
169 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
170 * | | | | | | | | | | | |MsLeft|MsDown|MsRght|
171 * `-------------------------------------------------------------------------------------------------'
174 _______, KC_F1 , KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, \
175 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F12 , XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_PGUP, \
176 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_END, KC_PGDN, \
177 _______, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_U, XXXXXXX, \
178 _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R \
181 /* Raise JIS Exchange L and R
182 * ,-----------------------------------------. ,-----------------------------------------.
183 * | F6 | F7 | F8 | F9 | F10 | F11 | | | F1 | F2 | F3 | F4 | F5 |
184 * |------+------+------+------+------+------| |------+------+------+------+------+------|
185 * | F12 | | | | | | | | | | | | |
186 * |------+------+------+------+------+------| |------+------+------+------+------+------|
187 * | | | | | | | | | | | | | |
188 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
189 * | | | | | | MsUp | | | |MsBtn1|MsBtn2| | | |
190 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
191 * | | | | |MsLeft|MsDown|MsRght| | | | | | | |
192 * `-------------------------------------------------------------------------------------------------'
195 KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_F1 , KC_F2, KC_F3, KC_F4, KC_F5, \
196 KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
197 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
198 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_U, XXXXXXX, XXXXXXX, _______, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, \
199 _______, _______, XXXXXXX, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, XXXXXXX, _______, XXXXXXX \
202 /* Adjust (Lower + Raise) Common map for Normal and Exchange
203 * ,-----------------------------------------. ,-----------------------------------------.
204 * | | Reset|RGBRST|Aud on|Audoff| | | | Reset|RGBRST|Aud on|Audoff| |
205 * |------+------+------+------+------+------| |------+------+------+------+------+------|
206 * | |ModNrm|ModExc| Mac | Win | | | |ModNrm|ModExc| Mac | Win | |
207 * |------+------+------+------+------+------| |------+------+------+------+------|------+
208 * | |RGB ON| HUE+ | SAT+ | VAL+ | | | |RGB ON| HUE+ | SAT+ | VAL+ | |
209 * |------+------+------+------+------+------+------+------+------+------+------+------+------|------+
210 * | | MODE | HUE- | SAT- | VAL- | | | | | MODE | HUE- | SAT- | VAL- | |
211 * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
212 * | | | | | | | | | | | | | | |
213 * `-------------------------------------------------------------------------------------------------'
215 [_ADJUST] = LAYOUT( \
216 XXXXXXX, RESET, RGBRST, AU_ON, AU_OFF, XXXXXXX, XXXXXXX, RESET, RGBRST, AU_ON, AU_OFF, XXXXXXX, \
217 XXXXXXX, BASE, BAS_E, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, BASE, BAS_E, AG_NORM, AG_SWAP, XXXXXXX, \
218 XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, \
219 XXXXXXX, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, \
220 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
225 #error "undefined keymaps"
229 char keylog[20] = {};
230 const char code_to_name[60] = {
231 ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
232 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
233 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
234 '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
235 'R', 'E', 'B', 'T', ' ', '-', ' ', '@', ' ', ' ',
236 ' ', ';', ':', ' ', ',', '.', '/', ' ', ' ', ' '};
238 inline void set_keylog(uint16_t keycode, keyrecord_t *record)
241 uint8_t leds = host_keyboard_leds();
245 name = code_to_name[keycode];
249 snprintf(keylog, sizeof(keylog), "\n%dx%d %2x %c %c %c %c",
250 record->event.key.row,
251 record->event.key.col,
254 (leds & (1<<USB_LED_NUM_LOCK)) ? 'N' : ' ',
255 (leds & (1<<USB_LED_CAPS_LOCK)) ? 'C' : ' ',
256 (leds & (1<<USB_LED_SCROLL_LOCK)) ? 'S' : ' '
262 float tone_qwerty[][2] = SONG(QWERTY_SOUND);
263 float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
267 _delay_ms(20); // gets rid of tick
276 void music_on_user(void)
281 void music_scale_user(void)
283 PLAY_SONG(music_scale);
289 #define PLAY_SONG(tone)
292 // define variables for reactive RGB
293 int RGB_current_mode;
294 #ifdef ADJUST_MACRO_ENABLE
295 // Setting ADJUST layer RGB back to default
296 void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
297 if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
298 RGBLIGHT(RGB_current_mode);
304 #define ADJUST_MACRO(layer1, layer2, layer3) update_tri_layer_RGB(layer1, layer2, layer3)
306 #define ADJUST_MACRO(layer1, layer2, layer3)
309 #ifdef RGBLIGHT_ENABLE
310 #define RGBLIGHT(mode) rgblight_mode(mode)
312 #define RGBLIGHT(mode)
316 inline void persistent_default_layer_set(uint16_t default_layer) {
317 eeconfig_update_default_layer(default_layer);
318 default_layer_set(default_layer);
321 bool TOG_STATUS = false;
323 void toggle_lower_raise_layer(bool pressed, uint16_t dist_layer, uint16_t lower_layer, uint16_t raise_layer) {
325 //not sure how to have keyboard check mode and set it to a variable, so my work around
326 //uses another variable that would be set to true after the first time a reactive key is pressed.
327 if (!TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
328 TOG_STATUS = !TOG_STATUS;
329 #ifdef RGBLIGHT_ENABLE
330 rgblight_mode((dist_layer == _LOWER || dist_layer == _LOW_E) ? 16 : 15);
334 layer_on(dist_layer);
335 ADJUST_MACRO(lower_layer, raise_layer, _ADJUST);
337 RGBLIGHT(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change
339 layer_off(dist_layer);
340 ADJUST_MACRO(lower_layer, raise_layer, _ADJUST);
344 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
346 if (record->event.pressed) {
347 set_keylog(keycode, record);
353 if (record->event.pressed) {
354 PLAY_SONG(tone_qwerty);
355 persistent_default_layer_set(1UL<<_BASE);
359 if (record->event.pressed) {
360 PLAY_SONG(tone_qwerty);
361 persistent_default_layer_set(1UL<<_BAS_E);
365 toggle_lower_raise_layer(record->event.pressed, _LOWER, _LOWER, _RAISE);
368 toggle_lower_raise_layer(record->event.pressed, _LOW_E, _LOW_E, _RAI_E);
371 toggle_lower_raise_layer(record->event.pressed, _RAISE, _LOWER, _RAISE);
374 toggle_lower_raise_layer(record->event.pressed, _RAI_E, _LOW_E, _RAI_E);
377 if (record->event.pressed) {
381 RGBLIGHT(RGB_current_mode);
385 //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
387 #ifdef RGBLIGHT_ENABLE
388 if (record->event.pressed) {
389 rgblight_mode(RGB_current_mode);
391 RGB_current_mode = rgblight_config.mode;
396 if (record->event.pressed) {
397 if (keymap_config.swap_lalt_lgui==false) {
398 register_code(KC_LANG2);
400 SEND_STRING(SS_LALT("`"));
403 unregister_code(KC_LANG2);
408 if (record->event.pressed) {
409 if(keymap_config.swap_lalt_lgui==false){
410 register_code(KC_LANG1);
412 SEND_STRING(SS_LALT("`"));
415 unregister_code(KC_LANG1);
420 #ifdef RGBLIGHT_ENABLE
421 if (record->event.pressed) {
422 eeconfig_update_rgblight_default();
424 RGB_current_mode = rgblight_config.mode;
435 void matrix_init_user(void) {
439 #ifdef RGBLIGHT_ENABLE
440 RGB_current_mode = rgblight_config.mode;
442 //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
444 TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000));
445 iota_gfx_init(!has_usb()); // turns on the display
449 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
452 void matrix_scan_user(void) {
453 iota_gfx_task(); // this is what updates the display continuously
456 inline void matrix_update(struct CharacterMatrix *dest,
457 const struct CharacterMatrix *source) {
458 if (memcmp(dest->display, source->display, sizeof(dest->display))) {
459 memcpy(dest->display, source->display, sizeof(dest->display));
464 //assign the right code to your layers for OLED display
466 #define L_LOWER (1<<_LOWER)
467 #define L_RAISE (1<<_RAISE)
468 #define L_ADJUST (1<<_ADJUST)
469 #define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
470 #define L_LOW_E (1<<_LOW_E)
471 #define L_RAI_E (1<<_RAI_E)
472 #define L_ADJUST_TRIE (L_ADJUST|L_RAI_E|L_LOW_E)
474 const char helix_logo[]={
475 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
476 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
477 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,
479 inline void render_logo(struct CharacterMatrix *matrix) {
481 matrix_write(matrix, helix_logo);
484 const char mac_win_logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}};
485 inline void render_status(struct CharacterMatrix *matrix) {
487 // Render to mode icon
488 if(keymap_config.swap_lalt_lgui==false){
489 matrix_write(matrix, mac_win_logo[0][0]);
490 matrix_write_P(matrix, PSTR("\n"));
491 matrix_write(matrix, mac_win_logo[0][1]);
493 matrix_write(matrix, mac_win_logo[1][0]);
494 matrix_write_P(matrix, PSTR("\n"));
495 matrix_write(matrix, mac_win_logo[1][1]);
498 // 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
500 matrix_write_P(matrix, PSTR("\nLayer: "));
501 switch (layer_state) {
503 matrix_write_P(matrix, default_layer_state == (1UL<<_BAS_E) ? PSTR("BaseEx") : PSTR("Base"));
506 matrix_write_P(matrix, PSTR("Raise"));
509 matrix_write_P(matrix, PSTR("RaiseEx"));
512 matrix_write_P(matrix, PSTR("Lower"));
515 matrix_write_P(matrix, PSTR("LowerEx"));
520 matrix_write_P(matrix, PSTR("Adjust"));
523 snprintf(buf, sizeof(buf), "%d", (short)layer_state);
524 matrix_write(matrix, buf);
527 matrix_write(matrix, keylog);
530 void iota_gfx_task_user(void) {
531 struct CharacterMatrix matrix;
539 matrix_clear(&matrix);
541 render_status(&matrix);
543 render_logo(&matrix);
546 matrix_update(&display, &matrix);