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.h 15KB

11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. /*
  2. Copyright 2012,2013 Jun Wako <[email protected]>
  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. #ifndef ACTION_H
  15. #define ACTION_H
  16. #include "keyboard.h"
  17. #include "keycode.h"
  18. /* Struct to record event and tap count */
  19. typedef struct {
  20. keyevent_t event;
  21. uint8_t tap_count;
  22. } keyrecord_t;
  23. /* Action struct.
  24. *
  25. * In avr-gcc bit field seems to be assigned from LSB(bit0) to MSB(bit15).
  26. * AVR looks like a little endian in avr-gcc.
  27. *
  28. * NOTE: not portable across compiler/endianness?
  29. * Byte order and bit order of 0x1234:
  30. * Big endian: 15 ... 8 7 ... 210
  31. * | 0x12 | 0x34 |
  32. * 0001 0010 0011 0100
  33. * Little endian: 012 ... 7 8 ... 15
  34. * | 0x34 | 0x12 |
  35. * 0010 1100 0100 1000
  36. */
  37. typedef union {
  38. uint16_t code;
  39. struct action_kind {
  40. uint16_t param :12;
  41. uint8_t id :4;
  42. } kind;
  43. struct action_key {
  44. uint8_t code :8;
  45. uint8_t mods :4;
  46. uint8_t kind :4;
  47. } key;
  48. struct action_layer {
  49. uint8_t code :8;
  50. uint8_t val :4;
  51. uint8_t kind :4;
  52. } layer;
  53. struct action_usage {
  54. uint16_t code :10;
  55. uint8_t page :2;
  56. uint8_t kind :4;
  57. } usage;
  58. struct action_command {
  59. uint8_t id :8;
  60. uint8_t opt :4;
  61. uint8_t kind :4;
  62. } command;
  63. struct action_function {
  64. uint8_t id :8;
  65. uint8_t opt :4;
  66. uint8_t kind :4;
  67. } func;
  68. } action_t;
  69. /* Execute action per keyevent */
  70. void action_exec(keyevent_t event);
  71. /* action for key */
  72. action_t action_for_key(uint8_t layer, key_t key);
  73. /* user defined special function */
  74. void action_function(keyrecord_t *record, uint8_t id, uint8_t opt);
  75. /*
  76. * Utilities for actions.
  77. */
  78. void register_code(uint8_t code);
  79. void unregister_code(uint8_t code);
  80. void add_mods(uint8_t mods);
  81. void del_mods(uint8_t mods);
  82. void set_mods(uint8_t mods);
  83. void clear_keyboard(void);
  84. void clear_keyboard_but_mods(void);
  85. bool sending_anykey(void);
  86. void layer_switch(uint8_t new_layer);
  87. bool is_tap_key(key_t key);
  88. bool waiting_buffer_has_anykey_pressed(void);
  89. /*
  90. * Action codes
  91. * ============
  92. * 16bit code: action_kind(4bit) + action_parameter(12bit)
  93. *
  94. * Keyboard Keys
  95. * -------------
  96. * ACT_LMODS(0000):
  97. * 0000|0000|000000|00 No action
  98. * 0000|0000|000000|01 Transparent
  99. * 0000|0000| keycode Key
  100. * 0000|mods|000000|00 Left mods
  101. * 0000|mods| keycode Key & Left mods
  102. *
  103. * ACT_RMODS(0001):
  104. * 0001|0000|000000|00 No action(not used)
  105. * 0001|0000|000000|01 Transparent(not used)
  106. * 0001|0000| keycode Key(no used)
  107. * 0001|mods|000000|00 Right mods
  108. * 0001|mods| keycode Key & Right mods
  109. *
  110. * ACT_LMODS_TAP(0010):
  111. * 0010|mods|000000|00 Left mods OneShot
  112. * 0010|mods|000000|01 (reserved)
  113. * 0010|mods|000000|10 (reserved)
  114. * 0010|mods|000000|11 (reserved)
  115. * 0010|mods| keycode Left mods + tap Key
  116. *
  117. * ACT_RMODS_TAP(0011):
  118. * 0011|mods|000000|00 Right mods OneShot
  119. * 0011|mods|000000|01 (reserved)
  120. * 0011|mods|000000|10 (reserved)
  121. * 0011|mods|000000|11 (reserved)
  122. * 0011|mods| keycode Right mods + tap Key
  123. *
  124. *
  125. * Other HID Usage
  126. * ---------------
  127. * This action handles other usages than keyboard.
  128. * ACT_USAGE(0100):
  129. * 0100|00| usage(10) System control(0x80) - General Desktop page(0x01)
  130. * 0100|01| usage(10) Consumer control(0x01) - Consumer page(0x0C)
  131. * 0100|10| usage(10) (reserved)
  132. * 0100|11| usage(10) (reserved)
  133. *
  134. *
  135. * Mouse Keys
  136. * ----------
  137. * ACT_MOUSEKEY(0110):
  138. * 0101|XXXX| keycode Mouse key
  139. *
  140. *
  141. * Layer Actions
  142. * -------------
  143. * ACT_KEYMAP:
  144. * 1000|--xx|0000 0000 Clear keyamp and overlay
  145. * 1000|LLLL|0000 00xx Reset default layer and clear keymap and overlay
  146. * 1000|LLLL| keycode Invert with tap key
  147. * 1000|LLLL|1111 0000 Invert with tap toggle
  148. * 1000|LLLL|1111 00xx Invert[^= L]
  149. * 1000|LLLL|1111 0100 On/Off
  150. * 1000|LLLL|1111 01xx On[|= L]
  151. * 1000|LLLL|1111 1000 Off/On
  152. * 1000|LLLL|1111 10xx Off[&= ~L]
  153. * 1000|LLLL|1111 1100 Set/Set(0)
  154. * 1000|LLLL|1111 11xx Set[= L]
  155. * default layer: 0-15(4bit)
  156. * xx: On {00:for special use, 01:press, 10:release, 11:both}
  157. *
  158. * ACT_OVERLAY:
  159. * 1011|0000|0000 0000 Clear overlay
  160. * 1011|LLLL|0000 00ss Invert 4-bit chunk [^= L<<(4*ss)]
  161. * 1011|LLLL| keycode Invert with tap key
  162. * 1011|LLLL|1111 0000 Invert with tap toggle
  163. * 1011|LLLL|1111 00xx Invert[^= 1<<L]
  164. * 1011|LLLL|1111 0100 On/Off(momentary)
  165. * 1011|LLLL|1111 01xx On[|= 1<<L]
  166. * 1011|LLLL|1111 1000 Off/On
  167. * 1011|LLLL|1111 10xx Off[&= ~1<<L]
  168. * 1011|LLLL|1111 1100 Set[= 1<<L]/Clear
  169. * 1011|LLLL|1111 11xx Set[= 1<<L]
  170. * overlays: 16-layer on/off status(16bit)
  171. * xx: On {00:for special use, 01:press, 10:release, 11:both}
  172. *
  173. *
  174. * Extensions(11XX)
  175. * ----------------
  176. * NOTE: NOT FIXED
  177. *
  178. * ACT_MACRO(1100):
  179. * 1100|opt | id(8) Macro play?
  180. * 1100|1111| id(8) Macro record?
  181. *
  182. * ACT_COMMAND(1110):
  183. * 1110|opt | id(8) Built-in Command exec
  184. *
  185. * ACT_FUNCTION(1111):
  186. * 1111| address(12) Function?
  187. * 1111|opt | id(8) Function?
  188. *
  189. */
  190. enum action_kind_id {
  191. ACT_LMODS = 0b0000,
  192. ACT_RMODS = 0b0001,
  193. ACT_LMODS_TAP = 0b0010,
  194. ACT_RMODS_TAP = 0b0011,
  195. ACT_USAGE = 0b0100,
  196. ACT_MOUSEKEY = 0b0101,
  197. ACT_KEYMAP = 0b1000,
  198. ACT_OVERLAY = 0b1001,
  199. ACT_MACRO = 0b1100,
  200. ACT_COMMAND = 0b1110,
  201. ACT_FUNCTION = 0b1111
  202. };
  203. /* action utility */
  204. #define ACTION_NO 0
  205. #define ACTION_TRANSPARENT 1
  206. #define ACTION(kind, param) ((kind)<<12 | (param))
  207. #define MODS4(mods) (((mods)>>4 | (mods)) & 0x0F)
  208. /*
  209. * Key
  210. */
  211. #define ACTION_KEY(key) ACTION(ACT_LMODS, key)
  212. /* Mods & key */
  213. #define ACTION_LMODS(mods) ACTION(ACT_LMODS, MODS4(mods)<<8 | 0x00)
  214. #define ACTION_LMODS_KEY(mods, key) ACTION(ACT_LMODS, MODS4(mods)<<8 | (key))
  215. #define ACTION_RMODS(mods) ACTION(ACT_RMODS, MODS4(mods)<<8 | 0x00)
  216. #define ACTION_RMODS_KEY(mods, key) ACTION(ACT_RMODS, MODS4(mods)<<8 | (key))
  217. #define ACTION_LMOD(mod) ACTION(ACT_LMODS, MODS4(MOD_BIT(mod))<<8 | 0x00)
  218. #define ACTION_LMOD_KEY(mod, key) ACTION(ACT_LMODS, MODS4(MOD_BIT(mod))<<8 | (key))
  219. #define ACTION_RMOD(mod) ACTION(ACT_RMODS, MODS4(MOD_BIT(mod))<<8 | 0x00)
  220. #define ACTION_RMOD_KEY(mod, key) ACTION(ACT_RMODS, MODS4(MOD_BIT(mod))<<8 | (key))
  221. /* Tap key */
  222. enum mods_codes {
  223. MODS_ONESHOT = 0x00,
  224. };
  225. #define ACTION_LMODS_TAP_KEY(mods, key) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | (key))
  226. #define ACTION_LMODS_ONESHOT(mods) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | MODS_ONESHOT)
  227. #define ACTION_RMODS_TAP_KEY(mods, key) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | (key))
  228. #define ACTION_RMODS_ONESHOT(mods) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | MODS_ONESHOT)
  229. #define ACTION_LMOD_TAP_KEY(mod, key) ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key))
  230. #define ACTION_LMOD_ONESHOT(mod) ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | MODS_ONESHOT)
  231. #define ACTION_RMOD_TAP_KEY(mod, key) ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key))
  232. #define ACTION_RMOD_ONESHOT(mod) ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | MODS_ONESHOT)
  233. /* Layer Operation:
  234. * Invert layer ^= (1<<layer)
  235. * On layer |= (1<<layer)
  236. * Off layer &= ~(1<<layer)
  237. * Set layer = (1<<layer)
  238. * Clear layer = 0
  239. */
  240. enum layer_params {
  241. ON_PRESS = 1,
  242. ON_RELEASE = 2,
  243. ON_BOTH = 3,
  244. OP_RESET = 0x00,
  245. OP_INV4 = 0x00,
  246. OP_INV = 0xF0,
  247. OP_ON = 0xF4,
  248. OP_OFF = 0xF8,
  249. OP_SET = 0xFC,
  250. };
  251. /*
  252. * Default Layer
  253. */
  254. #define ACTION_DEFAULT_LAYER ACTION(ACT_KEYMAP, 0<<8 | OP_RESET | 0)
  255. #define ACTION_SET_DEFAULT_LAYER(layer) ACTION_KEYMAP_RESET(layer)
  256. #define ACTION_SET_DEFAULT_LAYER_P(layer) ACTION_KEYMAP_RESET_P(layer)
  257. #define ACTION_SET_DEFAULT_LAYER_R(layer) ACTION_KEYMAP_RESET_R(layer)
  258. #define ACTION_SET_DEFAULT_LAYER_B(layer) ACTION_KEYMAP_RESET_B(layer)
  259. /*
  260. * Keymap Layer
  261. */
  262. #define ACTION_KEYMAP(layer) ACTION_KEYMAP_MOMENTARY(layer)
  263. #define ACTION_KEYMAP_MOMENTARY(layer) ACTION_KEYMAP_ON_OFF(layer)
  264. #define ACTION_KEYMAP_TOGGLE(layer) ACTION_KEYMAP_INV_R(layer)
  265. /* Keymap Set and clear overaly */
  266. #define ACTION_KEYMAP_RESET(layer) ACTION_KEYMAP_RESET_R(layer)
  267. #define ACTION_KEYMAP_RESET_P(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_RESET | ON_PRESS)
  268. #define ACTION_KEYMAP_RESET_R(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_RESET | ON_RELEASE)
  269. #define ACTION_KEYMAP_RESET_B(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_RESET | ON_BOTH)
  270. /* Keymap Invert */
  271. #define ACTION_KEYMAP_INV(layer) ACTION_KEYMAP_INV_B(layer)
  272. #define ACTION_KEYMAP_TAP_TOGGLE(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_INV | 0)
  273. #define ACTION_KEYMAP_INV_P(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_INV | ON_PRESS)
  274. #define ACTION_KEYMAP_INV_R(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_INV | ON_RELEASE)
  275. #define ACTION_KEYMAP_INV_B(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_INV | ON_BOTH)
  276. /* Keymap On */
  277. #define ACTION_KEYMAP_ON(layer) ACTION_KEYMAP_ON_OFF(layer)
  278. #define ACTION_KEYMAP_ON_OFF(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_ON | 0)
  279. #define ACTION_KEYMAP_ON_P(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_ON | ON_PRESS)
  280. #define ACTION_KEYMAP_ON_R(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_ON | ON_RELEASE)
  281. #define ACTION_KEYMAP_ON_B(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_ON | ON_BOTH)
  282. /* Keymap Off */
  283. #define ACTION_KEYMAP_OFF(layer) ACTION_KEYMAP_OFF_ON(layer)
  284. #define ACTION_KEYMAP_OFF_ON(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_OFF | 0)
  285. #define ACTION_KEYMAP_OFF_P(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_OFF | ON_PRESS)
  286. #define ACTION_KEYMAP_OFF_R(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_OFF | ON_RELEASE)
  287. #define ACTION_KEYMAP_OFF_B(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_OFF | ON_BOTH)
  288. /* Keymap Set */
  289. #define ACTION_KEYMAP_SET(layer) ACTION_KEYMAP_SET_CLEAR(layer)
  290. #define ACTION_KEYMAP_SET_CLEAR(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_SET | 0)
  291. #define ACTION_KEYMAP_SET_P(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_SET | ON_PRESS)
  292. #define ACTION_KEYMAP_SET_R(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_SET | ON_RELEASE)
  293. #define ACTION_KEYMAP_SET_B(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_SET | ON_BOTH)
  294. /* Keymap Invert with tap key */
  295. #define ACTION_KEYMAP_TAP_KEY(layer, key) ACTION(ACT_KEYMAP, (layer)<<8 | (key))
  296. /*
  297. * Overlay Layer
  298. */
  299. #define ACTION_OVERLAY(layer) ACTION_OVERLAY_MOMENTARY(layer)
  300. #define ACTION_OVERLAY_MOMENTARY(layer) ACTION_OVERLAY_ON_OFF(layer)
  301. #define ACTION_OVERLAY_TOGGLE(layer) ACTION_OVERLAY_INV_R(layer)
  302. /* Overlay Clear */
  303. #define ACTION_OVERLAY_CLEAR ACTION(ACT_OVERLAY, 0<<8 | OP_INV4 | 0)
  304. #define ACTION_OVERLAY_CLEAR_P ACTION(ACT_OVERLAY, 0<<8 | OP_INV4 | ON_PRESS)
  305. #define ACTION_OVERLAY_CLEAR_R ACTION(ACT_OVERLAY, 0<<8 | OP_INV4 | ON_RELEASE)
  306. #define ACTION_OVERLAY_CLEAR_B ACTION(ACT_OVERLAY, 0<<8 | OP_INV4 | ON_BOTH)
  307. /* Overlay Invert 4-bit chunk */
  308. #define ACTION_OVERLAY_INV4(bits, shift) ACTION(ACT_OVERLAY, (bits)<<8 | OP_INV4 | shift)
  309. /* Overlay Invert */
  310. #define ACTION_OVERLAY_INV(layer) ACTION_OVERLAY_INV_B(layer)
  311. #define ACTION_OVERLAY_TAP_TOGGLE(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_INV | 0)
  312. #define ACTION_OVERLAY_INV_P(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_INV | ON_PRESS)
  313. #define ACTION_OVERLAY_INV_R(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_INV | ON_RELEASE)
  314. #define ACTION_OVERLAY_INV_B(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_INV | ON_BOTH)
  315. /* Overlay On */
  316. #define ACTION_OVERLAY_ON(layer) ACTION_OVERLAY_ON_OFF(layer)
  317. #define ACTION_OVERLAY_ON_OFF(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_ON | 0)
  318. #define ACTION_OVERLAY_ON_P(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_ON | ON_PRESS)
  319. #define ACTION_OVERLAY_ON_R(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_ON | ON_RELEASE)
  320. #define ACTION_OVERLAY_ON_B(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_ON | ON_BOTH)
  321. /* Overlay Off */
  322. #define ACTION_OVERLAY_OFF(layer) ACTION_OVERLAY_OFF_ON(layer)
  323. #define ACTION_OVERLAY_OFF_ON(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_OFF | 0)
  324. #define ACTION_OVERLAY_OFF_P(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_OFF | ON_PRESS)
  325. #define ACTION_OVERLAY_OFF_R(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_OFF | ON_RELEASE)
  326. #define ACTION_OVERLAY_OFF_B(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_OFF | ON_BOTH)
  327. /* Overlay Set */
  328. #define ACTION_OVERLAY_SET(layer) ACTION_OVERLAY_SET_CLEAR(layer)
  329. #define ACTION_OVERLAY_SET_CLEAR(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_SET | 0)
  330. #define ACTION_OVERLAY_SET_P(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_SET | ON_PRESS)
  331. #define ACTION_OVERLAY_SET_R(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_SET | ON_RELEASE)
  332. #define ACTION_OVERLAY_SET_B(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_SET | ON_BOTH)
  333. /* Overlay Invert with tap key */
  334. #define ACTION_OVERLAY_TAP_KEY(layer, key) ACTION(ACT_OVERLAY, (layer)<<8 | (key))
  335. /*
  336. * HID Usage
  337. */
  338. enum usage_pages {
  339. PAGE_SYSTEM,
  340. PAGE_CONSUMER
  341. };
  342. #define ACTION_USAGE_SYSTEM(id) ACTION(ACT_USAGE, PAGE_SYSTEM<<10 | (id))
  343. #define ACTION_USAGE_CONSUMER(id) ACTION(ACT_USAGE, PAGE_CONSUMER<<10 | (id))
  344. /* Mousekey */
  345. #define ACTION_MOUSEKEY(key) ACTION(ACT_MOUSEKEY, key)
  346. /* Macro */
  347. #define ACTION_MACRO(opt, id) ACTION(ACT_FUNCTION, (opt)<<8 | (addr))
  348. /* Command */
  349. #define ACTION_COMMAND(opt, id) ACTION(ACT_COMMAND, (opt)<<8 | (addr))
  350. /* Function */
  351. enum function_opts {
  352. FUNC_TAP = 0x8, /* indciates function is tappable */
  353. };
  354. #define ACTION_FUNCTION(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | id)
  355. #define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | id)
  356. #endif /* ACTION_H */