aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@live.com>2019-01-17 09:04:35 -0800
committerMechMerlin <30334081+mechmerlin@users.noreply.github.com>2019-01-17 09:04:35 -0800
commit5fcca9a226b2ab0b1335396e25c37e4b2a261a06 (patch)
tree144cae167933315b914dcc6eef908df9d57f11de
parentf97894d8dba1d20693e71289d284a03335507bd2 (diff)
downloadqmk_firmware-5fcca9a226b2ab0b1335396e25c37e4b2a261a06.tar.gz
qmk_firmware-5fcca9a226b2ab0b1335396e25c37e4b2a261a06.zip
Add documentation and fix formating (#4860)
-rw-r--r--tmk_core/common/action_layer.c301
1 files changed, 145 insertions, 156 deletions
diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c
index 3147d61b3..6ff8c5549 100644
--- a/tmk_core/common/action_layer.c
+++ b/tmk_core/common/action_layer.c
@@ -17,82 +17,76 @@ uint32_t default_layer_state = 0;
17 17
18/** \brief Default Layer State Set At user Level 18/** \brief Default Layer State Set At user Level
19 * 19 *
20 * FIXME: Needs docs 20 * Run user code on default layer state change
21 */ 21 */
22__attribute__((weak)) 22__attribute__((weak))
23uint32_t default_layer_state_set_user(uint32_t state) { 23uint32_t default_layer_state_set_user(uint32_t state) {
24 return state; 24 return state;
25} 25}
26 26
27/** \brief Default Layer State Set At Keyboard Level 27/** \brief Default Layer State Set At Keyboard Level
28 * 28 *
29 * FIXME: Needs docs 29 * Run keyboard code on default layer state change
30 */ 30 */
31__attribute__((weak)) 31__attribute__((weak))
32uint32_t default_layer_state_set_kb(uint32_t state) { 32uint32_t default_layer_state_set_kb(uint32_t state) {
33 return default_layer_state_set_user(state); 33 return default_layer_state_set_user(state);
34} 34}
35 35
36/** \brief Default Layer State Set 36/** \brief Default Layer State Set
37 * 37 *
38 * FIXME: Needs docs 38 * Static function to set the default layer state, prints debug info and clears keys
39 */ 39 */
40static void default_layer_state_set(uint32_t state) 40static void default_layer_state_set(uint32_t state) {
41{ 41 state = default_layer_state_set_kb(state);
42 state = default_layer_state_set_kb(state); 42 debug("default_layer_state: ");
43 debug("default_layer_state: "); 43 default_layer_debug(); debug(" to ");
44 default_layer_debug(); debug(" to "); 44 default_layer_state = state;
45 default_layer_state = state; 45 default_layer_debug(); debug("\n");
46 default_layer_debug(); debug("\n");
47#ifdef STRICT_LAYER_RELEASE 46#ifdef STRICT_LAYER_RELEASE
48 clear_keyboard_but_mods(); // To avoid stuck keys 47 clear_keyboard_but_mods(); // To avoid stuck keys
49#else 48#else
50 clear_keyboard_but_mods_and_keys(); // Don't reset held keys 49 clear_keyboard_but_mods_and_keys(); // Don't reset held keys
51#endif 50#endif
52} 51}
53 52
54/** \brief Default Layer Print 53/** \brief Default Layer Print
55 * 54 *
56 * FIXME: Needs docs 55 * Print out the hex value of the 32-bit default layer state, as well as the value of the highest bit.
57 */ 56 */
58void default_layer_debug(void) 57void default_layer_debug(void) {
59{ 58 dprintf("%08lX(%u)", default_layer_state, biton32(default_layer_state));
60 dprintf("%08lX(%u)", default_layer_state, biton32(default_layer_state));
61} 59}
62 60
63/** \brief Default Layer Set 61/** \brief Default Layer Set
64 * 62 *
65 * FIXME: Needs docs 63 * Sets the default layer state.
66 */ 64 */
67void default_layer_set(uint32_t state) 65void default_layer_set(uint32_t state) {
68{ 66 default_layer_state_set(state);
69 default_layer_state_set(state);
70} 67}
71 68
72#ifndef NO_ACTION_LAYER 69#ifndef NO_ACTION_LAYER
73/** \brief Default Layer Or 70/** \brief Default Layer Or
74 * 71 *
75 * FIXME: Needs docs 72 * Turns on the default layer based on matching bits between specifed layer and existing layer state
76 */ 73 */
77void default_layer_or(uint32_t state) 74void default_layer_or(uint32_t state) {
78{ 75 default_layer_state_set(default_layer_state | state);
79 default_layer_state_set(default_layer_state | state);
80} 76}
81/** \brief Default Layer And 77/** \brief Default Layer And
82 * 78 *
83 * FIXME: Needs docs 79 * Turns on default layer based on matching enabled bits between specifed layer and existing layer state
84 */ 80 */
85void default_layer_and(uint32_t state) 81void default_layer_and(uint32_t state) {
86{ 82 default_layer_state_set(default_layer_state & state);
87 default_layer_state_set(default_layer_state & state);
88} 83}
89/** \brief Default Layer Xor 84/** \brief Default Layer Xor
90 * 85 *
91 * FIXME: Needs docs 86 * Turns on default layer based on non-matching bits between specifed layer and existing layer state
92 */ 87 */
93void default_layer_xor(uint32_t state) 88void default_layer_xor(uint32_t state) {
94{ 89 default_layer_state_set(default_layer_state ^ state);
95 default_layer_state_set(default_layer_state ^ state);
96} 90}
97#endif 91#endif
98 92
@@ -104,170 +98,168 @@ uint32_t layer_state = 0;
104 98
105/** \brief Layer state set user 99/** \brief Layer state set user
106 * 100 *
107 * FIXME: Needs docs 101 * Runs user code on layer state change
108 */ 102 */
109__attribute__((weak)) 103__attribute__((weak))
110uint32_t layer_state_set_user(uint32_t state) { 104uint32_t layer_state_set_user(uint32_t state) {
111 return state; 105 return state;
112} 106}
113 107
114/** \brief Layer state set keyboard 108/** \brief Layer state set keyboard
115 * 109 *
116 * FIXME: Needs docs 110 * Runs keyboard code on layer state change
117 */ 111 */
118__attribute__((weak)) 112__attribute__((weak))
119uint32_t layer_state_set_kb(uint32_t state) { 113uint32_t layer_state_set_kb(uint32_t state) {
120 return layer_state_set_user(state); 114 return layer_state_set_user(state);
121} 115}
122 116
123/** \brief Layer state set 117/** \brief Layer state set
124 * 118 *
125 * FIXME: Needs docs 119 * Sets the layer to match the specifed state (a bitmask)
126 */ 120 */
127void layer_state_set(uint32_t state) 121void layer_state_set(uint32_t state) {
128{ 122 state = layer_state_set_kb(state);
129 state = layer_state_set_kb(state); 123 dprint("layer_state: ");
130 dprint("layer_state: "); 124 layer_debug(); dprint(" to ");
131 layer_debug(); dprint(" to "); 125 layer_state = state;
132 layer_state = state; 126 layer_debug(); dprintln();
133 layer_debug(); dprintln();
134#ifdef STRICT_LAYER_RELEASE 127#ifdef STRICT_LAYER_RELEASE
135 clear_keyboard_but_mods(); // To avoid stuck keys 128 clear_keyboard_but_mods(); // To avoid stuck keys
136#else 129#else
137 clear_keyboard_but_mods_and_keys(); // Don't reset held keys 130 clear_keyboard_but_mods_and_keys(); // Don't reset held keys
138#endif 131#endif
139} 132}
140 133
141/** \brief Layer clear 134/** \brief Layer clear
142 * 135 *
143 * Turn off all layers. 136 * Turn off all layers
144 */ 137 */
145void layer_clear(void) 138void layer_clear(void) {
146{ 139 layer_state_set(0);
147 layer_state_set(0);
148} 140}
149 141
150/** \brief Layer state is 142/** \brief Layer state is
151 * 143 *
152 * Return whether the given state is on (it might still be shadowed by a higher state, though). 144 * Return whether the given state is on (it might still be shadowed by a higher state, though)
153 */ 145 */
154bool layer_state_is(uint8_t layer) 146bool layer_state_is(uint8_t layer) {
155{ 147 return layer_state_cmp(layer_state, layer);
156 return layer_state_cmp(layer_state, layer);
157} 148}
158 149
159/** \brief Layer state compare 150/** \brief Layer state compare
160 * 151 *
161 * FIXME: Needs docs 152 * Used for comparing layers {mostly used for unit testing}
162 */ 153 */
163bool layer_state_cmp(uint32_t cmp_layer_state, uint8_t layer) { 154bool layer_state_cmp(uint32_t cmp_layer_state, uint8_t layer) {
164 if (!cmp_layer_state) { return layer == 0; } 155 if (!cmp_layer_state) { return layer == 0; }
165 return (cmp_layer_state & (1UL<<layer)) != 0; 156 return (cmp_layer_state & (1UL<<layer)) != 0;
166} 157}
167 158
168/** \brief Layer move 159/** \brief Layer move
169 * 160 *
170 * Turn on the given layer and turn off all other layers. 161 * Turns on the given layer and turn off all other layers
171 */ 162 */
172void layer_move(uint8_t layer) 163void layer_move(uint8_t layer) {
173{ 164 layer_state_set(1UL<<layer);
174 layer_state_set(1UL<<layer);
175} 165}
176 166
177/** \brief Layer on 167/** \brief Layer on
178 * 168 *
179 * Turn on the given layer. 169 * Turns on given layer
180 */ 170 */
181void layer_on(uint8_t layer) 171void layer_on(uint8_t layer) {
182{ 172 layer_state_set(layer_state | (1UL<<layer));
183 layer_state_set(layer_state | (1UL<<layer));
184} 173}
185 174
186/** \brief Layer off 175/** \brief Layer off
187 * 176 *
188 * FIXME: Needs docs 177 * Turns off given layer
189 */ 178 */
190void layer_off(uint8_t layer) 179void layer_off(uint8_t layer) {
191{ 180 layer_state_set(layer_state & ~(1UL<<layer));
192 layer_state_set(layer_state & ~(1UL<<layer));
193} 181}
194 182
195/** \brief Layer invert 183/** \brief Layer invert
196 * 184 *
197 * Toggle the given layer (set it if it's unset, or unset it if it's set). 185 * Toggle the given layer (set it if it's unset, or unset it if it's set)
198 */ 186 */
199void layer_invert(uint8_t layer) 187void layer_invert(uint8_t layer) {
200{ 188 layer_state_set(layer_state ^ (1UL<<layer));
201 layer_state_set(layer_state ^ (1UL<<layer));
202} 189}
203 190
204/** \brief Layer or 191/** \brief Layer or
205 * 192 *
206 * FIXME: Needs docs 193 * Turns on layers based on matching bits between specifed layer and existing layer state
207 */ 194 */
208void layer_or(uint32_t state) 195void layer_or(uint32_t state) {
209{ 196 layer_state_set(layer_state | state);
210 layer_state_set(layer_state | state);
211} 197}
212/** \brief Layer and 198/** \brief Layer and
213 * 199 *
214 * FIXME: Needs docs 200 * Turns on layers based on matching enabled bits between specifed layer and existing layer state
215 */ 201 */
216void layer_and(uint32_t state) 202void layer_and(uint32_t state) {
217{ 203 layer_state_set(layer_state & state);
218 layer_state_set(layer_state & state);
219} 204}
220/** \brief Layer xor 205/** \brief Layer xor
221 * 206 *
222 * FIXME: Needs docs 207 * Turns on layers based on non-matching bits between specifed layer and existing layer state
223 */ 208 */
224void layer_xor(uint32_t state) 209void layer_xor(uint32_t state) {
225{ 210 layer_state_set(layer_state ^ state);
226 layer_state_set(layer_state ^ state);
227} 211}
228 212
229/** \brief Layer debug printing 213/** \brief Layer debug printing
230 * 214 *
231 * Print out the hex value of the 32-bit layer state, as well as the value of the highest bit. 215 * Print out the hex value of the 32-bit layer state, as well as the value of the highest bit.
232 */ 216 */
233void layer_debug(void) 217void layer_debug(void) {
234{ 218 dprintf("%08lX(%u)", layer_state, biton32(layer_state));
235 dprintf("%08lX(%u)", layer_state, biton32(layer_state));
236} 219}
237#endif 220#endif
238 221
239#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) 222#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
223/** \brief source layer cache
224 */
225
240uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS] = {{0}}; 226uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS] = {{0}};
241 227
242void update_source_layers_cache(keypos_t key, uint8_t layer) 228/** \brief update source layers cache
243{ 229 *
244 const uint8_t key_number = key.col + (key.row * MATRIX_COLS); 230 * Updates the cached keys when changing layers
245 const uint8_t storage_row = key_number / 8; 231 */
246 const uint8_t storage_bit = key_number % 8; 232void update_source_layers_cache(keypos_t key, uint8_t layer) {
247 233 const uint8_t key_number = key.col + (key.row * MATRIX_COLS);
248 for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) { 234 const uint8_t storage_row = key_number / 8;
249 source_layers_cache[storage_row][bit_number] ^= 235 const uint8_t storage_bit = key_number % 8;
250 (-((layer & (1U << bit_number)) != 0) 236
251 ^ source_layers_cache[storage_row][bit_number]) 237 for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
252 & (1U << storage_bit); 238 source_layers_cache[storage_row][bit_number] ^=
253 } 239 (-((layer & (1U << bit_number)) != 0)
240 ^ source_layers_cache[storage_row][bit_number])
241 & (1U << storage_bit);
242 }
254} 243}
255 244
256uint8_t read_source_layers_cache(keypos_t key) 245/** \brief read source layers cache
257{ 246 *
258 const uint8_t key_number = key.col + (key.row * MATRIX_COLS); 247 * reads the cached keys stored when the layer was changed
259 const uint8_t storage_row = key_number / 8; 248 */
260 const uint8_t storage_bit = key_number % 8; 249uint8_t read_source_layers_cache(keypos_t key) {
261 uint8_t layer = 0; 250 const uint8_t key_number = key.col + (key.row * MATRIX_COLS);
262 251 const uint8_t storage_row = key_number / 8;
263 for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) { 252 const uint8_t storage_bit = key_number % 8;
264 layer |= 253 uint8_t layer = 0;
265 ((source_layers_cache[storage_row][bit_number] 254
266 & (1U << storage_bit)) != 0) 255 for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
267 << bit_number; 256 layer |=
268 } 257 ((source_layers_cache[storage_row][bit_number]
269 258 & (1U << storage_bit)) != 0)
270 return layer; 259 << bit_number;
260 }
261
262 return layer;
271} 263}
272#endif 264#endif
273 265
@@ -278,61 +270,58 @@ uint8_t read_source_layers_cache(keypos_t key)
278 * when the layer is switched after the down event but before the up 270 * when the layer is switched after the down event but before the up
279 * event as they may get stuck otherwise. 271 * event as they may get stuck otherwise.
280 */ 272 */
281action_t store_or_get_action(bool pressed, keypos_t key) 273action_t store_or_get_action(bool pressed, keypos_t key) {
282{
283#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) 274#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
284 if (disable_action_cache) { 275 if (disable_action_cache) {
285 return layer_switch_get_action(key);
286 }
287
288 uint8_t layer;
289
290 if (pressed) {
291 layer = layer_switch_get_layer(key);
292 update_source_layers_cache(key, layer);
293 }
294 else {
295 layer = read_source_layers_cache(key);
296 }
297 return action_for_key(layer, key);
298#else
299 return layer_switch_get_action(key); 276 return layer_switch_get_action(key);
277 }
278
279 uint8_t layer;
280
281 if (pressed) {
282 layer = layer_switch_get_layer(key);
283 update_source_layers_cache(key, layer);
284 }
285 else {
286 layer = read_source_layers_cache(key);
287 }
288 return action_for_key(layer, key);
289#else
290 return layer_switch_get_action(key);
300#endif 291#endif
301} 292}
302 293
303 294
304/** \brief Layer switch get layer 295/** \brief Layer switch get layer
305 * 296 *
306 * FIXME: Needs docs 297 * Gets the layer based on key info
307 */ 298 */
308int8_t layer_switch_get_layer(keypos_t key) 299int8_t layer_switch_get_layer(keypos_t key) {
309{
310#ifndef NO_ACTION_LAYER 300#ifndef NO_ACTION_LAYER
311 action_t action; 301 action_t action;
312 action.code = ACTION_TRANSPARENT; 302 action.code = ACTION_TRANSPARENT;
313 303
314 uint32_t layers = layer_state | default_layer_state; 304 uint32_t layers = layer_state | default_layer_state;
315 /* check top layer first */ 305 /* check top layer first */
316 for (int8_t i = 31; i >= 0; i--) { 306 for (int8_t i = 31; i >= 0; i--) {
317 if (layers & (1UL<<i)) { 307 if (layers & (1UL<<i)) {
318 action = action_for_key(i, key); 308 action = action_for_key(i, key);
319 if (action.code != ACTION_TRANSPARENT) { 309 if (action.code != ACTION_TRANSPARENT) {
320 return i; 310 return i;
321 } 311 }
322 }
323 } 312 }
324 /* fall back to layer 0 */ 313 }
325 return 0; 314 /* fall back to layer 0 */
315 return 0;
326#else 316#else
327 return biton32(default_layer_state); 317 return biton32(default_layer_state);
328#endif 318#endif
329} 319}
330 320
331/** \brief Layer switch get layer 321/** \brief Layer switch get layer
332 * 322 *
333 * FIXME: Needs docs 323 * Gets action code based on key position
334 */ 324 */
335action_t layer_switch_get_action(keypos_t key) 325action_t layer_switch_get_action(keypos_t key) {
336{ 326 return action_for_key(layer_switch_get_layer(key), key);
337 return action_for_key(layer_switch_get_layer(key), key);
338} 327}