mirror of
https://github.com/Keychron/qmk_firmware.git
synced 2024-12-11 12:45:33 +06:00
112 lines
2.9 KiB
C
112 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;
|