8 Step macro and profile switching fully working
This commit is contained in:
+30
-11
@@ -8,6 +8,7 @@
|
||||
- Verbindungsaufbau und automatischer Reconnect
|
||||
- Hintergrund-Lese-Thread mit Paket-Assembler
|
||||
- Sende-Methoden für alle Protokoll-Operationen
|
||||
- ACK/NACK-Synchronisation zwischen ReadLoop-Thread und `SendConfig`/`SendMacros`-Task
|
||||
|
||||
## COM-Port-Erkennung
|
||||
|
||||
@@ -52,20 +53,38 @@ Bei IOException:
|
||||
else: break → Disconnect
|
||||
```
|
||||
|
||||
## ACK/NACK-Synchronisation
|
||||
|
||||
`SendConfig` und `SendMacros` blockieren nach COMMIT auf ein `SemaphoreSlim`-Gate bis das Board antwortet:
|
||||
|
||||
```
|
||||
_configAckGate / _macroAckGate – SemaphoreSlim(0, 1)
|
||||
_configAckOk / _macroAckOk – volatile bool (true = ACK, false = NACK)
|
||||
```
|
||||
|
||||
| Methode | Aufruf durch | Wirkung |
|
||||
|---|---|---|
|
||||
| `SignalConfigAck()` | TrayApp bei EvtConfigAck | `_configAckOk = true`, Gate freigeben |
|
||||
| `SignalConfigNack()` | TrayApp bei EvtConfigNack | `_configAckOk = false`, Gate freigeben |
|
||||
| `SignalMacroAck()` | TrayApp bei EvtMacroAck | `_macroAckOk = true`, Gate freigeben |
|
||||
| `SignalMacroNack()` | TrayApp bei EvtMacroNack | `_macroAckOk = false`, Gate freigeben |
|
||||
|
||||
`SendConfig()` und `SendMacros()` geben `bool` zurück (`true` = ACK erhalten, `false` = NACK oder Timeout nach 3 s).
|
||||
|
||||
## Sende-Methoden
|
||||
|
||||
| Methode | Funktion |
|
||||
|---|---|
|
||||
| `Send(pkt)` | Rohe 8-Byte-Übertragung (fire-and-forget, ignoriert Sendefehler) |
|
||||
| `SetLedOverride(keyId, r, g, b)` | CMD 0x01 |
|
||||
| `ClearLedOverride(keyId)` | CMD 0x02 |
|
||||
| `SetLedBase(keyId, r, g, b)` | CMD 0x03 |
|
||||
| `RequestConfig()` | CMD 0x13 – Board antwortet mit Config-Dump |
|
||||
| `RequestMacros()` | CMD 0x23 – Board antwortet mit Makro-Dump |
|
||||
| `SendConfig(cfg)` | BEGIN(0x10) → 38×DATA(0x11) → COMMIT(0x12), 5 ms zwischen Chunks |
|
||||
| `SendMacros(macros)` | BEGIN(0x20) → 43×DATA(0x21) → COMMIT(0x22), 5 ms zwischen Chunks |
|
||||
| Methode | Rückgabe | Funktion |
|
||||
|---|---|---|
|
||||
| `Send(pkt)` | void | Rohe 8-Byte-Übertragung (fire-and-forget) |
|
||||
| `SetLedOverride(keyId, r, g, b)` | void | CMD 0x01 |
|
||||
| `ClearLedOverride(keyId)` | void | CMD 0x02 |
|
||||
| `SetLedBase(keyId, r, g, b)` | void | CMD 0x03 |
|
||||
| `RequestConfig()` | void | CMD 0x13 – Board antwortet mit Config-Dump |
|
||||
| `RequestMacros()` | void | CMD 0x23 – Board antwortet mit Makro-Dump |
|
||||
| `SendConfig(cfg)` | bool | BEGIN(0x10) → 124×DATA(0x11) → COMMIT(0x12), 5 ms zwischen Chunks, wartet auf ACK/NACK |
|
||||
| `SendMacros(macros)` | bool | BEGIN(0x20) → 86×DATA(0x21) → COMMIT(0x22), 5 ms zwischen Chunks, wartet auf ACK/NACK |
|
||||
|
||||
`SendConfig` und `SendMacros` blockieren ~400 ms → werden in `Task.Run()` aus `ConfigForm.OnSave()` aufgerufen.
|
||||
`SendConfig` und `SendMacros` blockieren ~1,5 s (Chunks + NVM-Zeit) → werden in `Task.Run()` aus `ConfigForm.OnSave()` aufgerufen.
|
||||
|
||||
## Events
|
||||
|
||||
|
||||
Reference in New Issue
Block a user