111 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 	2019, g Heavy Industries
 | |
|         Blessed mother of Christ, please keep this readable
 | |
|         and protect us from segfaults. For thine is the clock,
 | |
|         the slave and the master. Until we return from main.
 | |
| 
 | |
|         Amen.
 | |
| 
 | |
|         This is a stripped down version of the Georgi engine meant for use with
 | |
|         . As such serial-Steno features are disabled, chords are 16bits and
 | |
|         crap is removed where possible
 | |
| */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include "quantum.h"
 | |
| #include <string.h>
 | |
| #include <stdio.h>
 | |
| #include "config_engine.h"
 | |
| 
 | |
| // Set defaults
 | |
| #ifndef IN_CHORD_MASK
 | |
| #    define IN_CHORD_MASK 0xFFFFFFFFFFFFFFFF
 | |
| #endif
 | |
| 
 | |
| #ifndef COMBO_END
 | |
| #    define COMBO_END 0x00
 | |
| #endif
 | |
| 
 | |
| // In memory chord datatypes
 | |
| enum specialActions {
 | |
|     SPEC_STICKY,
 | |
|     SPEC_REPEAT,
 | |
|     SPEC_CLICK,
 | |
|     SPEC_SWITCH,
 | |
| };
 | |
| struct funcEntry {
 | |
|     C_SIZE chord;
 | |
|     void (*act)(void);
 | |
| } funcEntry_t;
 | |
| struct stringEntry {
 | |
|     C_SIZE chord;
 | |
|     PGM_P  str;
 | |
| } stringEntry_t;
 | |
| struct comboEntry {
 | |
|     C_SIZE chord;
 | |
|     PGM_P  keys;
 | |
| } comboEntry_t;
 | |
| struct keyEntry {
 | |
|     C_SIZE  chord;
 | |
|     uint8_t key;
 | |
| } keyEntry_t;
 | |
| struct specialEntry {
 | |
|     C_SIZE              chord;
 | |
|     enum specialActions action;
 | |
|     uint16_t            arg;
 | |
| } specialEntry_t;
 | |
| 
 | |
| // Chord Temps
 | |
| extern C_SIZE cChord;
 | |
| extern C_SIZE test;
 | |
| extern size_t keymapsCount;  // Total keymaps (exported from keymap.c)
 | |
| 
 | |
| // Function defs
 | |
| void    processKeysUp(void);
 | |
| void    processChord(void);
 | |
| C_SIZE  processQwerty(bool lookup);
 | |
| C_SIZE  processFakeSteno(bool lookup);
 | |
| void    saveState(C_SIZE cChord);
 | |
| void    restoreState(void);
 | |
| uint8_t bitpop_v(C_SIZE val);
 | |
| 
 | |
| // Macros for use in keymap.c
 | |
| void   SEND(uint8_t kc);
 | |
| void   REPEAT(void);
 | |
| void   SET_STICKY(C_SIZE);
 | |
| void   SWITCH_LAYER(int);
 | |
| void   CLICK_MOUSE(uint8_t);
 | |
| C_SIZE process_chord_getnext(C_SIZE cur_chord);
 | |
| // Run before hitting the engine. Return false to skip engine processing
 | |
| C_SIZE process_engine_pre(C_SIZE cur_chord, uint16_t keycode, keyrecord_t *record);
 | |
| // Run after reading a chord.
 | |
| C_SIZE process_engine_post(C_SIZE cur_chord, uint16_t keycode, keyrecord_t *record);
 | |
| 
 | |
| // Keymap helpers
 | |
| // New Approach, multiple structures
 | |
| #define P_KEYMAP(chord, keycode) {chord, keycode},
 | |
| 
 | |
| #define K_KEYMAP(chord, name, ...) {chord, (PGM_P)&name},
 | |
| #define K_ACTION(chord, name, ...) const uint8_t name[] PROGMEM = __VA_ARGS__;
 | |
| 
 | |
| #define S_KEYMAP(chord, name, string) {chord, (PGM_P)&name},
 | |
| #define S_ACTION(chord, name, string) const char name[] PROGMEM = string;
 | |
| 
 | |
| #define X_KEYMAP(chord, name, func) {chord, name},
 | |
| #define X_ACTION(chord, name, func) \
 | |
|     void name(void) { func }
 | |
| 
 | |
| #define Z_KEYMAP(chord, act, arg) {chord, act, arg},
 | |
| 
 | |
| #define TEST_COLLISION(chord, ...) \
 | |
|     case chord:                    \
 | |
|         break;
 | |
| #define BLANK(...)
 | |
| 
 | |
| // Shift to internal representation
 | |
| // i.e) S(teno)R(ight)F
 | |
| #define STN(n) ((C_SIZE)1 << n)
 | |
| #define ENGINE_HOOK(keycode, chord)                        \
 | |
|     case keycode:                                          \
 | |
|         pr ? (pressed |= (chord)) : (pressed &= ~(chord)); \
 | |
|         break;
 | 
