keymap.c 35 KB

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