Harden firmware state and transfer handling
This commit is contained in:
+19
-17
@@ -50,10 +50,10 @@ Es gibt kein Framing, keinen Längenheader und keine Prüfsumme auf Paketebene.
|
||||
|
||||
| ID | Name | Zweck |
|
||||
|---|---|---|
|
||||
| `0x81` | `KEY_DOWN` | wird für jede aktuelle Host-Action gesendet |
|
||||
| `0x82` | `KEY_UP` | definiert, aktuell nicht gesendet |
|
||||
| `0x83` | `ENC_CW` | definiert, aktuell nicht gesendet |
|
||||
| `0x84` | `ENC_CCW` | definiert, aktuell nicht gesendet |
|
||||
| `0x81` | `KEY_DOWN` | Host-Button gedrückt |
|
||||
| `0x82` | `KEY_UP` | Host-Button losgelassen |
|
||||
| `0x83` | `ENC_CW` | Encoder-Host-Action im Uhrzeigersinn |
|
||||
| `0x84` | `ENC_CCW` | Encoder-Host-Action gegen Uhrzeigersinn |
|
||||
| `0x85` | `PONG` | Antwort auf Ping |
|
||||
| `0x90` | `CONFIG_ACK` | Config erfolgreich gespeichert |
|
||||
| `0x91` | `CONFIG_NACK` | Config ungueltig oder NVM-Timeout |
|
||||
@@ -66,9 +66,10 @@ Es gibt kein Framing, keinen Längenheader und keine Prüfsumme auf Paketebene.
|
||||
| `0x98` | `MACRO_END` | Makro-Dump fertig |
|
||||
| `0x99` | `MACRO_NACK` | Makro-Speichern fehlgeschlagen |
|
||||
|
||||
Bei `ActionType::HOST_COMMAND` enthält Byte 1 die Matrix-Key-ID oder die
|
||||
Encoder-ID. `SAction.data` wird nicht übertragen. Auch CW- und CCW-Actions
|
||||
senden aktuell `0x81`; die Drehrichtung ist im Paket nicht enthalten.
|
||||
Bei `ActionType::HOST_COMMAND` enthält Byte 1 die Matrix-Key-ID oder
|
||||
Encoder-ID. Die 16-Bit-Command-ID aus `SAction.data` steht little-endian in
|
||||
Byte 2 und 3. Encoder-Actions verwenden die richtungsspezifischen IDs
|
||||
`0x83/0x84`.
|
||||
|
||||
## Chunk-Zahlen
|
||||
|
||||
@@ -120,16 +121,15 @@ Nur bei erfolgreicher Pruefung wird in NVM geschrieben.
|
||||
|
||||
`MACRO_COMMIT` schreibt ohne CRC direkt nach NVM und signalisiert nur Erfolg oder Fehler.
|
||||
|
||||
Die in `BEGIN` angekündigte Chunkzahl wird zwar gespeichert, aber beim Commit
|
||||
nicht ausgewertet. Die Firmware verfolgt nicht, welche Chunkindizes tatsächlich
|
||||
eingetroffen sind. Doppelte, fehlende und ungeordnete Chunks werden deshalb
|
||||
nicht als solche erkannt. Bei Configdaten schlägt ein unvollständiger Transfer
|
||||
typischerweise an der CRC fehl; bei Makrodaten kann ein unvollständiger
|
||||
Null-gefüllter Puffer gespeichert werden.
|
||||
Beide Empfangspfade erwarten exakt die berechnete Chunkzahl, markieren jeden
|
||||
Index einmalig und akzeptieren `COMMIT` nur nach einem vollständigen Transfer.
|
||||
Doppelte oder außerhalb des Bereichs liegende Chunks machen den Transfer
|
||||
ungültig und führen beim Commit zu NACK.
|
||||
|
||||
Die Configvalidierung prüft keine Feldwerte oder Enum-Bereiche. Insbesondere
|
||||
müssen Hostimplementierungen gültige Profilindizes, Actiontypen, LED-Enums und
|
||||
Animationsperioden liefern.
|
||||
Config-Commit prüft zusätzlich Magic, Version, CRC, Profilindex,
|
||||
Actiontypen/-daten, LED-Enums und kritische Animationsperioden.
|
||||
Makro-Commit prüft die Vollständigkeit und alle HID-Keycodes. Die Makrotabelle
|
||||
besitzt weiterhin keine eigene persistente CRC.
|
||||
|
||||
## Praktische Hinweise fuer die GUI
|
||||
|
||||
@@ -139,7 +139,9 @@ Animationsperioden liefern.
|
||||
- `DtrEnable` muss aktiv sein, sonst verwirft das Board CDC-Ausgaben
|
||||
- ausschließlich vollständige 8-Byte-Pakete schreiben; schon ein verlorenes
|
||||
Byte verschiebt die Paketgrenzen für alle folgenden Daten
|
||||
- Encoder-Host-Actions derzeit nicht anhand von `0x83/0x84` erwarten
|
||||
- Host-Command-ID little-endian aus Byte 2/3 lesen
|
||||
- Config- und Makro-Dumps ebenfalls auf Chunkzahl, eindeutige Indizes und
|
||||
Vollständigkeit prüfen
|
||||
|
||||
## Implementierungsdetails
|
||||
|
||||
|
||||
Reference in New Issue
Block a user