2
0

keymap.c 34 KB

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