2.5 KiB
2.5 KiB
Aktions-Engine
Dateien:
config/action.hCMainController.h/.cppCButton.h/.cpp
SAction
struct __attribute__((packed)) SAction {
ActionType type;
uint16_t data;
};
Groesse: 3 Byte.
Das packed ist zwingend, weil Config v3 bytegenau zwischen Firmware und GUI uebereinstimmen muss.
ActionType
| Typ | Bedeutung | data |
|---|---|---|
NONE |
keine Aktion | - |
HID_KEY |
Tastaturtaste ueber USB HID | low byte = keycode, high byte = modifier |
HID_CONSUMER |
Media/Consumer-HID | usage id |
HOST_COMMAND |
Event an die GUI | command id |
MACRO |
Makro aus SMacroTable |
slot 0..31 |
PROFILE_SWITCH |
Profilwechsel | 0..2 oder 0xFF fuer naechstes Profil |
Verhalten bei KEY_DOWN
| Typ | Effekt |
|---|---|
HID_KEY |
usb_hid_send_key() |
HID_CONSUMER |
usb_hid_send_consumer() |
HOST_COMMAND |
usb_serial_send(KEY_DOWN/ENC_*) |
MACRO |
komplette Sequenz sofort abspielen |
PROFILE_SWITCH |
Config aus NVM laden, Profil aendern, CRC neu berechnen, speichern, Buttons neu initialisieren |
NONE |
nichts |
Verhalten bei KEY_UP
| Typ | Effekt |
|---|---|
HID_KEY |
usb_hid_release_key() |
HID_CONSUMER |
usb_hid_release_consumer() |
HOST_COMMAND |
optionaler Up-Pfad, derzeit praktisch ohne Nutzlast |
MACRO |
nichts |
PROFILE_SWITCH |
nichts |
NONE |
nichts |
Hold- und Tap-Modell
- MX-Buttons und Encoder-SW benutzen fuer HID und Consumer das Hold-Modell.
- Encoder
CWundCCWsind immer diskrete Tap-Events:
down -> delay(10 ms) -> up
- Makros laufen komplett synchron in der Firmware.
Makro-Ausfuehrung
Bei ActionType::MACRO wird action.data als Slot interpretiert.
Die Firmware laeuft dann durch bis zu 8 Steps:
step.keycode == 0 -> Ende
Key-Down
10 ms warten
Key-Up
20 ms warten
Profilwechsel
PROFILE_SWITCH arbeitet direkt auf der gespeicherten Config:
- Config aus NVM laden
active_profileaendern- CRC neu berechnen
- wieder speichern
init_buttons()
Wichtig:
active_profile liegt im CRC-geschuetzten Bereich. Ohne neue CRC wuerde die Config beim naechsten Laden verworfen.
Sonderfall Werksreset
Die Reset-Kombination uebersteuert das normale Action-System fuer genau zwei Tasten:
key_id 9key_id 24
Sobald beide gleichzeitig gehalten werden:
- ihre normalen Actions werden nicht weiter ausgefuehrt
- eventuell bereits gestartete HID-Holds werden sofort freigegeben
- die LEDs der beiden Tasten leuchten rot
- nach 5 Sekunden wird
perform_factory_reset()ausgefuehrt