VersaGUI/doc/02_device_config.md
2026-03-30 19:51:38 +02:00

105 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# DeviceConfig & MacroTable
**Datei:** `DeviceConfig.cs`
## Überblick
C#-Spiegel der Firmware-Structs. Muss byte-kompatibel mit `SDeviceConfig` (nvm_config.h) und `SMacroTable` (macro_config.h) sein.
---
## DeviceConfig
### Felder
| Feld | Typ | Inhalt |
|---|---|---|
| `MxActions[20]` | `DeviceAction[]` | Aktionen für MX-Buttons 019 |
| `EncActions[4,3]` | `DeviceAction[,]` | Encoder [03][SW=0/CW=1/CCW=2] |
| `LedBase[20]` | `Color[]` | RGB-Basis-LED-Farbe je Button |
| `LedAnim[20]` | `LedAnimType[]` | Animation je Button |
| `LedPeriod[20]` | `ushort[]` | Animationsperiode in ms |
### Serialisierungs-Layout (ToBytes / FromBytes, 223 B)
```
Offset 0 4B Magic 0x56503202 (little-endian)
Offset 4 1B Version = 2
Offset 5 2B CRC16-CCITT über Bytes 7222 (little-endian)
Offset 7 60B MxActions[20] je 3B: type(1) + data_lo(1) + data_hi(1)
Offset 67 36B EncActions[4][3] je 3B
Offset103 20B LedBase[i].R
Offset123 20B LedBase[i].G
Offset143 20B LedBase[i].B
Offset163 20B LedAnim[i] als byte
Offset183 40B LedPeriod[i] als uint16 little-endian
```
### CRC16-CCITT
Polynom `0x1021`, Init `0xFFFF`, über Bytes 7222 (nach dem CRC-Feld selbst). Muss identisch mit Firmware-Implementierung sein. `DeviceConfig.Crc16()` ist statisch und direkt testbar.
### Defaults (entspricht Firmware-Defaults)
- Alle Aktionen: `None`
- LEDs: warm-weiß (R=80, G=40, B=0)
- Animation: `ColorCycle` (Regenbogen), Period 4000 ms
---
## DeviceAction
```csharp
public enum ActionType : byte { None=0, HidKey=1, HidConsumer=2, HostCommand=3, Macro=4 }
public class DeviceAction {
public ActionType Type { get; set; }
public ushort Data { get; set; }
// HidKey: Low-Byte = HID Keycode, High-Byte = Modifier
// HidConsumer: Consumer Usage ID
// HostCommand: Command-ID
// Macro: Slot-Index 031
}
```
`DeviceAction.Display` gibt einen lesbaren String zurück (z.B. `"Strg+C"`, `"Play/Pause"`, `"Makro 3"`).
---
## MacroTable
```csharp
public class MacroTable {
public const int Slots = 32;
public const int MaxSteps = 4;
public MacroStep[,] Steps { get; } // [slot][step]
}
public class MacroStep {
public byte Keycode { get; set; } // 0 = leer
public byte Modifier { get; set; }
}
```
### Slot-Konvention
| Slots | Verwendung |
|---|---|
| 019 | MX-Button `mxIdx` (`MacroTable.SlotForMx(mxIdx)`) |
| 2031 | Encoder: `20 + enc * 3 + actIdx` (`MacroTable.SlotForEncoder(enc, actIdx)`) |
### Serialisierung (256 B)
32 Slots × 4 Steps × 2 B = 256 B. Keycode zuerst, dann Modifier. Kein Magic/CRC (Board akzeptiert jeden Inhalt).
---
## LedAnimType
```csharp
public enum LedAnimType : byte {
Static=0, Blink=1, Pulse=2, ColorCycle=5
}
```
Werte entsprechen `LEDAnim` in der Firmware. `FADE_IN` (3) und `FADE_OUT` (4) existieren in der Firmware aber nicht in der GUI (nicht konfigurierbar, nur `COLOR_FADE` intern).