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.

363 lines
10 KiB

  1. #include <limits.h>
  2. #include <stdint.h>
  3. #include "keyboard.h"
  4. #include "action.h"
  5. #include "encoder.h"
  6. #include "util.h"
  7. #include "action_layer.h"
  8. /** \brief Default Layer State
  9. */
  10. layer_state_t default_layer_state = 0;
  11. /** \brief Default Layer State Set At user Level
  12. *
  13. * Run user code on default layer state change
  14. */
  15. __attribute__((weak)) layer_state_t default_layer_state_set_user(layer_state_t state) {
  16. return state;
  17. }
  18. /** \brief Default Layer State Set At Keyboard Level
  19. *
  20. * Run keyboard code on default layer state change
  21. */
  22. __attribute__((weak)) layer_state_t default_layer_state_set_kb(layer_state_t state) {
  23. return default_layer_state_set_user(state);
  24. }
  25. /** \brief Default Layer State Set
  26. *
  27. * Static function to set the default layer state, prints debug info and clears keys
  28. */
  29. static void default_layer_state_set(layer_state_t state) {
  30. state = default_layer_state_set_kb(state);
  31. ac_dprintf("default_layer_state: ");
  32. default_layer_debug();
  33. ac_dprintf(" to ");
  34. default_layer_state = state;
  35. default_layer_debug();
  36. ac_dprintf("\n");
  37. #if defined(STRICT_LAYER_RELEASE)
  38. clear_keyboard_but_mods(); // To avoid stuck keys
  39. #elif defined(SEMI_STRICT_LAYER_RELEASE)
  40. clear_keyboard_but_mods_and_keys(); // Don't reset held keys
  41. #endif
  42. }
  43. /** \brief Default Layer Print
  44. *
  45. * Print out the hex value of the 32-bit default layer state, as well as the value of the highest bit.
  46. */
  47. void default_layer_debug(void) {
  48. ac_dprintf("%08hX(%u)", default_layer_state, get_highest_layer(default_layer_state));
  49. }
  50. /** \brief Default Layer Set
  51. *
  52. * Sets the default layer state.
  53. */
  54. void default_layer_set(layer_state_t state) {
  55. default_layer_state_set(state);
  56. }
  57. #ifndef NO_ACTION_LAYER
  58. /** \brief Default Layer Or
  59. *
  60. * Turns on the default layer based on matching bits between specified layer and existing layer state
  61. */
  62. void default_layer_or(layer_state_t state) {
  63. default_layer_state_set(default_layer_state | state);
  64. }
  65. /** \brief Default Layer And
  66. *
  67. * Turns on default layer based on matching enabled bits between specified layer and existing layer state
  68. */
  69. void default_layer_and(layer_state_t state) {
  70. default_layer_state_set(default_layer_state & state);
  71. }
  72. /** \brief Default Layer Xor
  73. *
  74. * Turns on default layer based on non-matching bits between specified layer and existing layer state
  75. */
  76. void default_layer_xor(layer_state_t state) {
  77. default_layer_state_set(default_layer_state ^ state);
  78. }
  79. #endif
  80. #ifndef NO_ACTION_LAYER
  81. /** \brief Keymap Layer State
  82. */
  83. layer_state_t layer_state = 0;
  84. /** \brief Layer state set user
  85. *
  86. * Runs user code on layer state change
  87. */
  88. __attribute__((weak)) layer_state_t layer_state_set_user(layer_state_t state) {
  89. return state;
  90. }
  91. /** \brief Layer state set keyboard
  92. *
  93. * Runs keyboard code on layer state change
  94. */
  95. __attribute__((weak)) layer_state_t layer_state_set_kb(layer_state_t state) {
  96. return layer_state_set_user(state);
  97. }
  98. /** \brief Layer state set
  99. *
  100. * Sets the layer to match the specified state (a bitmask)
  101. */
  102. void layer_state_set(layer_state_t state) {
  103. state = layer_state_set_kb(state);
  104. ac_dprintf("layer_state: ");
  105. layer_debug();
  106. ac_dprintf(" to ");
  107. layer_state = state;
  108. layer_debug();
  109. ac_dprintf("\n");
  110. # if defined(STRICT_LAYER_RELEASE)
  111. clear_keyboard_but_mods(); // To avoid stuck keys
  112. # elif defined(SEMI_STRICT_LAYER_RELEASE)
  113. clear_keyboard_but_mods_and_keys(); // Don't reset held keys
  114. # endif
  115. }
  116. /** \brief Layer clear
  117. *
  118. * Turn off all layers
  119. */
  120. void layer_clear(void) {
  121. layer_state_set(0);
  122. }
  123. /** \brief Layer state is
  124. *
  125. * Return whether the given state is on (it might still be shadowed by a higher state, though)
  126. */
  127. bool layer_state_is(uint8_t layer) {
  128. return layer_state_cmp(layer_state, layer);
  129. }
  130. /** \brief Layer state compare
  131. *
  132. * Used for comparing layers {mostly used for unit testing}
  133. */
  134. bool layer_state_cmp(layer_state_t cmp_layer_state, uint8_t layer) {
  135. if (!cmp_layer_state) {
  136. return layer == 0;
  137. }
  138. return (cmp_layer_state & ((layer_state_t)1 << layer)) != 0;
  139. }
  140. /** \brief Layer move
  141. *
  142. * Turns on the given layer and turn off all other layers
  143. */
  144. void layer_move(uint8_t layer) {
  145. layer_state_set((layer_state_t)1 << layer);
  146. }
  147. /** \brief Layer on
  148. *
  149. * Turns on given layer
  150. */
  151. void layer_on(uint8_t layer) {
  152. layer_state_set(layer_state | ((layer_state_t)1 << layer));
  153. }
  154. /** \brief Layer off
  155. *
  156. * Turns off given layer
  157. */
  158. void layer_off(uint8_t layer) {
  159. layer_state_set(layer_state & ~((layer_state_t)1 << layer));
  160. }
  161. /** \brief Layer invert
  162. *
  163. * Toggle the given layer (set it if it's unset, or unset it if it's set)
  164. */
  165. void layer_invert(uint8_t layer) {
  166. layer_state_set(layer_state ^ ((layer_state_t)1 << layer));
  167. }
  168. /** \brief Layer or
  169. *
  170. * Turns on layers based on matching bits between specified layer and existing layer state
  171. */
  172. void layer_or(layer_state_t state) {
  173. layer_state_set(layer_state | state);
  174. }
  175. /** \brief Layer and
  176. *
  177. * Turns on layers based on matching enabled bits between specified layer and existing layer state
  178. */
  179. void layer_and(layer_state_t state) {
  180. layer_state_set(layer_state & state);
  181. }
  182. /** \brief Layer xor
  183. *
  184. * Turns on layers based on non-matching bits between specified layer and existing layer state
  185. */
  186. void layer_xor(layer_state_t state) {
  187. layer_state_set(layer_state ^ state);
  188. }
  189. /** \brief Layer debug printing
  190. *
  191. * Print out the hex value of the 32-bit layer state, as well as the value of the highest bit.
  192. */
  193. void layer_debug(void) {
  194. ac_dprintf("%08hX(%u)", layer_state, get_highest_layer(layer_state));
  195. }
  196. #endif
  197. #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
  198. /** \brief source layer cache
  199. */
  200. uint8_t source_layers_cache[((MATRIX_ROWS * MATRIX_COLS) + (CHAR_BIT)-1) / (CHAR_BIT)][MAX_LAYER_BITS] = {{0}};
  201. # ifdef ENCODER_MAP_ENABLE
  202. uint8_t encoder_source_layers_cache[(NUM_ENCODERS + (CHAR_BIT)-1) / (CHAR_BIT)][MAX_LAYER_BITS] = {{0}};
  203. # endif // ENCODER_MAP_ENABLE
  204. /** \brief update source layers cache impl
  205. *
  206. * Updates the supplied cache when changing layers
  207. */
  208. void update_source_layers_cache_impl(uint8_t layer, uint16_t entry_number, uint8_t cache[][MAX_LAYER_BITS]) {
  209. const uint16_t storage_idx = entry_number / (CHAR_BIT);
  210. const uint8_t storage_bit = entry_number % (CHAR_BIT);
  211. for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
  212. cache[storage_idx][bit_number] ^= (-((layer & (1U << bit_number)) != 0) ^ cache[storage_idx][bit_number]) & (1U << storage_bit);
  213. }
  214. }
  215. /** \brief read source layers cache
  216. *
  217. * reads the cached keys stored when the layer was changed
  218. */
  219. uint8_t read_source_layers_cache_impl(uint16_t entry_number, uint8_t cache[][MAX_LAYER_BITS]) {
  220. const uint16_t storage_idx = entry_number / (CHAR_BIT);
  221. const uint8_t storage_bit = entry_number % (CHAR_BIT);
  222. uint8_t layer = 0;
  223. for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
  224. layer |= ((cache[storage_idx][bit_number] & (1U << storage_bit)) != 0) << bit_number;
  225. }
  226. return layer;
  227. }
  228. /** \brief update encoder source layers cache
  229. *
  230. * Updates the cached encoders when changing layers
  231. */
  232. void update_source_layers_cache(keypos_t key, uint8_t layer) {
  233. if (key.row < MATRIX_ROWS && key.col < MATRIX_COLS) {
  234. const uint16_t entry_number = (uint16_t)(key.row * MATRIX_COLS) + key.col;
  235. update_source_layers_cache_impl(layer, entry_number, source_layers_cache);
  236. }
  237. # ifdef ENCODER_MAP_ENABLE
  238. else if (key.row == KEYLOC_ENCODER_CW || key.row == KEYLOC_ENCODER_CCW) {
  239. const uint16_t entry_number = key.col;
  240. update_source_layers_cache_impl(layer, entry_number, encoder_source_layers_cache);
  241. }
  242. # endif // ENCODER_MAP_ENABLE
  243. }
  244. /** \brief read source layers cache
  245. *
  246. * reads the cached keys stored when the layer was changed
  247. */
  248. uint8_t read_source_layers_cache(keypos_t key) {
  249. if (key.row < MATRIX_ROWS && key.col < MATRIX_COLS) {
  250. const uint16_t entry_number = (uint16_t)(key.row * MATRIX_COLS) + key.col;
  251. return read_source_layers_cache_impl(entry_number, source_layers_cache);
  252. }
  253. # ifdef ENCODER_MAP_ENABLE
  254. else if (key.row == KEYLOC_ENCODER_CW || key.row == KEYLOC_ENCODER_CCW) {
  255. const uint16_t entry_number = key.col;
  256. return read_source_layers_cache_impl(entry_number, encoder_source_layers_cache);
  257. }
  258. # endif // ENCODER_MAP_ENABLE
  259. return 0;
  260. }
  261. #endif
  262. /** \brief Store or get action (FIXME: Needs better summary)
  263. *
  264. * Make sure the action triggered when the key is released is the same
  265. * one as the one triggered on press. It's important for the mod keys
  266. * when the layer is switched after the down event but before the up
  267. * event as they may get stuck otherwise.
  268. */
  269. action_t store_or_get_action(bool pressed, keypos_t key) {
  270. #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
  271. if (disable_action_cache) {
  272. return layer_switch_get_action(key);
  273. }
  274. uint8_t layer;
  275. if (pressed) {
  276. layer = layer_switch_get_layer(key);
  277. update_source_layers_cache(key, layer);
  278. } else {
  279. layer = read_source_layers_cache(key);
  280. }
  281. return action_for_key(layer, key);
  282. #else
  283. return layer_switch_get_action(key);
  284. #endif
  285. }
  286. /** \brief Layer switch get layer
  287. *
  288. * Gets the layer based on key info
  289. */
  290. uint8_t layer_switch_get_layer(keypos_t key) {
  291. #ifndef NO_ACTION_LAYER
  292. action_t action;
  293. action.code = ACTION_TRANSPARENT;
  294. layer_state_t layers = layer_state | default_layer_state;
  295. /* check top layer first */
  296. for (int8_t i = MAX_LAYER - 1; i >= 0; i--) {
  297. if (layers & ((layer_state_t)1 << i)) {
  298. action = action_for_key(i, key);
  299. if (action.code != ACTION_TRANSPARENT) {
  300. return i;
  301. }
  302. }
  303. }
  304. /* fall back to layer 0 */
  305. return 0;
  306. #else
  307. return get_highest_layer(default_layer_state);
  308. #endif
  309. }
  310. /** \brief Layer switch get layer
  311. *
  312. * Gets action code based on key position
  313. */
  314. action_t layer_switch_get_action(keypos_t key) {
  315. return action_for_key(layer_switch_get_layer(key), key);
  316. }
  317. #ifndef NO_ACTION_LAYER
  318. layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
  319. layer_state_t mask12 = ((layer_state_t)1 << layer1) | ((layer_state_t)1 << layer2);
  320. layer_state_t mask3 = (layer_state_t)1 << layer3;
  321. return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3);
  322. }
  323. void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
  324. layer_state_set(update_tri_layer_state(layer_state, layer1, layer2, layer3));
  325. }
  326. #endif