3.1 KiB
3.1 KiB
Serial-Protokoll (CDC USB)
Dateien:
hal/usb_serial.hhal/usb_serial.cppCMainController.cpp
Paketformat
Alle Pakete sind exakt 8 Byte lang:
Byte 0: command / event id
Byte 1: key_id oder chunk-index oder chunk-count
Byte 2: daten a
Byte 3: daten b
Byte 4: daten c
Byte 5..7: reserviert
Es gibt kein Framing und keinen Laengenheader.
Richtungen
| Richtung | IDs | Verarbeitung |
|---|---|---|
| PC -> Board | 0x01..0x7F |
poll_vendor() |
| Board -> PC | 0x81..0xFF |
usb_serial_send() |
Commands
| ID | Name | Zweck |
|---|---|---|
0x01 |
SET_LED_OVERRIDE |
temporaere LED-Override setzen |
0x02 |
CLEAR_LED_OVERRIDE |
Override entfernen |
0x03 |
SET_LED_BASE |
Base-Farbe im RAM setzen |
0x05 |
PING |
Antwort: PONG |
0x10 |
CONFIG_BEGIN |
Config-Transfer starten |
0x11 |
CONFIG_DATA |
6 Byte Config-Nutzdaten |
0x12 |
CONFIG_COMMIT |
Config pruefen und speichern |
0x13 |
CONFIG_READ |
Config-Dump an Host senden |
0x20 |
MACRO_BEGIN |
Makro-Transfer starten |
0x21 |
MACRO_DATA |
6 Byte Makro-Nutzdaten |
0x22 |
MACRO_COMMIT |
Makros speichern |
0x23 |
MACRO_READ |
Makro-Dump an Host senden |
Events
| ID | Name | Zweck |
|---|---|---|
0x81 |
KEY_DOWN |
Host-Command-Button gedrueckt |
0x82 |
KEY_UP |
Host-Command-Button losgelassen |
0x83 |
ENC_CW |
Encoder Host-Command im Uhrzeigersinn |
0x84 |
ENC_CCW |
Encoder Host-Command gegen Uhrzeigersinn |
0x85 |
PONG |
Antwort auf Ping |
0x90 |
CONFIG_ACK |
Config erfolgreich gespeichert |
0x91 |
CONFIG_NACK |
Config ungueltig oder NVM-Timeout |
0x92 |
CONFIG_BEGIN |
Config-Dump beginnt |
0x93 |
CONFIG_DATA |
6 Byte Config-Dump |
0x94 |
CONFIG_END |
Config-Dump fertig |
0x95 |
MACRO_ACK |
Makros erfolgreich gespeichert |
0x96 |
MACRO_BEGIN |
Makro-Dump beginnt |
0x97 |
MACRO_DATA |
6 Byte Makro-Dump |
0x98 |
MACRO_END |
Makro-Dump fertig |
0x99 |
MACRO_NACK |
Makro-Speichern fehlgeschlagen |
Chunk-Zahlen
Aktuelle Blob-Groessen:
- Config:
740Byte - Makros:
512Byte
Bei 6 Nutzbytes pro Paket ergibt das:
Config: ceil(740 / 6) = 124 Chunks
Makros: ceil(512 / 6) = 86 Chunks
Transferablauf
PC -> Board
BEGIN(chunk_count)
DATA 0
DATA 1
...
COMMIT
Board -> PC
BEGIN(chunk_count)
DATA 0
DATA 1
...
END
Validierung
CONFIG_COMMIT prueft:
- Magic
- Version
- CRC
Nur bei erfolgreicher Pruefung wird in NVM geschrieben.
MACRO_COMMIT schreibt ohne CRC direkt nach NVM und signalisiert nur Erfolg oder Fehler.
Praktische Hinweise fuer die GUI
- nach
CONFIG_COMMITaufCONFIG_ACKoderCONFIG_NACKwarten - danach erst
MACRO_*senden - Dumps besser sequenziell lesen: zuerst Config, danach Makros
DtrEnablemuss aktiv sein, sonst verwirft das Board CDC-Ausgaben
Implementierungsdetails
- RX-Ringbuffer: 256 Byte = 32 volle Pakete
- feste 8-Byte-Pakete vereinfachen Firmware und GUI
- nach einem reinen SWD-Reflash kann ein physischer USB-Reconnect noetig sein