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.

418 lines
10 KiB

🐮🥛 Butterstick Support 🥛🐮 (#5742) * Working on chording * Working on chording * Got layouts in order * Initial Georgi support * forgot to add keymaps * Updated readme * Update keyboards/georgi/keymaps/template/readme.md Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/template/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Disabled features, updated info * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Fixed info.json * Split the number button and fixed gaming mode. * started work on history feature * Working history/multikeyfuckery * type * inital code reduction refactor * Got multikey patched up, optimizing for size * Forgot to remove stuff * fixed key repeat * Key repeat added. * Symshift locking * Midchord Sym shenanigans. * Added only QWERTY mode * Split out header * Added stickybits, minimal layour * Fixing user layout * Whitespace fixing * Fixing Version name * Starting work on BS * Fixing default layout and rules * Updated Butter fw * Copy-paste rebase * more fixing from merge. Fuck * Forgot to roll version * Added revisions as per @mechmerlin
5 years ago
🐮🥛 Butterstick Support 🥛🐮 (#5742) * Working on chording * Working on chording * Got layouts in order * Initial Georgi support * forgot to add keymaps * Updated readme * Update keyboards/georgi/keymaps/template/readme.md Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/template/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Disabled features, updated info * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Fixed info.json * Split the number button and fixed gaming mode. * started work on history feature * Working history/multikeyfuckery * type * inital code reduction refactor * Got multikey patched up, optimizing for size * Forgot to remove stuff * fixed key repeat * Key repeat added. * Symshift locking * Midchord Sym shenanigans. * Added only QWERTY mode * Split out header * Added stickybits, minimal layour * Fixing user layout * Whitespace fixing * Fixing Version name * Starting work on BS * Fixing default layout and rules * Updated Butter fw * Copy-paste rebase * more fixing from merge. Fuck * Forgot to roll version * Added revisions as per @mechmerlin
5 years ago
🐮🥛 Butterstick Support 🥛🐮 (#5742) * Working on chording * Working on chording * Got layouts in order * Initial Georgi support * forgot to add keymaps * Updated readme * Update keyboards/georgi/keymaps/template/readme.md Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/template/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Disabled features, updated info * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Fixed info.json * Split the number button and fixed gaming mode. * started work on history feature * Working history/multikeyfuckery * type * inital code reduction refactor * Got multikey patched up, optimizing for size * Forgot to remove stuff * fixed key repeat * Key repeat added. * Symshift locking * Midchord Sym shenanigans. * Added only QWERTY mode * Split out header * Added stickybits, minimal layour * Fixing user layout * Whitespace fixing * Fixing Version name * Starting work on BS * Fixing default layout and rules * Updated Butter fw * Copy-paste rebase * more fixing from merge. Fuck * Forgot to roll version * Added revisions as per @mechmerlin
5 years ago
🐮🥛 Butterstick Support 🥛🐮 (#5742) * Working on chording * Working on chording * Got layouts in order * Initial Georgi support * forgot to add keymaps * Updated readme * Update keyboards/georgi/keymaps/template/readme.md Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/template/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Disabled features, updated info * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Fixed info.json * Split the number button and fixed gaming mode. * started work on history feature * Working history/multikeyfuckery * type * inital code reduction refactor * Got multikey patched up, optimizing for size * Forgot to remove stuff * fixed key repeat * Key repeat added. * Symshift locking * Midchord Sym shenanigans. * Added only QWERTY mode * Split out header * Added stickybits, minimal layour * Fixing user layout * Whitespace fixing * Fixing Version name * Starting work on BS * Fixing default layout and rules * Updated Butter fw * Copy-paste rebase * more fixing from merge. Fuck * Forgot to roll version * Added revisions as per @mechmerlin
5 years ago
🐮🥛 Butterstick Support 🥛🐮 (#5742) * Working on chording * Working on chording * Got layouts in order * Initial Georgi support * forgot to add keymaps * Updated readme * Update keyboards/georgi/keymaps/template/readme.md Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/template/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Disabled features, updated info * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Fixed info.json * Split the number button and fixed gaming mode. * started work on history feature * Working history/multikeyfuckery * type * inital code reduction refactor * Got multikey patched up, optimizing for size * Forgot to remove stuff * fixed key repeat * Key repeat added. * Symshift locking * Midchord Sym shenanigans. * Added only QWERTY mode * Split out header * Added stickybits, minimal layour * Fixing user layout * Whitespace fixing * Fixing Version name * Starting work on BS * Fixing default layout and rules * Updated Butter fw * Copy-paste rebase * more fixing from merge. Fuck * Forgot to roll version * Added revisions as per @mechmerlin
5 years ago
🐮🥛 Butterstick Support 🥛🐮 (#5742) * Working on chording * Working on chording * Got layouts in order * Initial Georgi support * forgot to add keymaps * Updated readme * Update keyboards/georgi/keymaps/template/readme.md Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/template/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Disabled features, updated info * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Fixed info.json * Split the number button and fixed gaming mode. * started work on history feature * Working history/multikeyfuckery * type * inital code reduction refactor * Got multikey patched up, optimizing for size * Forgot to remove stuff * fixed key repeat * Key repeat added. * Symshift locking * Midchord Sym shenanigans. * Added only QWERTY mode * Split out header * Added stickybits, minimal layour * Fixing user layout * Whitespace fixing * Fixing Version name * Starting work on BS * Fixing default layout and rules * Updated Butter fw * Copy-paste rebase * more fixing from merge. Fuck * Forgot to roll version * Added revisions as per @mechmerlin
5 years ago
🐮🥛 Butterstick Support 🥛🐮 (#5742) * Working on chording * Working on chording * Got layouts in order * Initial Georgi support * forgot to add keymaps * Updated readme * Update keyboards/georgi/keymaps/template/readme.md Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/template/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Disabled features, updated info * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Fixed info.json * Split the number button and fixed gaming mode. * started work on history feature * Working history/multikeyfuckery * type * inital code reduction refactor * Got multikey patched up, optimizing for size * Forgot to remove stuff * fixed key repeat * Key repeat added. * Symshift locking * Midchord Sym shenanigans. * Added only QWERTY mode * Split out header * Added stickybits, minimal layour * Fixing user layout * Whitespace fixing * Fixing Version name * Starting work on BS * Fixing default layout and rules * Updated Butter fw * Copy-paste rebase * more fixing from merge. Fuck * Forgot to roll version * Added revisions as per @mechmerlin
5 years ago
🐮🥛 Butterstick Support 🥛🐮 (#5742) * Working on chording * Working on chording * Got layouts in order * Initial Georgi support * forgot to add keymaps * Updated readme * Update keyboards/georgi/keymaps/template/readme.md Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/template/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Disabled features, updated info * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Fixed info.json * Split the number button and fixed gaming mode. * started work on history feature * Working history/multikeyfuckery * type * inital code reduction refactor * Got multikey patched up, optimizing for size * Forgot to remove stuff * fixed key repeat * Key repeat added. * Symshift locking * Midchord Sym shenanigans. * Added only QWERTY mode * Split out header * Added stickybits, minimal layour * Fixing user layout * Whitespace fixing * Fixing Version name * Starting work on BS * Fixing default layout and rules * Updated Butter fw * Copy-paste rebase * more fixing from merge. Fuck * Forgot to roll version * Added revisions as per @mechmerlin
5 years ago
  1. #include "sten.h"
  2. // Chord state
  3. uint32_t cChord = 0; // Current Chord
  4. int chordIndex = 0; // Keys in previousachord
  5. int32_t chordState[32]; // Full Chord history
  6. #define QWERBUF 24 // Size of chords to buffer for output
  7. bool repeatFlag = false; // Should we repeat?
  8. uint32_t pChord = 0; // Previous Chord
  9. int pChordIndex = 0; // Keys in previousachord
  10. uint32_t pChordState[32]; // Previous chord sate
  11. uint32_t stickyBits = 0; // Or'd with every incoming press
  12. #ifndef NO_DEBUG
  13. char debugMsg[32];
  14. #endif
  15. // StenoLayer
  16. uint32_t releasedChord = 0; // Keys released from current chord
  17. uint32_t tChord = 0; // Protects state of cChord
  18. #ifndef STENOLAYERS
  19. uint32_t stenoLayers[] = { PWR };
  20. size_t stenoLayerCount = sizeof(stenoLayers)/sizeof(stenoLayers[0]);
  21. #endif
  22. // Mode state
  23. enum MODE { STENO = 0, QWERTY, COMMAND };
  24. enum MODE pMode;
  25. bool QWERSTENO = false;
  26. #ifdef ONLYQWERTY
  27. enum MODE cMode = QWERTY;
  28. #else
  29. enum MODE cMode = STENO;
  30. #endif
  31. // Command State
  32. #define MAX_CMD_BUF 20
  33. uint8_t CMDLEN = 0;
  34. uint8_t CMDBUF[MAX_CMD_BUF];
  35. // Key Repeat state
  36. bool inChord = false;
  37. bool repEngaged = false;
  38. uint16_t repTimer = 0;
  39. #define REP_INIT_DELAY 750
  40. #define REP_DELAY 25
  41. // Mousekeys state
  42. bool inMouse = false;
  43. int8_t mousePress;
  44. // All processing done at chordUp goes through here
  45. bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[6]) {
  46. // Check for mousekeys, this is release
  47. #ifdef MOUSEKEY_ENABLE
  48. if (inMouse) {
  49. inMouse = false;
  50. mousekey_off(mousePress);
  51. mousekey_send();
  52. }
  53. #endif
  54. // Toggle Serial/QWERTY steno
  55. if (cChord == (PWR | FN | ST1 | ST2)) {
  56. #ifndef NO_DEBUG
  57. uprintf("Fallback Toggle\n");
  58. #endif
  59. QWERSTENO = !QWERSTENO;
  60. goto out;
  61. }
  62. // handle command mode
  63. if (cChord == (PWR | FN | RD | RZ)) {
  64. #ifndef NO_DEBUG
  65. uprintf("COMMAND Toggle\n");
  66. #endif
  67. if (cMode != COMMAND) { // Entering Command Mode
  68. CMDLEN = 0;
  69. pMode = cMode;
  70. cMode = COMMAND;
  71. } else { // Exiting Command Mode
  72. cMode = pMode;
  73. // Press all and release all
  74. for (int i = 0; i < CMDLEN; i++) {
  75. register_code(CMDBUF[i]);
  76. }
  77. clear_keyboard();
  78. }
  79. goto out;
  80. }
  81. // Handle Gaming Toggle,
  82. if (cChord == (PWR | FN | ST4 | ST3) && keymapsCount > 1) {
  83. #ifndef NO_DEBUG
  84. uprintf("Switching to QMK\n");
  85. #endif
  86. layer_on(1);
  87. goto out;
  88. }
  89. // Lone FN press, toggle QWERTY
  90. #ifndef ONLYQWERTY
  91. if (cChord == FN) {
  92. (cMode == STENO) ? (cMode = QWERTY) : (cMode = STENO);
  93. goto out;
  94. }
  95. #endif
  96. // Check for Plover momentary
  97. if (cMode == QWERTY && (cChord & FN)) {
  98. cChord ^= FN;
  99. goto steno;
  100. }
  101. // Do QWERTY and Momentary QWERTY
  102. if (cMode == QWERTY || (cMode == COMMAND) || (cChord & (FN | PWR))) {
  103. processChord(false);
  104. goto out;
  105. }
  106. // Fallback NKRO Steno
  107. if (cMode == STENO && QWERSTENO) {
  108. processChord(true);
  109. goto out;
  110. }
  111. steno:
  112. // Hey that's a steno chord!
  113. inChord = false;
  114. chordIndex = 0;
  115. cChord = 0;
  116. return true;
  117. out:
  118. cChord = 0;
  119. inChord = false;
  120. chordIndex = 0;
  121. clear_keyboard();
  122. repEngaged = false;
  123. for (int i = 0; i < 32; i++)
  124. chordState[i] = 0xFFFF;
  125. return false;
  126. }
  127. // Update Chord State
  128. bool process_steno_user(uint16_t keycode, keyrecord_t *record) {
  129. // Everything happens in here when steno keys come in.
  130. // Bail on keyup
  131. if (!record->event.pressed) return true;
  132. // Update key repeat timers
  133. repTimer = timer_read();
  134. inChord = true;
  135. // Switch on the press adding to chord
  136. bool pr = record->event.pressed;
  137. switch (keycode) {
  138. // Mods and stuff
  139. case STN_ST1: pr ? (cChord |= (ST1)): (cChord &= ~(ST1)); break;
  140. case STN_ST2: pr ? (cChord |= (ST2)): (cChord &= ~(ST2)); break;
  141. case STN_ST3: pr ? (cChord |= (ST3)): (cChord &= ~(ST3)); break;
  142. case STN_ST4: pr ? (cChord |= (ST4)): (cChord &= ~(ST4)); break;
  143. case STN_FN: pr ? (cChord |= (FN)) : (cChord &= ~(FN)); break;
  144. case STN_PWR: pr ? (cChord |= (PWR)): (cChord &= ~(PWR)); break;
  145. case STN_N1...STN_N6: pr ? (cChord |= (LNO)): (cChord &= ~(LNO)); break;
  146. case STN_N7...STN_NC: pr ? (cChord |= (RNO)): (cChord &= ~(RNO)); break;
  147. // All the letter keys
  148. case STN_S1: pr ? (cChord |= (LSU)) : (cChord &= ~(LSU)); break;
  149. case STN_S2: pr ? (cChord |= (LSD)) : (cChord &= ~(LSD)); break;
  150. case STN_TL: pr ? (cChord |= (LFT)) : (cChord &= ~(LFT)); break;
  151. case STN_KL: pr ? (cChord |= (LK)) : (cChord &= ~(LK)); break;
  152. case STN_PL: pr ? (cChord |= (LP)) : (cChord &= ~(LP)); break;
  153. case STN_WL: pr ? (cChord |= (LW)) : (cChord &= ~(LW)); break;
  154. case STN_HL: pr ? (cChord |= (LH)) : (cChord &= ~(LH)); break;
  155. case STN_RL: pr ? (cChord |= (LR)) : (cChord &= ~(LR)); break;
  156. case STN_A: pr ? (cChord |= (LA)) : (cChord &= ~(LA)); break;
  157. case STN_O: pr ? (cChord |= (LO)) : (cChord &= ~(LO)); break;
  158. case STN_E: pr ? (cChord |= (RE)) : (cChord &= ~(RE)); break;
  159. case STN_U: pr ? (cChord |= (RU)) : (cChord &= ~(RU)); break;
  160. case STN_FR: pr ? (cChord |= (RF)) : (cChord &= ~(RF)); break;
  161. case STN_RR: pr ? (cChord |= (RR)) : (cChord &= ~(RR)); break;
  162. case STN_PR: pr ? (cChord |= (RP)) : (cChord &= ~(RP)); break;
  163. case STN_BR: pr ? (cChord |= (RB)) : (cChord &= ~(RB)); break;
  164. case STN_LR: pr ? (cChord |= (RL)) : (cChord &= ~(RL)); break;
  165. case STN_GR: pr ? (cChord |= (RG)) : (cChord &= ~(RG)); break;
  166. case STN_TR: pr ? (cChord |= (RT)) : (cChord &= ~(RT)); break;
  167. case STN_SR: pr ? (cChord |= (RS)) : (cChord &= ~(RS)); break;
  168. case STN_DR: pr ? (cChord |= (RD)) : (cChord &= ~(RD)); break;
  169. case STN_ZR: pr ? (cChord |= (RZ)) : (cChord &= ~(RZ)); break;
  170. }
  171. // Store previous state for fastQWER
  172. if (pr) {
  173. chordState[chordIndex] = cChord;
  174. chordIndex++;
  175. }
  176. return true;
  177. }
  178. void matrix_scan_user(void) {
  179. // We abuse this for early sending of key
  180. // Key repeat only on QWER/SYMB layers
  181. if (cMode != QWERTY || !inChord) return;
  182. // Check timers
  183. #ifndef NO_REPEAT
  184. if (repEngaged && timer_elapsed(repTimer) > REP_DELAY) {
  185. // Process Key for report
  186. processChord(false);
  187. // Send report to host
  188. send_keyboard_report();
  189. clear_keyboard();
  190. repTimer = timer_read();
  191. }
  192. if (!repEngaged && timer_elapsed(repTimer) > REP_INIT_DELAY) {
  193. repEngaged = true;
  194. }
  195. #endif
  196. };
  197. // For Plover NKRO
  198. uint32_t processFakeSteno(bool lookup) {
  199. P( LSU, SEND(KC_Q););
  200. P( LSD, SEND(KC_A););
  201. P( LFT, SEND(KC_W););
  202. P( LP, SEND(KC_E););
  203. P( LH, SEND(KC_R););
  204. P( LK, SEND(KC_S););
  205. P( LW, SEND(KC_D););
  206. P( LR, SEND(KC_F););
  207. P( ST1, SEND(KC_T););
  208. P( ST2, SEND(KC_G););
  209. P( LA, SEND(KC_C););
  210. P( LO, SEND(KC_V););
  211. P( RE, SEND(KC_N););
  212. P( RU, SEND(KC_M););
  213. P( ST3, SEND(KC_Y););
  214. P( ST4, SEND(KC_H););
  215. P( RF, SEND(KC_U););
  216. P( RP, SEND(KC_I););
  217. P( RL, SEND(KC_O););
  218. P( RT, SEND(KC_P););
  219. P( RD, SEND(KC_LBRC););
  220. P( RR, SEND(KC_J););
  221. P( RB, SEND(KC_K););
  222. P( RG, SEND(KC_L););
  223. P( RS, SEND(KC_SCLN););
  224. P( RZ, SEND(KC_COMM););
  225. P( LNO, SEND(KC_1););
  226. P( RNO, SEND(KC_1););
  227. return 0;
  228. }
  229. // Traverse the chord history to a given point
  230. // Returns the mask to use
  231. void processChord(bool useFakeSteno) {
  232. // Save the clean chord state
  233. uint32_t savedChord = cChord;
  234. // Apply Stick Bits if needed
  235. if (stickyBits != 0) {
  236. cChord |= stickyBits;
  237. for (int i = 0; i <= chordIndex; i++)
  238. chordState[i] |= stickyBits;
  239. }
  240. // Strip FN
  241. if (cChord & FN) cChord ^= FN;
  242. // First we test if a whole chord was passsed
  243. // If so we just run it handling repeat logic
  244. if (useFakeSteno && processFakeSteno(true) == cChord) {
  245. processFakeSteno(false);
  246. return;
  247. } else if (processQwerty(true) == cChord) {
  248. processQwerty(false);
  249. // Repeat logic
  250. if (repeatFlag) {
  251. restoreState();
  252. repeatFlag = false;
  253. processChord(false);
  254. } else {
  255. saveState(cChord);
  256. }
  257. return;
  258. }
  259. // Iterate through chord picking out the individual
  260. // and longest chords
  261. uint32_t bufChords[QWERBUF];
  262. int bufLen = 0;
  263. uint32_t mask = 0;
  264. // We iterate over it multiple times to catch the longest
  265. // chord. Then that gets addded to the mask and re run.
  266. while (savedChord != mask) {
  267. uint32_t test = 0;
  268. uint32_t longestChord = 0;
  269. for (int i = 0; i <= chordIndex; i++) {
  270. cChord = chordState[i] & ~mask;
  271. if (cChord == 0)
  272. continue;
  273. // Assume mid parse Sym is new chord
  274. if (i != 0 && test != 0 && (cChord ^ test) == PWR) {
  275. longestChord = test;
  276. break;
  277. }
  278. // Lock SYM layer in once detected
  279. if (mask & PWR)
  280. cChord |= PWR;
  281. // Testing for keycodes
  282. if (useFakeSteno) {
  283. test = processFakeSteno(true);
  284. } else {
  285. test = processQwerty(true);
  286. }
  287. if (test != 0) {
  288. longestChord = test;
  289. }
  290. }
  291. mask |= longestChord;
  292. bufChords[bufLen] = longestChord;
  293. bufLen++;
  294. // That's a loop of sorts, halt processing
  295. if (bufLen >= QWERBUF) {
  296. return;
  297. }
  298. }
  299. // Now that the buffer is populated, we run it
  300. for (int i = 0; i < bufLen ; i++) {
  301. cChord = bufChords[i];
  302. if (useFakeSteno) {
  303. processFakeSteno(false);
  304. } else {
  305. processQwerty(false);
  306. }
  307. }
  308. // Save state in case of repeat
  309. if (!repeatFlag) {
  310. saveState(savedChord);
  311. }
  312. // Restore cChord for held repeat
  313. cChord = savedChord;
  314. return;
  315. }
  316. void saveState(uint32_t cleanChord) {
  317. pChord = cleanChord;
  318. pChordIndex = chordIndex;
  319. for (int i = 0; i < 32; i++)
  320. pChordState[i] = chordState[i];
  321. }
  322. void restoreState() {
  323. cChord = pChord;
  324. chordIndex = pChordIndex;
  325. for (int i = 0; i < 32; i++)
  326. chordState[i] = pChordState[i];
  327. }
  328. // Macros for calling from keymap.c
  329. void SEND(uint8_t kc) {
  330. // Send Keycode, Does not work for Quantum Codes
  331. if (cMode == COMMAND && CMDLEN < MAX_CMD_BUF) {
  332. #ifndef NO_DEBUG
  333. uprintf("CMD LEN: %d BUF: %d\n", CMDLEN, MAX_CMD_BUF);
  334. #endif
  335. CMDBUF[CMDLEN] = kc;
  336. CMDLEN++;
  337. }
  338. if (cMode != COMMAND) register_code(kc);
  339. return;
  340. }
  341. void REPEAT(void) {
  342. if (cMode != QWERTY)
  343. return;
  344. repeatFlag = true;
  345. return;
  346. }
  347. void SET_STICKY(uint32_t stick) {
  348. stickyBits = stick;
  349. return;
  350. }
  351. void SWITCH_LAYER(int layer) {
  352. if (keymapsCount >= layer)
  353. layer_on(layer);
  354. }
  355. void CLICK_MOUSE(uint8_t kc) {
  356. #ifdef MOUSEKEY_ENABLE
  357. mousekey_on(kc);
  358. mousekey_send();
  359. // Store state for later use
  360. inMouse = true;
  361. mousePress = kc;
  362. #endif
  363. }