Files
Kettenoeler/DEV.md
2025-08-22 17:58:30 +02:00

193 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Developer Documentation Smart Chain Oiler
Diese Datei richtet sich an Entwickler\:innen, die das Projekt aufbauen, erweitern oder debuggen wollen. Ergänzend zur [README.md](README.md) (Überblick & Features) enthält dieses Dokument Details zu BuildProzess, Debugging, Protokollen und internen Architekturen.
---
## Build & Flash
### PlatformIO Environments
* `pcb_rev_1-2_serial`, `pcb_rev_1-2_ota`
* `pcb_rev_1-3_serial`, `pcb_rev_1-3_ota`
* `pcb_rev_1-4_serial`, `pcb_rev_1-4_ota`
Default: **pcb\_rev\_1-4\_serial**
### Serial Flash
```bash
pio run -e pcb_rev_1-4_serial -t upload
```
### OTA Flash
```bash
pio run -e pcb_rev_1-4_ota -t upload
```
* Port: 8266
* Auth: `ADMIN_PASSWORD` (aus `wifi_credentials.ini`)
### Filesystem Update (LittleFS)
* **Immer zuerst** FSImage flashen, wenn „Benötigte FlashVersion“ ≠ „Installierte“
* `.fs.gz` hochladen → danach `.fw.bin`
---
## Serial Console (115200 Baud)
Der ESP8266 bietet ein einfaches CLI (über UART oder USB). Nützliche Befehle:
| Befehl | Funktion |
| ------------------ | ------------------------------ |
| `help` | Liste aller Kommandos |
| `sysinfo` | Systeminfo (Versionen, Uptime) |
| `netinfo` | Netzwerkinfos (IP, WiFi) |
| `dtc_list` | Aktive DTCs anzeigen |
| `dtc_clear` | DTCListe zurücksetzen |
| `purge` | Entlüften/Pumpimpulse starten |
| `toggle_wifi` | WiFiAP ein/aus |
| `tank_refill` | Tankfüllstand zurücksetzen |
| `isr_debug on/off` | Debug-Ausgabe zu ImpulsISR |
---
## WebSocket API
### Endpoint
`ws://<host>/ws`
### Server → Client Events
* `NOTIFY:<type>;<msg>` → Toast/Alert im UI
* `DEBUG:<text>` → Debugausgabe
* `DTC:<list>` → aktive DTCs (Format: `ts,code,severity,active;…`)
* `MAPPING_STATUS:<map>` → Mapping Keys → Labels (Statuswerte)
* `MAPPING_STATIC:<map>` → Mapping Keys → Labels (Staticwerte)
* `STATUS:<values>` → Livewerte (z. B. Distanzzähler, Tank %)
* `STATIC:<values>` → Konfiguration, Versionen
### Client → Server Events
* Generisches Schema: `btn-<elementId>:<value>`
* Beispiel: `btn-refill:1` (Tankreset), `btn-purge:25` (25 Impulse)
---
## DTC Framework
Severity:
* **INFO** nur Anzeige im WebUI
* **WARN (Orange)** Hinweis, Betrieb läuft weiter
* **CRITICAL (Rot)** Pumpe gestoppt
DTCDefinitionen: siehe [`dtc_defs.txt`](dtc_defs.txt). Im WebUI werden Codes per `dtc_table.json` in Titel & Beschreibung gemappt.
---
## Tankmodell & Persistenz
* `amountPerDose_microL` definiert Ölmenge pro Puls
* Virtueller Tank (ml, Warnschwelle %, Restreichweite)
* Daten persistiert in EEPROM/Flash (Partition PDS)
* Sanity/ChecksumPrüfungen → passende DTCs
---
## Speed Sources
* **Impuls/Pickup:** via Interrupt (konfigurierbar: Puls/Umdrehung, Reifenmaße)
* **GPS (TinyGPSPlus):** Baudrate wählbar, Distanzberechnung
* **CAN (KTMspezifisch):** tested mit KTM 890 Adventure R & 1290 SuperDuke
* **OBD2 CAN/KLine:** in Testphase (PCB ≥ 1.4 für KLine)
---
## LED Control
* Implementiert in `ledcontrol.cpp`
* Farben + Muster (`led_colors.h`)
* BrightnessRange konfigurierbar (WebUI)
* DTC Severity → LED Orange/Rot
---
## Codegen & Versionsverwaltung
* `struct2json.cpp` wird **automatisch generiert** (nicht manuell editieren)
* GitRevision via `codegen/git_rev_macro.py` eingebettet
* FlashVersion Check: „Benötigte vs. Installierte FlashVersion“ (WebUIUpdateTab)
---
## Hardware PinMapping & PCB Revisionen
### PowerPfad (Rev 1.4)
* **+12V Eingang** → **VerpolschutzDiode****StepDown auf 5V** → versorgt **Wemos D1 mini**
* **3,3V** wird vom **Wemos** bereitgestellt (per LDO) und speist Peripherie (CAN, KLine, OLED, EEPROM, WS2812DataLevel ok am D3)
* **Pumpe**: LowSideMOSFET mit **Freilaufdiode** (Entstörung gegen induktive Spannungsspitzen)
### Wemos D1 mini (ESP8266) Pins
| Funktion | BoardPin | GPIO | Bemerkung |
| ---------------------------------- | --------- | ------ | ------------------------------------------------------------------------------------------- |
| **Pumpe (MOSFET, LowSide)** | D0 | GPIO16 | Schaltausgang für Pumpentreiber |
| **I²C SCL (OLED/EEPROM)** | D1 | GPIO5 | U8g2 + I2CEEPROM auf gleichem Bus |
| **I²C SDA (OLED/EEPROM)** | D2 | GPIO4 | PullUps auf 3,3V vorhanden |
| **WS2812 LED Data** | D3 | GPIO0 | Serieller Widerstand im Datenpfad |
| **CockpitTaster** | D4 | GPIO2 | gegen **GND**, Schutzdiode, interner PullUp |
| **SPI SCK (MCP2515)** | D5 | GPIO14 | CANController |
| **SPI MISO (MCP2515)** | D6 | GPIO12 | shared mit internen Leitungen, siehe KLine/UART Hinweis |
| **SPI MOSI (MCP2515)** | D7 | GPIO13 | CANController |
| **CS / CEN / Impuls (per Jumper)** | D8 | GPIO15 | **JumperFunktion**: CS für MCP2515 **oder** **CEN\_KLine** **oder** **ImpulsEingang** |
| **UART0 TX** | TX (J44) | GPIO1 | geht an USBUART **und** an KLineTransceiver (aktiv nur wenn **CEN\_KLine** gesetzt) |
| **UART0 RX / GPSEingang** | RX (J43) | GPIO3 | USBUART **und** GPSEingang; GPSFrames werden vom Parser konsumiert, Rest an CLI geroutet |
> **Hinweis zu KLine:** Der MC33660 wird über **CEN\_KLine** (D8, per LötJumper) nur aktiviert, wenn gesendet/empfangen werden soll. Dadurch bleibt die serielle Konsole (USB) im Normalbetrieb verfügbar.
### CAN / OBDKLine / GPS Anschlüsse
* **CAN:** MCP2515 (SPI) + MCP2551, Signale **CAN\_H**/**CAN\_L** nach außen geführt
* **KLine:** MC33660, UART0 TX/RX zugeschaltet über **CEN\_KLine**
* **GPS (seriell):** UART0 RX an **J4Pin3**, Baudrate im WebUI wählbar; nur RX genutzt
### PCBRevisionen
* **Rev1.2:** Basis (Pumpe, Taster, LED, optional OLED/I²C)
* **Rev1.3:** Verbesserte CANIntegration/PowerPfad
* **Rev1.4:** KLineTransceiver, JumperMux auf **D8** (CS/CEN/Impuls), GPSHeader (J4)
\-------------------|------|-----------------|-------------------------------------------|
\| Taster | D3 | GPIO0 | PullUp, ISRAbfrage |
\| RGBLED (WS2812) | D4 | GPIO2 | Adafruit NeoPixelLib |
\| Pumpe (MOSFET) | D1 | GPIO5 | LowSide Treiber |
\| CANCS | D8 | GPIO15 | MCP2515 CS |
\| CANINT | D0 | GPIO16 | Interrupt vom MCP2515 |
\| OBD2 KLine | D7 | GPIO13 | ab PCB Rev 1.4, Pegelwandler erforderlich |
\| GPS RX | D6 | GPIO12 | Seriell, TinyGPSPlus |
\| OLED I²C SCL | D5 | GPIO14 | U8g2Lib |
\| OLED I²C SDA | D2 | GPIO4 | U8g2Lib |
> Hinweis: tatsächliches Mapping je nach `config.h` und PCBRevision. Tabelle zeigt Standardzuordnung Rev1.4.
### PCB Revisionen
* **Rev 1.2:** Basisfunktionen, kein OBD2Support
* **Rev 1.3:** Verbesserte CANIntegration, stabileres PowerDesign
* **Rev 1.4:** zusätzlicher Pegelwandler für **OBD2 KLine**, vorbereitet für GPSModul
---
## Known Limitations / TODO
* OBD2 CAN/KLine: nur Basisfunktionen, erweiterte PIDUnterstützung offen
* GPS: bei schlechtem Empfang kann DTC „NO GPS SIGNAL“ spammen
* OLED: nur BasicStatusanzeigen; keine volle UI
---