]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/handwired/promethium/keymaps/priyadi/keymap.c
Add ifdefs for keyboard layouts
[qmk_firmware.git] / keyboards / handwired / promethium / keymaps / priyadi / keymap.c
1 // This is the canonical layout file for the Quantum project. If you want to add another keyboard,
2 // this is the style you want to emulate.
3
4 #include "promethium.h"
5 #include "action_layer.h"
6 #include "eeconfig.h"
7 #include "process_unicode.h"
8 #include "quantum.h"
9 #include "rgbsps.h"
10 #include "ps2_mouse.h"
11 #include "ps2.h"
12 #include "outputselect.h"
13 #define COUNT(x) (sizeof (x) / sizeof (*(x)))
14
15 // Fillers to make layering clearer
16 #define _______ KC_TRNS
17 #define XXXXXXX KC_NO
18 #define G(x) LGUI(x)
19 #define KC_WWWB KC_WWW_BACK
20 #define KC_WWWF KC_WWW_FORWARD
21
22 // hybrid right-alt & scroll lock (mapped to Compose in OS)
23 #undef KC_RALT
24 #define KC_RALT MT(MOD_RALT, KC_SLCK)
25
26 // glow
27 enum glow_modes {
28   GLOW_NONE,
29   GLOW_MIN,
30   GLOW_FULL
31 };
32 uint8_t glow_mode = GLOW_MIN;
33
34 extern keymap_config_t keymap_config;
35
36 enum layers {
37   _QWERTY,
38   _DVORAK,
39   _COLEMAK,
40   _WORKMAN,
41   _NORMAN,
42
43   _PUNC,
44   _NUM,
45   _FUNC,
46
47   _GREEKU,
48   _GREEKL,
49
50   _EMOJI,
51   _GUI,
52   _SYS,
53 };
54
55 enum planck_keycodes {
56   // layouts
57   QWERTY = SAFE_RANGE,
58   DVORAK,
59   COLEMAK,
60   WORKMAN,
61   NORMAN,
62
63   // layer switchers
64   PUNC,
65   NUM,
66   FUNC,
67   EMOJI,
68   GUI,
69   GREEK,
70
71   // os switchers
72   LINUX,
73   WIN,
74   OSX,
75
76   // others
77   GLOW,
78   AUDIO
79 };
80
81 // unicode map
82
83 enum unicode_name {
84   GRIN, // grinning face 😊
85   TJOY, // tears of joy 😂
86   SMILE, // grining face with smiling eyes 😁
87   HEART, // heart ❤
88   EYERT, // smiling face with heart shaped eyes 😍
89   CRY, // crying face 😭
90   SMEYE, // smiling face with smiling eyes 😊
91   UNAMU, // unamused 😒
92   KISS, // kiss 😘
93   HART2, // two hearts 💕
94   WEARY, // weary 😩
95   OKHND, // ok hand sign 👌
96   PENSV, // pensive 😔
97   SMIRK, // smirk 😏
98   RECYC, // recycle ♻
99   WINK, // wink 😉
100   THMUP, // thumb up 👍
101   THMDN, // thumb down 👎
102   PRAY, // pray 🙏
103   PHEW, // relieved 😌
104   MUSIC, // musical notes
105   FLUSH, // flushed 😳
106   CELEB, // celebration 🙌
107   CRY2, // crying face 😢
108   COOL, // smile with sunglasses 😎
109   NOEVS, // see no evil
110   NOEVH, // hear no evil
111   NOEVK, // speak no evil
112   POO, // pile of poo
113   EYES, // eyes
114   VIC, // victory hand
115   BHART, // broken heart
116   SLEEP, // sleeping face
117   SMIL2, // smiling face with open mouth & sweat
118   HUNRD, // 100
119   CONFU, // confused
120   TONGU, // face with tongue & winking eye
121   DISAP, // disappointed
122   YUMMY, // face savoring delicious food
123   CLAP, // hand clapping
124   FEAR, // face screaming in fear
125   HORNS, // smiling face with horns
126   HALO, // smiling face with halo
127   BYE, // waving hand
128   SUN, // sun
129   MOON, // moon
130   SKULL, // skull
131
132   // greek letters
133   UALPH,
134   UBETA,
135   UGAMM,
136   UDELT,
137   UEPSI,
138   UZETA,
139   UETA,
140   UTHET,
141   UIOTA,
142   UKAPP,
143   ULAMB,
144   UMU,
145   UNU,
146   UXI,
147   UOMIC,
148   UPI,
149   URHO,
150   USIGM,
151   UTAU,
152   UUPSI,
153   UPHI,
154   UCHI,
155   UPSI,
156   UOMEG,
157
158   LALPH,
159   LBETA,
160   LGAMM,
161   LDELT,
162   LEPSI,
163   LZETA,
164   LETA,
165   LTHET,
166   LIOTA,
167   LKAPP,
168   LLAMB,
169   LMU,
170   LNU,
171   LXI,
172   LOMIC,
173   LPI,
174   LRHO,
175   LSIGM,
176   LTAU,
177   LUPSI,
178   LPHI,
179   LCHI,
180   LPSI,
181   LOMEG,
182
183   FSIGM,
184 };
185
186 const uint32_t PROGMEM unicode_map[] = {
187   [GRIN] = 0x1F600,
188   [TJOY] = 0x1F602,
189   [SMILE] = 0x1F601,
190   [HEART] = 0x2764,
191   [EYERT] = 0x1f60d,
192   [CRY] = 0x1f62d,
193   [SMEYE] = 0x1F60A,
194   [UNAMU] = 0x1F612,
195   [KISS] = 0x1F618,
196   [HART2] = 0x1F495,
197   [WEARY] = 0x1F629,
198   [OKHND] = 0x1F44C,
199   [PENSV] = 0x1F614,
200   [SMIRK] = 0x1F60F,
201   [RECYC] = 0x267B,
202   [WINK] = 0x1F609,
203   [THMUP] = 0x1F44D,
204   [THMDN] = 0x1F44E,
205   [PRAY] = 0x1F64F,
206   [PHEW] = 0x1F60C,
207   [MUSIC] = 0x1F3B6,
208   [FLUSH] = 0x1F633,
209   [CELEB] = 0x1F64C,
210   [CRY2] = 0x1F622,
211   [COOL] = 0x1F60E,
212   [NOEVS] = 0x1F648,
213   [NOEVH] = 0x1F649,
214   [NOEVK] = 0x1F64A,
215   [POO] = 0x1F4A9,
216   [EYES] = 0x1F440,
217   [VIC] = 0x270C,
218   [BHART] = 0x1F494,
219   [SLEEP] = 0x1F634,
220   [SMIL2] = 0x1F605,
221   [HUNRD] = 0x1F4AF,
222   [CONFU] = 0x1F615,
223   [TONGU] = 0x1F61C,
224   [DISAP] = 0x1F61E,
225   [YUMMY] = 0x1F60B,
226   [CLAP] = 0x1F44F,
227   [FEAR] = 0x1F631,
228   [HORNS] = 0x1F608,
229   [HALO] = 0x1F607,
230   [BYE] = 0x1F44B,
231   [SUN] = 0x2600,
232   [MOON] = 0x1F314,
233   [SKULL] = 0x1F480,
234
235   // greek letters
236   [UALPH] = 0x0391,
237   [UBETA] = 0x0392,
238   [UGAMM] = 0x0393,
239   [UDELT] = 0x0394,
240   [UEPSI] = 0x0395,
241   [UZETA] = 0x0396,
242   [UETA] = 0x0397,
243   [UTHET] = 0x0398,
244   [UIOTA] = 0x0399,
245   [UKAPP] = 0x039A,
246   [ULAMB] = 0x039B,
247   [UMU] = 0x039C,
248   [UNU] = 0x039D,
249   [UXI] = 0x039E,
250   [UOMIC] = 0x039F,
251   [UPI] = 0x03A0,
252   [URHO] = 0x03A1,
253   [USIGM] = 0x03A3,
254   [UTAU] = 0x03A4,
255   [UUPSI] = 0x03A5,
256   [UPHI] = 0x03A6,
257   [UCHI] = 0x03A7,
258   [UPSI] = 0x03A8,
259   [UOMEG] = 0x03A9,
260   [LALPH] = 0x03B1,
261   [LBETA] = 0x03B2,
262   [LGAMM] = 0x03B3,
263   [LDELT] = 0x03B4,
264   [LEPSI] = 0x03B5,
265   [LZETA] = 0x03B6,
266   [LETA] = 0x03B7,
267   [LTHET] = 0x03B8,
268   [LIOTA] = 0x03B9,
269   [LKAPP] = 0x03BA,
270   [LLAMB] = 0x03BB,
271   [LMU] = 0x03BC,
272   [LNU] = 0x03BD,
273   [LXI] = 0x03BE,
274   [LOMIC] = 0x03BF,
275   [LPI] = 0x03C0,
276   [LRHO] = 0x03C1,
277   [LSIGM] = 0x03C3,
278   [LTAU] = 0x03C4,
279   [LUPSI] = 0x03C5,
280   [LPHI] = 0x03C6,
281   [LCHI] = 0x03C7,
282   [LPSI] = 0x03C8,
283   [LOMEG] = 0x03C9,
284   [FSIGM] = 0x03C2,
285 };
286
287 // RGBSPS
288
289 const uint8_t PROGMEM LED_ALNUM[] = {
290   LED_Z,
291   LED_A,
292   LED_Q,
293   LED_W,
294   LED_S,
295   LED_X,
296   LED_C,
297   LED_D,
298   LED_E,
299   LED_R,
300   LED_F,
301   LED_V,
302   LED_B,
303   LED_G,
304   LED_T,
305   LED_N,
306   LED_HH,
307   LED_Y,
308   LED_U,
309   LED_J,
310   LED_M,
311   LED_COMM,
312   LED_K,
313   LED_I,
314   LED_O,
315   LED_L,
316   LED_DOT,
317   LED_SLSH,
318   LED_SCLN,
319   LED_P,
320   LED_LSPC,
321   LED_RSPC
322 };
323
324 const uint8_t PROGMEM LED_HOMING[] = {
325   LED_A,
326   LED_S,
327   LED_D,
328   LED_F,
329   LED_J,
330   LED_K,
331   LED_L,
332   LED_SCLN
333 };
334
335 const uint8_t PROGMEM LED_MODS[] = {
336   LED_TAB,
337   LED_ESC,
338   LED_LSFT,
339   LED_LCTL,
340   LED_LGUI,
341   LED_LALT,
342   LED_RALT,
343   LED_RGUI,
344   LED_BKSP,
345   LED_ENT,
346   LED_RSFT,
347   LED_RCTL
348 };
349
350 const uint8_t PROGMEM LED_FN[] = {
351   LED_PUNC,
352   LED_NUM,
353   LED_FUNC,
354   LED_EMOJI
355 };
356
357 const uint8_t PROGMEM LED_INDICATORS[] = {
358   LED_IND_EMOJI,
359   LED_IND_NUM,
360   LED_IND_FUNC,
361   LED_IND_BATTERY,
362   LED_IND_USB,
363   LED_IND_BLUETOOTH,
364 };
365
366 const uint8_t PROGMEM LED_TRACKPOINT[] = {
367   LED_TRACKPOINT1,
368   LED_TRACKPOINT2,
369   LED_TRACKPOINT3,
370 };
371
372 void led_turnoff_keys(void) {
373   for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
374     rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 0, 0, 0);
375   }
376   for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
377     rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 0, 0);
378   }
379   for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
380     rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 0);
381   }
382 }
383
384 void led_reset(void) {
385   switch (glow_mode) {
386     case GLOW_NONE:
387       led_turnoff_keys();
388       break;
389     case GLOW_MIN:
390       led_turnoff_keys();
391       for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
392         rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 8, 8, 8);
393       }
394       rgbsps_set(LED_F, 15, 0, 0);
395       rgbsps_set(LED_J, 15, 0, 0);
396       break;
397     case GLOW_FULL:
398       for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
399         rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 8, 8, 8);
400       }
401       for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
402         rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 15, 0);
403       }
404       for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
405         rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 15);
406       }
407       for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
408         rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 15, 0, 0);
409       }
410       rgbsps_set(LED_F, 15, 15, 0);
411       rgbsps_set(LED_J, 15, 15, 0);
412       break;
413   }
414 }
415
416 void led_layer_normal(void) {
417   rgbsps_set(LED_IND_FUNC, 0, 0, 0);
418   rgbsps_set(LED_IND_NUM, 0, 0, 0);
419   rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
420
421   led_reset();
422
423   rgbsps_send();
424 }
425
426 void led_layer_func(void) {
427   rgbsps_set(LED_IND_FUNC, 0, 15, 0);
428   rgbsps_set(LED_IND_NUM, 0, 0, 0);
429   rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
430
431   led_reset();
432
433   rgbsps_send();
434 }
435
436 void led_layer_punc(void) {
437   rgbsps_set(LED_IND_FUNC, 0, 15, 0);
438   rgbsps_set(LED_IND_NUM, 0, 0, 15);
439   rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
440
441   led_reset();
442
443   rgbsps_send();
444 }
445
446 void led_layer_num(void) {
447   rgbsps_set(LED_IND_FUNC, 0, 0, 0);
448   rgbsps_set(LED_IND_NUM, 0, 0, 15);
449   rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
450
451   led_reset();
452
453   rgbsps_send();
454 }
455
456 void led_layer_emoji(void) {
457   rgbsps_set(LED_IND_FUNC, 0, 0, 0);
458   rgbsps_set(LED_IND_NUM, 0, 0, 0);
459   rgbsps_set(LED_IND_EMOJI, 15, 15, 0);
460
461   rgbsps_set(LED_PUNC, 15, 15, 15);
462   rgbsps_set(LED_EMOJI, 15, 15, 15);
463
464   rgbsps_send();
465 }
466
467 void led_layer_gui(void) {
468   rgbsps_set(LED_IND_FUNC, 15, 10, 15);
469   rgbsps_set(LED_IND_NUM, 15, 10, 15);
470   rgbsps_set(LED_IND_EMOJI, 15, 10, 15);
471   rgbsps_send();
472 }
473
474 void led_set_output_ble(void) {
475   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 15);
476   rgbsps_set(LED_IND_USB, 0, 0, 0);
477   rgbsps_send();
478 }
479
480 void led_set_output_usb(void) {
481   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
482   rgbsps_set(LED_IND_USB, 15, 15, 15);
483   rgbsps_send();
484 }
485
486 void led_set_output_none(void) {
487   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
488   rgbsps_set(LED_IND_USB, 0, 0, 0);
489   rgbsps_send();
490 }
491
492 void led_init(void) {
493   // turn off all
494   rgbsps_turnoff();
495
496   // set trackpoint color
497   rgbsps_set(LED_TRACKPOINT1, 15, 0, 0);
498   rgbsps_set(LED_TRACKPOINT2, 0, 0, 15);
499   rgbsps_set(LED_TRACKPOINT3, 15, 0, 0);
500
501   led_layer_normal();
502 }
503
504
505 // keymaps
506
507 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
508
509 /* Qwerty
510  * ,-----------------------------------------------------------------------------------.
511  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
512  * |------+------+------+------+------+-------------+------+------+------+------+------|
513  * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   '  |Enter |
514  * |------+------+------+------+------+------|------+------+------+------+------+------|
515  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Shift |
516  * |------+------+------+------+------+------+------+------+------+------+------+------|
517  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
518  * `-----------------------------------------------------------------------------------'
519  */
520 [_QWERTY] = KEYMAP(
521   KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
522   KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_QUOT, KC_ENT ,
523   KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,
524   KC_LCTL, KC_LALT, KC_LGUI, PUNC,    NUM,     KC_SPC,  KC_SPC,  FUNC,    GREEK,   KC_RGUI, KC_RALT, KC_RCTL
525 ),
526
527 /* Dvorak
528  * ,-----------------------------------------------------------------------------------.
529  * | Tab  |   '  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
530  * |------+------+------+------+------+-------------+------+------+------+------+------|
531  * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |Enter |
532  * |------+------+------+------+------+------|------+------+------+------+------+------|
533  * | Shift|   /  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Shift |
534  * |------+------+------+------+------+------+------+------+------+------+------+------|
535  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
536  * `-----------------------------------------------------------------------------------'
537  */
538 #ifdef LAYOUT_DVORAK
539 [_DVORAK] = KEYMAP(
540   _______, KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    _______,
541   _______, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    _______,
542   _______, KC_SLSH, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    _______,
543   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
544 ),
545 #endif
546
547 /* Colemak
548  * ,-----------------------------------------------------------------------------------.
549  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
550  * |------+------+------+------+------+-------------+------+------+------+------+------|
551  * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |Enter |
552  * |------+------+------+------+------+------|------+------+------+------+------+------|
553  * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Shift |
554  * |------+------+------+------+------+------+------+------+------+------+------+------|
555  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
556  * `-----------------------------------------------------------------------------------'
557  */
558
559 #ifdef LAYOUT_COLEMAK
560 [_COLEMAK] = KEYMAP(
561   _______, KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_QUOT, _______,
562   _______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    _______,
563   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
564   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
565 ),
566 #endif
567
568 /* Norman
569  * ,-----------------------------------------------------------------------------------.
570  * | Tab  |   Q  |   W  |   D  |   F  |   K  |   J  |   U  |   R  |   L  |   ;  | Bksp |
571  * |------+------+------+------+------+-------------+------+------+------+------+------|
572  * | Esc  |   A  |   S  |   E  |   T  |   G  |   Y  |   N  |   I  |   O  |   H  |Enter |
573  * |------+------+------+------+------+------|------+------+------+------+------+------|
574  * | Shift|   Z  |   X  |   C  |   V  |   B  |   P  |   M  |   ,  |   .  |   /  |Shift |
575  * |------+------+------+------+------+------+------+------+------+------+------+------|
576  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
577  * `-----------------------------------------------------------------------------------'
578  */
579
580 #ifdef LAYOUT_NORMAN
581 [_NORMAN] = KEYMAP(
582   _______, KC_Q,    KC_W,    KC_D,    KC_F,    KC_K,    KC_J,    KC_U,    KC_R,    KC_L,    KC_QUOT, _______,
583   _______, KC_A,    KC_S,    KC_E,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_I,    KC_O,    KC_H,    _______,
584   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
585   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
586 ),
587 #endif
588
589 /* Workman
590  * ,-----------------------------------------------------------------------------------.
591  * | Tab  |   Q  |   D  |   R  |   W  |   B  |   J  |   F  |   U  |   P  |   ;  | Bksp |
592  * |------+------+------+------+------+-------------+------+------+------+------+------|
593  * | Esc  |   A  |   S  |   H  |   T  |   G  |   Y  |   N  |   E  |   O  |   I  |Enter |
594  * |------+------+------+------+------+------|------+------+------+------+------+------|
595  * | Shift|   Z  |   X  |   M  |   C  |   V  |   K  |   K  |   ,  |   .  |   /  |Shift |
596  * |------+------+------+------+------+------+------+------+------+------+------+------|
597  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
598  * `-----------------------------------------------------------------------------------'
599  */
600
601 #ifdef LAYOUT_WORKMAN
602 [_WORKMAN] = KEYMAP(
603   _______, KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_QUOT, _______,
604   _______, KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    _______,
605   _______, KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLSH, _______,
606   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
607 ),
608 #endif
609
610 /* Punc
611  * ,-----------------------------------------------------------------------------------.
612  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |   `  |
613  * |------+------+------+------+------+-------------+------+------+------+------+------|
614  * |      |   *  |   \  |   -  |   =  |   /  |      |   (  |   )  |   <  |   >  |      |
615  * |------+------+------+------+------+------|------+------+------+------+------+------|
616  * |   &  |   ^  |   |  |   _  |   +  |   ?  |      |   [  |   ]  |   {  |   }  |   :  |
617  * |------+------+------+------+------+------+------+------+------+------+------+------|
618  * |      |      |      |      |      |             |      |      |      |      |      |
619  * `-----------------------------------------------------------------------------------'
620  */
621 [_PUNC] = KEYMAP(
622   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_GRV ,
623   XXXXXXX, KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, XXXXXXX, KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, XXXXXXX,
624   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, XXXXXXX, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_COLN,
625   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
626 ),
627
628 /* Num
629  * ,-----------------------------------------------------------------------------------.
630  * |   ~  |   !  |   @  |   #  |   $  |   %  |   A  |   7  |   8  |   9  |   D  |   `  |
631  * |------+------+------+------+------+-------------+------+------+------+------+------|
632  * |      |   *  |   \  |   -  |   =  |   /  |   B  |   4  |   5  |   6  |   E  |      |
633  * |------+------+------+------+------+------|------+------+------+------+------+------|
634  * |   &  |   ^  |   |  |   _  |   +  |   ?  |   C  |   1  |   2  |   3  |   F  |  :   |
635  * |------+------+------+------+------+------+------+------+------+------+------+------|
636  * |      |      |      |      |      |      |   x  |   0  |   ,  |   .  |      |      |
637  * `-----------------------------------------------------------------------------------'
638  */
639 [_NUM] = KEYMAP(
640   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, S(KC_A),    KC_7,    KC_8,    KC_9, S(KC_D), KC_GRV,
641   XXXXXXX, KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, S(KC_B),    KC_4,    KC_5,    KC_6, S(KC_E), _______,
642   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C),    KC_1,    KC_2,    KC_3, S(KC_F), KC_COLN,
643   _______, _______, _______, _______, _______, _______,    KC_X,    KC_0, KC_COMM,  KC_DOT, _______, _______
644 ),
645
646 /* Func
647  * ,-----------------------------------------------------------------------------------.
648  * |      |  F1  |  F2  |  F3  |  F4  |      |      | PgUp |  Up  | PgDn | PgUp | Del  |
649  * |------+------+------+------+------+-------------+------+------+------+------+------|
650  * |      |  F5  |  F6  |  F7  |  F8  |PrtSc |      | Left | Down | Right| PgDn | Ins  |
651  * |------+------+------+------+------+------|------+------+------+------+------+------|
652  * |      |  F9  |  F10 |  F11 |  F12 |      |      |      | Home |  End |      |      |
653  * |------+------+------+------+------+------+------+------+------+------+------+------|
654  * |      |      |      |      |      |             |      |      |      |      |      |
655  * `-----------------------------------------------------------------------------------'
656  */
657 [_FUNC] = KEYMAP(
658   XXXXXXX,   KC_F1,   KC_F2,   KC_F3,   KC_F4, XXXXXXX, XXXXXXX, KC_PGUP,   KC_UP, KC_PGDN, KC_PGUP,  KC_DEL,
659   XXXXXXX,   KC_F5,   KC_F6,   KC_F7,  KC_F8,KC_PSCREEN,XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN,  KC_INS,
660   _______,   KC_F9,  KC_F10,  KC_F11,  KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, _______,
661   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
662 ),
663
664 /* Uppercase Greek
665  * ,-----------------------------------------------------------------------------------.
666  * |      |      |      |      |      |      |      |      |      |      |      |      |
667  * |------+------+------+------+------+-------------+------+------+------+------+------|
668  * |      |      |      |      |      |      |      |      |      |      |      |      |
669  * |------+------+------+------+------+------+------+------+------+------+------+------|
670  * |      |      |      |      |      |      |      |      |      |      |      |      |
671  * |------+------+------+------+------+------+------+------+------+------+------+------|
672  * |      |      |      |      |      |      |      |      |      |      |      |      |
673  * `-----------------------------------------------------------------------------------'
674  */
675 [_GREEKU] = KEYMAP(
676   _______, _______, _______,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC),  X(UPI), _______,
677   _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA),  X(UXI),X(UKAPP),X(ULAMB), _______, _______,
678   _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA),  X(UNU),  X(UMU), _______, _______, _______, _______,
679   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
680 ),
681
682 /* Lowercase Greek
683  * ,-----------------------------------------------------------------------------------.
684  * |      |      |      |      |      |      |      |      |      |      |      |      |
685  * |------+------+------+------+------+-------------+------+------+------+------+------|
686  * |      |      |      |      |      |      |      |      |      |      |      |      |
687  * |------+------+------+------+------+------+------+------+------+------+------+------|
688  * |      |      |      |      |      |      |      |      |      |      |      |      |
689  * |------+------+------+------+------+------+------+------+------+------+------+------|
690  * |      |      |      |      |      |      |      |      |      |      |      |      |
691  * `-----------------------------------------------------------------------------------'
692  */
693 [_GREEKL] = KEYMAP(
694   _______, _______,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC),  X(LPI), _______,
695   _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA),  X(LXI),X(LKAPP),X(LLAMB), _______, _______,
696   _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA),  X(LNU),  X(LMU), _______, _______, _______, _______,
697   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
698 ),
699
700 /* Emoji
701  * ,-----------------------------------------------------------------------------------.
702  * |      |      |      |      |      |      |      |      |      |      |      |      |
703  * |------+------+------+------+------+-------------+------+------+------+------+------|
704  * |      |      |      |      |      |      |      |      |      |      |      |      |
705  * |------+------+------+------+------+------+------+------+------+------+------+------|
706  * |      |      |      |      |      |      |      |      |      |      |      |      |
707  * |------+------+------+------+------+------+------+------+------+------+------+------|
708  * |      |      |      |      |      |      |      |      |      |      |      |      |
709  * `-----------------------------------------------------------------------------------'
710  */
711 [_EMOJI] = KEYMAP(
712   X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
713   X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART),  X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
714   X(THMDN),X(SLEEP), X(CLAP),  X(CRY),  X(VIC),X(BHART),  X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
715     X(POO), X(EYES),X(HUNRD), _______,X(SKULL),X(HORNS), X(HALO), X(FEAR), _______,X(YUMMY),X(DISAP),X(NOEVK)
716 ),
717
718 /* GUI
719  * ,-----------------------------------------------------------------------------------.
720  * |      |  D1  |  D2  |  D3  |  D4  |  D5  |  D6  |  D7  |  D8  |  D9  |  D10 |      |
721  * |------+------+------+------+------+-------------+------+------+------+------+------|
722  * |      |      | Vol- | Mute | Vol+ |      |      | Prev |      | Next |      |      |
723  * |------+------+------+------+------+------+------+------+------+------+------+------|
724  * |      |      | Prev | Play | Next |      |      |      |      |      |      |      |
725  * |------+------+------+------+------+------+------+------+------+------+------+------|
726  * |      |      |      |      |      |      |      |      |      |      |      |      |
727  * `-----------------------------------------------------------------------------------'
728  */
729 [_GUI] = KEYMAP(
730   XXXXXXX, G(KC_1), G(KC_2), G(KC_3), G(KC_4), G(KC_5), G(KC_6), G(KC_7), G(KC_8), G(KC_9), G(KC_0), XXXXXXX,
731   XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
732   XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
733   XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX
734 ),
735
736 /* Sys
737  * ,-----------------------------------------------------------------------------------.
738  * |      |Qwerty| Win  |      |      |      |      | USB  |      |      |      |      |
739  * |------+------+------+------+------+-------------+------+------+------+------+------|
740  * |      |Audio |      |Dvorak|      | Glow |      |      |WorkMn|Linux |      |      |
741  * |------+------+------+------+------+------+------+------+------+------+------+------|
742  * |      |      |      |Colmak|      | BLE  |Norman|MacOS |      |      |      |      |
743  * |------+------+------+------+------+------+------+------+------+------+------+------|
744  * |      |      |      |      |      |      |      |      |      |      |      |      |
745  * `-----------------------------------------------------------------------------------'
746  */
747 [_SYS] = KEYMAP(
748   XXXXXXX, QWERTY,  WIN,     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
749   XXXXXXX, AUDIO,   XXXXXXX, DVORAK,  XXXXXXX, GLOW,    XXXXXXX, XXXXXXX, WORKMAN, LINUX,   XXXXXXX, XXXXXXX,
750   XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN,  OSX,     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
751   _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
752 ),
753
754 };
755
756 void persistant_default_layer_set(uint16_t default_layer) {
757   eeconfig_update_default_layer(default_layer);
758   default_layer_set(default_layer);
759 }
760
761 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
762   bool lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
763   bool rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
764
765   switch (keycode) {
766     // handle greek layer shift
767     case KC_LSFT:
768     case KC_RSFT:
769       ;
770       uint8_t layer = biton32(layer_state);
771       if (layer == _GREEKU || layer == _GREEKL) {
772         if (record->event.pressed) {
773           layer_on(_GREEKU);
774           layer_off(_GREEKL);
775         } else {
776           if (lshift ^ rshift) { // if only one shift was pressed
777             layer_on(_GREEKL);
778             layer_off(_GREEKU);
779           }
780         }
781       }
782       return true;
783       break;
784
785     // press both ctrls to activate SYS layer
786     case KC_LCTL:
787     case KC_RCTL:
788       ;
789       bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
790       bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
791       if (record->event.pressed) {
792         if (lctrl ^ rctrl) { // if only one ctrl was pressed
793           layer_on(_SYS);
794         }
795       } else {
796         layer_off(_SYS);
797       }
798       return true;
799       break;
800
801     // QWERTZ style comma and dot: semicolon and colon when shifted
802     case KC_COMM:
803       if (record->event.pressed) {
804         if (lshift || rshift) {
805           if (lshift) unregister_code(KC_LSFT);
806           if (rshift) unregister_code(KC_RSFT);
807           register_code(KC_SCLN);
808           unregister_code(KC_SCLN);
809           if (lshift) register_code(KC_LSFT);
810           if (rshift) register_code(KC_RSFT);
811         } else {
812           register_code(KC_COMM);
813           unregister_code(KC_COMM);
814         }
815       }
816       return false;
817       break;
818     case KC_DOT:
819       if (record->event.pressed) {
820         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
821           register_code(KC_SCLN);
822           unregister_code(KC_SCLN);
823         } else {
824           register_code(KC_DOT);
825           unregister_code(KC_DOT);
826         }
827       }
828       return false;
829       break;
830
831     // layout switchers
832     case QWERTY:
833       if (record->event.pressed) {
834         persistant_default_layer_set(1UL<<_QWERTY);
835       }
836       return false;
837       break;
838 #ifdef LAYOUT_DVORAK
839     case DVORAK:
840       if (record->event.pressed) {
841         persistant_default_layer_set(1UL<<_DVORAK);
842       }
843       return false;
844       break;
845 #endif
846 #ifdef LAYOUT_COLEMAK
847     case COLEMAK:
848       if (record->event.pressed) {
849         persistant_default_layer_set(1UL<<_COLEMAK);
850       }
851       return false;
852       break;
853 #endif
854 #ifdef LAYOUT_WORKMAN
855     case WORKMAN:
856       if (record->event.pressed) {
857         persistant_default_layer_set(1UL<<_WORKMAN);
858       }
859       return false;
860       break;
861 #endif
862 #ifdef LAYOUT_NORMAN
863     case NORMAN:
864       if (record->event.pressed) {
865         persistant_default_layer_set(1UL<<_NORMAN);
866       }
867       return false;
868       break;
869 #endif
870
871     // layer switcher
872     case PUNC:
873       if (record->event.pressed) {
874         layer_on(_PUNC);
875         update_tri_layer(_PUNC, _GREEKL, _GUI);
876         if (IS_LAYER_ON(_GUI)) {
877           led_layer_normal();
878         } else {
879           led_layer_punc();
880         }
881       } else {
882         layer_off(_PUNC);
883         update_tri_layer(_PUNC, _GREEKL, _GUI);
884         if (IS_LAYER_ON(_GREEKL)) {
885           led_layer_normal();
886         } else {
887           led_layer_normal();
888         }
889       }
890       return false;
891       break;
892
893     case GREEK:
894       if (record->event.pressed) {
895         if (lshift || rshift) {
896           layer_on(_GREEKU);
897           layer_off(_GREEKL);
898         } else {
899           layer_on(_GREEKL);
900           layer_off(_GREEKU);
901           update_tri_layer(_PUNC, _GREEKL, _GUI);
902           if (IS_LAYER_ON(_GUI)) {
903             led_layer_normal();
904           } else {
905             led_layer_normal();
906           }
907         }
908       } else {
909         layer_off(_GREEKU);
910         layer_off(_GREEKL);
911         update_tri_layer(_PUNC, _GREEKL, _GUI);
912         if (IS_LAYER_ON(_PUNC)) {
913           led_layer_normal();
914         } else {
915           led_layer_normal();
916         }
917       }
918       return false;
919       break;
920
921     case NUM:
922       if (record->event.pressed) {
923         layer_on(_NUM);
924         led_layer_num();
925       } else {
926         layer_off(_NUM);
927         led_layer_normal();
928       }
929       return false;
930       break;
931
932     case FUNC:
933       if (record->event.pressed) {
934         layer_on(_FUNC);
935         led_layer_func();
936       } else {
937         layer_off(_FUNC);
938         led_layer_normal();
939       }
940       return false;
941       break;
942
943     // OS switchers
944     case LINUX:
945       set_unicode_input_mode(UC_LNX);
946       return false;
947       break;
948     case WIN:
949       set_unicode_input_mode(UC_WINC);
950       return false;
951       break;
952     case OSX:
953       set_unicode_input_mode(UC_OSX);
954       return false;
955       break;
956
957     // glow mode changer
958     case GLOW:
959       if (record->event.pressed) {
960         glow_mode++;
961         if (glow_mode > GLOW_FULL) {
962           glow_mode = GLOW_NONE;
963         }
964         led_reset();
965         rgbsps_send();
966       }
967       return false;
968       break;
969
970     // faux clicky toggle, TBD
971     case AUDIO:
972       return false;
973       break;
974   }
975   return true;
976 }
977
978 void set_output_user(uint8_t output) {
979   switch(output) {
980     case OUTPUT_USB:
981       led_set_output_usb();
982       break;
983     case OUTPUT_ADAFRUIT_BLE:
984       led_set_output_ble();
985       break;
986     default:
987       led_set_output_none();
988   }
989 }
990
991 void matrix_init_user(void) {
992   _delay_ms(500); // give time for usb to initialize
993
994   set_unicode_input_mode(UC_LNX);
995   led_init();
996
997   // auto detect output on init
998   uint8_t output = auto_detect_output();
999   if (output == OUTPUT_USB) {
1000     set_output(OUTPUT_USB);
1001   } else {
1002     set_output(OUTPUT_ADAFRUIT_BLE);
1003   }
1004 }
1005
1006 void battery_poll(float percentage) {
1007   rgbsps_sethsv(LED_IND_BATTERY, percentage*120/100, 255, 15);
1008   rgbsps_send();
1009 }
1010
1011 void ps2_mouse_init_user() {
1012     uint8_t rcv;
1013
1014     // set TrackPoint sensitivity
1015     PS2_MOUSE_SEND(0xE2, "set trackpoint sensitivity: 0xE2");
1016     PS2_MOUSE_SEND(0x81, "set trackpoint sensitivity: 0x81");
1017     PS2_MOUSE_SEND(0x4A, "set trackpoint sensitivity: 0x4A");
1018     PS2_MOUSE_SEND(0x49, "set trackpoint sensitivity: 0x59");
1019
1020     // set TrackPoint Negative Inertia factor
1021     PS2_MOUSE_SEND(0xE2, "set negative inertia factor: 0xE2");
1022     PS2_MOUSE_SEND(0x81, "set negative inertia factor: 0x81");
1023     PS2_MOUSE_SEND(0x4D, "set negative inertia factor: 0x4D");
1024     PS2_MOUSE_SEND(0x06, "set negative inertia factor: 0x06");
1025
1026     // set TrackPoint speed
1027     // (transfer function upper plateau speed)
1028     PS2_MOUSE_SEND(0xE2, "set trackpoint speed: 0xE2");
1029     PS2_MOUSE_SEND(0x81, "set trackpoint speed: 0x81");
1030     PS2_MOUSE_SEND(0x60, "set trackpoint speed: 0x60");
1031     PS2_MOUSE_SEND(0x61, "set trackpoint speed: 0x61");
1032
1033     // inquire pts status
1034     rcv = ps2_host_send(0xE2);
1035     rcv = ps2_host_send(0x2C);
1036     rcv = ps2_host_recv_response();
1037     if ((rcv & 1) == 1) {
1038       // if on, disable pts
1039       rcv = ps2_host_send(0xE2);
1040       rcv = ps2_host_send(0x47);
1041       rcv = ps2_host_send(0x2C);
1042       rcv = ps2_host_send(0x01);
1043     }
1044 }