2
0

keymap.c 34 KB

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