]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/handwired/promethium/keymaps/priyadi/keymap.c
Remove assignment warning
[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 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
759   if (pressed) {
760     *isactive = true;
761     if (*otheractive) {
762       layer_on(_SPACE);
763       space_layer_entered = true;
764     }
765   } else {
766     *isactive = false;
767     if (space_layer_entered) {
768       layer_off(_SPACE);
769       if (!*otheractive) {
770         space_layer_entered = false;
771       }
772     } else {
773       if (!*isemitted) {
774         register_code(KC_SPC);
775         unregister_code(KC_SPC);
776       }
777       *isemitted = false;
778     }
779   }
780 }
781
782 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
783   bool lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
784   bool rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
785
786 #ifdef DOUBLESPACE_LAYER_ENABLE
787   // double-space: send space immediately if any other key depressed before space is released
788   if ((lspace_active ^ rspace_active)
789       && keycode != LSPACE
790       && keycode != RSPACE
791       && record->event.pressed)
792   {
793     if (lspace_active) {
794       if (!lspace_emitted) {
795         register_code(KC_SPC);
796         unregister_code(KC_SPC);
797       }
798       lspace_emitted = true;
799     }
800     if (rspace_active) {
801       if (!rspace_emitted) {
802         register_code(KC_SPC);
803         unregister_code(KC_SPC);
804       }
805       rspace_emitted = true;
806     }
807   }
808 #endif
809
810   switch (keycode) {
811
812 #ifdef DOUBLESPACE_LAYER_ENABLE
813     // double-space enter space layer
814     case LSPACE:
815       process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
816       return false;
817       break;
818     case RSPACE:
819       process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
820       return false;
821       break;
822 #endif
823
824     // handle greek layer shift
825     // handle both shift = capslock
826     case KC_LSFT:
827     case KC_RSFT:
828       ;
829       uint8_t layer = biton32(layer_state);
830       if (layer == _GREEKU || layer == _GREEKL) {
831         if (record->event.pressed) {
832           layer_on(_GREEKU);
833           layer_off(_GREEKL);
834         } else {
835           if (lshift ^ rshift) { // if only one shift was pressed
836             layer_on(_GREEKL);
837             layer_off(_GREEKU);
838           }
839         }
840       } else {
841         if (record->event.pressed) {
842           if (lshift ^ rshift) { // if only one shift was pressed
843             register_code(KC_CAPS);
844             unregister_code(KC_CAPS);
845           }
846         }
847       }
848       return true;
849       break;
850
851     // press both ctrls to activate SYS layer
852     case KC_LCTL:
853     case KC_RCTL:
854       ;
855       bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
856       bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
857       if (record->event.pressed) {
858         if (lctrl ^ rctrl) { // if only one ctrl was pressed
859           layer_on(_SYS);
860         }
861       } else {
862         layer_off(_SYS);
863       }
864       return true;
865       break;
866
867     // QWERTZ style comma and dot: semicolon and colon when shifted
868     case KC_COMM:
869       if (record->event.pressed) {
870         if (lshift || rshift) {
871           if (lshift) unregister_code(KC_LSFT);
872           if (rshift) unregister_code(KC_RSFT);
873           register_code(KC_SCLN);
874           unregister_code(KC_SCLN);
875           if (lshift) register_code(KC_LSFT);
876           if (rshift) register_code(KC_RSFT);
877         } else {
878           register_code(KC_COMM);
879           unregister_code(KC_COMM);
880         }
881       }
882       return false;
883       break;
884     case KC_DOT:
885       if (record->event.pressed) {
886         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
887           register_code(KC_SCLN);
888           unregister_code(KC_SCLN);
889         } else {
890           register_code(KC_DOT);
891           unregister_code(KC_DOT);
892         }
893       }
894       return false;
895       break;
896
897     // layout switchers
898     case QWERTY:
899       if (record->event.pressed) {
900         persistant_default_layer_set(1UL<<_QWERTY);
901       }
902       return false;
903       break;
904 #ifdef LAYOUT_DVORAK
905     case DVORAK:
906       if (record->event.pressed) {
907         persistant_default_layer_set(1UL<<_DVORAK);
908       }
909       return false;
910       break;
911 #endif
912 #ifdef LAYOUT_COLEMAK
913     case COLEMAK:
914       if (record->event.pressed) {
915         persistant_default_layer_set(1UL<<_COLEMAK);
916       }
917       return false;
918       break;
919 #endif
920 #ifdef LAYOUT_WORKMAN
921     case WORKMAN:
922       if (record->event.pressed) {
923         persistant_default_layer_set(1UL<<_WORKMAN);
924       }
925       return false;
926       break;
927 #endif
928 #ifdef LAYOUT_NORMAN
929     case NORMAN:
930       if (record->event.pressed) {
931         persistant_default_layer_set(1UL<<_NORMAN);
932       }
933       return false;
934       break;
935 #endif
936
937     // layer switcher
938     case PUNC:
939       if (record->event.pressed) {
940         layer_on(_PUNC);
941         update_tri_layer(_PUNC, _GREEKL, _EMOJI);
942       } else {
943         layer_off(_PUNC);
944         update_tri_layer(_PUNC, _GREEKL, _EMOJI);
945       }
946       return false;
947       break;
948
949     case GREEK:
950       if (record->event.pressed) {
951         if (lshift || rshift) {
952           layer_on(_GREEKU);
953           layer_off(_GREEKL);
954         } else {
955           layer_on(_GREEKL);
956           layer_off(_GREEKU);
957           update_tri_layer(_PUNC, _GREEKL, _EMOJI);
958         }
959       } else {
960         layer_off(_GREEKU);
961         layer_off(_GREEKL);
962         update_tri_layer(_PUNC, _GREEKL, _EMOJI);
963       }
964       return false;
965       break;
966
967     case NUM:
968       if (record->event.pressed) {
969         turn_off_capslock();
970         layer_on(_NUM);
971       } else {
972         layer_off(_NUM);
973       }
974       return false;
975       break;
976
977     case FUNC:
978       if (record->event.pressed) {
979         layer_on(_FUNC);
980       } else {
981         layer_off(_FUNC);
982       }
983       return false;
984       break;
985
986     // OS switchers
987     case LINUX:
988       set_unicode_input_mode(UC_LNX);
989       return false;
990       break;
991     case WIN:
992       set_unicode_input_mode(UC_WINC);
993       return false;
994       break;
995     case OSX:
996       set_unicode_input_mode(UC_OSX);
997       return false;
998       break;
999
1000     // glow mode changer
1001     case GLOW:
1002       if (record->event.pressed) {
1003         glow_mode++;
1004         if (glow_mode > GLOW_FULL) {
1005           glow_mode = GLOW_NONE;
1006         }
1007         led_reset();
1008         rgbsps_send();
1009       }
1010       return false;
1011       break;
1012
1013     // faux clicky toggle, TBD
1014     case AUDIO:
1015       return false;
1016       break;
1017   }
1018   return true;
1019 }
1020
1021 void set_output_user(uint8_t output) {
1022   switch(output) {
1023     case OUTPUT_USB:
1024       led_set_output_usb();
1025       break;
1026     case OUTPUT_ADAFRUIT_BLE:
1027       led_set_output_ble();
1028       break;
1029     default:
1030       led_set_output_none();
1031   }
1032 }
1033
1034 void matrix_init_user(void) {
1035   _delay_ms(500); // give time for usb to initialize
1036
1037   set_unicode_input_mode(UC_LNX);
1038   led_init();
1039
1040   // auto detect output on init
1041   uint8_t output = auto_detect_output();
1042   if (output == OUTPUT_USB) {
1043     set_output(OUTPUT_USB);
1044   } else {
1045     set_output(OUTPUT_ADAFRUIT_BLE);
1046   }
1047 }
1048
1049 void matrix_scan_user(void) {
1050   led_set_layer_indicator();
1051 }
1052
1053 void battery_poll(uint8_t level) {
1054   rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1055   rgbsps_send();
1056 }
1057
1058 void led_set_user(uint8_t usb_led) {
1059   bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1060   if (new_capslock ^ capslock) { // capslock state is different
1061     if ((capslock = new_capslock)) {
1062       rgbsps_set(LED_IND_NUM, 15, 0, 0);
1063     } else {
1064       rgbsps_set(LED_IND_NUM, 0, 0, 0);
1065     }
1066     rgbsps_send();
1067   }
1068 }
1069
1070 void turn_off_capslock() {
1071   if (capslock) {
1072     register_code(KC_CAPS);
1073     unregister_code(KC_CAPS);
1074   }
1075 }
1076
1077 void ps2_mouse_init_user() {
1078     uint8_t rcv;
1079
1080     // set TrackPoint sensitivity
1081     PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1082     PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1083     PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1084     PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1085
1086     // set TrackPoint Negative Inertia factor
1087     PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1088     PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1089     PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1090     PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1091
1092     // set TrackPoint speed
1093     // (transfer function upper plateau speed)
1094     PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1095     PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1096     PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1097     PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1098
1099     // inquire pts status
1100     rcv = ps2_host_send(0xE2);
1101     rcv = ps2_host_send(0x2C);
1102     rcv = ps2_host_recv_response();
1103     if ((rcv & 1) == 1) {
1104       // if on, disable pts
1105       rcv = ps2_host_send(0xE2);
1106       rcv = ps2_host_send(0x47);
1107       rcv = ps2_host_send(0x2C);
1108       rcv = ps2_host_send(0x01);
1109     }
1110 }