# 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.