diff options
Diffstat (limited to 'tmk_core/common/action_code.h')
-rw-r--r-- | tmk_core/common/action_code.h | 315 |
1 files changed, 315 insertions, 0 deletions
diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h new file mode 100644 index 000000000..bc40e2c6f --- /dev/null +++ b/tmk_core/common/action_code.h | |||
@@ -0,0 +1,315 @@ | |||
1 | /* | ||
2 | Copyright 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_CODE_H | ||
18 | #define ACTION_CODE_H | ||
19 | |||
20 | /* Action codes | ||
21 | * ============ | ||
22 | * 16bit code: action_kind(4bit) + action_parameter(12bit) | ||
23 | * | ||
24 | * | ||
25 | * Key Actions(00xx) | ||
26 | * ----------------- | ||
27 | * ACT_MODS(000r): | ||
28 | * 000r|0000|0000 0000 No action code | ||
29 | * 000r|0000|0000 0001 Transparent code | ||
30 | * 000r|0000| keycode Key | ||
31 | * 000r|mods|0000 0000 Modifiers | ||
32 | * 000r|mods| keycode Modifiers+Key(Modified key) | ||
33 | * r: Left/Right flag(Left:0, Right:1) | ||
34 | * | ||
35 | * ACT_MODS_TAP(001r): | ||
36 | * 001r|mods|0000 0000 Modifiers with OneShot | ||
37 | * 001r|mods|0000 0001 Modifiers with tap toggle | ||
38 | * 001r|mods|0000 00xx (reserved) | ||
39 | * 001r|mods| keycode Modifiers with Tap Key(Dual role) | ||
40 | * | ||
41 | * | ||
42 | * Other Keys(01xx) | ||
43 | * ---------------- | ||
44 | * ACT_USAGE(0100): TODO: Not needed? | ||
45 | * 0100|00| usage(10) System control(0x80) - General Desktop page(0x01) | ||
46 | * 0100|01| usage(10) Consumer control(0x01) - Consumer page(0x0C) | ||
47 | * 0100|10| usage(10) (reserved) | ||
48 | * 0100|11| usage(10) (reserved) | ||
49 | * | ||
50 | * ACT_MOUSEKEY(0110): TODO: Not needed? | ||
51 | * 0101|xxxx| keycode Mouse key | ||
52 | * | ||
53 | * 011x|xxxx xxxx xxxx (reseved) | ||
54 | * | ||
55 | * | ||
56 | * Layer Actions(10xx) | ||
57 | * ------------------- | ||
58 | * ACT_LAYER(1000): | ||
59 | * 1000|oo00|pppE BBBB Default Layer Bitwise operation | ||
60 | * oo: operation(00:AND, 01:OR, 10:XOR, 11:SET) | ||
61 | * ppp: 4-bit chunk part(0-7) | ||
62 | * EBBBB: bits and extra bit | ||
63 | * 1000|ooee|pppE BBBB Layer Bitwise Operation | ||
64 | * oo: operation(00:AND, 01:OR, 10:XOR, 11:SET) | ||
65 | * ppp: 4-bit chunk part(0-7) | ||
66 | * EBBBB: bits and extra bit | ||
67 | * ee: on event(01:press, 10:release, 11:both) | ||
68 | * | ||
69 | * 1001|xxxx|xxxx xxxx (reserved) | ||
70 | * 1001|oopp|BBBB BBBB 8-bit Bitwise Operation??? | ||
71 | * | ||
72 | * ACT_LAYER_TAP(101x): | ||
73 | * 101E|LLLL| keycode On/Off with tap key | ||
74 | * 101E|LLLL|1110 mods On/Off with modifiers(0xE0-EF) | ||
75 | * 101E|LLLL|1111 0000 Invert with tap toggle(0xF0) | ||
76 | * 101E|LLLL|1111 0001 On/Off | ||
77 | * 101E|LLLL|1111 0010 Off/On | ||
78 | * 101E|LLLL|1111 0011 Set/Clear | ||
79 | * 101E|LLLL|1111 xxxx Reserved(0xF4-FF) | ||
80 | * ELLLL: layer 0-31(E: extra bit for layer 16-31) | ||
81 | * | ||
82 | * | ||
83 | * Extensions(11xx) | ||
84 | * ---------------- | ||
85 | * ACT_MACRO(1100): | ||
86 | * 1100|opt | id(8) Macro play? | ||
87 | * 1100|1111| id(8) Macro record? | ||
88 | * | ||
89 | * ACT_BACKLIGHT(1101): | ||
90 | * 1101|opt |level(8) Backlight commands | ||
91 | * | ||
92 | * ACT_COMMAND(1110): | ||
93 | * 1110|opt | id(8) Built-in Command exec | ||
94 | * | ||
95 | * ACT_FUNCTION(1111): | ||
96 | * 1111| address(12) Function? | ||
97 | * 1111|opt | id(8) Function? | ||
98 | */ | ||
99 | enum action_kind_id { | ||
100 | /* Key Actions */ | ||
101 | ACT_MODS = 0b0000, | ||
102 | ACT_LMODS = 0b0000, | ||
103 | ACT_RMODS = 0b0001, | ||
104 | ACT_MODS_TAP = 0b0010, | ||
105 | ACT_LMODS_TAP = 0b0010, | ||
106 | ACT_RMODS_TAP = 0b0011, | ||
107 | /* Other Keys */ | ||
108 | ACT_USAGE = 0b0100, | ||
109 | ACT_MOUSEKEY = 0b0101, | ||
110 | /* Layer Actions */ | ||
111 | ACT_LAYER = 0b1000, | ||
112 | ACT_LAYER_TAP = 0b1010, /* Layer 0-15 */ | ||
113 | ACT_LAYER_TAP_EXT = 0b1011, /* Layer 16-31 */ | ||
114 | /* Extensions */ | ||
115 | ACT_MACRO = 0b1100, | ||
116 | ACT_BACKLIGHT = 0b1101, | ||
117 | ACT_COMMAND = 0b1110, | ||
118 | ACT_FUNCTION = 0b1111 | ||
119 | }; | ||
120 | |||
121 | |||
122 | /* Action Code Struct | ||
123 | * | ||
124 | * NOTE: | ||
125 | * In avr-gcc bit field seems to be assigned from LSB(bit0) to MSB(bit15). | ||
126 | * AVR looks like a little endian in avr-gcc. | ||
127 | * Not portable across compiler/endianness? | ||
128 | * | ||
129 | * Byte order and bit order of 0x1234: | ||
130 | * Big endian: Little endian: | ||
131 | * -------------------- -------------------- | ||
132 | * FEDC BA98 7654 3210 0123 4567 89AB CDEF | ||
133 | * 0001 0010 0011 0100 0010 1100 0100 1000 | ||
134 | * 0x12 0x34 0x34 0x12 | ||
135 | */ | ||
136 | typedef union { | ||
137 | uint16_t code; | ||
138 | struct action_kind { | ||
139 | uint16_t param :12; | ||
140 | uint8_t id :4; | ||
141 | } kind; | ||
142 | struct action_key { | ||
143 | uint8_t code :8; | ||
144 | uint8_t mods :4; | ||
145 | uint8_t kind :4; | ||
146 | } key; | ||
147 | struct action_layer_bitop { | ||
148 | uint8_t bits :4; | ||
149 | uint8_t xbit :1; | ||
150 | uint8_t part :3; | ||
151 | uint8_t on :2; | ||
152 | uint8_t op :2; | ||
153 | uint8_t kind :4; | ||
154 | } layer_bitop; | ||
155 | struct action_layer_tap { | ||
156 | uint8_t code :8; | ||
157 | uint8_t val :5; | ||
158 | uint8_t kind :3; | ||
159 | } layer_tap; | ||
160 | struct action_usage { | ||
161 | uint16_t code :10; | ||
162 | uint8_t page :2; | ||
163 | uint8_t kind :4; | ||
164 | } usage; | ||
165 | struct action_backlight { | ||
166 | uint8_t level :8; | ||
167 | uint8_t opt :4; | ||
168 | uint8_t kind :4; | ||
169 | } backlight; | ||
170 | struct action_command { | ||
171 | uint8_t id :8; | ||
172 | uint8_t opt :4; | ||
173 | uint8_t kind :4; | ||
174 | } command; | ||
175 | struct action_function { | ||
176 | uint8_t id :8; | ||
177 | uint8_t opt :4; | ||
178 | uint8_t kind :4; | ||
179 | } func; | ||
180 | } action_t; | ||
181 | |||
182 | |||
183 | /* action utility */ | ||
184 | #define ACTION_NO 0 | ||
185 | #define ACTION_TRANSPARENT 1 | ||
186 | #define ACTION(kind, param) ((kind)<<12 | (param)) | ||
187 | |||
188 | |||
189 | /* | ||
190 | * Key Actions | ||
191 | */ | ||
192 | /* Mod bits: 43210 | ||
193 | * bit 0 ||||+- Control | ||
194 | * bit 1 |||+-- Shift | ||
195 | * bit 2 ||+--- Alt | ||
196 | * bit 3 |+---- Gui | ||
197 | * bit 4 +----- LR flag(Left:0, Right:1) | ||
198 | */ | ||
199 | enum mods_bit { | ||
200 | MOD_LCTL = 0x01, | ||
201 | MOD_LSFT = 0x02, | ||
202 | MOD_LALT = 0x04, | ||
203 | MOD_LGUI = 0x08, | ||
204 | MOD_RCTL = 0x11, | ||
205 | MOD_RSFT = 0x12, | ||
206 | MOD_RALT = 0x14, | ||
207 | MOD_RGUI = 0x18, | ||
208 | }; | ||
209 | enum mods_codes { | ||
210 | MODS_ONESHOT = 0x00, | ||
211 | MODS_TAP_TOGGLE = 0x01, | ||
212 | }; | ||
213 | #define ACTION_KEY(key) ACTION(ACT_MODS, (key)) | ||
214 | #define ACTION_MODS(mods) ACTION(ACT_MODS, ((mods)&0x1f)<<8 | 0) | ||
215 | #define ACTION_MODS_KEY(mods, key) ACTION(ACT_MODS, ((mods)&0x1f)<<8 | (key)) | ||
216 | #define ACTION_MODS_TAP_KEY(mods, key) ACTION(ACT_MODS_TAP, ((mods)&0x1f)<<8 | (key)) | ||
217 | #define ACTION_MODS_ONESHOT(mods) ACTION(ACT_MODS_TAP, ((mods)&0x1f)<<8 | MODS_ONESHOT) | ||
218 | #define ACTION_MODS_TAP_TOGGLE(mods) ACTION(ACT_MODS_TAP, ((mods)&0x1f)<<8 | MODS_TAP_TOGGLE) | ||
219 | |||
220 | |||
221 | /* | ||
222 | * Other Keys | ||
223 | */ | ||
224 | enum usage_pages { | ||
225 | PAGE_SYSTEM, | ||
226 | PAGE_CONSUMER | ||
227 | }; | ||
228 | #define ACTION_USAGE_SYSTEM(id) ACTION(ACT_USAGE, PAGE_SYSTEM<<10 | (id)) | ||
229 | #define ACTION_USAGE_CONSUMER(id) ACTION(ACT_USAGE, PAGE_CONSUMER<<10 | (id)) | ||
230 | #define ACTION_MOUSEKEY(key) ACTION(ACT_MOUSEKEY, key) | ||
231 | |||
232 | |||
233 | |||
234 | /* | ||
235 | * Layer Actions | ||
236 | */ | ||
237 | enum layer_param_on { | ||
238 | ON_PRESS = 1, | ||
239 | ON_RELEASE = 2, | ||
240 | ON_BOTH = 3, | ||
241 | }; | ||
242 | enum layer_param_bit_op { | ||
243 | OP_BIT_AND = 0, | ||
244 | OP_BIT_OR = 1, | ||
245 | OP_BIT_XOR = 2, | ||
246 | OP_BIT_SET = 3, | ||
247 | }; | ||
248 | enum layer_pram_tap_op { | ||
249 | OP_TAP_TOGGLE = 0xF0, | ||
250 | OP_ON_OFF, | ||
251 | OP_OFF_ON, | ||
252 | OP_SET_CLEAR, | ||
253 | }; | ||
254 | #define ACTION_LAYER_BITOP(op, part, bits, on) (ACT_LAYER<<12 | (op)<<10 | (on)<<8 | (part)<<5 | ((bits)&0x1f)) | ||
255 | #define ACTION_LAYER_TAP(layer, key) (ACT_LAYER_TAP<<12 | (layer)<<8 | (key)) | ||
256 | /* Default Layer */ | ||
257 | #define ACTION_DEFAULT_LAYER_SET(layer) ACTION_DEFAULT_LAYER_BIT_SET((layer)/4, 1<<((layer)%4)) | ||
258 | /* Layer Operation */ | ||
259 | #define ACTION_LAYER_CLEAR(on) ACTION_LAYER_BIT_AND(0, 0, (on)) | ||
260 | #define ACTION_LAYER_MOMENTARY(layer) ACTION_LAYER_ON_OFF(layer) | ||
261 | #define ACTION_LAYER_TOGGLE(layer) ACTION_LAYER_INVERT(layer, ON_RELEASE) | ||
262 | #define ACTION_LAYER_INVERT(layer, on) ACTION_LAYER_BIT_XOR((layer)/4, 1<<((layer)%4), (on)) | ||
263 | #define ACTION_LAYER_ON(layer, on) ACTION_LAYER_BIT_OR( (layer)/4, 1<<((layer)%4), (on)) | ||
264 | #define ACTION_LAYER_OFF(layer, on) ACTION_LAYER_BIT_AND((layer)/4, ~(1<<((layer)%4)), (on)) | ||
265 | #define ACTION_LAYER_SET(layer, on) ACTION_LAYER_BIT_SET((layer)/4, 1<<((layer)%4), (on)) | ||
266 | #define ACTION_LAYER_ON_OFF(layer) ACTION_LAYER_TAP((layer), OP_ON_OFF) | ||
267 | #define ACTION_LAYER_OFF_ON(layer) ACTION_LAYER_TAP((layer), OP_OFF_ON) | ||
268 | #define ACTION_LAYER_SET_CLEAR(layer) ACTION_LAYER_TAP((layer), OP_SET_CLEAR) | ||
269 | #define ACTION_LAYER_MODS(layer, mods) ACTION_LAYER_TAP((layer), 0xe0 | (mods)&0x0f) | ||
270 | /* With Tapping */ | ||
271 | #define ACTION_LAYER_TAP_KEY(layer, key) ACTION_LAYER_TAP((layer), (key)) | ||
272 | #define ACTION_LAYER_TAP_TOGGLE(layer) ACTION_LAYER_TAP((layer), OP_TAP_TOGGLE) | ||
273 | /* Bitwise Operation */ | ||
274 | #define ACTION_LAYER_BIT_AND(part, bits, on) ACTION_LAYER_BITOP(OP_BIT_AND, (part), (bits), (on)) | ||
275 | #define ACTION_LAYER_BIT_OR( part, bits, on) ACTION_LAYER_BITOP(OP_BIT_OR, (part), (bits), (on)) | ||
276 | #define ACTION_LAYER_BIT_XOR(part, bits, on) ACTION_LAYER_BITOP(OP_BIT_XOR, (part), (bits), (on)) | ||
277 | #define ACTION_LAYER_BIT_SET(part, bits, on) ACTION_LAYER_BITOP(OP_BIT_SET, (part), (bits), (on)) | ||
278 | /* Default Layer Bitwise Operation */ | ||
279 | #define ACTION_DEFAULT_LAYER_BIT_AND(part, bits) ACTION_LAYER_BITOP(OP_BIT_AND, (part), (bits), 0) | ||
280 | #define ACTION_DEFAULT_LAYER_BIT_OR( part, bits) ACTION_LAYER_BITOP(OP_BIT_OR, (part), (bits), 0) | ||
281 | #define ACTION_DEFAULT_LAYER_BIT_XOR(part, bits) ACTION_LAYER_BITOP(OP_BIT_XOR, (part), (bits), 0) | ||
282 | #define ACTION_DEFAULT_LAYER_BIT_SET(part, bits) ACTION_LAYER_BITOP(OP_BIT_SET, (part), (bits), 0) | ||
283 | |||
284 | |||
285 | /* | ||
286 | * Extensions | ||
287 | */ | ||
288 | enum backlight_opt { | ||
289 | BACKLIGHT_INCREASE = 0, | ||
290 | BACKLIGHT_DECREASE = 1, | ||
291 | BACKLIGHT_TOGGLE = 2, | ||
292 | BACKLIGHT_STEP = 3, | ||
293 | BACKLIGHT_LEVEL = 4, | ||
294 | }; | ||
295 | /* Macro */ | ||
296 | #define ACTION_MACRO(id) ACTION(ACT_MACRO, (id)) | ||
297 | #define ACTION_MACRO_TAP(id) ACTION(ACT_MACRO, FUNC_TAP<<8 | (id)) | ||
298 | #define ACTION_MACRO_OPT(id, opt) ACTION(ACT_MACRO, (opt)<<8 | (id)) | ||
299 | /* Backlight */ | ||
300 | #define ACTION_BACKLIGHT_INCREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_INCREASE << 8) | ||
301 | #define ACTION_BACKLIGHT_DECREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE << 8) | ||
302 | #define ACTION_BACKLIGHT_TOGGLE() ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE << 8) | ||
303 | #define ACTION_BACKLIGHT_STEP() ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP << 8) | ||
304 | #define ACTION_BACKLIGHT_LEVEL(level) ACTION(ACT_BACKLIGHT, BACKLIGHT_LEVEL << 8 | level) | ||
305 | /* Command */ | ||
306 | #define ACTION_COMMAND(id, opt) ACTION(ACT_COMMAND, (opt)<<8 | (addr)) | ||
307 | /* Function */ | ||
308 | enum function_opts { | ||
309 | FUNC_TAP = 0x8, /* indciates function is tappable */ | ||
310 | }; | ||
311 | #define ACTION_FUNCTION(id) ACTION(ACT_FUNCTION, (id)) | ||
312 | #define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | (id)) | ||
313 | #define ACTION_FUNCTION_OPT(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | (id)) | ||
314 | |||
315 | #endif /* ACTION_CODE_H */ | ||