]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/helix/rev2/keymaps/five_rows/keymap.c
New keymap for The Helix keyboard("five_rows") (#2592)
[qmk_firmware.git] / keyboards / helix / rev2 / keymaps / five_rows / 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 extern keymap_config_t keymap_config;
18
19 #ifdef RGBLIGHT_ENABLE
20 //Following line allows macro to read current RGB settings
21 extern rgblight_config_t rgblight_config;
22 #endif
23
24 extern uint8_t is_master;
25
26 // Each layer gets a name for readability, which is then used in the keymap matrix below.
27 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
28 // Layer names don't all need to be of the same length, obviously, and you can also skip them
29 // entirely and just use numbers.
30 #define _QWERTY 0
31 #define _COLEMAK 1
32 #define _DVORAK 2
33 #define _LOWER 3
34 #define _RAISE 4
35 #define _ADJUST 16
36
37 enum custom_keycodes {
38   QWERTY = SAFE_RANGE,
39   COLEMAK,
40   DVORAK,
41   LOWER,
42   RAISE,
43   ADJUST,
44   BACKLIT,
45   EISU,
46   KANA,
47   RGBRST
48 };
49
50 enum macro_keycodes {
51   KC_SAMPLEMACRO,
52 };
53
54
55 // Fillers to make layering more clear
56 #define _______ KC_TRNS
57 #define XXXXXXX KC_NO
58 //Macros
59 #define M_SAMPLE M(KC_SAMPLEMACRO)
60
61 #if HELIX_ROWS == 5
62 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
63
64   /* Qwerty
65    * ,-----------------------------------------.             ,-----------------------------------------.
66    * | ESC  |   1  |   2  |   3  |   4  |   5  |             |   6  |   7  |   8  |   9  |   0  | BS   |
67    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
68    * | Tab  |   Q  |   W  |   E  |   R  |   T  |             |   Y  |   U  |   I  |   O  |   P  |  \   |
69    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
70    * | Ctrl |   A  |   S  |   D  |   F  |   G  |             |   H  |   J  |   K  |   L  |   ;  | Ctrl |
71    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
72    * | Shift|   Z  |   X  |   C  |   V  |   B  |   `  |   '  |   N  |   M  |   ,  |   .  |   /  | Shift|
73    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
74    * |Adjust| Lower| Caps  | GUI  | Alt | Del  | Enter| Enter| Space| Alt  | GUI  | Menu |Lower |Lower |
75    * `-------------------------------------------------------------------------------------------------'
76    */
77   [_QWERTY] = KEYMAP( \
78       KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                      KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC, \
79       KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                      KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSLS, \
80       KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                      KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_RCTL, \
81       KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_GRV, KC_QUOT,  KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, \
82       ADJUST,  LOWER,   KC_CAPS, KC_LALT, KC_LGUI, KC_BSPC,  LT(_RAISE,KC_ENT), \
83                                                            LT(_RAISE,KC_ENT), KC_SPC,  KC_RGUI, KC_RALT, KC_APP,  LOWER,   LOWER \
84       ),
85
86   /* Colemak
87    * ,-----------------------------------------.             ,-----------------------------------------.
88    * | ESC  |   1  |   2  |   3  |   4  |   5  |             |   6  |   7  |   8  |   9  |   0  | Bksp |
89    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
90    * | Tab  |   Q  |   W  |   F  |   P  |   G  |             |   J  |   L  |   U  |   Y  |   ;  | \    |
91    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
92    * | Ctrl |   A  |   R  |   S  |   T  |   D  |             |   H  |   N  |   E  |   I  |   O  | Ctrl |
93    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
94    * | Shift|   Z  |   X  |   C  |   V  |   B  |   `  |   '  |   K  |   M  |   ,  |   .  |   /  | Shift|
95    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
96    * |Adjust| Lower| Caps  | GUI  | Alt | Del  | Enter| Enter| Space| Alt  | GUI  | Menu |Lower |Lower |
97    * `-------------------------------------------------------------------------------------------------'
98    */
99   [_COLEMAK] = KEYMAP( \
100       KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                      KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC, \
101       KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,                      KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSLS, \
102       KC_LCTL, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,                      KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_RCTL, \
103       KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_GRV, KC_QUOT,  KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, \
104       ADJUST,  LOWER,   KC_CAPS, KC_LALT, KC_LGUI, KC_DEL,  LT(_RAISE,KC_ENT), \
105                                                            LT(_RAISE,KC_ENT), KC_SPC,  KC_RGUI, KC_RALT, KC_APP,  LOWER,   LOWER \
106       ),
107
108   /* Dvorak
109    * ,-----------------------------------------.             ,-----------------------------------------.
110    * | ESC  |   1  |   2  |   3  |   4  |   5  |             |   6  |   7  |   8  |   9  |   0  | Bksp |
111    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
112    * | Tab  |   '  |   ,  |   .  |   P  |   Y  |             |   F  |   G  |   C  |   R  |   L  |  \   |
113    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
114    * | Ctrl |   A  |   O  |   E  |   U  |   I  |             |   D  |   H  |   T  |   N  |   S  | Ctrl |
115    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
116    * | Shift|   ;  |   Q  |   J  |   K  |   X  |   `  |   /  |   B  |   M  |   W  |   V  |   Z  | Shift|
117    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
118    * |Adjust| Lower| Caps  | GUI  | Alt | Del  | Enter| Enter| Space| Alt  | GUI  | Menu |Lower |Lower |
119    * `-------------------------------------------------------------------------------------------------'
120    */
121   [_DVORAK] = KEYMAP( \
122       KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                      KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC, \
123       KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,                      KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSLS, \
124       KC_LCTL, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,                      KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_RCTL, \
125       KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_GRV, KC_SLSH,  KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_RSFT, \
126       ADJUST,  LOWER,   KC_CAPS, KC_LALT, KC_LGUI, KC_DEL,  LT(_RAISE,KC_ENT), \
127                                                            LT(_RAISE,KC_ENT), KC_SPC,  KC_RGUI, KC_RALT, KC_APP,  LOWER,   LOWER \
128       ),
129
130   /* Lower
131    * ,-----------------------------------------.             ,-----------------------------------------.
132    * |      |  F1  |  F2  |  F3  |  F4  |  F5  |             |  F6  |  F7  |  F8  |  F9  |  F10 | F11  |
133    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
134    * |      |      |Pause | ScrLk| Ins  |      |             |      | Ins  | ScrLk|Pause |      | F12  |
135    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
136    * |      | PgUp |      | Up   |Delete| Home |             | Home |Delete| Up   |      | PgUp |      |
137    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
138    * |      | PgDn | Left | Down | Right| End  |      |      | End  | Left | Down | Right| PgDn |      |
139    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
140    * |      |      | PrtSc|      |      |      |      |      |      |      |      | PrtSc|      |      |
141    * `-------------------------------------------------------------------------------------------------'
142    */
143   [_LOWER] = KEYMAP( \
144       XXXXXXX,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,                    KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11, \
145       XXXXXXX, XXXXXXX, KC_PAUS, KC_SLCK, KC_INS,  XXXXXXX,                   XXXXXXX, KC_INS,  KC_SLCK, KC_PAUS, XXXXXXX, KC_F12, \
146       _______, KC_PGUP, XXXXXXX, KC_UP,   KC_DEL,  KC_HOME,                   KC_HOME, KC_DEL,  KC_UP,   XXXXXXX, KC_PGUP, _______, \
147       _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_END,  XXXXXXX, XXXXXXX, KC_END,  KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, \
148       XXXXXXX, _______, KC_PSCR, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, _______, _______ \
149       ),
150
151   /* Raise
152    * ,-----------------------------------------.             ,-----------------------------------------.
153    * |      |      |      |      |      |      |             |      |      |      |      |      |      |
154    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
155    * |      |      |      |      |  _   |  -   |             |  =   |  +   |      |      |      |      |
156    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
157    * |      |      |      |      |  {   |  [   |             |  ]   |  }   |      |      |      |      |
158    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
159    * |      |      |      |      |      | EISU | EISU | KANA | KANA | Next | Vol- | Vol+ | Play |      |
160    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
161    * |      |      |      |      |      |      |      |      |      |      |      |      |      |      |
162    * `-------------------------------------------------------------------------------------------------'
163    */
164   [_RAISE] = KEYMAP( \
165       XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
166       XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LSFT(KC_MINS), KC_MINS,         KC_EQL, LSFT(KC_EQL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
167       _______, XXXXXXX, XXXXXXX, XXXXXXX, LSFT(KC_LBRC), KC_LBRC,       KC_RBRC, LSFT(KC_RBRC), XXXXXXX, XXXXXXX, XXXXXXX, _______, \
168       _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,    EISU,    EISU,    KANA,    KANA, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, \
169       _______, _______, XXXXXXX, _______, _______, XXXXXXX, _______, _______, XXXXXXX, _______, _______, XXXXXXX, _______, _______ \
170       ),
171
172   /* Adjust (Lower + Raise)
173    * ,-----------------------------------------.             ,-----------------------------------------.
174    * |      |      |      |Dvorak|Colemk|Qwerty|             |      |      |      |      |      |      |
175    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
176    * |      | Reset|RGBRST|      |      | Win  |             |      |      |      |      |      |      |
177    * |------+------+------+------+------+------|             |------+------+------+------+------+------|
178    * | HUE+ | SAT+ | VAL+ |Aud on|Audoff| Mac  |             | Win  |Qwerty|Colemk|Dvorak|      |      |
179    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
180    * | HUE- | SAT- | VAL- |RGB md|RGB ON|      |      |      |      |      |RGB ON| HUE+ | SAT+ | VAL+ |
181    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
182    * |      |      |      |      |      |      |      |      |      |      | MODE | HUE- | SAT- | VAL- |
183    * `-------------------------------------------------------------------------------------------------'
184    */
185   [_ADJUST] =  KEYMAP( \
186       XXXXXXX, XXXXXXX, XXXXXXX,  DVORAK, COLEMAK,  QWERTY,                   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
187       XXXXXXX, RESET,   RGBRST,  XXXXXXX, XXXXXXX, AG_SWAP,                   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
188       RGB_HUI, RGB_SAI, RGB_VAI, AU_ON,   AU_OFF,  AG_NORM,                   AG_SWAP, QWERTY,  COLEMAK, DVORAK,  XXXXXXX, XXXXXXX, \
189       RGB_HUD, RGB_SAD, RGB_VAD,RGB_SMOD, RGB_TOG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \
190       _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \
191       )
192 };
193
194 #else
195 #error "undefined keymaps"
196 #endif
197
198
199 #ifdef AUDIO_ENABLE
200
201 float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
202 float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
203 float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
204 float tone_plover[][2]     = SONG(PLOVER_SOUND);
205 float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND);
206 float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
207 #endif
208
209 // define variables for reactive RGB
210 bool TOG_STATUS = false;
211 int RGB_current_mode;
212 static uint32_t current_default_layer_state;
213
214 uint32_t default_layer_state_set_kb(uint32_t state) {
215     current_default_layer_state = state;
216     return state;
217 }
218
219 void persistent_default_layer_set(uint16_t default_layer) {
220   eeconfig_update_default_layer(default_layer);
221   default_layer_set(default_layer);
222 }
223
224 // Setting ADJUST layer RGB back to default
225 void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
226   if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
227     #ifdef RGBLIGHT_ENABLE
228       //rgblight_mode(RGB_current_mode);
229     #endif
230     layer_on(layer3);
231   } else {
232     layer_off(layer3);
233   }
234 }
235
236 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
237   switch (keycode) {
238     case QWERTY:
239       if (record->event.pressed) {
240         #ifdef AUDIO_ENABLE
241           PLAY_SONG(tone_qwerty);
242         #endif
243         persistent_default_layer_set(1UL<<_QWERTY);
244       }
245       return false;
246       break;
247     case COLEMAK:
248       if (record->event.pressed) {
249         #ifdef AUDIO_ENABLE
250           PLAY_SONG(tone_colemak);
251         #endif
252         persistent_default_layer_set(1UL<<_COLEMAK);
253       }
254       return false;
255       break;
256     case DVORAK:
257       if (record->event.pressed) {
258         #ifdef AUDIO_ENABLE
259           PLAY_SONG(tone_dvorak);
260         #endif
261         persistent_default_layer_set(1UL<<_DVORAK);
262       }
263       return false;
264       break;
265     case LOWER:
266       if (record->event.pressed) {
267           //not sure how to have keyboard check mode and set it to a variable, so my work around
268           //uses another variable that would be set to true after the first time a reactive key is pressed.
269         if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
270         } else {
271           TOG_STATUS = !TOG_STATUS;
272           #ifdef RGBLIGHT_ENABLE
273             //rgblight_mode(16);
274           #endif
275         }
276         layer_on(_LOWER);
277         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
278       } else {
279         #ifdef RGBLIGHT_ENABLE
280           //rgblight_mode(RGB_current_mode);   // revert RGB to initial mode prior to RGB mode change
281         #endif
282         TOG_STATUS = false;
283         layer_off(_LOWER);
284         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
285       }
286       return false;
287       break;
288     case RAISE:
289       if (record->event.pressed) {
290         //not sure how to have keyboard check mode and set it to a variable, so my work around
291         //uses another variable that would be set to true after the first time a reactive key is pressed.
292         if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
293         } else {
294           TOG_STATUS = !TOG_STATUS;
295           #ifdef RGBLIGHT_ENABLE
296             //rgblight_mode(15);
297           #endif
298         }
299         layer_on(_RAISE);
300         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
301       } else {
302         #ifdef RGBLIGHT_ENABLE
303           //rgblight_mode(RGB_current_mode);  // revert RGB to initial mode prior to RGB mode change
304         #endif
305         layer_off(_RAISE);
306         TOG_STATUS = false;
307         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
308       }
309       return false;
310       break;
311     case ADJUST:
312         if (record->event.pressed) {
313           layer_on(_ADJUST);
314         } else {
315           layer_off(_ADJUST);
316         }
317         return false;
318         break;
319       //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
320     case RGB_MOD:
321       #ifdef RGBLIGHT_ENABLE
322         if (record->event.pressed) {
323           rgblight_mode(RGB_current_mode);
324           rgblight_step();
325           RGB_current_mode = rgblight_config.mode;
326         }
327       #endif
328       return false;
329       break;
330     case EISU:
331       if (record->event.pressed) {
332         if(keymap_config.swap_lalt_lgui==false){
333           register_code(KC_LANG2);
334         }else{
335           SEND_STRING(SS_LALT("`"));
336         }
337       } else {
338         unregister_code(KC_LANG2);
339       }
340       return false;
341       break;
342     case KANA:
343       if (record->event.pressed) {
344         if(keymap_config.swap_lalt_lgui==false){
345           register_code(KC_LANG1);
346         }else{
347           SEND_STRING(SS_LALT("`"));
348         }
349       } else {
350         unregister_code(KC_LANG1);
351       }
352       return false;
353       break;
354     case RGBRST:
355       #ifdef RGBLIGHT_ENABLE
356         if (record->event.pressed) {
357           eeconfig_update_rgblight_default();
358           rgblight_enable();
359           RGB_current_mode = rgblight_config.mode;
360         }
361       #endif
362       break;
363   }
364   return true;
365 }
366
367 void matrix_init_user(void) {
368     #ifdef AUDIO_ENABLE
369         startup_user();
370     #endif
371     #ifdef RGBLIGHT_ENABLE
372       RGB_current_mode = rgblight_config.mode;
373     #endif
374     //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
375     #ifdef SSD1306OLED
376         TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000));
377         iota_gfx_init(!has_usb());   // turns on the display
378     #endif
379 }
380
381
382 #ifdef AUDIO_ENABLE
383
384 void startup_user()
385 {
386     _delay_ms(20); // gets rid of tick
387 }
388
389 void shutdown_user()
390 {
391     _delay_ms(150);
392     stop_all_notes();
393 }
394
395 void music_on_user(void)
396 {
397     music_scale_user();
398 }
399
400 void music_scale_user(void)
401 {
402     PLAY_SONG(music_scale);
403 }
404
405 #endif
406
407
408 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
409 #ifdef SSD1306OLED
410
411 void matrix_scan_user(void) {
412      iota_gfx_task();  // this is what updates the display continuously
413 }
414
415 void matrix_update(struct CharacterMatrix *dest,
416                           const struct CharacterMatrix *source) {
417   if (memcmp(dest->display, source->display, sizeof(dest->display))) {
418     memcpy(dest->display, source->display, sizeof(dest->display));
419     dest->dirty = true;
420   }
421 }
422
423 static void render_logo(struct CharacterMatrix *matrix) {
424
425   static char logo[]={
426     0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
427     0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
428     0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,
429     0};
430   matrix_write(matrix, logo);
431   //matrix_write_P(&matrix, PSTR(" Split keyboard kit"));
432 }
433
434 // #define DEBUG_OLED_LAYER_DISPLAY
435
436 static const char Qwerty_name[]  PROGMEM = " Qwerty";
437 static const char Colemak_name[] PROGMEM = " Colemak";
438 static const char Dvorak_name[]  PROGMEM = " Dvorak";
439
440 static const char Raise_name[]   PROGMEM = ":Extra";
441 static const char Lower_name[]   PROGMEM = ":Func";
442 static const char Adjust_name[]  PROGMEM = ":Adjust";
443
444 static const char *layer_names[] = {
445     [_QWERTY] = Qwerty_name,
446     [_COLEMAK] = Colemak_name,
447     [_DVORAK] = Dvorak_name,
448     [_RAISE] = Raise_name,
449     [_LOWER] = Lower_name,
450     [_ADJUST] = Adjust_name
451 };
452
453 static int search_bit_form_lsb(uint32_t data)
454 {
455     int i;
456     for( i = 0; i < 32 && (data & 1)==0 ; data >>= 1, i++ )
457         {}
458     return i;
459 }
460
461 void render_status(struct CharacterMatrix *matrix) {
462
463   // Render to mode icon
464   static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}};
465   if(keymap_config.swap_lalt_lgui==false){
466     matrix_write(matrix, logo[0][0]);
467     matrix_write_P(matrix, PSTR("\n"));
468     matrix_write(matrix, logo[0][1]);
469   }else{
470     matrix_write(matrix, logo[1][0]);
471     matrix_write_P(matrix, PSTR("\n"));
472     matrix_write(matrix, logo[1][1]);
473   }
474
475   // 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
476 #ifdef DEBUG_OLED_LAYER_DISPLAY
477   char buf[40];
478 #endif
479   int name_num;
480   uint32_t lstate;
481
482   name_num = search_bit_form_lsb(current_default_layer_state);
483   if( name_num < sizeof(layer_names)/sizeof(char *) ) {
484       matrix_write_P(matrix, layer_names[name_num]);
485 #ifdef DEBUG_OLED_LAYER_DISPLAY
486   } else {
487       snprintf(buf, sizeof(buf), "base=%d? ", name_num);
488       matrix_write(matrix, buf);
489 #endif
490   }
491   matrix_write_P(matrix, PSTR("\n"));
492   for( lstate = layer_state, name_num = 0;
493        lstate && name_num < sizeof(layer_names)/sizeof(char *);
494        lstate >>=1, name_num++ ) {
495       if( (lstate & 1) != 0 ) {
496           if( layer_names[name_num] ) {
497               matrix_write_P(matrix, layer_names[name_num]);
498 #ifdef DEBUG_OLED_LAYER_DISPLAY
499           } else {
500               snprintf(buf, sizeof(buf), ":L=%d?", name_num);
501               matrix_write(matrix, buf);
502 #endif
503           }
504       }
505   }
506
507   // Host Keyboard LED Status
508   char led[40];
509     snprintf(led, sizeof(led), "\n%s  %s  %s",
510             (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) ? "NUMLOCK" : "       ",
511             (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? "CAPS" : "    ",
512             (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ? "SCLK" : "    ");
513   matrix_write(matrix, led);
514 }
515
516
517 void iota_gfx_task_user(void) {
518   struct CharacterMatrix matrix;
519
520 #if DEBUG_TO_SCREEN
521   if (debug_enable) {
522     return;
523   }
524 #endif
525
526   matrix_clear(&matrix);
527   if(is_master){
528     render_status(&matrix);
529   }else{
530     render_logo(&matrix);
531   }
532   matrix_update(&display, &matrix);
533 }
534
535 #endif