88 lines
1.7 KiB
Markdown
88 lines
1.7 KiB
Markdown
# Makro-System
|
|
|
|
Dateien:
|
|
|
|
- `config/macro_config.h`
|
|
- `config/macro_config.cpp`
|
|
- `CMainController.cpp`
|
|
|
|
## Datenstruktur
|
|
|
|
```cpp
|
|
struct __attribute__((packed)) SMacroStep {
|
|
uint8_t keycode;
|
|
uint8_t modifier;
|
|
};
|
|
|
|
#define MACRO_SLOTS 32
|
|
#define MACRO_MAX_STEPS 8
|
|
|
|
struct __attribute__((packed)) SMacroTable {
|
|
SMacroStep steps[MACRO_SLOTS][MACRO_MAX_STEPS];
|
|
};
|
|
```
|
|
|
|
Gesamtgroesse:
|
|
|
|
- `32 * 8 * 2 = 512` Byte
|
|
- verteilt auf zwei NVM-Rows
|
|
|
|
## Speicherort
|
|
|
|
| Row | Adresse | Inhalt |
|
|
|---|---|---|
|
|
| Macro Row 0 | `0x1FB00` | Bytes `0..255` |
|
|
| Macro Row 1 | `0x1FC00` | Bytes `256..511` |
|
|
|
|
## Slot-Konvention
|
|
|
|
Das Board speichert die Slots blind, die GUI verwendet dabei diese Zuordnung:
|
|
|
|
| Slots | Bedeutung |
|
|
|---|---|
|
|
| `0..19` | MX-Buttons |
|
|
| `20..31` | Encoder-Aktionen (`enc * 3 + act_idx`) |
|
|
|
|
## Laden
|
|
|
|
`macro_config_load()`:
|
|
|
|
- kopiert 512 Byte aus NVM in `SMacroTable`
|
|
- erkennt komplett geloeschten Flash (`0xFF`) als "noch nie beschrieben"
|
|
- setzt dann eine leere Tabelle
|
|
|
|
Eine leere Tabelle ist also ein gueltiger Default-Zustand.
|
|
|
|
## Speichern
|
|
|
|
`macro_config_save()`:
|
|
|
|
1. Tabelle in einen 4-Byte-aligned Puffer kopieren
|
|
2. beide Rows loeschen
|
|
3. 8 Pages zu je 64 Byte schreiben
|
|
|
|
Rueckgabewert:
|
|
|
|
- `true` bei Erfolg
|
|
- `false` bei NVM-Timeout
|
|
|
|
## Ausfuehrung
|
|
|
|
Beim Triggern eines Makros:
|
|
|
|
- Slot aus `action.data`
|
|
- bis zu 8 Steps abarbeiten
|
|
- `keycode == 0` beendet das Makro vorzeitig
|
|
- pro Step:
|
|
- HID key down
|
|
- 10 ms warten
|
|
- HID key up
|
|
- 20 ms warten
|
|
|
|
Die Ausfuehrung laeuft aus `m_macros` im RAM, nicht direkt aus NVM.
|
|
|
|
## Zusammenhang mit Werksreset
|
|
|
|
Beim Werksreset wird die komplette `SMacroTable` auf 0 gesetzt und in beide Makro-Rows zurueckgeschrieben.
|
|
Danach sind alle 32 Slots leer.
|