Projekt

Allgemein

Profil

Feature #139

Von Julius Haman vor 4 Tagen aktualisiert

Geräteübersicht: Die Live-Statusanzeige für BLE-Pulsmesser (Status-Punkt und Live-Puls) wird **komplett ausgebaut**. Die Übersicht prüft keine Geräte soll nicht mehr automatisch alle gespeicherten Geräte prüfen, sondern **nur den aktiven Pulsmesser (den fürs Training gewählten Favoriten)** (Entscheidung 09.10.2026, zuvor 08.10.2026: nur aktiver Pulsmesser). 08.10.2026). Andere Geräte haben keinen Live-Status mehr. 

 ### Hintergrund 
 Die Geräteübersicht hielt pro BLE-Pulsmesser-Zeile eine dauerhafte GATT-Verbindung mit Retry-Schleife (`DevicesViewModel.StartBleMonitors()`, `RunBleMonitorAsync`) plus 1-s-Statustimer. prüft alle gespeicherten Geräte auf Erreichbarkeit. Nicht erreichbare Geräte, zum Beispiel ein BLE-Pulsmesser, der gerade nicht sendet, werden dabei im Sekundentakt erneut versucht. Beim Test mit dem HRM200 und der nicht sendenden Instinct 2X Solar am 08.10.2026 zeigte das Log: 
 * Mehrere BLE-Pulsmesser wurden werden gleichzeitig angesprochen. Die Instinct (`FAD7BDDCB983`) war dauerhaft "nicht erreichbar" und wurde etwa alle 6 Sekunden neu versucht (jeweils 5 Sekunden Wartezeit auf ein Advertisement), auch noch nachdem der HRM200 (`EA10D2AFDBB8`) verbunden war. 
 * BLE-Verbindungszeiten des HRM200: Advertisement nach 0,5 s bzw. 3,2 s, verbunden mit Notifications nach 3,8 s, ein Versuch mit "Heart-Rate-Service nicht gefunden (Unreachable)" nach 10,9 s mit Wiederholung. Die ANT+-Suche desselben Gurts findet ihn in etwa 0,1 s. 
 * Beschränkung auf **Nicht belegt:** ob die parallele Prüfung der übrigen Geräte den aktiven Pulsmesser (Zwischenstand dieses Tickets) brachte Verbindungsaufbau des aktuellen Geräts bremst. Das Log erlaubt keine Verbesserung: Beim Test am 09.10.2026 dauerte der Verbindungsaufbau der Instinct 2X Solar weiterhin 5 Aussage dazu. Messwert für einen Vergleich vorher/nachher wäre die Zeit bis 12 s (Advertisement-Wartezeit plus GATT-Aufbau durch Windows), und die dauerhafte Verbindung "Verbunden" im Log. 

 ### Optionen 
 * **Nicht mehr automatisch prüfen.** Keine Parallelversuche. In der Übersicht steht im Verdacht, Test, Dialog "Geräte verbinden" und Training zu stören (nur eine Central-Verbindung pro Gerät). Die Anzeige ist damit nicht mehr Störquelle als Nutzen. zu sehen, ob ein Gerät in Reichweite ist. 
 * **Nur das aktuell gewählte Gerät prüfen.** Eine Verbindung, Statusanzeige bleibt für das gewählte Gerät. Andere Geräte haben keinen Status. 
 * **Prüfung nur auf Knopfdruck.** Der Nutzer entscheidet, ein Klick mehr. 

 ### Umsetzung Analyse (Code, 08.10.2026) 
 * `StartBleMonitors`/`RunBleMonitorAsync`/`StopBleMonitor` samt Statustimer und Pausieren bei Training/Test entfernt. Die Prüfung läuft in `DevicesViewModel.StartBleMonitors()` (Geräteübersicht): pro BLE-Pulsmesser-Zeile eine dauerhafte GATT-Verbindung mit Retry-Schleife (`RunBleMonitorAsync`) plus 1-s-Statustimer. 
 * `DeviceRow`: `ShowBleStatus`, `IsMonitored`, `BleConnected`, `LivePulse` entfernt; Status-Punkt Beim Trainingsstart (`FreiesTrainingRunning`) und bpm-Anzeige in `DevicesView.xaml` entfernt. beim "Testen" werden alle Monitore gestoppt (ein Pulsmesser nimmt nur eine Central-Verbindung an). `StopBleMonitor` → `BlePulsmesser.CloseConnection()` führt pro Monitor `GC.Collect()` + `WaitForPendingFinalizers()` auf dem UI-Thread aus. 
 * Die Geräteübersicht stellt selbst keine BLE-Verbindung mehr her. Verbindungen entstehen nur Das Stoppen ist nicht graceful: `Cts.Cancel()` wartet nicht auf das Ende von `RunBleMonitorAsync`, und `EstablishConnectionAsync` prüft das Token nach den `await`s nicht. Steckt ein Monitor gerade im Verbindungsaufbau, kann er nach dem Stoppen noch beim "Testen", im Dialog "Geräte verbinden" eine Verbindung anlegen, die die Uhr belegt und im Training. Test/Training blockiert, bis der Finalizer sie abräumt. 
 * Der Test-Button für BLE-Pulsmesser bleibt unverändert. Dass die Parallelprüfung den Verbindungsaufbau tatsächlich bremst, ist weiterhin nicht gemessen (siehe oben). 

 ### Umsetzung 
 * Nur den aktiven Pulsmesser (`ActivePulsmesserDeviceId`) dauerhaft verbinden (ein Monitor); beim Wechsel des aktiven Geräts alten Monitor stoppen, neuen starten. Andere Zeilen zeigen einen grauen Status-Punkt. 
 * Stoppen sauber: Token-Prüfung nach jedem `await` im Verbindungsaufbau, vor dem Schließen auf das Ende des Monitors warten, `GC.Collect()` nicht mehr auf dem UI-Thread. 
 * Betrifft die Geräteübersicht (`DevicesViewModel`). Das Geräteauswahl-Fenster (`DeviceFinderViewModel`) ist nicht betroffen. Teil dieses Tickets. 
 * Messwert vorher/nachher: Zeit bis "Verbunden" im Log. 

Zurück