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