engine.part.2 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. void single_dance(const struct Chord* self) {
  2. switch (*self->state) {
  3. case ACTIVATED:
  4. key_in(self->value1);
  5. break;
  6. case DEACTIVATED:
  7. key_out(self->value1);
  8. *self->state = IDLE;
  9. break;
  10. case RESTART:
  11. key_out(self->value1);
  12. break;
  13. default:
  14. break;
  15. }
  16. }
  17. void key_layer_dance(const struct Chord* self) {
  18. switch (*self->state) {
  19. case ACTIVATED:
  20. current_pseudolayer = self->value2;
  21. a_key_went_through = false;
  22. break;
  23. case DEACTIVATED:
  24. case RESTART:
  25. if (!a_key_went_through) {
  26. tap_key(self->value1);
  27. }
  28. current_pseudolayer = self->pseudolayer;
  29. *self->state = IDLE; // does not have effect if the state was RESTART
  30. break;
  31. default:
  32. break;
  33. }
  34. }
  35. void key_mod_dance(const struct Chord* self) {
  36. switch (*self->state) {
  37. case ACTIVATED:
  38. key_in(self->value2);
  39. a_key_went_through = false;
  40. break;
  41. case DEACTIVATED:
  42. case RESTART:
  43. key_out(self->value2);
  44. if (!a_key_went_through) {
  45. tap_key(self->value1);
  46. }
  47. *self->state = IDLE; // does not have effect if the state was RESTART
  48. break;
  49. default:
  50. break;
  51. }
  52. }
  53. void key_key_dance(const struct Chord* self) {
  54. switch (*self->state) {
  55. case ACTIVATED:
  56. break;
  57. case DEACTIVATED:
  58. tap_key(self->value1);
  59. *self->state = IDLE;
  60. break;
  61. case FINISHED:
  62. case PRESS_FROM_ACTIVE:
  63. key_in(self->value2);
  64. break;
  65. case RESTART:
  66. key_out(self->value2);
  67. break;
  68. default:
  69. break;
  70. }
  71. }
  72. void autoshift_dance_impl(const struct Chord* self) {
  73. switch (*self->state) {
  74. case ACTIVATED:
  75. *self->counter = 0;
  76. break;
  77. case DEACTIVATED:
  78. case RESTART:
  79. tap_key(self->value1);
  80. *self->state = IDLE;
  81. break;
  82. case FINISHED_FROM_ACTIVE:
  83. if (*self->counter == (LONG_PRESS_MULTIPLIER - 2)) {
  84. key_in(KC_LSFT);
  85. tap_key(self->value1);
  86. key_out(KC_LSFT);
  87. *self->state = IDLE;
  88. // the skip to IDLE is usually just a lag optimization,
  89. // in this case it has a logic function, on a short
  90. // press (still longer than a tap) the key does not get shifted
  91. } else {
  92. *self->counter += 1;
  93. *self->state = PRESS_FROM_ACTIVE;
  94. dance_timer = timer_read();
  95. }
  96. break;
  97. default:
  98. break;
  99. }
  100. }
  101. void autoshift_dance(const struct Chord* self) {
  102. if (autoshift_mode) {
  103. autoshift_dance_impl(self);
  104. } else {
  105. single_dance(self);
  106. }
  107. }
  108. void autoshift_toggle(const struct Chord* self){
  109. if (*self->state == ACTIVATED) {
  110. autoshift_mode = !autoshift_mode;
  111. *self->state = IDLE;
  112. }
  113. }
  114. void temp_pseudolayer(const struct Chord* self) {
  115. switch (*self->state) {
  116. case ACTIVATED:
  117. current_pseudolayer = self->value1;
  118. break;
  119. case DEACTIVATED:
  120. current_pseudolayer = self->pseudolayer;
  121. *self->state = IDLE;
  122. break;
  123. case RESTART:
  124. current_pseudolayer = self->pseudolayer;
  125. break;
  126. default:
  127. break;
  128. }
  129. }
  130. void temp_pseudolayer_alt(const struct Chord* self) {
  131. switch (*self->state) {
  132. case ACTIVATED:
  133. current_pseudolayer = self->value1;
  134. break;
  135. case DEACTIVATED:
  136. current_pseudolayer = self->value2;
  137. *self->state = IDLE;
  138. break;
  139. case RESTART:
  140. current_pseudolayer = self->value2;
  141. break;
  142. default:
  143. break;
  144. }
  145. }
  146. void perm_pseudolayer(const struct Chord* self) {
  147. if (*self->state == ACTIVATED) {
  148. current_pseudolayer = self->value1;
  149. *self->state = IDLE;
  150. }
  151. }
  152. void switch_layer(const struct Chord* self) {
  153. if (*self->state == ACTIVATED) {
  154. layer_move(self->value1);
  155. *self->state = IDLE;
  156. }
  157. }
  158. void lock(const struct Chord* self) {
  159. if (*self->state == ACTIVATED) {
  160. lock_next = true;
  161. *self->state = IDLE;
  162. }
  163. }
  164. void one_shot_key(const struct Chord* self) {
  165. switch (*self->state) {
  166. case ACTIVATED:
  167. break;
  168. case DEACTIVATED:
  169. key_in(self->value1);
  170. *self->state = IN_ONE_SHOT;
  171. break;
  172. case FINISHED:
  173. case PRESS_FROM_ACTIVE:
  174. key_in(self->value1);
  175. a_key_went_through = false;
  176. break;
  177. case RESTART:
  178. if (a_key_went_through) {
  179. key_out(self->value1);
  180. } else {
  181. *self->state = IN_ONE_SHOT;
  182. }
  183. default:
  184. break;
  185. }
  186. }
  187. void one_shot_layer(const struct Chord* self) {
  188. switch (*self->state) {
  189. case ACTIVATED:
  190. break;
  191. case DEACTIVATED:
  192. current_pseudolayer = self->value1;
  193. *self->state = IN_ONE_SHOT;
  194. break;
  195. case FINISHED:
  196. case PRESS_FROM_ACTIVE:
  197. current_pseudolayer = self->value1;
  198. a_key_went_through = false;
  199. break;
  200. case RESTART:
  201. if (a_key_went_through) {
  202. current_pseudolayer = self->pseudolayer;
  203. } else {
  204. *self->state = IN_ONE_SHOT;
  205. }
  206. default:
  207. break;
  208. }
  209. }
  210. void command(const struct Chord* self) {
  211. if (*self->state == ACTIVATED) {
  212. command_mode++;
  213. *self->state = IDLE;
  214. }
  215. }
  216. bool identical(uint16_t* buffer1, uint16_t* buffer2) {
  217. bool same = true;
  218. for (int i = 0; i < LEADER_MAX_LENGTH; i++) {
  219. same = same && (buffer1[i] == buffer2[i]);
  220. }
  221. return same;
  222. }
  223. void leader(const struct Chord* self) {
  224. if (*self->state == ACTIVATED) {
  225. in_leader_mode = true;
  226. *self->state = IDLE;
  227. }
  228. }
  229. void dynamic_macro_record(const struct Chord* self) {
  230. if (*self->state == ACTIVATED) {
  231. for (int i = 0; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
  232. dynamic_macro_buffer[i] = 0;
  233. }
  234. dynamic_macro_mode = true;
  235. *self->state = IDLE;
  236. }
  237. }
  238. void dynamic_macro_next(const struct Chord* self) {
  239. if (*self->state == ACTIVATED) {
  240. if (dynamic_macro_mode && dynamic_macro_ind < DYNAMIC_MACRO_MAX_LENGTH) {
  241. dynamic_macro_buffer[dynamic_macro_ind] = 0;
  242. dynamic_macro_ind++;
  243. }
  244. *self->state = IDLE;
  245. }
  246. }
  247. void dynamic_macro_end(const struct Chord* self) {
  248. if (*self->state == ACTIVATED) {
  249. if (dynamic_macro_mode) {
  250. dynamic_macro_mode = false;
  251. }
  252. *self->state = IDLE;
  253. }
  254. }
  255. void dynamic_macro_play(const struct Chord* self) {
  256. if (*self->state == ACTIVATED) {
  257. int ind_start = 0;
  258. while (ind_start < DYNAMIC_MACRO_MAX_LENGTH) {
  259. for (int i = ind_start; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
  260. if (dynamic_macro_buffer[i] == 0) {
  261. break;
  262. }
  263. register_code(dynamic_macro_buffer[i]);
  264. }
  265. send_keyboard_report();
  266. wait_ms(TAP_TIMEOUT);
  267. for (int i = ind_start; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
  268. if (dynamic_macro_buffer[i] == 0) {
  269. ind_start = i + 1;
  270. break;
  271. }
  272. unregister_code(dynamic_macro_buffer[i]);
  273. }
  274. send_keyboard_report();
  275. }
  276. *self->state = IDLE;
  277. }
  278. }
  279. void string_in(const struct Chord* self) {
  280. if (*self->state == ACTIVATED) {
  281. char buffer[STRING_MAX_LENGTH];
  282. strcpy_P(buffer, (char*)pgm_read_word(&(strings[self->value1])));
  283. send_string(buffer);
  284. }
  285. }
  286. void clear(const struct Chord* self);
  287. void reset_keyboard_kb(void){
  288. #ifdef WATCHDOG_ENABLE
  289. MCUSR = 0;
  290. wdt_disable();
  291. wdt_reset();
  292. #endif
  293. reset_keyboard();
  294. }
  295. void reset(const struct Chord* self) {
  296. if (*self->state == ACTIVATED) {
  297. reset_keyboard_kb();
  298. }
  299. }