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