sten.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // 2019, g Heavy Industries
  2. // Blessed mother of Christ, please keep this readable
  3. // and protect us from segfaults. For thine is the clock,
  4. // the slave and the master. Until we return from main.
  5. //
  6. // Amen.
  7. #include QMK_KEYBOARD_H
  8. #include "mousekey.h"
  9. #include "keymap.h"
  10. #include "keymap_steno.h"
  11. #include "wait.h"
  12. extern size_t keymapsCount; // Total keymaps
  13. extern uint32_t cChord; // Current Chord
  14. extern uint32_t stenoLayers[]; // Chords that simulate QMK layers
  15. extern size_t stenoLayerCount; // Number of simulated layers
  16. // Function defs
  17. void processChord(bool useFakeSteno);
  18. uint32_t processQwerty(bool lookup);
  19. uint32_t processFakeSteno(bool lookup);
  20. void saveState(uint32_t cChord);
  21. void restoreState(void);
  22. // Macros for use in keymap.c
  23. void SEND(uint8_t kc);
  24. void REPEAT(void);
  25. void SET_STICKY(uint32_t);
  26. void SWITCH_LAYER(int);
  27. void CLICK_MOUSE(uint8_t);
  28. // Keymap helper
  29. #define P(chord, act) if (cChord == (chord)) { if (!lookup) {act;} return chord;}
  30. #define PC(chord, act) if (cChord == (chord)) { if (!lookup) {act;} return chord;} \
  31. for(int i = 0; i < stenoLayerCount; i++) { \
  32. uint32_t refChord = stenoLayers[i] | chord; \
  33. if (cChord == (refChord)) { if (!lookup) {act;} return refChord;}; \
  34. }
  35. // Shift to internal representation
  36. // i.e) S(teno)R(ight)F
  37. #define STN(n) (1L<<n)
  38. enum ORDER {
  39. SFN = 0, SPWR, SST1, SST2, SST3, SST4, SNUML, SNUMR,
  40. SLSU, SLSD, SLT, SLK, SLP, SLW, SLH, SLR, SLA, SLO,
  41. SRE, SRU, SRF, SRR, SRP, SRB, SRL, SRG, SRT, SRS, SRD, SRZ, SRES1, SRES2
  42. };
  43. // Break it all out
  44. #define FN STN(SFN)
  45. #define PWR STN(SPWR)
  46. #define ST1 STN(SST1)
  47. #define ST2 STN(SST2)
  48. #define ST3 STN(SST3)
  49. #define ST4 STN(SST4)
  50. #define LNO STN(SNUML) // STN1-6
  51. #define RNO STN(SNUMR) // STN7-C
  52. #define RES1 STN(SRES1) // Use reserved for sticky state
  53. #define RES2 STN(SRES2)
  54. #define LSU STN(SLSU)
  55. #define LSD STN(SLSD)
  56. #define LFT STN(SLT) // (L)e(F)t (T), preprocessor conflict
  57. #define LK STN(SLK)
  58. #define LP STN(SLP)
  59. #define LW STN(SLW)
  60. #define LH STN(SLH)
  61. #define LR STN(SLR)
  62. #define LA STN(SLA)
  63. #define LO STN(SLO)
  64. #define RE STN(SRE)
  65. #define RU STN(SRU)
  66. #define RF STN(SRF)
  67. #define RR STN(SRR)
  68. #define RP STN(SRP)
  69. #define RB STN(SRB)
  70. #define RL STN(SRL)
  71. #define RG STN(SRG)
  72. #define RT STN(SRT)
  73. #define RS STN(SRS)
  74. #define RD STN(SRD)
  75. #define RZ STN(SRZ)