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