2
0

keymap.c 35 KB

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