VersaMCU/doc/04_macro_system.md

1.7 KiB

Makro-System

Dateien:

  • config/macro_config.h
  • config/macro_config.cpp
  • CMainController.cpp

Datenstruktur

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.