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.

action.c 19KB

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