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