# 📦 Datenfluss-Dokumentation: Digitale Ausgänge (Lesen & Schreiben)

Dieses Dokument beschreibt die Architektur und Datenflüsse für das **Lesen** und **Updaten** der digitalen Ausgänge im CPL-System. Unterstützt werden folgende Modi:

- `json`: Entwicklung mit editierbarer JSON-Datei
- `jsSimulatedProd`: Simulation durch `digitalOutputsMockData.js`
- `production`: Reale CPL-Hardware über CGI-Platzhalter

---

## 🔁 flowchart: Lesen der digitalen Ausgänge

<!-- flowchart (Typ: Datenflussdiagramm) oder Allgemein Ablaufsdiagramm -->

```mermaid
flowchart TD
    A[DigitalOutputsWidget.tsx] --> B[useEffect]
    B --> C[dispatch getDigitalOutputsThunk]
    C --> D[fetchDigitalOutputsService]
    D --> E{Moduswahl: NEXT_PUBLIC_CPL_MODE}

    E -->|json oder jsSimulatedProd| F[GET /api/cpl/getDigitalOutputsHandler.ts]
    F --> G[JSON oder geparste JS-Datei]

    E -->|production| H[loadScript '/CPL?/CPL/SERVICE/digitalOutputs.js']
    H --> I[Platzhalter-basierte win_da_state]

    G & I --> J[Redux: digitalOutputsSlice]
    J --> K[useSelector] --> A
```

---

## ✍️ flowchart: Updaten der digitalen Ausgänge

<!-- flowchart (Typ: Datenflussdiagramm) oder Allgemein Ablaufsdiagramm -->

```mermaid
flowchart TD
    A[DigitalOutputsWidget.tsx: onToggle] --> B[handleToggle id]
    B --> C[Redux: setDigitalOutputs]
    B --> D{Modus: production oder nicht}

    D -->|production| E1[window.location.href = /CPL?digitalOutputs.html&DAS0X=1]
    D -->|json oder jsSimulatedProd| F1[POST /api/cpl/updateDigitalOutputsHandler]
    F1 --> F2[Schreibe JSON oder JS-Datei]

    F2 & E1 --> G[Aktualisierte Zustände am Gerät]
```

---

## 🌐 API-Endpunkte

| Route                                     | Methode  | Modus                     | Funktion                       |
| ----------------------------------------- | -------- | ------------------------- | ------------------------------ |
| `/api/cpl/getDigitalOutputsHandler.ts`    | `GET`    | `json`, `jsSimulatedProd` | Liest JSON-Datei oder JS-Datei |
| `/CPL?/CPL/SERVICE/digitalOutputs.js`     | `SCRIPT` | `production`              | Liefert Platzhalter vom Gerät  |
| `/api/cpl/updateDigitalOutputsHandler.ts` | `POST`   | `json`, `jsSimulatedProd` | Speichert Statusänderung       |

---

## 🧪 Beispiel-JSON (Mock)

```json
{
  "win_da_state": [1, 0, 1, 0],
  "win_da_bezeichnung": ["Ausgang1", "Ausgang2", "Ausgang3", "Ausgang4"]
}
```

---

## 📁 Verzeichnisse

```
/mocks/api/SERVICE/                  → JSON-Dateien
/mocks/device-cgi-simulator/SERVICE/→ jsSimulatedProd: digitalOutputsMockData.js
/public/CPL/SERVICE/                → production: digitalOutputs.js
/pages/api/cpl/                     → GET/POST-Handler für json + jsSimulatedProd
/components/main/digitalOutputs/     → UI-Komponente: DigitalOutputsWidget.tsx
```

---

## ✅ Status

- [x] Lesen funktioniert in allen Modi
- [x] Schreiben funktioniert in allen Modi (production nur über Redirect)
- [x] json + jsSimulatedProd verwenden jetzt denselben API-Handler
- [x] Redux-Integration ist vollständig
