diff options
| author | Drashna Jaelre <drashna@live.com> | 2019-01-17 09:04:35 -0800 |
|---|---|---|
| committer | MechMerlin <30334081+mechmerlin@users.noreply.github.com> | 2019-01-17 09:04:35 -0800 |
| commit | 5fcca9a226b2ab0b1335396e25c37e4b2a261a06 (patch) | |
| tree | 144cae167933315b914dcc6eef908df9d57f11de | |
| parent | f97894d8dba1d20693e71289d284a03335507bd2 (diff) | |
| download | qmk_firmware-5fcca9a226b2ab0b1335396e25c37e4b2a261a06.tar.gz qmk_firmware-5fcca9a226b2ab0b1335396e25c37e4b2a261a06.zip | |
Add documentation and fix formating (#4860)
| -rw-r--r-- | tmk_core/common/action_layer.c | 301 |
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)) |
| 23 | uint32_t default_layer_state_set_user(uint32_t state) { | 23 | uint32_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)) |
| 32 | uint32_t default_layer_state_set_kb(uint32_t state) { | 32 | uint32_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 | */ |
| 40 | static void default_layer_state_set(uint32_t state) | 40 | static 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 | */ |
| 58 | void default_layer_debug(void) | 57 | void 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 | */ |
| 67 | void default_layer_set(uint32_t state) | 65 | void 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 | */ |
| 77 | void default_layer_or(uint32_t state) | 74 | void 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 | */ |
| 85 | void default_layer_and(uint32_t state) | 81 | void 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 | */ |
| 93 | void default_layer_xor(uint32_t state) | 88 | void 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)) |
| 110 | uint32_t layer_state_set_user(uint32_t state) { | 104 | uint32_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)) |
| 119 | uint32_t layer_state_set_kb(uint32_t state) { | 113 | uint32_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 | */ |
| 127 | void layer_state_set(uint32_t state) | 121 | void 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 | */ |
| 145 | void layer_clear(void) | 138 | void 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 | */ |
| 154 | bool layer_state_is(uint8_t layer) | 146 | bool 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 | */ |
| 163 | bool layer_state_cmp(uint32_t cmp_layer_state, uint8_t layer) { | 154 | bool 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 | */ |
| 172 | void layer_move(uint8_t layer) | 163 | void 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 | */ |
| 181 | void layer_on(uint8_t layer) | 171 | void 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 | */ |
| 190 | void layer_off(uint8_t layer) | 179 | void 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 | */ |
| 199 | void layer_invert(uint8_t layer) | 187 | void 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 | */ |
| 208 | void layer_or(uint32_t state) | 195 | void 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 | */ |
| 216 | void layer_and(uint32_t state) | 202 | void 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 | */ |
| 224 | void layer_xor(uint32_t state) | 209 | void 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 | */ |
| 233 | void layer_debug(void) | 217 | void 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 | |||
| 240 | uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS] = {{0}}; | 226 | uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS] = {{0}}; |
| 241 | 227 | ||
| 242 | void 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; | 232 | void 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 | ||
| 256 | uint8_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; | 249 | uint8_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 | */ |
| 281 | action_t store_or_get_action(bool pressed, keypos_t key) | 273 | action_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 | */ |
| 308 | int8_t layer_switch_get_layer(keypos_t key) | 299 | int8_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 | */ |
| 335 | action_t layer_switch_get_action(keypos_t key) | 325 | action_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 | } |
