qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

engine.h (2729B)


      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 
      8         This is a stripped down version of the Georgi engine meant for use with
      9         . As such serial-Steno features are disabled, chords are 16bits and
     10         crap is removed where possible
     11 */
     12 
     13 #pragma once
     14 
     15 #include <stdint.h>
     16 #include <stdbool.h>
     17 #include <string.h>
     18 #include <stdio.h>
     19 #include "action.h"
     20 #include "progmem.h"
     21 #include "config_engine.h"
     22 
     23 // Maximum values for combos
     24 #define COMBO_END 0x00
     25 
     26 // In memory chord datatypes
     27 enum specialActions {
     28     SPEC_STICKY,
     29     SPEC_REPEAT,
     30     SPEC_CLICK,
     31     SPEC_SWITCH,
     32 };
     33 struct funcEntry {
     34     C_SIZE chord;
     35     void (*act)(void);
     36 } funcEntry_t;
     37 struct stringEntry {
     38     C_SIZE chord;
     39     PGM_P  str;
     40 } stringEntry_t;
     41 struct comboEntry {
     42     C_SIZE chord;
     43     PGM_P  keys;
     44 } comboEntry_t;
     45 struct keyEntry {
     46     C_SIZE  chord;
     47     uint8_t key;
     48 } keyEntry_t;
     49 struct specialEntry {
     50     C_SIZE              chord;
     51     enum specialActions action;
     52     uint16_t            arg;
     53 } specialEntry_t;
     54 
     55 // Chord Temps
     56 extern C_SIZE cChord;
     57 extern C_SIZE test;
     58 
     59 // Function defs
     60 void    processKeysUp(void);
     61 void    processChord(void);
     62 C_SIZE  processQwerty(bool lookup);
     63 C_SIZE  processFakeSteno(bool lookup);
     64 void    saveState(C_SIZE cChord);
     65 void    restoreState(void);
     66 uint8_t bitpop_v(C_SIZE val);
     67 
     68 // Macros for use in keymap.c
     69 void   SEND(uint8_t kc);
     70 void   REPEAT(void);
     71 void   SET_STICKY(C_SIZE);
     72 void   SWITCH_LAYER(int);
     73 void   CLICK_MOUSE(uint8_t);
     74 C_SIZE process_engine_post(C_SIZE cur_chord, uint16_t keycode, keyrecord_t *record);
     75 C_SIZE process_chord_getnext(C_SIZE cur_chord);
     76 
     77 // Keymap helpers
     78 // New Approach, multiple structures
     79 #define P_KEYMAP(chord, keycode) {chord, keycode},
     80 
     81 #define K_KEYMAP(chord, name, ...) {chord, (PGM_P)&name},
     82 #define K_ACTION(chord, name, ...) const uint8_t name[] PROGMEM = __VA_ARGS__;
     83 
     84 #define S_KEYMAP(chord, name, string) {chord, (PGM_P)&name},
     85 #define S_ACTION(chord, name, string) const char name[] PROGMEM = string;
     86 
     87 #define X_KEYMAP(chord, name, func) {chord, name},
     88 #define X_ACTION(chord, name, func) \
     89     void name(void) { func }
     90 
     91 #define Z_KEYMAP(chord, act, arg) {chord, act, arg},
     92 
     93 #define TEST_COLLISION(chord, ...) \
     94     case chord:                    \
     95         break;
     96 #define BLANK(...)
     97 
     98 // Shift to internal representation
     99 // i.e) S(teno)R(ight)F
    100 #define STN(n) ((C_SIZE)1 << n)
    101 #define ENGINE_HOOK(keycode, chord)                        \
    102     case keycode:                                          \
    103         pr ? (pressed |= (chord)) : (pressed &= ~(chord)); \
    104         break;