Project_SylDa/docs/superpowers/specs/2026-08-02-led-stable-connection-design.md

97 lines
4 KiB
Markdown

# LED-signalering: stabiele verbinding
**Issue:** [#4](https://git.eddydevink.nl/eddy/Project_SylDa/issues/4) — Leds mogen uit na een minuut stabiele verbinding
**Datum:** 2026-08-02
**Status:** goedgekeurd
## Doel
Uniforme LED-signalering voor zowel server als client. De LED dient als debug-indicator tijdens opstarten en bij verbindingsproblemen. Na 60 seconden continue stabiele verbinding schakelt de LED uit.
## Kleurenschema
Identiek voor server (`main.cpp`) en client (`client.cpp`):
| State | LED | Prioriteit |
|-------|-----|-----------|
| OTA in progress | Groen knipperend (100ms interval) | 1 (hoogst) |
| OTA completed, waiting confirm | Geel vast | 1 |
| Geen verbinding | Rood | 2 |
| Verbinding actief (< 60s) | Geel | 3 |
| Verbinding stabiel (>= 60s) | **Uit** | 4 (laagst) |
| Relais-flash (overlay) | Groen 150ms | overlay |
Relais-flash is een overlay: toont kort groen bij verandering in relais-status, daarna keert LED terug naar de kleur die hoort bij de huidige verbindingsstatus.
## Timer-logica
- Timer (`connectionStableMs`) start zodra de **eerste** verbinding tot stand komt
- `connectionStableMs` telt op zolang er minstens 1 verbinding is (connectedCount > 0 voor server, connected == true voor client)
- Nieuwe verbindingen die later bijkomen resetten de timer **niet**
- Bij disconnect van een verbinding terwijl er nog andere verbindingen zijn: timer loopt door
- Pas als **alle** verbindingen wegvallen: `connectionStableMs` = 0, LED direct rood
- Drempel: `STABLE_LED_TIMEOUT_MS = 60000`
### Server-specifiek
- `connectedCount`: aantal actieve BLE-clients (0-2)
- Timer loopt als `connectedCount > 0`
- Alle clients disconnect = reset
### Client-specifiek
- `connected`: boolean, of client verbonden is met server
- Timer loopt als `connected == true`
- Disconnect = reset
## Relais-flash mechanisme
- Detectie: vergelijk huidige relais-state met vorige loop-iteratie
- Bij verandering: zet `relayFlashUntil = millis() + 150`
- Zolang `millis() < relayFlashUntil`: LED groen (overschrijft verbindingskleur)
- Flash reset de 60s timer **niet**
- **Server:** detecteert verandering in `relay1State || relay2State` (combinatie van touch, button, en BLE-commands)
- **Client:** detecteert verandering in `relay1State || relay2State` (alleen touch/button)
## OTA (beide firmwares)
OTA heeft hoogste prioriteit en override alle andere LED-states:
- **OTA in progress** (`otaInProgress == true`): groen knipperend, 100ms interval
- **OTA completed, waiting confirm** (`otaEnded == true && !otaConfirmed`): geel vast
- **OTA confirm timeout** of **OTA error**: valt terug naar normale verbindings-LED
- **OTA success + reboot**: groen vast, dan reboot
Client heeft OTA-logica nog niet geïmplementeerd, maar de LED-code wordt alvast voorbereid met dezelfde OTA-override structuur zodat toekomstige OTA-implementatie direct past.
## LED-update volgorde in loop()
```
1. Bepaal base-kleur op basis van verbindingsstatus (rood/geel/uit)
2. Controleer relais-flash: als actief -> groen
3. Controleer OTA-override: als actief -> OTA-kleur
4. FastLED.show()
```
## Wijzigingen per bestand
### `src/main.cpp` (server)
- Toevoegen: `STABLE_LED_TIMEOUT_MS`, `connectionStableMs`, `relayFlashUntil`, `lastRelayActive`
- Aanpassen: LED-logica in `loop()` — base-kleur uit `connectionStableMs` i.p.v. `connectedCount > 0`
- Toevoegen: relais-flash detectie
- Behouden: OTA LED-override (werkt al, prioriteit blijft hoogst)
- Verwijderen: setup LED-blinks (drie groene knipperingen) — vervangen door rood (geen verbinding)
### `src/client.cpp` (client)
- Toevoegen: `STABLE_LED_TIMEOUT_MS`, `connectionStableMs`, `relayFlashUntil`, `lastRelayActive`
- Aanpassen: LED-logica in `loop()` — base-kleur uit `connectionStableMs`, geen aparte relais-kleur meer
- Toevoegen: relais-flash detectie
- Toevoegen: OTA-override structuur (placeholder, `otaInProgress` default `false`)
- Setup: LED rood i.p.v. direct rood (blijft rood, maar nu als onderdeel van uniform schema)
### `src/version.h`
- Server versie bump naar "16"
- Client versie bump naar "2"