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