]> git.donarmstrong.com Git - tmk_firmware.git/blob - common/action.h
Refine ACT_LAYER and ACT_LAYER_TAP
[tmk_firmware.git] / common / action.h
1 /*
2 Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17 #ifndef ACTION_H
18 #define ACTION_H
19
20 #include <stdint.h>
21 #include <stdbool.h>
22 #include "keyboard.h"
23 #include "keycode.h"
24 #include "action_macro.h"
25
26
27 typedef struct {
28     keyevent_t  event;
29 #ifndef NO_ACTION_TAPPING
30     /* tapping count and state */
31     struct {
32         bool    interrupted :1;
33         bool    reserved2   :1;
34         bool    reserved1   :1;
35         bool    reserved0   :1;
36         uint8_t count       :4;
37     } tap;
38 #endif
39 } keyrecord_t;
40
41 /* Action struct.
42  *
43  * In avr-gcc bit field seems to be assigned from LSB(bit0) to MSB(bit15).
44  * AVR looks like a little endian in avr-gcc.
45  *
46  * NOTE: not portable across compiler/endianness?
47  * Byte order and bit order of 0x1234:
48  * Big endian:     15 ...  8 7 ... 210
49  *                |  0x12   |  0x34   |
50  *                 0001 0010 0011 0100
51  * Little endian:  012 ... 7  8 ... 15
52  *                |  0x34   |  0x12   |
53  *                 0010 1100 0100 1000
54  */
55 typedef union {
56     uint16_t code;
57     struct action_kind {
58         uint16_t param  :12;
59         uint8_t  id     :4;
60     } kind;
61     struct action_key {
62         uint8_t  code   :8;
63         uint8_t  mods   :4;
64         uint8_t  kind   :4;
65     } key;
66     struct action_layer_bitop {
67         uint8_t  bits   :4;
68         uint8_t  xbit   :1;
69         uint8_t  part   :3;
70         uint8_t  on     :2;
71         uint8_t  op     :2;
72         uint8_t  kind   :4;
73     } layer_bitop;
74     struct action_layer_tap {
75         uint8_t  code   :8;
76         uint8_t  val    :5;
77         uint8_t  kind   :3;
78     } layer_tap;
79     struct action_usage {
80         uint16_t code   :10;
81         uint8_t  page   :2;
82         uint8_t  kind   :4;
83     } usage;
84     struct action_command {
85         uint8_t  id     :8;
86         uint8_t  opt    :4;
87         uint8_t  kind   :4;
88     } command;
89     struct action_function {
90         uint8_t  id     :8;
91         uint8_t  opt    :4;
92         uint8_t  kind   :4;
93     } func;
94 } action_t;
95
96
97
98 /* Execute action per keyevent */
99 void action_exec(keyevent_t event);
100
101 /* action for key */
102 action_t action_for_key(uint8_t layer, key_t key);
103
104 /* macro */
105 const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt);
106
107 /* user defined special function */
108 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt);
109
110 /* Utilities for actions.  */
111 void process_action(keyrecord_t *record);
112 void register_code(uint8_t code);
113 void unregister_code(uint8_t code);
114 void add_mods(uint8_t mods);
115 void del_mods(uint8_t mods);
116 void set_mods(uint8_t mods);
117 void clear_keyboard(void);
118 void clear_keyboard_but_mods(void);
119 bool sending_anykey(void);
120 void layer_switch(uint8_t new_layer);
121 bool is_tap_key(key_t key);
122
123 /* debug */
124 void debug_event(keyevent_t event);
125 void debug_record(keyrecord_t record);
126 void debug_action(action_t action);
127
128
129
130 /*
131  * Action codes
132  * ============
133  * 16bit code: action_kind(4bit) + action_parameter(12bit)
134  *
135  * Keyboard Keys(00XX)
136  * -------------------
137  * ACT_LMODS(0000):
138  * 0000|0000|000000|00    No action
139  * 0000|0000|000000|01    Transparent
140  * 0000|0000| keycode     Key
141  * 0000|mods|000000|00    Left mods
142  * 0000|mods| keycode     Key & Left mods
143  *
144  * ACT_RMODS(0001):
145  * 0001|0000|000000|00    No action(not used)
146  * 0001|0000|000000|01    Transparent(not used)
147  * 0001|0000| keycode     Key(no used)
148  * 0001|mods|000000|00    Right mods
149  * 0001|mods| keycode     Key & Right mods
150  *
151  * ACT_LMODS_TAP(0010):
152  * 0010|mods|000000|00    Left mods OneShot
153  * 0010|mods|000000|01    (reserved)
154  * 0010|mods|000000|10    (reserved)
155  * 0010|mods|000000|11    (reserved)
156  * 0010|mods| keycode     Left mods + tap Key
157  *
158  * ACT_RMODS_TAP(0011):
159  * 0011|mods|000000|00    Right mods OneShot
160  * 0011|mods|000000|01    (reserved)
161  * 0011|mods|000000|10    (reserved)
162  * 0011|mods|000000|11    (reserved)
163  * 0011|mods| keycode     Right mods + tap Key
164  *
165  *
166  * Other keys(01XX)
167  * --------------------
168  * This action handles other usages than keyboard.
169  * ACT_USAGE(0100):
170  * 0100|00| usage(10)     System control(0x80) - General Desktop page(0x01)
171  * 0100|01| usage(10)     Consumer control(0x01) - Consumer page(0x0C)
172  * 0100|10| usage(10)     (reserved)
173  * 0100|11| usage(10)     (reserved)
174  *
175  * ACT_MOUSEKEY(0110):
176  * 0101|XXXX| keycode     Mouse key
177  *
178  *
179  * Layer Actions(10XX)
180  * -------------------
181  * ACT_LAYER:
182  * 1000|oo00|pppx BBBB   Default Layer Bitwise operation
183  *   oo:    operation(00:AND, 01:OR, 10:XOR, 11:SET)
184  *   ppp:   4-bit chunk part(0-7)
185  *   xBBBB: bits and extra bit
186  * 1000|ooee|pppx BBBB   Layer Bitwise Operation
187  *   oo:    operation(00:AND, 01:OR, 10:XOR, 11:SET)
188  *   ppp:   4-bit chunk part(0-7)
189  *   xBBBB: bits and extra bit
190  *   ee:    on event(00:default layer, 01:press, 10:release, 11:both)
191  *
192  * ACT_LAYER_TAP:
193  * 101x|LLLL| keycode    Invert with tap key
194  * 101x|LLLL|1110 xxxx   Reserved(0xE0-EF)
195  * 101x|LLLL|1111 0000   Invert with tap toggle(0xF0)
196  * 101x|LLLL|1111 0001   On  Off
197  * 101x|LLLL|1111 0010   Off On
198  * 101x|LLLL|1111 0011   Set Clear
199  * 101x|LLLL|1111 xxxx   Reserved(0xF4-FF)
200  *   xLLLL: layer(0-31)
201  *
202  *
203  *
204  *
205  *
206  * Extensions(11XX)
207  * ----------------
208  * ACT_MACRO(1100):
209  * 1100|opt | id(8)      Macro play?
210  * 1100|1111| id(8)      Macro record?
211  *
212  * ACT_COMMAND(1110):
213  * 1110|opt | id(8)      Built-in Command exec
214  *
215  * ACT_FUNCTION(1111):
216  * 1111| address(12)     Function?
217  * 1111|opt | id(8)      Function?
218  *
219  */
220 enum action_kind_id {
221     ACT_MODS            = 0b0000,
222     ACT_LMODS           = 0b0000,
223     ACT_RMODS           = 0b0001,
224     ACT_MODS_TAP        = 0b0010,
225     ACT_LMODS_TAP       = 0b0010,
226     ACT_RMODS_TAP       = 0b0011,
227
228     ACT_USAGE           = 0b0100,
229     ACT_MOUSEKEY        = 0b0101,
230
231     ACT_LAYER           = 0b1000,
232     ACT_LAYER_TAP       = 0b1010,
233     ACT_LAYER_TAP1      = 0b1011,
234
235     ACT_MACRO           = 0b1100,
236     ACT_COMMAND         = 0b1110,
237     ACT_FUNCTION        = 0b1111
238 };
239
240
241 /* action utility */
242 #define ACTION_NO                       0
243 #define ACTION_TRANSPARENT              1
244 #define ACTION(kind, param)             ((kind)<<12 | (param))
245 #define MODS4(mods)                     (((mods)>>4 | (mods)) & 0x0F)
246
247 /*
248  * Key
249  */
250 #define ACTION_KEY(key)                 ACTION(ACT_LMODS,    key)
251 /* Mods & key */
252 #define ACTION_LMODS(mods)              ACTION(ACT_LMODS,    MODS4(mods)<<8 | 0x00)
253 #define ACTION_LMODS_KEY(mods, key)     ACTION(ACT_LMODS,    MODS4(mods)<<8 | (key))
254 #define ACTION_RMODS(mods)              ACTION(ACT_RMODS,    MODS4(mods)<<8 | 0x00)
255 #define ACTION_RMODS_KEY(mods, key)     ACTION(ACT_RMODS,    MODS4(mods)<<8 | (key))
256 #define ACTION_LMOD(mod)                ACTION(ACT_LMODS,    MODS4(MOD_BIT(mod))<<8 | 0x00)
257 #define ACTION_LMOD_KEY(mod, key)       ACTION(ACT_LMODS,    MODS4(MOD_BIT(mod))<<8 | (key))
258 #define ACTION_RMOD(mod)                ACTION(ACT_RMODS,    MODS4(MOD_BIT(mod))<<8 | 0x00)
259 #define ACTION_RMOD_KEY(mod, key)       ACTION(ACT_RMODS,    MODS4(MOD_BIT(mod))<<8 | (key))
260 /* Tap key */
261 enum mods_codes {
262     MODS_ONESHOT           = 0x00,
263 };
264 #define ACTION_LMODS_TAP_KEY(mods, key) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | (key))
265 #define ACTION_LMODS_ONESHOT(mods)      ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | MODS_ONESHOT)
266 #define ACTION_RMODS_TAP_KEY(mods, key) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | (key))
267 #define ACTION_RMODS_ONESHOT(mods)      ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | MODS_ONESHOT)
268 #define ACTION_LMOD_TAP_KEY(mod, key)   ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key))
269 #define ACTION_LMOD_ONESHOT(mod)        ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | MODS_ONESHOT)
270 #define ACTION_RMOD_TAP_KEY(mod, key)   ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key))
271 #define ACTION_RMOD_ONESHOT(mod)        ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | MODS_ONESHOT)
272
273 /* HID Usage */
274 enum usage_pages {
275     PAGE_SYSTEM,
276     PAGE_CONSUMER
277 };
278 #define ACTION_USAGE_SYSTEM(id)         ACTION(ACT_USAGE, PAGE_SYSTEM<<10 | (id))
279 #define ACTION_USAGE_CONSUMER(id)       ACTION(ACT_USAGE, PAGE_CONSUMER<<10 | (id))
280
281 /* Mousekey */
282 #define ACTION_MOUSEKEY(key)            ACTION(ACT_MOUSEKEY, key)
283
284
285
286 /* Layer Actions */
287 enum layer_param_on {
288     ON_PRESS    = 1,
289     ON_RELEASE  = 2,
290     ON_BOTH     = 3,
291 };
292
293 enum layer_param_op {
294     OP_DEFAULT_LAYER = 0,
295 };
296
297 enum layer_param_bit_op {
298     OP_BIT_AND = 0,
299     OP_BIT_OR,
300     OP_BIT_XOR,
301     OP_BIT_SET,
302 };
303
304 enum layer_pram_tap_op {
305     OP_TAP_TOGGLE = 0xF0,
306     OP_ON_OFF,
307     OP_OFF_ON,
308     OP_SET_CLEAR,
309 };
310
311 /* Layer Operation           1000|ee00|ooov vvvv */
312 #define ACTION_LAYER(op, val, on)               (ACT_LAYER<<12 | (on)<<10 | (op)<<5 | val)
313 /* Layer Bitwise Operation   1000|ooee|pppx BBBB */
314 #define ACTION_LAYER_BITOP(op, part, bits, on)  (ACT_LAYER<<12 | (op)<<10 | (on)<<8 | (part)<<5 | (bits)&0x1f)
315 /* Layer with Tapping        101x|LLLL| keycode  */
316 #define ACTION_LAYER_TAP(layer, key)            (ACT_LAYER_TAP<<12 | (layer)<<8 | (key))
317
318 /* Default Layer Operation */
319 #define ACTION_DEFAULT_LAYER_SET(layer)         ACTION_DEFAULT_LAYER(layer, ON_RELEASE)
320 #define ACTION_DEFAULT_LAYER(layer, on)         ACTION_LAYER(OP_DEFAULT_LAYER, layer, on)
321 /* Layer Operation */
322 #define ACTION_LAYER_CLEAR(on)                  ACTION_LAYER_AND(0x1f, (on))
323 #define ACTION_LAYER_MOMENTARY(layer)           ACTION_LAYER_ON_OFF(layer)
324 #define ACTION_LAYER_TOGGLE(layer)              ACTION_LAYER_INVERT(layer, ON_RELEASE)
325 #define ACTION_LAYER_INVERT(layer, on)          ACTION_LAYER_BIT_XOR((layer)/4, 1<<((layer)%4), (on))
326 #define ACTION_LAYER_ON(layer, on)              ACTION_LAYER_BIT_OR((layer)/4, 1<<((layer)%4), (on))
327 #define ACTION_LAYER_OFF(layer, on)             ACTION_LAYER_BIT_AND((layer)/4, ~(1<<((layer)%4)), (on))
328 #define ACTION_LAYER_SET(layer, on)             ACTION_LAYER_BIT_SET((layer)/4, 1<<((layer)%4), (on))
329 #define ACTION_LAYER_ON_OFF(layer)              ACTION_LAYER_TAP((layer), OP_ON_OFF)
330 #define ACTION_LAYER_OFF_ON(layer)              ACTION_LAYER_TAP((layer), OP_OFF_ON)
331 #define ACTION_LAYER_SET_CLEAR(layer)           ACTION_LAYER_TAP((layer), OP_SET_CLEAR)
332 /* Bitwise Operation */
333 #define ACTION_LAYER_BIT_AND(part, bits, on)    ACTION_LAYER_BITOP(OP_BIT_AND, part, bits)
334 #define ACTION_LAYER_BIT_OR(part, bits, on)     ACTION_LAYER_BITOP(OP_BIT_OR, part, bits)
335 #define ACTION_LAYER_BIT_XOR(part, bits, on)    ACTION_LAYER_BITOP(OP_BIT_XOR, part, bits)
336 #define ACTION_LAYER_BIT_SET(part, bits, on)    ACTION_LAYER_BITOP(OP_BIT_SET, part, bits)
337 /* with Tapping */
338 #define ACTION_LAYER_TAP_KEY(layer, key)        ACTION_LAYER_TAP((layer), (key))
339 #define ACTION_LAYER_TAP_TOGGLE(layer)          ACTION_LAYER_TAP((layer), OP_TAP_TOGGLE)
340
341
342 /*
343  * Extensions
344  */
345 /* Macro */
346 #define ACTION_MACRO(id)                ACTION(ACT_MACRO, (id))
347 #define ACTION_MACRO_TAP(id)            ACTION(ACT_MACRO, FUNC_TAP<<8 | (id))
348 #define ACTION_MACRO_OPT(id, opt)       ACTION(ACT_MACRO, (opt)<<8 | (id))
349
350 /* Command */
351 #define ACTION_COMMAND(id, opt)         ACTION(ACT_COMMAND,  (opt)<<8 | (addr))
352
353 /* Function */
354 enum function_opts {
355     FUNC_TAP        = 0x8,      /* indciates function is tappable */
356 };
357 #define ACTION_FUNCTION(id)             ACTION(ACT_FUNCTION, (id))
358 #define ACTION_FUNCTION_TAP(id)         ACTION(ACT_FUNCTION, FUNC_TAP<<8 | (id))
359 #define ACTION_FUNCTION_OPT(id, opt)    ACTION(ACT_FUNCTION, (opt)<<8 | (id))
360
361 #endif  /* ACTION_H */