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