]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/handwired/promethium/keymaps/priyadi/keymap.c
3107d4e05f3e72b50de40546bf701cb1716f295f
[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_set_layer_indicator(void) {
417   static uint8_t oldlayer = 255;
418
419   rgbsps_set(LED_IND_FUNC, 0, 0, 0);
420   rgbsps_set(LED_IND_NUM, 0, 0, 0);
421   rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
422
423   led_reset();
424
425   uint8_t layer = biton32(layer_state);
426   if (oldlayer == layer) {
427     return;
428   }
429
430   oldlayer = layer;
431
432   if (layer <= _NORMAN) {
433     rgbsps_send();
434     return;
435   }
436
437   switch(layer) {
438     case _FUNC:
439       rgbsps_set(LED_IND_FUNC, 15, 0, 0);
440       break;
441     case _NUM:
442       rgbsps_set(LED_IND_NUM, 0, 0, 15);
443       break;
444     case _EMOJI:
445       rgbsps_set(LED_IND_EMOJI, 15, 15, 0);
446       break;
447     default:
448       rgbsps_set(LED_IND_FUNC, 3, 3, 3);
449       rgbsps_set(LED_IND_NUM, 3, 3, 3);
450       rgbsps_set(LED_IND_EMOJI, 3, 3, 3);
451   }
452
453   rgbsps_send();
454 }
455
456 void led_set_output_ble(void) {
457   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 15);
458   rgbsps_set(LED_IND_USB, 0, 0, 0);
459   rgbsps_send();
460 }
461
462 void led_set_output_usb(void) {
463   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
464   rgbsps_set(LED_IND_USB, 15, 15, 15);
465   rgbsps_send();
466 }
467
468 void led_set_output_none(void) {
469   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
470   rgbsps_set(LED_IND_USB, 0, 0, 0);
471   rgbsps_send();
472 }
473
474 void led_init(void) {
475   // turn off all
476   rgbsps_turnoff();
477
478   // set trackpoint color
479   rgbsps_set(LED_TRACKPOINT1, 15, 0, 0);
480   rgbsps_set(LED_TRACKPOINT2, 0, 0, 15);
481   rgbsps_set(LED_TRACKPOINT3, 15, 0, 0);
482 }
483
484
485 // keymaps
486
487 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
488
489 /* Qwerty
490  * ,-----------------------------------------------------------------------------------.
491  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
492  * |------+------+------+------+------+-------------+------+------+------+------+------|
493  * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   '  |Enter |
494  * |------+------+------+------+------+------|------+------+------+------+------+------|
495  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Shift |
496  * |------+------+------+------+------+------+------+------+------+------+------+------|
497  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
498  * `-----------------------------------------------------------------------------------'
499  */
500 [_QWERTY] = KEYMAP(
501   KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
502   KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_QUOT, KC_ENT ,
503   KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,
504   KC_LCTL, KC_LALT, KC_LGUI, PUNC,    NUM,     KC_SPC,  KC_SPC,  FUNC,    GREEK,   KC_RGUI, KC_RALT, KC_RCTL
505 ),
506
507 /* Dvorak
508  * ,-----------------------------------------------------------------------------------.
509  * | Tab  |   '  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
510  * |------+------+------+------+------+-------------+------+------+------+------+------|
511  * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |Enter |
512  * |------+------+------+------+------+------|------+------+------+------+------+------|
513  * | Shift|   /  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Shift |
514  * |------+------+------+------+------+------+------+------+------+------+------+------|
515  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
516  * `-----------------------------------------------------------------------------------'
517  */
518 #ifdef LAYOUT_DVORAK
519 [_DVORAK] = KEYMAP(
520   _______, KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    _______,
521   _______, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    _______,
522   _______, KC_SLSH, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    _______,
523   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
524 ),
525 #endif
526
527 /* Colemak
528  * ,-----------------------------------------------------------------------------------.
529  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
530  * |------+------+------+------+------+-------------+------+------+------+------+------|
531  * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |Enter |
532  * |------+------+------+------+------+------|------+------+------+------+------+------|
533  * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Shift |
534  * |------+------+------+------+------+------+------+------+------+------+------+------|
535  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
536  * `-----------------------------------------------------------------------------------'
537  */
538
539 #ifdef LAYOUT_COLEMAK
540 [_COLEMAK] = KEYMAP(
541   _______, KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_QUOT, _______,
542   _______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    _______,
543   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
544   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
545 ),
546 #endif
547
548 /* Norman
549  * ,-----------------------------------------------------------------------------------.
550  * | Tab  |   Q  |   W  |   D  |   F  |   K  |   J  |   U  |   R  |   L  |   ;  | Bksp |
551  * |------+------+------+------+------+-------------+------+------+------+------+------|
552  * | Esc  |   A  |   S  |   E  |   T  |   G  |   Y  |   N  |   I  |   O  |   H  |Enter |
553  * |------+------+------+------+------+------|------+------+------+------+------+------|
554  * | Shift|   Z  |   X  |   C  |   V  |   B  |   P  |   M  |   ,  |   .  |   /  |Shift |
555  * |------+------+------+------+------+------+------+------+------+------+------+------|
556  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
557  * `-----------------------------------------------------------------------------------'
558  */
559
560 #ifdef LAYOUT_NORMAN
561 [_NORMAN] = KEYMAP(
562   _______, KC_Q,    KC_W,    KC_D,    KC_F,    KC_K,    KC_J,    KC_U,    KC_R,    KC_L,    KC_QUOT, _______,
563   _______, KC_A,    KC_S,    KC_E,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_I,    KC_O,    KC_H,    _______,
564   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
565   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
566 ),
567 #endif
568
569 /* Workman
570  * ,-----------------------------------------------------------------------------------.
571  * | Tab  |   Q  |   D  |   R  |   W  |   B  |   J  |   F  |   U  |   P  |   ;  | Bksp |
572  * |------+------+------+------+------+-------------+------+------+------+------+------|
573  * | Esc  |   A  |   S  |   H  |   T  |   G  |   Y  |   N  |   E  |   O  |   I  |Enter |
574  * |------+------+------+------+------+------|------+------+------+------+------+------|
575  * | Shift|   Z  |   X  |   M  |   C  |   V  |   K  |   K  |   ,  |   .  |   /  |Shift |
576  * |------+------+------+------+------+------+------+------+------+------+------+------|
577  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
578  * `-----------------------------------------------------------------------------------'
579  */
580
581 #ifdef LAYOUT_WORKMAN
582 [_WORKMAN] = KEYMAP(
583   _______, KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_QUOT, _______,
584   _______, KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    _______,
585   _______, KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLSH, _______,
586   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
587 ),
588 #endif
589
590 /* Punc
591  * ,-----------------------------------------------------------------------------------.
592  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |   `  |
593  * |------+------+------+------+------+-------------+------+------+------+------+------|
594  * |      |   *  |   \  |   -  |   =  |   /  |      |   (  |   )  |   <  |   >  |      |
595  * |------+------+------+------+------+------|------+------+------+------+------+------|
596  * |   &  |   ^  |   |  |   _  |   +  |   ?  |      |   [  |   ]  |   {  |   }  |   :  |
597  * |------+------+------+------+------+------+------+------+------+------+------+------|
598  * |      |      |      |      |      |             |      |      |      |      |      |
599  * `-----------------------------------------------------------------------------------'
600  */
601 [_PUNC] = KEYMAP(
602   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_GRV ,
603   XXXXXXX, KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, XXXXXXX, KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, XXXXXXX,
604   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, XXXXXXX, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_COLN,
605   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
606 ),
607
608 /* Num
609  * ,-----------------------------------------------------------------------------------.
610  * |   ~  |   !  |   @  |   #  |   $  |   %  |   A  |   7  |   8  |   9  |   D  |   `  |
611  * |------+------+------+------+------+-------------+------+------+------+------+------|
612  * |      |   *  |   \  |   -  |   =  |   /  |   B  |   4  |   5  |   6  |   E  |      |
613  * |------+------+------+------+------+------|------+------+------+------+------+------|
614  * |   &  |   ^  |   |  |   _  |   +  |   ?  |   C  |   1  |   2  |   3  |   F  |  :   |
615  * |------+------+------+------+------+------+------+------+------+------+------+------|
616  * |      |      |      |      |      |      |   x  |   0  |   ,  |   .  |      |      |
617  * `-----------------------------------------------------------------------------------'
618  */
619 [_NUM] = KEYMAP(
620   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,
621   XXXXXXX, KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, S(KC_B),    KC_4,    KC_5,    KC_6, S(KC_E), _______,
622   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,
623   _______, _______, _______, _______, _______, _______,    KC_X,    KC_0, KC_COMM,  KC_DOT, _______, _______
624 ),
625
626 /* Func
627  * ,-----------------------------------------------------------------------------------.
628  * |      |  F1  |  F2  |  F3  |  F4  |      |      | PgUp |  Up  | PgDn | PgUp | Del  |
629  * |------+------+------+------+------+-------------+------+------+------+------+------|
630  * |      |  F5  |  F6  |  F7  |  F8  |PrtSc |      | Left | Down | Right| PgDn | Ins  |
631  * |------+------+------+------+------+------|------+------+------+------+------+------|
632  * |      |  F9  |  F10 |  F11 |  F12 |      |      |      | Home |  End |      |      |
633  * |------+------+------+------+------+------+------+------+------+------+------+------|
634  * |      |      |      |      |      |             |      |      |      |      |      |
635  * `-----------------------------------------------------------------------------------'
636  */
637 [_FUNC] = KEYMAP(
638   XXXXXXX,   KC_F1,   KC_F2,   KC_F3,   KC_F4, XXXXXXX, XXXXXXX, KC_PGUP,   KC_UP, KC_PGDN, KC_PGUP,  KC_DEL,
639   XXXXXXX,   KC_F5,   KC_F6,   KC_F7,  KC_F8,KC_PSCREEN,XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN,  KC_INS,
640   _______,   KC_F9,  KC_F10,  KC_F11,  KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, _______,
641   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
642 ),
643
644 /* Uppercase Greek
645  * ,-----------------------------------------------------------------------------------.
646  * |      |      |      |      |      |      |      |      |      |      |      |      |
647  * |------+------+------+------+------+-------------+------+------+------+------+------|
648  * |      |      |      |      |      |      |      |      |      |      |      |      |
649  * |------+------+------+------+------+------+------+------+------+------+------+------|
650  * |      |      |      |      |      |      |      |      |      |      |      |      |
651  * |------+------+------+------+------+------+------+------+------+------+------+------|
652  * |      |      |      |      |      |      |      |      |      |      |      |      |
653  * `-----------------------------------------------------------------------------------'
654  */
655 [_GREEKU] = KEYMAP(
656   _______, _______, _______,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC),  X(UPI), _______,
657   _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA),  X(UXI),X(UKAPP),X(ULAMB), _______, _______,
658   _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA),  X(UNU),  X(UMU), _______, _______, _______, _______,
659   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
660 ),
661
662 /* Lowercase Greek
663  * ,-----------------------------------------------------------------------------------.
664  * |      |      |      |      |      |      |      |      |      |      |      |      |
665  * |------+------+------+------+------+-------------+------+------+------+------+------|
666  * |      |      |      |      |      |      |      |      |      |      |      |      |
667  * |------+------+------+------+------+------+------+------+------+------+------+------|
668  * |      |      |      |      |      |      |      |      |      |      |      |      |
669  * |------+------+------+------+------+------+------+------+------+------+------+------|
670  * |      |      |      |      |      |      |      |      |      |      |      |      |
671  * `-----------------------------------------------------------------------------------'
672  */
673 [_GREEKL] = KEYMAP(
674   _______, _______,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC),  X(LPI), _______,
675   _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA),  X(LXI),X(LKAPP),X(LLAMB), _______, _______,
676   _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA),  X(LNU),  X(LMU), _______, _______, _______, _______,
677   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
678 ),
679
680 /* Emoji
681  * ,-----------------------------------------------------------------------------------.
682  * |      |      |      |      |      |      |      |      |      |      |      |      |
683  * |------+------+------+------+------+-------------+------+------+------+------+------|
684  * |      |      |      |      |      |      |      |      |      |      |      |      |
685  * |------+------+------+------+------+------+------+------+------+------+------+------|
686  * |      |      |      |      |      |      |      |      |      |      |      |      |
687  * |------+------+------+------+------+------+------+------+------+------+------+------|
688  * |      |      |      |      |      |      |      |      |      |      |      |      |
689  * `-----------------------------------------------------------------------------------'
690  */
691 [_EMOJI] = KEYMAP(
692   X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
693   X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART),  X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
694   X(THMDN),X(SLEEP), X(CLAP),  X(CRY),  X(VIC),X(BHART),  X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
695     X(POO), X(EYES),X(HUNRD), _______,X(SKULL),X(HORNS), X(HALO), X(FEAR), _______,X(YUMMY),X(DISAP),X(NOEVK)
696 ),
697
698 /* GUI
699  * ,-----------------------------------------------------------------------------------.
700  * |      |  D1  |  D2  |  D3  |  D4  |  D5  |  D6  |  D7  |  D8  |  D9  |  D10 |      |
701  * |------+------+------+------+------+-------------+------+------+------+------+------|
702  * |      |      | Vol- | Mute | Vol+ |      |      | Prev |      | Next |      |      |
703  * |------+------+------+------+------+------+------+------+------+------+------+------|
704  * |      |      | Prev | Play | Next |      |      |      |      |      |      |      |
705  * |------+------+------+------+------+------+------+------+------+------+------+------|
706  * |      |      |      |      |      |      |      |      |      |      |      |      |
707  * `-----------------------------------------------------------------------------------'
708  */
709 [_GUI] = KEYMAP(
710   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,
711   XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
712   XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
713   XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX
714 ),
715
716 /* Sys
717  * ,-----------------------------------------------------------------------------------.
718  * |      |Qwerty| Win  |      |Reset |      |      | USB  |      |      |      |      |
719  * |------+------+------+------+------+-------------+------+------+------+------+------|
720  * |      |Audio |      |Dvorak|      | Glow |      |      |WorkMn|Linux |      |      |
721  * |------+------+------+------+------+------+------+------+------+------+------+------|
722  * |      |      |      |Colmak|      | BLE  |Norman|MacOS |      |      |      |      |
723  * |------+------+------+------+------+------+------+------+------+------+------+------|
724  * |      |      |      |      |      |      |      |      |      |      |      |      |
725  * `-----------------------------------------------------------------------------------'
726  */
727 [_SYS] = KEYMAP(
728   XXXXXXX, QWERTY,  WIN,     XXXXXXX, RESET,   XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
729   XXXXXXX, AUDIO,   XXXXXXX, DVORAK,  XXXXXXX, GLOW,    XXXXXXX, XXXXXXX, WORKMAN, LINUX,   XXXXXXX, XXXXXXX,
730   XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN,  OSX,     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
731   _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
732 ),
733
734 };
735
736 void persistant_default_layer_set(uint16_t default_layer) {
737   eeconfig_update_default_layer(default_layer);
738   default_layer_set(default_layer);
739 }
740
741 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
742   bool lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
743   bool rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
744
745   switch (keycode) {
746     // handle greek layer shift
747     case KC_LSFT:
748     case KC_RSFT:
749       ;
750       uint8_t layer = biton32(layer_state);
751       if (layer == _GREEKU || layer == _GREEKL) {
752         if (record->event.pressed) {
753           layer_on(_GREEKU);
754           layer_off(_GREEKL);
755         } else {
756           if (lshift ^ rshift) { // if only one shift was pressed
757             layer_on(_GREEKL);
758             layer_off(_GREEKU);
759           }
760         }
761       }
762       return true;
763       break;
764
765     // press both ctrls to activate SYS layer
766     case KC_LCTL:
767     case KC_RCTL:
768       ;
769       bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
770       bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
771       if (record->event.pressed) {
772         if (lctrl ^ rctrl) { // if only one ctrl was pressed
773           layer_on(_SYS);
774         }
775       } else {
776         layer_off(_SYS);
777       }
778       return true;
779       break;
780
781     // press both Supers to activate EMOJI layer
782     case KC_LGUI:
783     case KC_RGUI:
784       ;
785       bool lgui = keyboard_report->mods & MOD_BIT(KC_LGUI);
786       bool rgui = keyboard_report->mods & MOD_BIT(KC_RGUI);
787       if (record->event.pressed) {
788         if (lgui ^ rgui) { // if only one super was pressed
789           layer_on(_EMOJI);
790         }
791       } else {
792         layer_off(_EMOJI);
793       }
794       return true;
795       break;
796
797     // QWERTZ style comma and dot: semicolon and colon when shifted
798     case KC_COMM:
799       if (record->event.pressed) {
800         if (lshift || rshift) {
801           if (lshift) unregister_code(KC_LSFT);
802           if (rshift) unregister_code(KC_RSFT);
803           register_code(KC_SCLN);
804           unregister_code(KC_SCLN);
805           if (lshift) register_code(KC_LSFT);
806           if (rshift) register_code(KC_RSFT);
807         } else {
808           register_code(KC_COMM);
809           unregister_code(KC_COMM);
810         }
811       }
812       return false;
813       break;
814     case KC_DOT:
815       if (record->event.pressed) {
816         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
817           register_code(KC_SCLN);
818           unregister_code(KC_SCLN);
819         } else {
820           register_code(KC_DOT);
821           unregister_code(KC_DOT);
822         }
823       }
824       return false;
825       break;
826
827     // layout switchers
828     case QWERTY:
829       if (record->event.pressed) {
830         persistant_default_layer_set(1UL<<_QWERTY);
831       }
832       return false;
833       break;
834 #ifdef LAYOUT_DVORAK
835     case DVORAK:
836       if (record->event.pressed) {
837         persistant_default_layer_set(1UL<<_DVORAK);
838       }
839       return false;
840       break;
841 #endif
842 #ifdef LAYOUT_COLEMAK
843     case COLEMAK:
844       if (record->event.pressed) {
845         persistant_default_layer_set(1UL<<_COLEMAK);
846       }
847       return false;
848       break;
849 #endif
850 #ifdef LAYOUT_WORKMAN
851     case WORKMAN:
852       if (record->event.pressed) {
853         persistant_default_layer_set(1UL<<_WORKMAN);
854       }
855       return false;
856       break;
857 #endif
858 #ifdef LAYOUT_NORMAN
859     case NORMAN:
860       if (record->event.pressed) {
861         persistant_default_layer_set(1UL<<_NORMAN);
862       }
863       return false;
864       break;
865 #endif
866
867     // layer switcher
868     case PUNC:
869       if (record->event.pressed) {
870         layer_on(_PUNC);
871         update_tri_layer(_PUNC, _GREEKL, _GUI);
872       } else {
873         layer_off(_PUNC);
874         update_tri_layer(_PUNC, _GREEKL, _GUI);
875       }
876       return false;
877       break;
878
879     case GREEK:
880       if (record->event.pressed) {
881         if (lshift || rshift) {
882           layer_on(_GREEKU);
883           layer_off(_GREEKL);
884         } else {
885           layer_on(_GREEKL);
886           layer_off(_GREEKU);
887           update_tri_layer(_PUNC, _GREEKL, _GUI);
888         }
889       } else {
890         layer_off(_GREEKU);
891         layer_off(_GREEKL);
892         update_tri_layer(_PUNC, _GREEKL, _GUI);
893       }
894       return false;
895       break;
896
897     case NUM:
898       if (record->event.pressed) {
899         layer_on(_NUM);
900       } else {
901         layer_off(_NUM);
902       }
903       return false;
904       break;
905
906     case FUNC:
907       if (record->event.pressed) {
908         layer_on(_FUNC);
909       } else {
910         layer_off(_FUNC);
911       }
912       return false;
913       break;
914
915     // OS switchers
916     case LINUX:
917       set_unicode_input_mode(UC_LNX);
918       return false;
919       break;
920     case WIN:
921       set_unicode_input_mode(UC_WINC);
922       return false;
923       break;
924     case OSX:
925       set_unicode_input_mode(UC_OSX);
926       return false;
927       break;
928
929     // glow mode changer
930     case GLOW:
931       if (record->event.pressed) {
932         glow_mode++;
933         if (glow_mode > GLOW_FULL) {
934           glow_mode = GLOW_NONE;
935         }
936         led_reset();
937         rgbsps_send();
938       }
939       return false;
940       break;
941
942     // faux clicky toggle, TBD
943     case AUDIO:
944       return false;
945       break;
946   }
947   return true;
948 }
949
950 void set_output_user(uint8_t output) {
951   switch(output) {
952     case OUTPUT_USB:
953       led_set_output_usb();
954       break;
955     case OUTPUT_ADAFRUIT_BLE:
956       led_set_output_ble();
957       break;
958     default:
959       led_set_output_none();
960   }
961 }
962
963 void matrix_init_user(void) {
964   _delay_ms(500); // give time for usb to initialize
965
966   set_unicode_input_mode(UC_LNX);
967   led_init();
968
969   // auto detect output on init
970   uint8_t output = auto_detect_output();
971   if (output == OUTPUT_USB) {
972     set_output(OUTPUT_USB);
973   } else {
974     set_output(OUTPUT_ADAFRUIT_BLE);
975   }
976 }
977
978 void matrix_scan_user(void) {
979   led_set_layer_indicator();
980 }
981
982 void battery_poll(float percentage) {
983   rgbsps_sethsv(LED_IND_BATTERY, percentage*120/100, 255, 15);
984   rgbsps_send();
985 }
986
987 void ps2_mouse_init_user() {
988     uint8_t rcv;
989
990     // set TrackPoint sensitivity
991     PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
992     PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
993     PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
994     PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
995
996     // set TrackPoint Negative Inertia factor
997     PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
998     PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
999     PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1000     PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1001
1002     // set TrackPoint speed
1003     // (transfer function upper plateau speed)
1004     PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1005     PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1006     PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1007     PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1008
1009     // inquire pts status
1010     rcv = ps2_host_send(0xE2);
1011     rcv = ps2_host_send(0x2C);
1012     rcv = ps2_host_recv_response();
1013     if ((rcv & 1) == 1) {
1014       // if on, disable pts
1015       rcv = ps2_host_send(0xE2);
1016       rcv = ps2_host_send(0x47);
1017       rcv = ps2_host_send(0x2C);
1018       rcv = ps2_host_send(0x01);
1019     }
1020 }