Keyboard firmwares for Atmel AVR and Cortex-M
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. #include "host.h"
  2. #include "timer.h"
  3. #include "keymap.h"
  4. #include "keycode.h"
  5. #include "keyboard.h"
  6. #include "mousekey.h"
  7. #include "command.h"
  8. #include "util.h"
  9. #include "debug.h"
  10. #include "action.h"
  11. #define Kdebug(s) do { if (debug_keyboard) debug(s); } while(0)
  12. #define Kdebug_P(s) do { if (debug_keyboard) debug_P(s); } while(0)
  13. #define Kdebug_hex(s) do { if (debug_keyboard) debug_hex(s); } while(0)
  14. /*
  15. *
  16. * Event/State|IDLE PRESSING DELAYING[f] WAITING[f,k]
  17. * -----------+------------------------------------------------------------------
  18. * Fn Down |(L+) -*1 WAITING(Sk) IDLE(Rf,Ps)*7
  19. * Up |(L-) IDLE(L-)*8 IDLE(L-)*8 IDLE(L-)*8
  20. * Fnk Down |DELAYING(Sf)* (Rf) WAITING(Sk) IDLE(Rf,Ps,Rf)
  21. * Up |(L-) IDLE(L-/Uf)*8 IDLE(Rf,Uf/L-)*3 IDLE(Rf,Ps,Uf/L-)*3
  22. * Key Down |PRESSING(Rk) (Rk) WAITING(Sk) IDLE(Rf,Ps,Rk)
  23. * Up |(Uk) IDLE(Uk)*4 (Uk) IDLE(L+,Ps,Pk)/(Uk)*a
  24. * |
  25. * Delay |- - IDLE(L+) IDLE(L+,Ps)
  26. * Magic Key |COMMAND*5
  27. *
  28. * *1: ignore Fn if other key is down.
  29. * *2: register Fnk if any key is pressing
  30. * *3: register/unregister delayed Fnk and move to IDLE if code == delayed Fnk, else *8
  31. * *4: if no keys registered to host
  32. * *5: unregister all keys
  33. * *6: only if no keys down
  34. * *7: ignore Fn because Fnk key and stored key are down.
  35. * *8: move to IDLE if layer switch(off) occurs, else stay at current state
  36. * *9: repeat key if pressing Fnk twice quickly(move to PRESSING)
  37. * *a: layer switch and process waiting key and code if code == wainting key, else unregister key
  38. *
  39. * States:
  40. * IDLE: No key is down except modifiers
  41. * DELAYING: delay layer switch after pressing Fn with alt keycode
  42. * WAITING: key is pressed during DELAYING
  43. *
  44. * Events:
  45. * Fn: Fn key without alternative keycode
  46. * Fnk: Fn key with alternative keycode
  47. * -: ignore
  48. * Delay: layer switch delay term is elapsed
  49. *
  50. * Actions:
  51. * Rk: register key
  52. * Uk: unregister key
  53. * Rf: register Fn(alt keycode)
  54. * Uf: unregister Fn(alt keycode)
  55. * Rs: register stored key
  56. * Us: unregister stored key
  57. * Sk: Store key(waiting Key)
  58. * Sf: Store Fn(delayed Fn)
  59. * Ps: Process stored key
  60. * Ps: Process key
  61. * Is: Interpret stored keys in current layer
  62. * L+: Switch to new layer(*unregister* all keys but modifiers)
  63. * L-: Switch back to last layer(*unregister* all keys but modifiers)
  64. * Ld: Switch back to default layer(*unregister* all keys but modifiers)
  65. */
  66. typedef enum { IDLE, DELAYING, WAITING, PRESSING } kbdstate_t;
  67. #define NEXT(state) do { \
  68. Kdebug("NEXT: "); Kdebug_P(state_str(kbdstate)); \
  69. kbdstate = state; \
  70. Kdebug(" -> "); Kdebug_P(state_str(kbdstate)); Kdebug("\n"); \
  71. } while (0)
  72. static kbdstate_t kbdstate = IDLE;
  73. static uint8_t fn_state_bits = 0;
  74. static const char *state_str(kbdstate_t state)
  75. {
  76. if (state == IDLE) return PSTR("IDLE");
  77. if (state == DELAYING) return PSTR("DELAYING");
  78. if (state == WAITING) return PSTR("WAITING");
  79. if (state == PRESSING) return PSTR("PRESSING");
  80. return PSTR("UNKNOWN");
  81. }
  82. static bool anykey_sent_to_host(void)
  83. {
  84. return (host_has_anykey() || host_mouse_in_use() ||
  85. host_last_sysytem_report() || host_last_consumer_report());
  86. }
  87. static void register_code(uint8_t code);
  88. static void unregister_code(uint8_t code);
  89. static void register_mods(uint8_t mods);
  90. static void unregister_mods(uint8_t mods);
  91. static void clear_keyboard(void);
  92. static void clear_keyboard_but_mods(void);
  93. static void layer_switch(uint8_t new_layer);
  94. /* tap */
  95. #define TAP_TIME 200
  96. #define LAYER_DELAY 200
  97. static keyevent_t last_event = {};
  98. static uint16_t last_event_time = 0;
  99. static uint8_t tap_count = 0;
  100. /* layer */
  101. uint8_t default_layer = 0;
  102. uint8_t current_layer = 0;
  103. keyrecord_t delaying_layer = {};
  104. keyrecord_t waiting_key = {};
  105. // TODO: ring buffer: waiting_keys[]
  106. /*
  107. #define WAITING_KEYS_BUFFER 3
  108. static keyrecord_t waiting_keys[WAITING_KEYS_BUFFER] = {};
  109. static uint8_t waiting_keys_head = 0;
  110. static uint8_t waiting_keys_tail = 0;
  111. static void waiting_key_queue(keyevent_t event)
  112. {
  113. }
  114. static void waiting_key_dequeue(keyevent_t event)
  115. {
  116. }
  117. */
  118. static void process(keyevent_t event, action_t action)
  119. {
  120. //action_t action = keymap_get_action(current_layer, event.key.row, event.key.col);
  121. debug("action: "); debug_hex16(action.code); debug("\n");
  122. debug("kind.id: "); debug_hex(action.kind.id); debug("\n");
  123. debug("kind.param: "); debug_hex16(action.kind.param); debug("\n");
  124. debug("key.code: "); debug_hex(action.key.code); debug("\n");
  125. debug("key.mods: "); debug_hex(action.key.mods); debug("\n");
  126. switch (action.kind.id) {
  127. /* Key and Mods */
  128. case ACT_LMODS:
  129. // normal key or key plus mods
  130. if (event.pressed) {
  131. uint8_t tmp_mods = host_get_mods();
  132. if (action.key.mods) {
  133. host_add_mods(action.key.mods);
  134. host_send_keyboard_report();
  135. }
  136. register_code(action.key.code);
  137. if (action.key.mods && action.key.code) {
  138. host_set_mods(tmp_mods);
  139. host_send_keyboard_report();
  140. }
  141. } else {
  142. if (action.key.mods && !action.key.code) {
  143. host_del_mods(action.key.mods);
  144. host_send_keyboard_report();
  145. }
  146. unregister_code(action.key.code);
  147. }
  148. break;
  149. case ACT_RMODS:
  150. if (event.pressed) {
  151. uint8_t tmp_mods = host_get_mods();
  152. if (action.key.mods) {
  153. host_add_mods(action.key.mods<<4);
  154. host_send_keyboard_report();
  155. }
  156. register_code(action.key.code);
  157. if (action.key.mods && action.key.code) {
  158. host_set_mods(tmp_mods);
  159. host_send_keyboard_report();
  160. }
  161. } else {
  162. if (action.key.mods && !action.key.code) {
  163. host_del_mods(action.key.mods<<4);
  164. host_send_keyboard_report();
  165. }
  166. unregister_code(action.key.code);
  167. }
  168. break;
  169. case ACT_LMOD_TAP:
  170. break;
  171. case ACT_RMOD_TAP:
  172. break;
  173. /* other HID usage */
  174. case ACT_USAGE:
  175. #ifdef EXTRAKEY_ENABLE
  176. switch (action.usage.page) {
  177. case ACTION_USAGE_PAGE_SYSTEM:
  178. if (event.pressed) {
  179. host_system_send(action.usage.code);
  180. } else {
  181. host_system_send(0);
  182. }
  183. break;
  184. case ACTION_USAGE_PAGE_CONSUMER:
  185. if (event.pressed) {
  186. host_consumer_send(action.usage.code);
  187. } else {
  188. host_consumer_send(0);
  189. }
  190. break;
  191. }
  192. #endif
  193. break;
  194. /* Mouse key */
  195. case ACT_MOUSEKEY:
  196. #ifdef MOUSEKEY_ENABLE
  197. if (event.pressed) {
  198. mousekey_on(action.key.code);
  199. mousekey_send();
  200. } else {
  201. mousekey_off(action.key.code);
  202. mousekey_send();
  203. }
  204. #endif
  205. break;
  206. /* Layer key */
  207. case ACT_LAYER_PRESSED:
  208. // layer action when pressed
  209. switch (action.layer.code) {
  210. case 0x00:
  211. if (event.pressed) {
  212. layer_switch(action.layer.opt);
  213. }
  214. break;
  215. case 0xF0:
  216. // TODO: tap toggle
  217. break;
  218. case 0xFF:
  219. if (event.pressed) {
  220. default_layer = action.layer.opt;
  221. layer_switch(default_layer);
  222. }
  223. break;
  224. default:
  225. // with tap key
  226. debug("tap: "); debug_hex(tap_count); debug("\n");
  227. if (event.pressed) {
  228. if (tap_count == 0) {
  229. if (host_has_anykey()) {
  230. register_code(action.layer.code);
  231. } else {
  232. delaying_layer = (keyrecord_t){
  233. .event = event,
  234. .action = action,
  235. .mods = host_get_mods()
  236. };
  237. }
  238. } else if (tap_count > 0) {
  239. register_code(action.layer.code);
  240. }
  241. } else {
  242. // tap key
  243. if (KEYEQ(event.key, delaying_layer.event.key) &&
  244. timer_elapsed(delaying_layer.event.time) < TAP_TIME) {
  245. uint8_t tmp_mods = host_get_mods();
  246. host_set_mods(delaying_layer.mods);
  247. register_code(delaying_layer.action.layer.code);
  248. host_set_mods(tmp_mods);
  249. unregister_code(delaying_layer.action.layer.code);
  250. } else {
  251. unregister_code(action.layer.code);
  252. }
  253. delaying_layer = (keyrecord_t){};
  254. }
  255. break;
  256. }
  257. break;
  258. case ACT_LAYER_RELEASED:
  259. switch (action.layer.code) {
  260. case 0x00:
  261. if (event.pressed) {
  262. layer_switch(action.layer.opt);
  263. }
  264. break;
  265. case 0xF0:
  266. // Ignored. LAYER_RELEASED with tap toggle is invalid action.
  267. break;
  268. case 0xFF:
  269. if (!event.pressed) {
  270. default_layer = action.layer.opt;
  271. layer_switch(default_layer);
  272. }
  273. break;
  274. default:
  275. // Ignored. LAYER_RELEASED with tap key is invalid action.
  276. break;
  277. }
  278. break;
  279. case ACT_LAYER_BIT:
  280. switch (action.layer.code) {
  281. case 0x00:
  282. if (event.pressed) {
  283. layer_switch(current_layer | action.layer.opt);
  284. } else {
  285. layer_switch(current_layer & ~action.layer.opt);
  286. }
  287. break;
  288. case 0xF0:
  289. // TODO: tap toggle
  290. break;
  291. case 0xFF:
  292. // change default layer
  293. if (event.pressed) {
  294. default_layer = current_layer | action.layer.opt;
  295. layer_switch(default_layer);
  296. } else {
  297. default_layer = current_layer & ~action.layer.opt;
  298. layer_switch(default_layer);
  299. }
  300. break;
  301. default:
  302. // with tap key
  303. debug("tap: "); debug_hex(tap_count); debug("\n");
  304. if (event.pressed) {
  305. if (tap_count == 0) {
  306. if (host_has_anykey()) {
  307. register_code(action.layer.code);
  308. } else {
  309. delaying_layer = (keyrecord_t){
  310. .event = event,
  311. .action = action,
  312. .mods = keyboard_report->mods
  313. };
  314. }
  315. } else if (tap_count > 0) {
  316. register_code(action.layer.code);
  317. }
  318. } else {
  319. if (tap_count == 0) {
  320. // no tap
  321. layer_switch(current_layer & ~action.layer.opt);
  322. } else if (tap_count == 1) {
  323. // tap
  324. register_code(action.layer.code);
  325. }
  326. unregister_code(action.layer.code);
  327. }
  328. break;
  329. }
  330. case ACT_LAYER_EXT:
  331. switch (action.layer.opt) {
  332. case 0x00:
  333. // set default layer when pressed
  334. switch (action.layer.code) {
  335. case 0x00:
  336. if (event.pressed) {
  337. layer_switch(default_layer);
  338. }
  339. break;
  340. case 0xF0:
  341. // TODO: tap toggle
  342. break;
  343. case 0xFF:
  344. if (event.pressed) {
  345. default_layer = current_layer;
  346. layer_switch(default_layer);
  347. }
  348. break;
  349. default:
  350. // TODO: tap key
  351. break;
  352. }
  353. break;
  354. case 0x01:
  355. // set default layer when released
  356. switch (action.layer.code) {
  357. case 0x00:
  358. if (!event.pressed) {
  359. layer_switch(default_layer);
  360. }
  361. break;
  362. case 0xFF:
  363. if (!event.pressed) {
  364. default_layer = current_layer;
  365. layer_switch(default_layer);
  366. }
  367. break;
  368. case 0xF0:
  369. default:
  370. // Ignore tap.
  371. if (!event.pressed) {
  372. layer_switch(default_layer);
  373. }
  374. break;
  375. }
  376. break;
  377. }
  378. break;
  379. /* Extentions */
  380. case ACT_MACRO:
  381. case ACT_COMMAND:
  382. case ACT_FUNCTION:
  383. default:
  384. break;
  385. }
  386. }
  387. void action_exec(keyevent_t event)
  388. {
  389. /* count tap when key is up */
  390. if (KEYEQ(event.key, last_event.key) && timer_elapsed(last_event_time) < TAP_TIME) {
  391. if (!event.pressed) tap_count++;
  392. } else {
  393. tap_count = 0;
  394. }
  395. /* When delaying layer switch */
  396. if (delaying_layer.action.code) {
  397. /* Layer switch when delay time elapses or waiting key is released */
  398. if ((timer_elapsed(delaying_layer.event.time) > LAYER_DELAY) ||
  399. (!event.pressed && KEYEQ(event.key, waiting_key.event.key))) {
  400. /* layer switch */
  401. switch (delaying_layer.action.kind.id) {
  402. case ACT_LAYER_PRESSED:
  403. layer_switch(delaying_layer.action.layer.opt);
  404. break;
  405. case ACT_LAYER_BIT:
  406. layer_switch(current_layer | delaying_layer.action.layer.opt);
  407. break;
  408. }
  409. delaying_layer = (keyrecord_t){};
  410. /* Process waiting keys in new layer */
  411. if (waiting_key.event.time) {
  412. uint8_t tmp_mods = host_get_mods();
  413. host_set_mods(waiting_key.mods);
  414. process(waiting_key.event, keymap_get_action(current_layer,
  415. waiting_key.event.key.row,
  416. waiting_key.event.key.col));
  417. host_set_mods(tmp_mods);
  418. waiting_key = (keyrecord_t){};
  419. }
  420. }
  421. /* when delaying layer key is released within delay term */
  422. else if (!event.pressed && KEYEQ(event.key, delaying_layer.event.key)) {
  423. /* tap key down */
  424. uint8_t tmp_mods = host_get_mods();
  425. host_set_mods(delaying_layer.mods);
  426. register_code(delaying_layer.action.layer.code);
  427. delaying_layer = (keyrecord_t){};
  428. /* process waiting keys */
  429. if (waiting_key.event.time) {
  430. host_set_mods(waiting_key.mods);
  431. process(waiting_key.event, waiting_key.action);
  432. waiting_key = (keyrecord_t){};
  433. }
  434. host_set_mods(tmp_mods);
  435. }
  436. }
  437. action_t action = keymap_get_action(current_layer, event.key.row, event.key.col);
  438. /* postpone key-down events while delaying layer */
  439. if (delaying_layer.action.code) {
  440. if (event.pressed) {
  441. // TODO: waiting_keys[]
  442. waiting_key = (keyrecord_t){
  443. .event = event,
  444. .action = action,
  445. .mods = host_get_mods()
  446. };
  447. } else {
  448. process(event, action);
  449. }
  450. } else {
  451. process(event, action);
  452. }
  453. /* last event */
  454. last_event = event;
  455. last_event_time = timer_read();
  456. }
  457. static void register_code(uint8_t code)
  458. {
  459. if (code == KC_NO) {
  460. return;
  461. }
  462. else if IS_KEY(code) {
  463. // TODO: should push command_proc out of this block?
  464. if (!command_proc(code)) {
  465. host_add_key(code);
  466. host_send_keyboard_report();
  467. }
  468. }
  469. else if IS_MOD(code) {
  470. host_add_mods(MOD_BIT(code));
  471. host_send_keyboard_report();
  472. }
  473. }
  474. static void unregister_code(uint8_t code)
  475. {
  476. if IS_KEY(code) {
  477. host_del_key(code);
  478. host_send_keyboard_report();
  479. }
  480. else if IS_MOD(code) {
  481. host_del_mods(MOD_BIT(code));
  482. host_send_keyboard_report();
  483. }
  484. }
  485. static void register_mods(uint8_t mods)
  486. {
  487. if (!mods) return;
  488. host_add_mods(mods);
  489. host_send_keyboard_report();
  490. }
  491. static void unregister_mods(uint8_t mods)
  492. {
  493. if (!mods) return;
  494. host_del_mods(mods);
  495. host_send_keyboard_report();
  496. }
  497. static void clear_keyboard(void)
  498. {
  499. host_clear_mods();
  500. clear_keyboard_but_mods();
  501. }
  502. static void clear_keyboard_but_mods(void)
  503. {
  504. host_clear_keys();
  505. host_send_keyboard_report();
  506. #ifdef MOUSEKEY_ENABLE
  507. mousekey_clear();
  508. mousekey_send();
  509. #endif
  510. #ifdef EXTRAKEY_ENABLE
  511. host_system_send(0);
  512. host_consumer_send(0);
  513. #endif
  514. }
  515. static void layer_switch(uint8_t new_layer)
  516. {
  517. if (current_layer != new_layer) {
  518. Kdebug("Layer Switch: "); Kdebug_hex(current_layer);
  519. Kdebug(" -> "); Kdebug_hex(new_layer); Kdebug("\n");
  520. current_layer = new_layer;
  521. clear_keyboard_but_mods(); // To avoid stuck keys
  522. // TODO: update mods with full scan of matrix? if modifier changes between layers
  523. }
  524. }