# TrayApp **Datei:** `TrayApp.cs` ## Verantwortung - App-Lebenszyklus als `ApplicationContext` (kein Hauptfenster) - Tray-Icon mit Verbindungsstatus und Kontextmenü - Empfang und Routing aller Board-Events (via `SerialManager.PacketReceived`) - Config/Makro-Dump-Empfang (chunked, via `_rxConfigBuf` / `_rxMacroBuf`) - ACK/NACK-Weiterleitung an SerialManager - Öffnen des `ConfigForm` (nur eine Instanz gleichzeitig) ## Tray-Menü ``` [●/○] VersaPad – verbunden / nicht verbunden (disabled, nur Anzeige) ────────────────────────────────────────────── Konfiguration... → OpenConfigForm() ────────────────────────────────────────────── Beenden → Application.Exit() ``` Icon und Tooltip spiegeln den Verbindungsstatus: - Verbunden: `SystemIcons.Information`, Text "VersaPad – verbunden" - Getrennt: `SystemIcons.Application`, Text "VersaPad – nicht verbunden" (TODO: eigenes Icon einbinden) ## Board-Event-Handling (OnPacket) | Event-ID | Aktion | |---|---| | `EvtConfigBegin` | `_rxConfigBuf = new byte[740]` | | `EvtConfigData` | Chunk in `_rxConfigBuf` eintragen (`KeyId * 6` = Byte-Offset) | | `EvtConfigEnd` | `DeviceConfig.FromBytes()` → `ConfigForm.RefreshAll()` | | `EvtConfigAck` | `serial.SignalConfigAck()` — gibt SendConfig()-Thread frei | | `EvtConfigNack` | `serial.SignalConfigNack()` — gibt SendConfig()-Thread frei (Fehler) | | `EvtMacroBegin` | `_rxMacroBuf = new byte[512]` | | `EvtMacroData` | Chunk in `_rxMacroBuf` eintragen | | `EvtMacroEnd` | `MacroTable.FromBytes()` | | `EvtMacroAck` | `serial.SignalMacroAck()` — gibt SendMacros()-Thread frei | | `EvtMacroNack` | `serial.SignalMacroNack()` — gibt SendMacros()-Thread frei (Fehler) | | `EvtPong` | MessageBox "Ping OK" | | `EvtKeyDown` | TODO: HOST_COMMAND-Aktion ausführen | | `EvtEncCw/Ccw` | TODO: Encoder HOST_COMMAND | ACK/NACK-Events zeigen keine eigene MessageBox mehr — das Ergebnis wird nach Abschluss beider Transfers gebündelt in `ConfigForm.OnSave()` angezeigt. ## Verbindungslebenszyklus ``` OnConnected(): Icon + Text + Menü-Item aktualisieren serial.RequestConfig() → Config-Dump vom Board serial.RequestMacros() → Makro-Dump vom Board OnDisconnected(): Icon + Text + Menü-Item aktualisieren ``` ## TODOs in dieser Klasse - HOST_COMMAND-Ausführung: `EvtKeyDown` empfangen → Aktion aus Config laden → URL/Programm starten - Eigenes Tray-Icon statt `SystemIcons.Application` - Debug-Log (`versapad_rx.txt`) entfernen