]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c
Keymap: Modified of 'Helix five rows JIS" keymap (#3425)
[qmk_firmware.git] / keyboards / helix / rev2 / keymaps / five_rows_jis / keymap.c
1 #include "helix.h"
2 #include "bootloader.h"
3 #include "action_layer.h"
4 #include "eeconfig.h"
5 #ifdef PROTOCOL_LUFA
6 #include "lufa.h"
7 #include "split_util.h"
8 #endif
9 #include "LUFA/Drivers/Peripheral/TWI.h"
10 #ifdef AUDIO_ENABLE
11   #include "audio.h"
12 #endif
13 #ifdef SSD1306OLED
14   #include "ssd1306.h"
15 #endif
16
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
19
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
22
23 extern keymap_config_t keymap_config;
24
25 #ifdef RGBLIGHT_ENABLE
26 //Following line allows macro to read current RGB settings
27 extern rgblight_config_t rgblight_config;
28 #endif
29
30 extern uint8_t is_master;
31
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.
36 enum layer_number {
37   _BASE = 0,
38   _BAS_E,
39   _LOWER,
40   _LOW_E,
41   _RAISE,
42   _RAI_E,
43   _ADJUST,
44 };
45
46 enum custom_keycodes {
47   BASE = SAFE_RANGE,
48   BAS_E,
49   LOWER,
50   LOW_E,
51   RAISE,
52   RAI_E,
53   ADJUST,
54   EISU,
55   #ifdef KANA_ENABLE
56   KANA,
57   #endif
58   RGBRST
59 };
60
61 // JIS key aliases
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
69
70 // Fillers to make layering more clear
71 #define _______ KC_TRNS
72 #define XXXXXXX KC_NO
73
74 #if HELIX_ROWS == 5
75 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
76   /* Qwerty JIS Normal
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    * `-------------------------------------------------------------------------------------------------'
88    */
89   [_BASE] = LAYOUT( \
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  \
95     ),
96
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    * `-------------------------------------------------------------------------------------------------'
109    */
110   [_BAS_E] = LAYOUT( \
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 \
116     ),
117
118   /* Lower JIS Normal
119    * ,-----------------------------------------.             ,-----------------------------------------.
120    * |      |      |      |      |      |      |             |      |      |      |  -=  |  ^~  |  \|  |
121    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
122    * |      |      |      |      |      |      |             |      |      |      |      |  @`  |  [{  |
123    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
124    * |      |      |      |      |      |      |             |      |      |      |  ;+  |  :*  |  ]}  |
125    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
126    * |      |      |      |      |      |      |      |      |      |      |  ,<  |  .>  |  /?  |  \_  |
127    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
128    * |      |      |      |      |      |      | Del  |      |      |      |      |      |      |      |
129    * `-------------------------------------------------------------------------------------------------'
130    */
131   [_LOWER] = LAYOUT( \
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  \
137     ),
138
139   /* Lower JIS Exchange L and R
140    * ,-----------------------------------------.             ,-----------------------------------------.
141    * |      |      |      |  -=  |  ^~  |  \|  |             |      |      |      |      |      |      |
142    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
143    * |      |      |      |      |  @`  |  [{  |             |      |      |      |      |      |      |
144    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
145    * |      |      |      |  ;+  |  :*  |  ]}  |             |      |      |      |      |      |      |
146    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
147    * |      |  ,<  |  .>  |  /?  |  \_  |PageUp|      |      |      |      |      |      |      |      |
148    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
149    * |      |      |      |      | Home |PageDn| End  |      |      |      |      |      |      | Del  |
150    * `-------------------------------------------------------------------------------------------------'
151    */
152   [_LOW_E] = LAYOUT( \
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   \
158     ),
159
160   /* Raise JIS Normal
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    * `-------------------------------------------------------------------------------------------------'
172    */
173   [_RAISE] = LAYOUT( \
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  \
179     ),
180
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    * `-------------------------------------------------------------------------------------------------'
193    */
194   [_RAI_E] = LAYOUT( \
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  \
200     ),
201
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    * `-------------------------------------------------------------------------------------------------'
214    */
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     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______  \
221     ),
222 };
223
224 #else
225 #error "undefined keymaps"
226 #endif
227
228 #ifdef SSD1306OLED
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     ' ', ';', ':', ' ', ',', '.', '/', ' ', ' ', ' '};
237
238 inline void set_keylog(uint16_t keycode, keyrecord_t *record)
239 {
240   char name = ' ';
241   uint8_t leds = host_keyboard_leds();
242
243   if (keycode < 60)
244   {
245     name = code_to_name[keycode];
246   }
247
248   // update keylog
249   snprintf(keylog, sizeof(keylog), "\n%dx%d %2x %c %c %c %c",
250            record->event.key.row,
251            record->event.key.col,
252            keycode,
253            name,
254           (leds & (1<<USB_LED_NUM_LOCK)) ? 'N' : ' ',
255           (leds & (1<<USB_LED_CAPS_LOCK)) ? 'C' : ' ',
256           (leds & (1<<USB_LED_SCROLL_LOCK)) ? 'S' : ' '
257            );
258 }
259 #endif
260
261 #ifdef AUDIO_ENABLE
262 float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
263 float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
264
265 void startup_user()
266 {
267   _delay_ms(20); // gets rid of tick
268 }
269
270 void shutdown_user()
271 {
272   _delay_ms(150);
273   stop_all_notes();
274 }
275
276 void music_on_user(void)
277 {
278   music_scale_user();
279 }
280
281 void music_scale_user(void)
282 {
283   PLAY_SONG(music_scale);
284 }
285
286 #else
287 float tone_qwerty;
288 float music_scale;
289 #define PLAY_SONG(tone)
290 #endif
291
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);
299     layer_on(layer3);
300    } else {
301     layer_off(layer3);
302   }
303 }
304 #define ADJUST_MACRO(layer1, layer2, layer3) update_tri_layer_RGB(layer1, layer2, layer3)
305 #else
306 #define ADJUST_MACRO(layer1, layer2, layer3)
307 #endif
308
309 #ifdef RGBLIGHT_ENABLE
310 #define RGBLIGHT(mode) rgblight_mode(mode)
311 #else
312 #define RGBLIGHT(mode)
313 #endif
314
315
316 inline void persistent_default_layer_set(uint16_t default_layer) {
317   eeconfig_update_default_layer(default_layer);
318   default_layer_set(default_layer);
319 }
320
321 bool TOG_STATUS = false;
322
323 void toggle_lower_raise_layer(bool pressed, uint16_t dist_layer, uint16_t lower_layer, uint16_t raise_layer) {
324   if (pressed) {
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);
331       #endif
332     }
333
334     layer_on(dist_layer);
335     ADJUST_MACRO(lower_layer, raise_layer, _ADJUST);
336   } else {
337     RGBLIGHT(RGB_current_mode);   // revert RGB to initial mode prior to RGB mode change
338     TOG_STATUS = false;
339     layer_off(dist_layer);
340     ADJUST_MACRO(lower_layer, raise_layer, _ADJUST);
341   }
342 }
343
344 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
345   #ifdef SSD1306OLED
346     if (record->event.pressed) {
347       set_keylog(keycode, record);
348     }
349   #endif
350
351   switch (keycode) {
352     case BASE:
353       if (record->event.pressed) {
354         PLAY_SONG(tone_qwerty);
355         persistent_default_layer_set(1UL<<_BASE);
356       }
357       break;
358     case BAS_E:
359       if (record->event.pressed) {
360         PLAY_SONG(tone_qwerty);
361         persistent_default_layer_set(1UL<<_BAS_E);
362       }
363       break;
364     case LOWER:
365       toggle_lower_raise_layer(record->event.pressed, _LOWER, _LOWER, _RAISE);
366       break;
367     case LOW_E:
368       toggle_lower_raise_layer(record->event.pressed, _LOW_E, _LOW_E, _RAI_E);
369       break;
370     case RAISE:
371       toggle_lower_raise_layer(record->event.pressed, _RAISE, _LOWER, _RAISE);
372       break;
373     case RAI_E:
374       toggle_lower_raise_layer(record->event.pressed, _RAI_E, _LOW_E, _RAI_E);
375       break;
376     case ADJUST:
377         if (record->event.pressed) {
378           RGBLIGHT(14);
379           layer_on(_ADJUST);
380         } else {
381           RGBLIGHT(RGB_current_mode);
382           layer_off(_ADJUST);
383         }
384         break;
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
386     case RGB_MOD:
387       #ifdef RGBLIGHT_ENABLE
388         if (record->event.pressed) {
389           rgblight_mode(RGB_current_mode);
390           rgblight_step();
391           RGB_current_mode = rgblight_config.mode;
392         }
393       #endif
394       break;
395     case EISU:
396       if (record->event.pressed) {
397         if (keymap_config.swap_lalt_lgui==false) {
398           register_code(KC_LANG2);
399         } else {
400           SEND_STRING(SS_LALT("`"));
401         }
402       } else {
403         unregister_code(KC_LANG2);
404       }
405       break;
406     #ifdef KANA_ENABLE
407     case KANA:
408       if (record->event.pressed) {
409         if(keymap_config.swap_lalt_lgui==false){
410           register_code(KC_LANG1);
411         }else{
412           SEND_STRING(SS_LALT("`"));
413         }
414       } else {
415         unregister_code(KC_LANG1);
416       }
417       break;
418     #endif
419     case RGBRST:
420       #ifdef RGBLIGHT_ENABLE
421         if (record->event.pressed) {
422           eeconfig_update_rgblight_default();
423           rgblight_enable();
424           RGB_current_mode = rgblight_config.mode;
425         }
426       #endif
427       break;
428     default:
429       return true;
430   }
431
432   return false;
433 }
434
435 void matrix_init_user(void) {
436   #ifdef AUDIO_ENABLE
437     startup_user();
438   #endif
439   #ifdef RGBLIGHT_ENABLE
440     RGB_current_mode = rgblight_config.mode;
441   #endif
442   //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
443   #ifdef SSD1306OLED
444     TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000));
445     iota_gfx_init(!has_usb());   // turns on the display
446   #endif
447 }
448
449 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
450 #ifdef SSD1306OLED
451
452 void matrix_scan_user(void) {
453   iota_gfx_task();  // this is what updates the display continuously
454 }
455
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));
460     dest->dirty = true;
461   }
462 }
463
464 //assign the right code to your layers for OLED display
465 #define L_BASE _BASE
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)
473
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,
478   0};
479 inline void render_logo(struct CharacterMatrix *matrix) {
480
481   matrix_write(matrix, helix_logo);
482 }
483
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) {
486
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]);
492   } else {
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]);
496   }
497
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
499   char buf[20];
500   matrix_write_P(matrix, PSTR("\nLayer: "));
501   switch (layer_state) {
502     case L_BASE:
503       matrix_write_P(matrix, default_layer_state == (1UL<<_BAS_E) ? PSTR("BaseEx") : PSTR("Base"));
504       break;
505     case L_RAISE:
506       matrix_write_P(matrix, PSTR("Raise"));
507       break;
508     case L_RAI_E:
509       matrix_write_P(matrix, PSTR("RaiseEx"));
510       break;
511     case L_LOWER:
512       matrix_write_P(matrix, PSTR("Lower"));
513       break;
514     case L_LOW_E:
515       matrix_write_P(matrix, PSTR("LowerEx"));
516       break;
517     case L_ADJUST:
518     case L_ADJUST_TRI:
519     case L_ADJUST_TRIE:
520       matrix_write_P(matrix, PSTR("Adjust"));
521       break;
522     default:
523       snprintf(buf, sizeof(buf), "%d", (short)layer_state);
524       matrix_write(matrix, buf);
525   }
526
527   matrix_write(matrix, keylog);
528 }
529
530 void iota_gfx_task_user(void) {
531   struct CharacterMatrix matrix;
532
533 #if DEBUG_TO_SCREEN
534   if (debug_enable) {
535     return;
536   }
537 #endif
538
539   matrix_clear(&matrix);
540   if (is_master) {
541     render_status(&matrix);
542   } else {
543     render_logo(&matrix);
544   }
545
546   matrix_update(&display, &matrix);
547 }
548
549 #endif