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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

action.c 16KB

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