Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf57e11ccb | ||
|
|
6d345d2145 | ||
|
|
a410da6e72 | ||
|
|
f0a214d712 | ||
|
|
21f273aae4 | ||
|
|
e42d2b3de2 | ||
|
|
785f64331d | ||
|
|
40aabe48bc | ||
|
|
ca3a9c1264 | ||
|
|
bcd9ecf0c8 | ||
|
|
e5c61d42d4 | ||
|
|
d77b0795ea | ||
|
|
7ebffdab8f | ||
|
|
b73fc798c3 | ||
|
|
5defbe362c | ||
|
|
749f50097f | ||
|
|
95373dc619 | ||
|
|
a1c047e1ef | ||
|
|
52391c46c9 | ||
|
|
5d47228eed | ||
|
|
a3461fe960 | ||
|
|
1a05f8e1b3 | ||
|
|
dd8e641aa7 | ||
|
|
6201c1bc36 | ||
|
|
6d710f0129 | ||
|
|
5cc71ffa92 | ||
|
|
6bef94b8e1 | ||
|
|
95e97e5937 | ||
|
|
8db8e166a2 | ||
|
|
1def9e45dc | ||
|
|
c2a8b21917 | ||
|
|
6d7d544ac7 | ||
|
|
992796345c | ||
|
|
5e2d0f7af8 | ||
|
|
b6fdaa9ad7 | ||
|
|
08d07bd1a0 | ||
|
|
ee74c700bf | ||
|
|
750a6fb78c | ||
|
|
80b6eb810f | ||
|
|
6a9048411e | ||
|
|
ecb9836510 | ||
|
|
c4cb6eb90a | ||
|
|
c58b901f26 | ||
|
|
d83619904f | ||
|
|
50540179c7 | ||
|
|
9bbd7d72aa | ||
|
|
43c5d5a41a | ||
|
|
dfd2aaddd1 | ||
|
|
6c783c55de | ||
|
|
f38ea3045b | ||
|
|
0a6c6ed869 | ||
|
|
e8308a9182 | ||
|
|
edb1e333f0 | ||
|
|
528c8d5500 | ||
|
|
117715dc3b | ||
|
|
328dc06983 | ||
|
|
480708c992 | ||
|
|
9a0761f6da | ||
|
|
e6c09b7a9a | ||
|
|
4fa0c81087 | ||
|
|
04eb77fb2d | ||
|
|
7878f1bafd | ||
|
|
60bb859fc9 | ||
|
|
e8fdc60fea | ||
|
|
8b7978507c | ||
|
|
a8ae034911 | ||
|
|
ee5888ed97 | ||
|
|
9d9591c26e | ||
|
|
288aacf1b4 | ||
|
|
d75708993a | ||
|
|
146420a0bc | ||
|
|
4f9f686d81 | ||
|
|
e0c6784ecf |
@@ -11,17 +11,17 @@ für zwei Mikrocontroller, die per UART (230400 8N1, JSON-Zeilen) verbunden sind
|
|||||||
Änderungshistorie: `Changelog.txt` (Root), Version steht in `String version = "…"`.
|
Änderungshistorie: `Changelog.txt` (Root), Version steht in `String version = "…"`.
|
||||||
|
|
||||||
- **ESP32-P4 – UART-Touch-Display (spiegelt den S3-Zustand).**
|
- **ESP32-P4 – UART-Touch-Display (spiegelt den S3-Zustand).**
|
||||||
Ordner: `JC_Display_Firmware/` (Hauptsketch `JC_Display_Firmware.ino`,
|
Ordner: `P4_Display_Firmware/` (Hauptsketch `P4_Display_Firmware.ino`,
|
||||||
UI in `ui.cpp`/`ui.h`, UART-Protokoll in `protocol_client.*`, LVGL 9.x).
|
UI in `ui.cpp`/`ui.h`, UART-Protokoll in `protocol_client.*`, LVGL 9.x).
|
||||||
Hat **kein eigenes WLAN** (der ESP32-C6-Co-Prozessor ist ungenutzt); alle Daten
|
Hat **kein eigenes WLAN** (der ESP32-C6-Co-Prozessor ist ungenutzt); alle Daten
|
||||||
kommen über UART vom S3. Eigene Version `DISPLAY_FW_VERSION` +
|
kommen über UART vom S3. Eigene Version `DISPLAY_FW_VERSION` +
|
||||||
`JC_Display_Firmware/Changelog.txt`.
|
`P4_Display_Firmware/Changelog.txt`.
|
||||||
|
|
||||||
Wenn ich „S3/Controller/Maschine" sage, ist `Dual_PID_FastHeatUp.ino` gemeint;
|
Wenn ich „S3/Controller/Maschine" sage, ist `Dual_PID_FastHeatUp.ino` gemeint;
|
||||||
„P4/Display" ist der Ordner `JC_Display_Firmware/`.
|
„P4/Display" ist der Ordner `P4_Display_Firmware/`.
|
||||||
|
|
||||||
**Nicht anfassen:** Der Ordner `Sicherungen/` enthält nur datierte Versions-Backups
|
**Nicht anfassen:** Der Ordner `Sicherungen/` enthält nur datierte Versions-Backups
|
||||||
(`.ino`) — niemals dort editieren. Unter `JC_Display_Firmware/JC4880P443C_I_W/` liegen
|
(`.ino`) — niemals dort editieren. Unter `P4_Display_Firmware/JC4880P443C_I_W/` liegen
|
||||||
reine Hersteller-Demos/Beispiele (Board-Support), ebenfalls nicht als Projektcode behandeln.
|
reine Hersteller-Demos/Beispiele (Board-Support), ebenfalls nicht als Projektcode behandeln.
|
||||||
|
|
||||||
# Agent Instructions
|
# Agent Instructions
|
||||||
@@ -33,8 +33,8 @@ reine Hersteller-Demos/Beispiele (Board-Support), ebenfalls nicht als Projektcod
|
|||||||
## Git-Workflow
|
## Git-Workflow
|
||||||
|
|
||||||
- Host: Gitea `git.mueller.black`, Repo `thomas/Dual-PID`, User `thomas`, CLI `tea`.
|
- Host: Gitea `git.mueller.black`, Repo `thomas/Dual-PID`, User `thomas`, CLI `tea`.
|
||||||
- Aenderungen immer ueber Feature-Branch + Merge-Request (`tea pr create`), nie direkt auf `main` committen oder pushen.
|
- Aenderungen immer ueber Feature-Branch + Merge-Request, nie direkt auf `main` committen oder pushen.
|
||||||
- Pull/Merge-Requests dürfen immer selbstständig gemergt werden (Auto-Merge, kein grünes CI erforderlich, via `tea pr merge` oder Gitea-API); danach den Merge kurz melden.
|
- PR anlegen **und** mergen bevorzugt über die **Gitea-REST-API** (PowerShell `Invoke-RestMethod` auf `https://git.mueller.black/api/v1/repos/thomas/Dual-PID/pulls[/<nr>/merge]`, Token aus `C:\Users\Thomas\AppData\Local\tea\config.yml`, nur in Variable, nie ausgeben), da die `tea`-CLI gegen `git.mueller.black` oft hängt und nie zurückkehrt. `tea pr create`/`tea pr merge` nur als Ausweichweg. PRs dürfen selbstständig gemergt werden (Auto-Merge, kein grünes CI erforderlich); danach den Merge kurz melden.
|
||||||
- Kein Force-Push, kein History-Rewrite auf geteilten Branches.
|
- Kein Force-Push, kein History-Rewrite auf geteilten Branches.
|
||||||
- Commit-Identitaet bleibt `raw-designs` / `Thomas@raw-designs.de` (globale Git-Config, nicht aendern).
|
- Commit-Identitaet bleibt `raw-designs` / `Thomas@raw-designs.de` (globale Git-Config, nicht aendern).
|
||||||
- Commit-Messages im Conventional-Commits-Format (feat/fix/docs/refactor/...).
|
- Commit-Messages im Conventional-Commits-Format (feat/fix/docs/refactor/...).
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# JC4880P443C-I-W Touch-Display — UART-Protokoll & Architektur
|
# P4-Touch-Display — UART-Protokoll & Architektur
|
||||||
|
|
||||||
Status: Entwurf v1.0 der Doku · Firmware-Protokollversion: **1** (vorhanden, abgeschaltet) ·
|
Status: Entwurf v1.0 der Doku · Firmware-Protokollversion: **1** (vorhanden, abgeschaltet) ·
|
||||||
Ziel-Protokollversion: **2** (geplante Erweiterungen)
|
Ziel-Protokollversion: **2** (geplante Erweiterungen)
|
||||||
@@ -16,11 +16,11 @@ Bewusste Designentscheidung (siehe Projektbesprechung):
|
|||||||
|
|
||||||
- Das **Webinterface bleibt auf der Hauptplatine** (ESP32-S3). Es bleibt unverändert
|
- Das **Webinterface bleibt auf der Hauptplatine** (ESP32-S3). Es bleibt unverändert
|
||||||
die zentrale Steuerungs- und Konnektivitätsinstanz.
|
die zentrale Steuerungs- und Konnektivitätsinstanz.
|
||||||
- Das **JC-Display ist ein vollwertiges Touch-Bediengerät**, das über UART angebunden
|
- Das **P4-Display ist ein vollwertiges Touch-Bediengerät**, das über UART angebunden
|
||||||
ist und denselben Funktionsumfang bietet wie das Webinterface — aber **kein** eigenes
|
ist und denselben Funktionsumfang bietet wie das Webinterface — aber **kein** eigenes
|
||||||
WLAN/Webserver betreibt.
|
WLAN/Webserver betreibt.
|
||||||
- Das **OLED (SH1106G) bleibt optional** und wird wie bisher über ein **Compile-Flag**
|
- Das **OLED (SH1106G) bleibt optional** und wird wie bisher über ein **Compile-Flag**
|
||||||
gewählt (`ENABLE_DISPLAY`). Es ist unabhängig vom JC-Display.
|
gewählt (`ENABLE_DISPLAY`). Es ist unabhängig vom P4-Display.
|
||||||
|
|
||||||
```
|
```
|
||||||
+----------------------------+ UART (GPIO43/44) +---------------------------+
|
+----------------------------+ UART (GPIO43/44) +---------------------------+
|
||||||
@@ -34,13 +34,13 @@ Bewusste Designentscheidung (siehe Projektbesprechung):
|
|||||||
| - OLED (optional) | | ST7701 / GT911 / ES8311 |
|
| - OLED (optional) | | ST7701 / GT911 / ES8311 |
|
||||||
+----------------------------+ +---------------------------+
|
+----------------------------+ +---------------------------+
|
||||||
|
|
||||||
* Der ESP32-C6 auf dem JC-Display (WLAN/BT) wird in diesem Projekt NICHT für die
|
* Der ESP32-C6 auf dem P4-Display (WLAN/BT) wird in diesem Projekt NICHT für die
|
||||||
Maschinensteuerung benötigt. WLAN/Webinterface laufen weiterhin auf der S3.
|
Maschinensteuerung benötigt. WLAN/Webinterface laufen weiterhin auf der S3.
|
||||||
```
|
```
|
||||||
|
|
||||||
### Rollenverteilung
|
### Rollenverteilung
|
||||||
|
|
||||||
| Aufgabe | S3 (Hauptplatine) | P4 (JC-Display) |
|
| Aufgabe | S3 (Hauptplatine) | P4 (P4-Display) |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Echtzeit-Regelung (PID, SSR, Sicherheit) | **ja** | nein |
|
| Echtzeit-Regelung (PID, SSR, Sicherheit) | **ja** | nein |
|
||||||
| Sensoren (NTC, MAX6675, Waage) | **ja** | nein |
|
| Sensoren (NTC, MAX6675, Waage) | **ja** | nein |
|
||||||
@@ -76,7 +76,7 @@ schickt Bedienwünsche als Kommandos. So bleiben Web-UI, OLED und Touch-Display
|
|||||||
```
|
```
|
||||||
|
|
||||||
> **Hinweis (bewusst akzeptiert):** GPIO43/44 sind beim ESP32-S3 zugleich die Standard-
|
> **Hinweis (bewusst akzeptiert):** GPIO43/44 sind beim ESP32-S3 zugleich die Standard-
|
||||||
> Pins der seriellen Debug-Konsole (UART0). Solange das JC-Display dort angeschlossen ist,
|
> Pins der seriellen Debug-Konsole (UART0). Solange das P4-Display dort angeschlossen ist,
|
||||||
> steht die klassische serielle Debug-Ausgabe an diesen Pins nicht parallel zur Verfügung.
|
> steht die klassische serielle Debug-Ausgabe an diesen Pins nicht parallel zur Verfügung.
|
||||||
> Debug/Logging erfolgt dann über USB-CDC bzw. das Webinterface. Diese Pins wurden
|
> Debug/Logging erfolgt dann über USB-CDC bzw. das Webinterface. Diese Pins wurden
|
||||||
> ausdrücklich beibehalten, weil sie auf der Platine herausgeführt sind.
|
> ausdrücklich beibehalten, weil sie auf der Platine herausgeführt sind.
|
||||||
@@ -519,7 +519,7 @@ Für ein vollwertiges 480×800-Touch-UI fehlen v1 noch einige Daten/Funktionen.
|
|||||||
## 9. OLED-Koexistenz (Compile-Flag)
|
## 9. OLED-Koexistenz (Compile-Flag)
|
||||||
|
|
||||||
- OLED bleibt über `ENABLE_DISPLAY` (Compile-Flag) wählbar — unverändert.
|
- OLED bleibt über `ENABLE_DISPLAY` (Compile-Flag) wählbar — unverändert.
|
||||||
- Das JC-Display wird über `TOUCH_UART_ENABLED` (Compile-Flag) aktiviert.
|
- Das P4-Display wird über `TOUCH_UART_ENABLED` (Compile-Flag) aktiviert.
|
||||||
- **Geplante Änderung:** beide Flags strikt **unabhängig** halten, damit alle Kombinationen
|
- **Geplante Änderung:** beide Flags strikt **unabhängig** halten, damit alle Kombinationen
|
||||||
baubar sind:
|
baubar sind:
|
||||||
|
|
||||||
@@ -562,7 +562,7 @@ Puffergrößen/Chunking, optionaler CRC + Handshake, `action`-Stringliste dokume
|
|||||||
**Löschen:** Nichts.
|
**Löschen:** Nichts.
|
||||||
|
|
||||||
**Fully-Kiosk bleibt erhalten** (Entscheidung) — als eigenständige, optionale Funktion
|
**Fully-Kiosk bleibt erhalten** (Entscheidung) — als eigenständige, optionale Funktion
|
||||||
neben dem JC-Display. Lastbewertung der S3:
|
neben dem P4-Display. Lastbewertung der S3:
|
||||||
- Einziger Aufruf `sendFullyKioskLoadUrl()` wird **nur bei Standby-Zustandswechsel**
|
- Einziger Aufruf `sendFullyKioskLoadUrl()` wird **nur bei Standby-Zustandswechsel**
|
||||||
getriggert (`if (standbyModeActive != lastStandbyModeActive)`), **nicht periodisch**
|
getriggert (`if (standbyModeActive != lastStandbyModeActive)`), **nicht periodisch**
|
||||||
(wenige Male pro Tag).
|
(wenige Male pro Tag).
|
||||||
@@ -586,10 +586,10 @@ neben dem JC-Display. Lastbewertung der S3:
|
|||||||
6. **[offen, optional]** CRC + ggf. Puffer-Feinjustage (§8.3) — bewusst nicht als toter,
|
6. **[offen, optional]** CRC + ggf. Puffer-Feinjustage (§8.3) — bewusst nicht als toter,
|
||||||
ungetesteter Code eingebaut; bei Bedarf später.
|
ungetesteter Code eingebaut; bei Bedarf später.
|
||||||
7. **[offen, durch dich]** `TOUCH_UART_ENABLED` auf 1 setzen + Build verifizieren, **sobald**
|
7. **[offen, durch dich]** `TOUCH_UART_ENABLED` auf 1 setzen + Build verifizieren, **sobald**
|
||||||
das JC-Display physisch an Serial1 (GPIO43/44) hängt. Bewusst noch **0**, damit die
|
das P4-Display physisch an Serial1 (GPIO43/44) hängt. Bewusst noch **0**, damit die
|
||||||
serielle Debug-Konsole (GPIO43/44) im aktuellen Betrieb erhalten bleibt.
|
serielle Debug-Konsole (GPIO43/44) im aktuellen Betrieb erhalten bleibt.
|
||||||
|
|
||||||
### Phase B — P4-Seite (JC-Display, Projekt `JC_Display_Firmware/`)
|
### Phase B — P4-Seite (P4-Display, Projekt `P4_Display_Firmware/`)
|
||||||
Grundgerüst angelegt (Arduino-ESP32 P4 + LVGL 9 + ArduinoJson 7). Aufteilung:
|
Grundgerüst angelegt (Arduino-ESP32 P4 + LVGL 9 + ArduinoJson 7). Aufteilung:
|
||||||
`config.h`, `machine_state.h`, `protocol_client.*`, `ui.*`, `display_hal.*`, `.ino`, `README.md`.
|
`config.h`, `machine_state.h`, `protocol_client.*`, `ui.*`, `display_hal.*`, `.ino`, `README.md`.
|
||||||
|
|
||||||
@@ -603,7 +603,7 @@ Grundgerüst angelegt (Arduino-ESP32 P4 + LVGL 9 + ArduinoJson 7). Aufteilung:
|
|||||||
(`display_hal.cpp`, Schalter `JC_USE_REAL_PANEL`): MIPI-DSI/ST7701, GT911 (I²C SDA=7/SCL=8),
|
(`display_hal.cpp`, Schalter `JC_USE_REAL_PANEL`): MIPI-DSI/ST7701, GT911 (I²C SDA=7/SCL=8),
|
||||||
Backlight GPIO23, LCD-Reset GPIO5; LVGL-Port mit eigenem Task + Lock. Stub-Modus bleibt für
|
Backlight GPIO23, LCD-Reset GPIO5; LVGL-Port mit eigenem Task + Lock. Stub-Modus bleibt für
|
||||||
Schreibtisch-Tests. Vendor-BSP-Dateien sind in den Sketch zu kopieren (siehe Projekt-README).
|
Schreibtisch-Tests. Vendor-BSP-Dateien sind in den Sketch zu kopieren (siehe Projekt-README).
|
||||||
5. **[festgelegt]** UART-Pins am JC-Display: **P4 GPIO50 (TX) / GPIO51 (RX)** vom Expand-IO-Header
|
5. **[festgelegt]** UART-Pins am P4-Display: **P4 GPIO50 (TX) / GPIO51 (RX)** vom Expand-IO-Header
|
||||||
JP1 (Schaltplan `4_USB&IO.png`). Gegenseite S3 unverändert GPIO43/44.
|
JP1 (Schaltplan `4_USB&IO.png`). Gegenseite S3 unverändert GPIO43/44.
|
||||||
6. **[offen]** Weitere Screens: Einstellungen (Brew/Service/Sensor), Profil-Auswahl/-Editor,
|
6. **[offen]** Weitere Screens: Einstellungen (Brew/Service/Sensor), Profil-Auswahl/-Editor,
|
||||||
PID/AutoTune-Bedienung; Ausrichtung Hochformat (Rotation 0 in `pins_config.h`).
|
PID/AutoTune-Bedienung; Ausrichtung Hochformat (Rotation 0 in `pins_config.h`).
|
||||||
@@ -1,304 +0,0 @@
|
|||||||
Version 1.6.1:
|
|
||||||
- Waveshare 7" (H): Bild und Touch lassen sich um 180 Grad drehen, wenn das Panel auf dem
|
|
||||||
Kopf eingebaut ist. Schalter WS7_ROTATE_180 in pins_config.h, Vorgabe ist gedreht.
|
|
||||||
Die Drehung übernimmt der PPA-Grafikbeschleuniger des ESP32-P4 - die Software-Rotation
|
|
||||||
des LVGL-Ports rechnet nur in RGB565 und wäre für dieses Panel unbrauchbar.
|
|
||||||
- Der Touch dreht mit, sonst läge die Bedienung spiegelbildlich zum Bild.
|
|
||||||
|
|
||||||
Version 1.6.0:
|
|
||||||
- Neu: Dieselbe Firmware läuft jetzt auch auf einem Waveshare ESP32-P4-Pico mit dem
|
|
||||||
Waveshare 7inch DSI LCD (H) (1280x720). Umgeschaltet wird über „JC_PANEL_TYPE" in
|
|
||||||
config.h; WS_PANEL_7H ist ab dieser Version die Vorgabe, JC_PANEL_43 und JC_PANEL_70
|
|
||||||
bleiben unverändert verfügbar.
|
|
||||||
- Das Waveshare-Panel hängt hinter einer Bridge, die ausschließlich RGB888 annimmt. LVGL
|
|
||||||
rechnet für dieses Panel deshalb mit 24 statt 16 Bit Farbtiefe. lv_conf.h liest dazu
|
|
||||||
JC_PANEL_TYPE aus config.h, damit Sketch und LVGL-Bibliothek garantiert dieselbe
|
|
||||||
Farbtiefe benutzen; display_hal.cpp bricht den Build ab, falls sie auseinanderlaufen.
|
|
||||||
Der Panelwechsel muss aus diesem Grund in config.h erfolgen und nicht per Compiler-Flag.
|
|
||||||
- Bringup ohne Hersteller-Panel-Treiber: DSI-Bus, Kommandokanal und DPI-Panel werden direkt
|
|
||||||
angelegt. Entscheidend ist die Legacy-Referenztaktquelle PLL_F20M - mit der Standardquelle
|
|
||||||
bleibt der Bildschirm auf ESP32-P4 Rev. 1.3 / ECO2 schwarz. Die Zeitbasis (2 Lanes zu
|
|
||||||
1250 Mbit/s, 80 MHz DPI-Takt, Austastlücken 64/64/64, rund 60 Hz) steht als WS7_*-Werte
|
|
||||||
in pins_config.h und ist dort anpassbar, falls das Bild reißt.
|
|
||||||
- Panel-Freigabe und Helligkeit laufen beim Waveshare nicht über einen PWM-Pin, sondern über
|
|
||||||
Register der Bridge auf I2C-Adresse 0x45. Die Hintergrundbeleuchtung wird bewusst erst
|
|
||||||
eingeschaltet, wenn die DSI-Ausgabe steht - sonst blitzt beim Start Bildrauschen auf.
|
|
||||||
Standby-Abdunklung und „Uhrzeit im Standby" funktionieren wie bei den JC-Panels.
|
|
||||||
- Touch: Der GT9271 des Waveshare-Panels benutzt dieselbe Registerbelegung wie der GT911,
|
|
||||||
liegt aber auf I2C-Adresse 0x14 und meldet im Hochformat. X und Y werden deshalb getauscht
|
|
||||||
und auf die Bildfläche begrenzt; Ausreißer des Controllers landen nicht mehr als Klick am
|
|
||||||
Bildrand. Sollte die Bedienung spiegelverkehrt reagieren, lässt sich das mit
|
|
||||||
WS7_TOUCH_MIRROR_RAW_X / _Y in pins_config.h umdrehen.
|
|
||||||
- Der Framebuffer wächst auf 3 x 2,8 MB (rund 8,3 MB PSRAM). Auf dem P4-Pico mit 32 MB
|
|
||||||
PSRAM ist das unkritisch.
|
|
||||||
- Die UART-Pins zur Hauptplatine sind für das Waveshare-Board getrennt eingestellt, weil
|
|
||||||
dessen 40-poliger Header eine andere Belegung hat als die JC-Panels: TX = GPIO17,
|
|
||||||
RX = GPIO18 (JC-Panels unverändert TX = GPIO33, RX = GPIO31).
|
|
||||||
|
|
||||||
Version 1.5.0:
|
|
||||||
- Neu: Dieselbe Firmware unterstützt jetzt auch das 7-Zoll-Display Guition JC1060P470C-I-W
|
|
||||||
(JD9165, 1024x600) zusätzlich zum bisherigen 4,3-Zöller JC4880P443C-I-W (ST7701, 480x800).
|
|
||||||
Umgeschaltet wird über „JC_PANEL_TYPE" in config.h (JC_PANEL_43 / JC_PANEL_70) oder per
|
|
||||||
Compiler-Flag -DJC_PANEL_TYPE=70. Vorgabe bleibt das 4,3-Zoll-Panel, dessen Verhalten sich
|
|
||||||
nicht ändert.
|
|
||||||
- Panel-Treiber esp_lcd_jd9165.c/.h aus dem Hersteller-Paket übernommen; board_bringup.c legt
|
|
||||||
je nach Panel den passenden DSI-Bus, die DPI-Zeitbasis und den Herstellertreiber an.
|
|
||||||
- pins_config.h liefert Auflösung, LCD-Reset-Pin (4,3": GPIO5, 7,0": GPIO27) und Ausrichtung
|
|
||||||
panelabhängig. Das 7-Zoll-Panel ist nativ Querformat, deshalb entfällt dort die 270-Grad-
|
|
||||||
Rotation samt PPA-Beschleunigung.
|
|
||||||
- Der GT911 des 7-Zöllers meldet Rohkoordinaten im Raster 800x480 statt 1024x600. Die
|
|
||||||
Umrechnung hängt am process_coordinates-Hook von esp_lcd_touch, damit die Herstellerdatei
|
|
||||||
esp_lcd_touch_gt911.c unverändert bleibt. Ohne sie wäre nur der linke obere Bildteil
|
|
||||||
bedienbar.
|
|
||||||
- Die Oberfläche rechnet nicht mehr mit fest verdrahteten 480 Pixeln Höhe, sondern mit
|
|
||||||
DISP_VER_RES. Layout und Schriften bleiben sonst unverändert: Das Dashboard arbeitet fast
|
|
||||||
durchgehend mit Prozentmaßen, und die feineren Pixelabstände des 7-Zöllers (170 statt 213 dpi)
|
|
||||||
lassen dieselben Schriftgrößen physisch größer erscheinen.
|
|
||||||
- Die UART-Verkabelung ist bei beiden Panels gleich (P4 GPIO33 = TX, GPIO31 = RX). Beim
|
|
||||||
7-Zöller liegen diese Pins allerdings auf der FPC-Buchse FPC4 (1,0 mm, 16-polig) statt auf
|
|
||||||
einer Stiftleiste - dort wird ein Adapterkabel gebraucht.
|
|
||||||
|
|
||||||
Version 1.4.2:
|
|
||||||
- Bug-Fix: Beim Aufwecken über Antippen erschien die Auswahl „Espresso oder Cold Extraction"
|
|
||||||
manchmal nicht. Der Dialog entschied nach einer anderen Bedingung, ob er die Auswahl ANZEIGT
|
|
||||||
(verlangte zusätzlich cxArmable), als er beim Absenden benutzte, um die Rückfrage der S3 zu
|
|
||||||
UNTERDRÜCKEN. In der Lücke dazwischen zeigte er nur „Aufwecken", sendete aber „wakeEspresso" -
|
|
||||||
und damit war die Frage auch auf der S3 erledigt. Beide Stellen benutzen jetzt dieselbe Funktion
|
|
||||||
wake_choice_offered().
|
|
||||||
- Hat der Dialog die Auswahl nicht angeboten, sendet er wieder „deactivateStandby". Dann öffnet die
|
|
||||||
S3 ihr eigenes Auswahlfenster, und die Frage kommt trotzdem - derselbe Weg wie beim Aufwecken über
|
|
||||||
den Schalter. Die Auswahl kann damit nicht mehr ersatzlos entfallen.
|
|
||||||
|
|
||||||
Version 1.4.1:
|
|
||||||
- Passend zu S3 5.6.2: Die Auswahl beim Aufwecken erscheint auch dann, wenn der Cold-Extraction-Modus
|
|
||||||
bereits aktiv ist - sie geht in beide Richtungen. „Espresso" schaltet den Modus dann ab.
|
|
||||||
- Der Cold-Extraction-Knopf zeigt den Ist-Zustand: Bei aktivem Modus ist er hervorgehoben und heißt
|
|
||||||
„Cold Extraction (aktiv lassen)", sonst „Cold Extraction (Wasser bleibt kalt)".
|
|
||||||
|
|
||||||
Version 1.4.0:
|
|
||||||
- Die Auswahl „Espresso oder Cold Extraction" erscheint jetzt auch beim Aufwecken über den Schalter
|
|
||||||
(braucht S3-Firmware ab 5.6.0). Meldet die S3 ein offenes Auswahlfenster (cxWakeChoice), blendet das
|
|
||||||
Display den Dialog von sich aus ein - ohne Antippen - und zeigt die verbleibende Bedenkzeit als
|
|
||||||
Countdown. „Abbrechen" entfällt in diesem Fall, weil es nichts abzubrechen gibt: Läuft die Zeit ab,
|
|
||||||
heizt die Maschine normal auf.
|
|
||||||
- Der Espresso-Knopf sendet „wakeEspresso" statt „deactivateStandby", sobald die Auswahl relevant ist.
|
|
||||||
Damit wird die Entscheidung auf der S3 vermerkt und nicht direkt danach erneut gefragt.
|
|
||||||
- Der Cold-Extraction-Knopf beendet den Standby nur noch, wenn er überhaupt aktiv ist - im Auswahlfenster
|
|
||||||
nach dem Aufwecken schaltet er nur den Modus.
|
|
||||||
|
|
||||||
Version 1.3.0:
|
|
||||||
- Der Aufweck-Dialog wird zur Auswahl: „Womit aufwecken?" mit den Knöpfen „Espresso" (heizt normal auf)
|
|
||||||
und „Cold Extraction (Wasser bleibt kalt)". Braucht S3-Firmware ab 5.5.0.
|
|
||||||
Bei „Cold Extraction" wird erst der Modus scharf geschaltet und dann der Standby beendet, damit der
|
|
||||||
Wasserkreis nicht zwischendurch anheizt.
|
|
||||||
- Steuerbar über die neue Einstellung „Beim Aufwecken fragen" (Cold-Extraction-Seite, Abschnitt
|
|
||||||
Grundeinstellung; identisch zur Web-UI). Ist sie aus, erscheint wieder der bisherige Dialog mit
|
|
||||||
„Aufwecken" und „Abbrechen" - der Zwischenschritt entfällt dann komplett.
|
|
||||||
|
|
||||||
Version 1.2.1:
|
|
||||||
- Bug-Fix: Während einer kalten Extraktion zeigten Waage-Kachel und Live-Bezugsschirm das Zielgewicht
|
|
||||||
des normalen Espresso-Bezugs (bbwTarget) statt des Ziels der kalten Extraktion (cxTarget). Außerdem
|
|
||||||
erschienen Gewichtsanzeige und Fortschrittsbalken nur, wenn Brew-by-Weight aktiv war - bei kalter
|
|
||||||
Extraktion ist das typischerweise aus, obwohl ein Ziel existiert. Beide Anzeigen nutzen jetzt
|
|
||||||
cxTarget, sobald cxShot gesetzt ist.
|
|
||||||
|
|
||||||
Version 1.2.0:
|
|
||||||
- Neue Seite „Cold Extraction" mit eigenem Menüeintrag (braucht S3-Firmware ab 5.4.0). Dort stehen jetzt
|
|
||||||
alle Parameter der kalten Extraktion und lassen sich direkt am Display ändern: Freigabetemperatur,
|
|
||||||
Vorbenetzung (Dauer + Pumpenleistung), Hauptbezug (Pulsperiode + Pumpenleistung), Zielgewicht,
|
|
||||||
maximale Bezugsdauer sowie der Pumpenschutz. Gespeichert wird über das erweiterte saveBrew-Kommando.
|
|
||||||
- Der Modus-Schalter ist von der Temperatur-Seite auf die neue Seite umgezogen (eine Stelle statt zwei).
|
|
||||||
Der Knopf „Aufwecken mit Cold Extraction" im Standby-Dialog bleibt unverändert.
|
|
||||||
- Brew-Control-Seite neu gegliedert: Statt einer durchlaufenden Liste unter Zwischenüberschriften liegt
|
|
||||||
jede Funktion (Pre-Infusion, Brew-by-Time, Brew-by-Weight, Dampf-Timer) jetzt in einer eigenen Karte
|
|
||||||
mit Titel und einer Zeile, die erklärt, was sie tut. Die neue Cold-Extraction-Seite nutzt dieselbe
|
|
||||||
Gliederung.
|
|
||||||
- Eingabefelder werden nur beim Öffnen der Seite aus dem Zustand gefüllt, damit laufende State-Pushes
|
|
||||||
eine begonnene Eingabe nicht überschreiben (gleiches Verhalten wie auf der Brew-Control-Seite).
|
|
||||||
|
|
||||||
Version 1.1.3:
|
|
||||||
- Aufweck-Dialog hat einen dritten Knopf: „Aufwecken mit Cold Extraction" (braucht S3 ab 5.3.5).
|
|
||||||
Er stellt den Modus scharf und beendet erst danach den Standby - in dieser Reihenfolge, damit
|
|
||||||
der Wasserkreis gar nicht erst anheizt. Ohne diesen Weg musste man normal aufwecken (Maschine
|
|
||||||
heizt an) und den Modus danach umschalten. Der Knopf erscheint nur, wenn die Funktion
|
|
||||||
freigeschaltet und umschaltbar ist und der Modus nicht ohnehin schon läuft.
|
|
||||||
- Der Schalter „Cold Extraction" auf der Temperatur-Seite hängt jetzt am neuen State-Feld
|
|
||||||
cxArmable statt an cxAllowed: umschaltbar auch im Standby und bei warmem Kessel, gesperrt nur
|
|
||||||
während eines laufenden kalten Bezugs. Bei älterer S3-Firmware fällt das Feld auf cxEnabled
|
|
||||||
zurück, der Schalter bleibt also bedienbar.
|
|
||||||
- Erklärzeile im Standby: „Nach dem Aufwecken bleibt der Wasserkreis aus."
|
|
||||||
|
|
||||||
Version 1.1.2:
|
|
||||||
- Cold Extraction: Fehlt eine nutzbare Waage, weist das Display jetzt dauerhaft darauf hin.
|
|
||||||
Ohne Waage greifen weder Zielgewicht noch Stillstands-Erkennung, der Bezug endet erst nach der
|
|
||||||
maximalen Bezugsdauer (braucht S3-Firmware ab 5.3.4).
|
|
||||||
- Statuszeile: „Cold Extraction aktiv - ohne Waage, Ende nach Zeit" (gelb) statt des blauen
|
|
||||||
Normalhinweises; beim Aktivieren zusätzlich kurz die Meldung zum neuen cxNotice-Code 4.
|
|
||||||
- Erklärzeile unter dem Schalter und die Parameter-Anzeige auf der Brew-Seite ergänzen den
|
|
||||||
Hinweis; bei aktivem Modus ohne Waage nennt die Zeile die Zeit statt des Zielgewichts.
|
|
||||||
|
|
||||||
Version 1.1.1:
|
|
||||||
- Compiler-Warnungen des P4-Builds aufgeräumt (rein technisch, keine Funktionsänderung):
|
|
||||||
- „LV_FS_DEFAULT_DRIVE_LETTER is deprecated": Die Option heißt ab LVGL 9.3
|
|
||||||
LV_FS_DEFAULT_DRIVER_LETTER. Der alte Name funktionierte zwar noch, löste aber in
|
|
||||||
lv_api_map_v9_1.h ein #warning aus - und zwar in JEDER Übersetzungseinheit, die lvgl.h
|
|
||||||
einbindet. Das allein waren rund 60 Warnungen pro Build, die alles andere zugedeckt haben.
|
|
||||||
In lv_conf.h umbenannt.
|
|
||||||
- „bitwise operation between different enumeration types is deprecated": LV_PART_* und
|
|
||||||
LV_STATE_* sind in LVGL 9 zwei verschiedene Enum-Typen; sie direkt mit | zu verknüpfen ist
|
|
||||||
in C++20 abgekündigt. Neues Makro TH_SEL(part, state) in theme.h castet beide auf
|
|
||||||
lv_style_selector_t (ohnehin uint32_t). Betraf 5 Stellen in ui.cpp und theme.h.
|
|
||||||
- Bug-Fix: Der Puffer für die Cold-Extraction-Infozeile auf der Brew-Seite war mit 192 Bytes
|
|
||||||
zu klein - der Text ist rund 205 Zeichen lang (das „°" zählt als zwei Bytes), die letzte
|
|
||||||
Zeile wurde also abgeschnitten. Jetzt 256 Bytes.
|
|
||||||
|
|
||||||
Version 1.1.0:
|
|
||||||
- Cold Extraction am Display bedienbar (braucht S3-Firmware ab 5.3.2):
|
|
||||||
- Neuer Schalter „Cold Extraction" auf der Seite „Temperaturen" unter „Modi", darunter eine
|
|
||||||
Erklärzeile mit dem aktuellen Zustand bzw. dem Sperrgrund. Schalter und Zeile bleiben
|
|
||||||
unsichtbar, solange die S3 die Funktion nicht freigeschaltet meldet (auch bei älterer
|
|
||||||
S3-Firmware, die die Felder gar nicht sendet).
|
|
||||||
- Einschalten ist nur bei erteilter Freigabe möglich (Wasserkessel kalt genug, kein Standby /
|
|
||||||
Wartung / Tuning); ausschalten immer, außer während eines laufenden kalten Bezugs. Gesendet
|
|
||||||
wird gezielt startColdExtraction/stopColdExtraction statt eines Toggles, damit ein
|
|
||||||
abgewiesener Befehl den Schalter nicht in einen nie bestätigten Zustand bringt.
|
|
||||||
- Statuszeile: eigener Slot direkt hinter der Sicherheitsmeldung. Zeigt dauerhaft
|
|
||||||
„Cold Extraction aktiv - Wasserkreis heizt nicht", bei fehlender Freigabe den Grund,
|
|
||||||
während der Pumpen-Zwangspause den Pumpenschutz und transient einen abgewiesenen Start
|
|
||||||
bzw. einen Abbruch wegen fehlenden Zulaufs.
|
|
||||||
- Wasser-Kachel im Dashboard zeigt bei aktivem Modus „Cold Extraction - Heizen aus" statt
|
|
||||||
eines Sollwerts, der nicht erreicht wird; der Aufheiz-Countdown ist dann unterdrückt.
|
|
||||||
- Phasenleiste und Live-Bezugsschirm benennen die erste Phase eines kalten Bezugs
|
|
||||||
„Vorbenetzung" (keine Pause-Phase) und zeigen die Pumpenpause an.
|
|
||||||
- Brew-Seite: Cold-Extraction-Parameter als Anzeige (Freigabeschwelle, Vorbenetzung,
|
|
||||||
Zielgewicht, Timeout) mit Hinweis, dass sie in der Web-UI eingestellt werden.
|
|
||||||
- Statistik-Seite: kalte Bezüge sind mit „(kalt)" markiert und gehen nicht in die mittlere
|
|
||||||
Bezugsdauer ein - gleiche Regel wie in der S3-Statistik.
|
|
||||||
- Bug-Fix: Das Limit für eingehende UART-Zeilen (PROTO_RX_LINE_MAX) lag bei 2048 Bytes, während
|
|
||||||
die State-Zeile der S3 bereits rund 2,1 KB erreicht - mit langem Status-, Profil- oder
|
|
||||||
SSID-Text konnte sie darüber liegen. In dem Fall wurde die GANZE Zeile verworfen und das
|
|
||||||
Display fror auf dem letzten Stand ein, ohne dass die Verbindung als tot erkannt wurde.
|
|
||||||
Das Limit ist jetzt 4096 Bytes; der RX-Puffer selbst bleibt bei 2 KB reserviert, weil der
|
|
||||||
interne RAM knapp ist und eine Arduino-String nicht ins PSRAM alloziert werden kann.
|
|
||||||
|
|
||||||
Version 1.0.13:
|
|
||||||
- Profil-Schnellwahl + Anzeige des aktiven Profils (braucht S3-Firmware ab 5.1.1):
|
|
||||||
- Neuer Profil-Chip im Header (auf allen Seiten sichtbar): zeigt das zuletzt geladene bzw.
|
|
||||||
gespeicherte Profil; ein „*" hinter dem Namen bedeutet, dass seitdem profil-relevante
|
|
||||||
Einstellungen geändert wurden. Lange Namen werden gekürzt; ohne bekanntes Profil
|
|
||||||
(oder mit älterer S3-Firmware) bleibt der Chip unsichtbar.
|
|
||||||
- Antippen des Chips öffnet die Profil-Schnellwahl: ein Overlay mit allen gespeicherten
|
|
||||||
Profilen, das aktive mit Häkchen und Akzentfarbe hervorgehoben. Ein Tap lädt das Profil
|
|
||||||
direkt (Toast bestätigt, Chip aktualisiert sich mit dem nächsten State) — zwei Berührungen
|
|
||||||
vom Dashboard zum Profilwechsel statt Umweg über die Profile-Seite.
|
|
||||||
- Profile-Seite: das aktive Profil wird in der Liste mit Häkchen-Symbol und Akzentfarbe
|
|
||||||
markiert.
|
|
||||||
|
|
||||||
Version 1.0.12:
|
|
||||||
- Verlauf-Chart: Flackernde Heizleistungs-Kurven in den großen Zeitfenstern behoben. Die
|
|
||||||
Dezimierung pickte pro Chart-Punkt ein Einzelsample, dessen Abtast-Raster mit jedem
|
|
||||||
Sekundentick um eine Position wanderte — die schnell schaltende Heizleistung (PWM)
|
|
||||||
sprang dadurch sichtbar zwischen zwei Kurvenbildern hin und her. Jetzt wird über den
|
|
||||||
gesamten Zeitabschnitt eines Chart-Punkts gemittelt: das Bild steht ruhig, und die
|
|
||||||
Leistungs-Kurve zeigt die tatsächliche mittlere Heizleistung statt zufälliger
|
|
||||||
Momentwerte. Im 2-min-Fenster (1 Sample je Punkt) ändert sich nichts.
|
|
||||||
|
|
||||||
Version 1.0.11:
|
|
||||||
- Verlauf-Seite ausgebaut (nur P4, keine S3-/Protokolländerung nötig):
|
|
||||||
- Umschaltbares Zeitfenster: Buttons „2 min / 10 min / 30 min / 60 min" in der Kopfzeile.
|
|
||||||
Intern läuft eine 1-s-Historie als Ringpuffer über volle 60 Minuten; das Chart zeigt
|
|
||||||
weiterhin 120 Punkte und dezimiert je Fenster. Dadurch ist beim Fensterwechsel der
|
|
||||||
komplette Verlauf sofort da (kein leeres Chart, kein Neuaufbau). Die Wahl wird P4-lokal
|
|
||||||
im NVS gespeichert und überlebt Neustarts.
|
|
||||||
- Gestrichelte Soll-Linien für Wasser und Dampf im Chart (Farbe der jeweiligen Kurve,
|
|
||||||
gedimmt). Die Y-Skala bezieht die Soll-Werte mit ein, damit die Linien im Bild liegen —
|
|
||||||
aber nur für Kreise, deren Ist-Kurve im Fenster sichtbar ist (ein kalter Dampfkessel
|
|
||||||
zieht die Skala nicht auseinander).
|
|
||||||
- Heizleistung zuschaltbar: Button „Leistung" blendet Duty-Cycle Wasser/Dampf als gedimmte
|
|
||||||
Zusatzkurven auf einer zweiten Achse (0–100 %) ein, inkl. Live-Legende. Einstellung
|
|
||||||
ebenfalls P4-lokal im NVS.
|
|
||||||
- Feinere Kurven: Die Temperatur-Historie wird jetzt in Zehntelgrad geführt und gezeichnet
|
|
||||||
(vorher ganzzahlig gerundet) — PID-Schwingungen um ±1 °C sind damit sauber ablesbar.
|
|
||||||
- Die ~29 KB Historie liegen im PSRAM (heap_caps_malloc, wie die LVGL-Framebuffer) —
|
|
||||||
als statische Arrays sprengten sie den internen RAM (Linker: 107 % belegt).
|
|
||||||
- Shot-Zusammenfassung: Karte auf 560 px verbreitert und Spaltenabstand zwischen
|
|
||||||
Dauer/Gewicht/Flow deutlich vergrößert (28 px statt 10 px) — die drei Werte standen
|
|
||||||
zu nahe beisammen und waren schlecht lesbar.
|
|
||||||
- PID-AutoTune sichtbar gemacht: Während eines Tuning-Laufs erscheint auf der Verlauf-Seite
|
|
||||||
eine Live-Karte (mit Spinner) — je Kreis Laufzeit, aktuelle Phase (heizt/kühlt ab) und
|
|
||||||
Schwingungshub samt Mittelpunkt (Min/Max der Ist-Temperatur seit Start). Nach dem Ende
|
|
||||||
zeigt die Karte ~30 s das Ergebnis (Erfolg/Abbruch samt Grund, farbcodiert). Die
|
|
||||||
PID-Tuning-Meldung in der Statuszeile ist jetzt antippbar und springt zur Verlauf-Seite,
|
|
||||||
wo die Schwingung auch als Kurve zu sehen ist.
|
|
||||||
|
|
||||||
Version 1.0.10:
|
|
||||||
- Live-Bezugsschirm (abschaltbar): Beim Start eines echten Bezugs blendet sich ein Vollbild-Overlay
|
|
||||||
weich ein — große Bezugszeit, Live-Gewicht und Flow samt Flow-Verlaufskurve der letzten 30 Sekunden
|
|
||||||
(nur bei verbundener Waage), Fortschrittsbalken Richtung Zielgewicht (Brew-by-Weight) bzw. Zielzeit
|
|
||||||
(Brew-by-Time) und Pre-Infusion-Phasenhinweis mit Restzeit. Über das X oben rechts für den laufenden
|
|
||||||
Bezug schließbar; beim nächsten Bezug erscheint er wieder. Ein/Aus-Schalter auf der Info-Seite unter
|
|
||||||
„Darstellung", die Einstellung wird P4-lokal im NVS gespeichert und überlebt Neustarts. Während
|
|
||||||
Flush und Reinigungsassistent erscheint das Overlay bewusst nicht.
|
|
||||||
- Shot-Zusammenfassung aufgewertet: Die Karte nach Bezugsende blendet jetzt weich ein/aus (Fade),
|
|
||||||
wirft einen Schlagschatten und zeigt Dauer, Endgewicht und mittleren Flow als große Werte mit
|
|
||||||
gedimmter Beschriftung statt reiner Textzeilen (Gewicht/Flow nur bei aktiver Waage).
|
|
||||||
- Pre-Infusion-Phasenanzeige auf dem Dashboard: Während eines Bezugs mit aktiver Pre-Infusion zeigt
|
|
||||||
eine Schrittleiste die Phasen „Pre-Infusion → Pause → Extraktion" an — erledigte Schritte mit Haken,
|
|
||||||
die aktive Phase hervorgehoben (Gold) inkl. Restzeit-Countdown (100-ms-Takt). Die aktive Phase kommt
|
|
||||||
quelltreu von der S3 (neues State-Feld "piState", ab S3-Firmware 5.0.12); bei älterer S3-Firmware wird
|
|
||||||
sie zeitbasiert aus den konfigurierten Phasendauern abgeleitet. Ist keine Pause konfiguriert (0 s),
|
|
||||||
wird der Pause-Schritt ausgeblendet.
|
|
||||||
- Temperatur-Seite: Solltemperaturen für Wasser und Dampf werden jetzt über radiale Drehregler (Arc,
|
|
||||||
270°) mit großem Wert mittig und −/+-Feinjustage eingestellt. Gesendet wird entprellt (nach kurzer
|
|
||||||
Bedienpause bzw. sofort beim Loslassen des Reglers oder Verlassen der Seite), damit Drag-Gesten die
|
|
||||||
S3 nicht mit setTemp-Kommandos und EEPROM-Schreibzugriffen fluten. Tippen in die Reglermitte löst
|
|
||||||
bewusst keinen Wertsprung aus (ADV_HITTEST: nur Ring/Griff reagieren).
|
|
||||||
- Dashboard-Feinschliff (nur P4, keine S3-/Protokolländerung nötig):
|
|
||||||
- Weiche Temperatur-Zustandsfarben: Der große Ist-Wert färbt sich stufenlos über den Abstand
|
|
||||||
zum Soll (kontinuierliche Farbinterpolation statt harter Stufen) — Blau beim Aufheizen,
|
|
||||||
Gold kurz vor dem Ziel, Grün im Zielband (±0,5 °C), Richtung Warngelb bei deutlichem
|
|
||||||
Überschwinger. Dazu neue „BEREIT"-Pille im Header (auf allen Seiten sichtbar), wenn der
|
|
||||||
Wasserkessel — und der Dampfkessel, sofern er heizt — im Zielband liegt, kein Fehler/
|
|
||||||
Standby/Eco aktiv ist und kein Aufheiz-Countdown läuft; mit Hysterese gegen Flackern
|
|
||||||
an der Bandgrenze, erscheint und verschwindet weich (Fade).
|
|
||||||
- Umschaltbares Temperatur-Design: Die Dashboard-Temperaturanzeige gibt es jetzt in fünf
|
|
||||||
Varianten — „Klassisch" (bisherige Karten mit Prozentbalken), „Instrumente" (freistehende
|
|
||||||
Rundinstrumente im Manometer-Look: Metall-Bezel mit Verlauf und Schlagschatten für eine
|
|
||||||
leichte 3D-Wirkung, 270°-Bogen füllt sich in der Zustandsfarbe, Soll-Wert in der
|
|
||||||
Bogen-Lücke), „Minimal" (komplett rahmenlos, nur große Werte mit dünner Ist/Soll-Linie),
|
|
||||||
„Soft-3D" (Neumorph: Fläche fast im Hintergrundton wirkt herausgedrückt — dunkler
|
|
||||||
Schatten unten rechts, heller Lichtschein oben links, eingelassener Balken) und
|
|
||||||
„Thermometer" (vertikale Säulen, die sich von unten in der Zustandsfarbe füllen, mit
|
|
||||||
Glanzstreifen als Glas-Effekt und rundem Kolben unten). Außer bei „Klassisch" folgt
|
|
||||||
auch die Füllfarbe von Balken/Bogen/Säule stufenlos der Zustandsfarbe des Ist-Werts.
|
|
||||||
Umschalter auf der Info-Seite unter „Darstellung"; die Wahl wird P4-lokal im NVS
|
|
||||||
gespeichert und überlebt Neustarts. Standard: Instrumente.
|
|
||||||
- Konsolidierte Statuszeile: Die sechs gestapelten Dashboard-Banner (Sicherheit, Dampf,
|
|
||||||
Reinigung, PID-Tuning, Wartung, Aufheiz-Countdown) teilen sich jetzt EINE feste einzeilige
|
|
||||||
Meldung — mehrere aktive Hinweise rotieren alle 4 s weich durch (Fade) statt das Layout
|
|
||||||
zu verschieben, Priorität Rot > Gelb > Blau. Wartungs- und Reinigungsmeldung bleiben
|
|
||||||
antippbar (Serviceseite bzw. Reinigungs-Sub-Screen), Überlängen laufen als Laufschrift durch.
|
|
||||||
|
|
||||||
Version 1.0.9:
|
|
||||||
- Weiche Übergänge (dezente Fade-Animationen) hinzugefügt:
|
|
||||||
- Start-Animation: Boot-Splash mit Logo, Untertitel, Lade-Spinner ("Verbinde mit Maschine...")
|
|
||||||
und Firmware-Stand; blendet sich beim Start weich ein und beim ersten State von der S3
|
|
||||||
(Verbindung steht) wieder aus.
|
|
||||||
- Einschlaf-Animation: Die Standby-Uhr wird beim Wechsel in den Standby weich eingeblendet.
|
|
||||||
- Aufweck-Animation: Beim Aufwecken blendet das Standby-Overlay weich aus und gibt das
|
|
||||||
Dashboard frei.
|
|
||||||
- Umsetzung speicher-neutral über das 'opa'-Style (kein opa_layered/Vollbild-Puffer), um den
|
|
||||||
LVGL-Speicherpool nicht zu belasten. Bei ausgeschalteter Standby-Uhr (Display aus) gibt es
|
|
||||||
weiterhin keine Einschlaf-Animation (schwarzer Bildschirm bietet keine Anzeigefläche).
|
|
||||||
|
|
||||||
Version 1.0.8:
|
|
||||||
- Statistik-Seite hinzugefügt
|
|
||||||
|
|
||||||
Version 1.0.7:
|
|
||||||
- Brew-by-Weight-Gewichtseingabelimit auf 150g erhöht, um auch Heißwasserbzug für Americano oder ähnliches via BBW zu ermöglichen
|
|
||||||
|
|
||||||
Version 1.0.6:
|
|
||||||
- Boot-Loop-Schutz implementiert:
|
|
||||||
P4-Boot-Loop-Schutz + „Update-Modus", der den UART-OTA offenhält.
|
|
||||||
Wenn die P4-Firmware in eine Absturzschleife läuft, erkennt sie das (RTC-Zähler wie beim S3) und
|
|
||||||
startet in einen abgespeckten Modus, der bewusst das riskanteste überspringt — vor allem die Display-/LVGL-Init (der wahrscheinlichste P4-Absturzgrund, siehe unser LVGL-Mem-Pool-Thema) — und nur den UART-Empfang + OTA-Receiver laufen lässt. Dann kann der S3 die P4-Firmware jederzeit per UART neu flashen, auch wenn die normale P4-Oberfläche kaputt ist. (Optional: eine ganz simple statische „Update-Modus"-Bildschirmmeldung, falls das Panel-Bringup als sicher genug gilt.)
|
|
||||||
@@ -1,428 +0,0 @@
|
|||||||
// =====================================================================================
|
|
||||||
// board_bringup.c - ESP32-P4 Hardware-Bringup
|
|
||||||
// JC_PANEL_43 = JC4880P443C-I-W (ST7701, 480x800, GT911)
|
|
||||||
// JC_PANEL_70 = JC1060P470C-I-W (JD9165, 1024x600, GT911)
|
|
||||||
// WS_PANEL_7H = Waveshare ESP32-P4-Pico + 7inch DSI LCD (H) (1280x720, GT9271)
|
|
||||||
// =====================================================================================
|
|
||||||
// BEWUSST eine .c-Datei (wird als C kompiliert): die esp_lcd-Init-Makros nutzen
|
|
||||||
// Compound-Literals und Out-of-Order-Designated-Initializer, die in C++ (Arduino .cpp)
|
|
||||||
// zu Fehlern fuehren. Der Ablauf ist 1:1 aus dem Hersteller-Beispiel
|
|
||||||
// arduino_examples/lvgl_v9_sw_rotation/lvgl_sw_rotation.c uebernommen - lediglich der
|
|
||||||
// Demo-Aufruf (lv_demo_widgets) entfaellt; das UI wird ueber display_hal.cpp aufgebaut.
|
|
||||||
//
|
|
||||||
// Nur aktiv bei JC_USE_REAL_PANEL == 1. Erwartet die Vendor-BSP-Dateien im Sketch:
|
|
||||||
// pins_config.h, lvgl_port_v9.h/.c, src/lcd/*, src/touch/*
|
|
||||||
// =====================================================================================
|
|
||||||
|
|
||||||
#include "config.h" // liefert JC_USE_REAL_PANEL (C-sicher)
|
|
||||||
|
|
||||||
#if JC_USE_REAL_PANEL
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "freertos/FreeRTOS.h"
|
|
||||||
#include "freertos/task.h"
|
|
||||||
#include "driver/gpio.h"
|
|
||||||
#include "driver/ledc.h"
|
|
||||||
#include "driver/i2c_master.h"
|
|
||||||
#include "esp_log.h"
|
|
||||||
#include "esp_cache.h"
|
|
||||||
#include "esp_ldo_regulator.h"
|
|
||||||
#include "esp_lcd_panel_io.h"
|
|
||||||
#include "esp_lcd_panel_ops.h"
|
|
||||||
#include "esp_lcd_mipi_dsi.h"
|
|
||||||
#include "src/touch/esp_lcd_touch_gt911.h"
|
|
||||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
||||||
// Das Waveshare-Panel braucht keinen Hersteller-Panel-Treiber: es wird direkt als
|
|
||||||
// DPI-Panel angelegt und mit den drei Standard-DCS-Befehlen geweckt.
|
|
||||||
#include "hal/mipi_dsi_types.h"
|
|
||||||
#elif JC_PANEL_TYPE == JC_PANEL_70
|
|
||||||
#include "src/lcd/esp_lcd_jd9165.h"
|
|
||||||
#else
|
|
||||||
#include "src/lcd/esp_lcd_st7701.h"
|
|
||||||
#endif
|
|
||||||
#include "pins_config.h"
|
|
||||||
#include "lvgl_port_v9.h"
|
|
||||||
|
|
||||||
#define BSP_MIPI_DSI_PHY_PWR_LDO_CHAN (3)
|
|
||||||
#define BSP_MIPI_DSI_PHY_PWR_LDO_VOLTAGE_MV (2500)
|
|
||||||
#define BSP_LCD_H_RES (LCD_H_RES) // native Panel-Aufloesung
|
|
||||||
#define BSP_LCD_V_RES (LCD_V_RES)
|
|
||||||
#define BSP_I2C_NUM (I2C_NUM_1)
|
|
||||||
#define BSP_I2C_SDA (GPIO_NUM_7)
|
|
||||||
#define BSP_I2C_SCL (GPIO_NUM_8)
|
|
||||||
#define BSP_LCD_TOUCH_RST (GPIO_NUM_NC)
|
|
||||||
#define BSP_LCD_TOUCH_INT (GPIO_NUM_NC)
|
|
||||||
#define BSP_LCD_RST ((gpio_num_t)LCD_RST)
|
|
||||||
#define BSP_LCD_BACKLIGHT ((gpio_num_t)LCD_LED)
|
|
||||||
#define LCD_LEDC_CH LEDC_CHANNEL_0
|
|
||||||
|
|
||||||
// Bytes je Pixel im Framebuffer. Das Waveshare-Panel laeuft in RGB888 (LVGL ebenfalls,
|
|
||||||
// siehe lv_conf.h), die JC-Panels in RGB565.
|
|
||||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
||||||
#define BSP_LCD_FB_BYTES_PER_PX (3)
|
|
||||||
#else
|
|
||||||
#define BSP_LCD_FB_BYTES_PER_PX (2)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static i2c_master_bus_handle_t s_i2c_handle = NULL;
|
|
||||||
|
|
||||||
// =====================================================================================
|
|
||||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
||||||
// =====================================================================================
|
|
||||||
// Waveshare 7inch DSI LCD (H): Panel-Freigabe und Helligkeit haengen an einer Bridge
|
|
||||||
// auf I2C-Adresse 0x45 - es gibt weder einen Reset- noch einen Backlight-GPIO.
|
|
||||||
// Registerfolge wie im Linux-Treiber:
|
|
||||||
// Grundinitialisierung: C0=01, C2=01, AC=01 (vor dem DSI-Bringup)
|
|
||||||
// Freigabe/Helligkeit: AD=01, AB=255-Helligkeit, AA=01 (ERST wenn DSI laeuft,
|
|
||||||
// sonst bleibt das Bild dunkel bzw. flackert beim Start)
|
|
||||||
// =====================================================================================
|
|
||||||
static i2c_master_dev_handle_t s_bridge_handle = NULL;
|
|
||||||
|
|
||||||
static void ws7_bridge_write(uint8_t reg, uint8_t value)
|
|
||||||
{
|
|
||||||
if (s_bridge_handle == NULL) return;
|
|
||||||
uint8_t buf[2] = { reg, value };
|
|
||||||
i2c_master_transmit(s_bridge_handle, buf, sizeof(buf), 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bridge am I2C-Bus anmelden und Grundinitialisierung schreiben. Muss VOR dem
|
|
||||||
// DSI-Bringup laufen; die Hintergrundbeleuchtung bleibt dabei noch aus.
|
|
||||||
static void ws7_bridge_pre_init(void)
|
|
||||||
{
|
|
||||||
i2c_device_config_t dev_cfg = {
|
|
||||||
.dev_addr_length = I2C_ADDR_BIT_LEN_7,
|
|
||||||
.device_address = WS7_BRIDGE_I2C_ADDR,
|
|
||||||
.scl_speed_hz = 100000,
|
|
||||||
};
|
|
||||||
if (i2c_master_bus_add_device(s_i2c_handle, &dev_cfg, &s_bridge_handle) != ESP_OK) {
|
|
||||||
s_bridge_handle = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ws7_bridge_write(0xC0, 0x01);
|
|
||||||
ws7_bridge_write(0xC2, 0x01);
|
|
||||||
ws7_bridge_write(0xAC, 0x01);
|
|
||||||
}
|
|
||||||
|
|
||||||
void jc_backlight_init(void)
|
|
||||||
{
|
|
||||||
// Nichts zu tun - die Bridge uebernimmt das, siehe ws7_bridge_pre_init().
|
|
||||||
}
|
|
||||||
|
|
||||||
void jc_backlight_set(int percent)
|
|
||||||
{
|
|
||||||
if (percent > 100) percent = 100;
|
|
||||||
if (percent < 0) percent = 0;
|
|
||||||
uint8_t brightness = (uint8_t)((255 * percent) / 100);
|
|
||||||
ws7_bridge_write(0xAD, 0x01); // Panel-/Backlight-Freigabe
|
|
||||||
ws7_bridge_write(0xAB, (uint8_t)(255 - brightness));
|
|
||||||
ws7_bridge_write(0xAA, 0x01); // Helligkeit uebernehmen
|
|
||||||
}
|
|
||||||
|
|
||||||
// =====================================================================================
|
|
||||||
#else // JC-Panels: Hintergrundbeleuchtung als LEDC-PWM an einem GPIO
|
|
||||||
// =====================================================================================
|
|
||||||
void jc_backlight_init(void)
|
|
||||||
{
|
|
||||||
const ledc_channel_config_t ch = {
|
|
||||||
.gpio_num = BSP_LCD_BACKLIGHT,
|
|
||||||
.speed_mode = LEDC_LOW_SPEED_MODE,
|
|
||||||
.channel = LCD_LEDC_CH,
|
|
||||||
.intr_type = LEDC_INTR_DISABLE,
|
|
||||||
.timer_sel = 1,
|
|
||||||
.duty = 0,
|
|
||||||
.hpoint = 0
|
|
||||||
};
|
|
||||||
const ledc_timer_config_t tm = {
|
|
||||||
.speed_mode = LEDC_LOW_SPEED_MODE,
|
|
||||||
.duty_resolution = LEDC_TIMER_10_BIT,
|
|
||||||
.timer_num = 1,
|
|
||||||
.freq_hz = 5000,
|
|
||||||
.clk_cfg = LEDC_AUTO_CLK
|
|
||||||
};
|
|
||||||
ledc_timer_config(&tm);
|
|
||||||
ledc_channel_config(&ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
void jc_backlight_set(int percent)
|
|
||||||
{
|
|
||||||
if (percent > 100) percent = 100;
|
|
||||||
if (percent < 0) percent = 0;
|
|
||||||
uint32_t duty = (1023 * percent) / 100;
|
|
||||||
ledc_set_duty(LEDC_LOW_SPEED_MODE, LCD_LEDC_CH, duty);
|
|
||||||
ledc_update_duty(LEDC_LOW_SPEED_MODE, LCD_LEDC_CH);
|
|
||||||
}
|
|
||||||
#endif // JC_PANEL_TYPE == WS_PANEL_7H
|
|
||||||
|
|
||||||
IRAM_ATTR static bool on_vsync(esp_lcd_panel_handle_t panel,
|
|
||||||
esp_lcd_dpi_panel_event_data_t *edata, void *ctx)
|
|
||||||
{
|
|
||||||
return lvgl_port_notify_lcd_vsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
||||||
// Der GT9271 des Waveshare-Panels meldet im Hochformat (Roh-X 0..720, Roh-Y 0..1280),
|
|
||||||
// das Bild laeuft aber im Querformat 1280x720. Achsentausch (und bei Bedarf Spiegelung)
|
|
||||||
// deshalb ueber den process_coordinates-Hook, der VOR den swap/mirror-Flags von
|
|
||||||
// esp_lcd_touch greift - deren Flags rechnen mit x_max/y_max des BILDES und wuerden auf
|
|
||||||
// den Rohwerten falsche Ergebnisse liefern.
|
|
||||||
static void ws7_touch_map(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y,
|
|
||||||
uint16_t *strength, uint8_t *point_num, uint8_t max_point_num)
|
|
||||||
{
|
|
||||||
(void)tp; (void)strength; (void)max_point_num;
|
|
||||||
if (point_num == NULL) return;
|
|
||||||
for (uint8_t i = 0; i < *point_num; i++) {
|
|
||||||
uint16_t raw_x = x[i];
|
|
||||||
uint16_t raw_y = y[i];
|
|
||||||
#if WS7_TOUCH_MIRROR_RAW_X
|
|
||||||
raw_x = (raw_x > WS7_TOUCH_RAW_X_MAX) ? 0 : (uint16_t)(WS7_TOUCH_RAW_X_MAX - raw_x);
|
|
||||||
#endif
|
|
||||||
#if WS7_TOUCH_MIRROR_RAW_Y
|
|
||||||
raw_y = (raw_y > WS7_TOUCH_RAW_Y_MAX) ? 0 : (uint16_t)(WS7_TOUCH_RAW_Y_MAX - raw_y);
|
|
||||||
#endif
|
|
||||||
// Achsentausch + Begrenzung auf die Bildflaeche (der GT9271 liefert vereinzelt
|
|
||||||
// Ausreisser, die sonst als Klick am Rand ankaemen).
|
|
||||||
uint16_t px = (raw_y >= LCD_H_RES) ? (LCD_H_RES - 1) : raw_y;
|
|
||||||
uint16_t py = (raw_x >= LCD_V_RES) ? (LCD_V_RES - 1) : raw_x;
|
|
||||||
#if WS7_ROTATE_180
|
|
||||||
// Bild wird um 180 Grad gedreht ausgegeben -> Touch muss mitdrehen.
|
|
||||||
px = (uint16_t)(LCD_H_RES - 1 - px);
|
|
||||||
py = (uint16_t)(LCD_V_RES - 1 - py);
|
|
||||||
#endif
|
|
||||||
x[i] = px;
|
|
||||||
y[i] = py;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if JC_PANEL_TYPE == JC_PANEL_70
|
|
||||||
// Der GT911 des 7,0"-Panels liefert Rohkoordinaten im Raster 800x480 (nicht 1024x600).
|
|
||||||
// Ohne Umrechnung waere nur das linke obere Rechteck erreichbar. Das Hersteller-Beispiel
|
|
||||||
// skaliert dafuer im Touch-Treiber; hier ueber den vorgesehenen process_coordinates-Hook,
|
|
||||||
// damit die Vendor-Datei esp_lcd_touch_gt911.c unveraendert bleibt.
|
|
||||||
#define JC_TOUCH_RAW_H_RES (800)
|
|
||||||
#define JC_TOUCH_RAW_V_RES (480)
|
|
||||||
|
|
||||||
static void jc_touch_scale(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y,
|
|
||||||
uint16_t *strength, uint8_t *point_num, uint8_t max_point_num)
|
|
||||||
{
|
|
||||||
(void)tp; (void)strength; (void)max_point_num;
|
|
||||||
if (point_num == NULL) return;
|
|
||||||
for (uint8_t i = 0; i < *point_num; i++) {
|
|
||||||
x[i] = (uint16_t)(((uint32_t)x[i] * LCD_H_RES) / JC_TOUCH_RAW_H_RES);
|
|
||||||
y[i] = (uint16_t)(((uint32_t)y[i] * LCD_V_RES) / JC_TOUCH_RAW_V_RES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Bringt Panel + Touch + LVGL-Port hoch (LVGL laeuft danach in eigenem Task).
|
|
||||||
void jc_board_bringup(void)
|
|
||||||
{
|
|
||||||
jc_backlight_init();
|
|
||||||
|
|
||||||
i2c_master_bus_config_t i2c_bus_conf = {
|
|
||||||
.clk_source = I2C_CLK_SRC_DEFAULT,
|
|
||||||
.sda_io_num = BSP_I2C_SDA,
|
|
||||||
.scl_io_num = BSP_I2C_SCL,
|
|
||||||
.i2c_port = BSP_I2C_NUM,
|
|
||||||
};
|
|
||||||
i2c_new_master_bus(&i2c_bus_conf, &s_i2c_handle);
|
|
||||||
|
|
||||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
||||||
// Bridge des Waveshare-Panels vorbereiten (noch ohne Hintergrundbeleuchtung).
|
|
||||||
ws7_bridge_pre_init();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static esp_ldo_channel_handle_t phy_pwr_chan = NULL;
|
|
||||||
esp_ldo_channel_config_t ldo_cfg = {
|
|
||||||
.chan_id = BSP_MIPI_DSI_PHY_PWR_LDO_CHAN,
|
|
||||||
.voltage_mv = BSP_MIPI_DSI_PHY_PWR_LDO_VOLTAGE_MV,
|
|
||||||
};
|
|
||||||
esp_ldo_acquire_channel(&ldo_cfg, &phy_pwr_chan);
|
|
||||||
|
|
||||||
esp_lcd_dsi_bus_handle_t mipi_dsi_bus;
|
|
||||||
esp_lcd_panel_io_handle_t io = NULL;
|
|
||||||
esp_lcd_panel_handle_t disp_panel = NULL;
|
|
||||||
|
|
||||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
||||||
// ---------------- Waveshare 7inch DSI LCD (H) (1280x720) ----------------
|
|
||||||
// Kein Hersteller-Panel-Treiber: DSI-Bus, DBI-Kommandokanal und DPI-Panel werden
|
|
||||||
// direkt angelegt. Entscheidend ist die Referenztaktquelle PLL_F20M - mit der
|
|
||||||
// Standardquelle bleibt das Bild auf ESP32-P4 Rev. 1.3 / ECO2 schwarz.
|
|
||||||
esp_lcd_dsi_bus_config_t bus_config = {
|
|
||||||
.bus_id = 0,
|
|
||||||
.num_data_lanes = WS7_DSI_LANES,
|
|
||||||
.phy_clk_src = MIPI_DSI_PHY_PLLREF_CLK_SRC_PLL_F20M,
|
|
||||||
.lane_bit_rate_mbps = WS7_DSI_LANE_MBPS,
|
|
||||||
};
|
|
||||||
esp_lcd_new_dsi_bus(&bus_config, &mipi_dsi_bus);
|
|
||||||
|
|
||||||
esp_lcd_dbi_io_config_t dbi_config = {
|
|
||||||
.virtual_channel = 0,
|
|
||||||
.lcd_cmd_bits = 8,
|
|
||||||
.lcd_param_bits = 8,
|
|
||||||
};
|
|
||||||
esp_lcd_new_panel_io_dbi(mipi_dsi_bus, &dbi_config, &io);
|
|
||||||
|
|
||||||
esp_lcd_dpi_panel_config_t dpi_config = {
|
|
||||||
.virtual_channel = 0,
|
|
||||||
.dpi_clk_src = MIPI_DSI_DPI_CLK_SRC_DEFAULT,
|
|
||||||
.dpi_clock_freq_mhz = WS7_DPI_CLOCK_MHZ,
|
|
||||||
.pixel_format = LCD_COLOR_PIXEL_FORMAT_RGB888,
|
|
||||||
.num_fbs = LVGL_PORT_LCD_BUFFER_NUMS,
|
|
||||||
.video_timing = {
|
|
||||||
.h_size = BSP_LCD_H_RES,
|
|
||||||
.v_size = BSP_LCD_V_RES,
|
|
||||||
.hsync_back_porch = WS7_HSYNC_BACK,
|
|
||||||
.hsync_pulse_width = WS7_HSYNC_PULSE,
|
|
||||||
.hsync_front_porch = WS7_HSYNC_FRONT,
|
|
||||||
.vsync_back_porch = WS7_VSYNC_BACK,
|
|
||||||
.vsync_pulse_width = WS7_VSYNC_PULSE,
|
|
||||||
.vsync_front_porch = WS7_VSYNC_FRONT,
|
|
||||||
},
|
|
||||||
.flags = {
|
|
||||||
.use_dma2d = true,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
esp_lcd_new_panel_dpi(mipi_dsi_bus, &dpi_config, &disp_panel);
|
|
||||||
|
|
||||||
// Panel wecken (MADCTL / Sleep Out / Display On). Ein Reset gibt es hier nicht:
|
|
||||||
// ein reines DPI-Panel kennt keine reset-Funktion, esp_lcd_panel_reset() wuerde
|
|
||||||
// ins Leere greifen.
|
|
||||||
{
|
|
||||||
uint8_t zero = 0x00;
|
|
||||||
uint8_t madctl = WS7_MADCTL;
|
|
||||||
esp_lcd_panel_io_tx_param(io, 0x36, &madctl, 1); // MADCTL
|
|
||||||
esp_lcd_panel_io_tx_param(io, 0x11, &zero, 1); // Sleep Out
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(120));
|
|
||||||
esp_lcd_panel_io_tx_param(io, 0x29, &zero, 1); // Display On
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(20));
|
|
||||||
}
|
|
||||||
esp_lcd_panel_init(disp_panel); // DPI-Videoausgabe starten
|
|
||||||
#elif JC_PANEL_TYPE == JC_PANEL_70
|
|
||||||
// ---------------- 7,0" JD9165 (1024x600) ----------------
|
|
||||||
esp_lcd_dsi_bus_config_t bus_config = JD9165_PANEL_BUS_DSI_2CH_CONFIG();
|
|
||||||
esp_lcd_new_dsi_bus(&bus_config, &mipi_dsi_bus);
|
|
||||||
|
|
||||||
esp_lcd_dbi_io_config_t dbi_config = JD9165_PANEL_IO_DBI_CONFIG();
|
|
||||||
esp_lcd_new_panel_io_dbi(mipi_dsi_bus, &dbi_config, &io);
|
|
||||||
|
|
||||||
esp_lcd_dpi_panel_config_t dpi_config = JD9165_1024_600_PANEL_60HZ_DPI_CONFIG(LCD_COLOR_PIXEL_FORMAT_RGB565);
|
|
||||||
dpi_config.num_fbs = LVGL_PORT_LCD_BUFFER_NUMS;
|
|
||||||
|
|
||||||
jd9165_vendor_config_t vendor_config = {
|
|
||||||
.mipi_config = {
|
|
||||||
.dsi_bus = mipi_dsi_bus,
|
|
||||||
.dpi_config = &dpi_config,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
esp_lcd_panel_dev_config_t lcd_dev_config = {
|
|
||||||
.bits_per_pixel = 16,
|
|
||||||
.rgb_ele_order = ESP_LCD_COLOR_SPACE_RGB,
|
|
||||||
.reset_gpio_num = BSP_LCD_RST,
|
|
||||||
.vendor_config = &vendor_config,
|
|
||||||
};
|
|
||||||
esp_lcd_new_panel_jd9165(io, &lcd_dev_config, &disp_panel);
|
|
||||||
#else
|
|
||||||
// ---------------- 4,3" ST7701 (480x800) ----------------
|
|
||||||
esp_lcd_dsi_bus_config_t bus_config = ST7701_PANEL_BUS_DSI_2CH_CONFIG();
|
|
||||||
esp_lcd_new_dsi_bus(&bus_config, &mipi_dsi_bus);
|
|
||||||
|
|
||||||
esp_lcd_dbi_io_config_t dbi_config = ST7701_PANEL_IO_DBI_CONFIG();
|
|
||||||
esp_lcd_new_panel_io_dbi(mipi_dsi_bus, &dbi_config, &io);
|
|
||||||
|
|
||||||
esp_lcd_dpi_panel_config_t dpi_config = ST7701_480_360_PANEL_60HZ_DPI_CONFIG(LCD_COLOR_PIXEL_FORMAT_RGB565);
|
|
||||||
dpi_config.num_fbs = LVGL_PORT_LCD_BUFFER_NUMS;
|
|
||||||
|
|
||||||
st7701_vendor_config_t vendor_config = {
|
|
||||||
.mipi_config = {
|
|
||||||
.dsi_bus = mipi_dsi_bus,
|
|
||||||
.dpi_config = &dpi_config,
|
|
||||||
},
|
|
||||||
.flags = {
|
|
||||||
.use_mipi_interface = 1,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
esp_lcd_panel_dev_config_t lcd_dev_config = {
|
|
||||||
.bits_per_pixel = 16,
|
|
||||||
.rgb_ele_order = ESP_LCD_COLOR_SPACE_RGB,
|
|
||||||
.reset_gpio_num = BSP_LCD_RST,
|
|
||||||
.vendor_config = &vendor_config,
|
|
||||||
};
|
|
||||||
esp_lcd_new_panel_st7701(io, &lcd_dev_config, &disp_panel);
|
|
||||||
#endif
|
|
||||||
#if JC_PANEL_TYPE != WS_PANEL_7H
|
|
||||||
esp_lcd_panel_reset(disp_panel);
|
|
||||||
esp_lcd_panel_init(disp_panel);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Alle Framebuffer einmal auf Schwarz loeschen. Im Avoid-Tear-Direct-Mode (mehrere
|
|
||||||
// Buffer) kopiert LVGL pro Frame nur die geaenderten Bereiche in den naechsten Buffer;
|
|
||||||
// bis alle Buffer einmal vollstaendig bemalt sind, wuerde sonst uninitialisierter
|
|
||||||
// Speicher (weisses Rauschen) durchblitzen. Schwarz faellt gegen das dunkle Theme
|
|
||||||
// nicht auf. Cache-Writeback noetig, da die Buffer im PSRAM liegen und der DMA liest.
|
|
||||||
{
|
|
||||||
void *fbs[3] = { NULL, NULL, NULL };
|
|
||||||
size_t fb_size = (size_t)BSP_LCD_H_RES * BSP_LCD_V_RES * BSP_LCD_FB_BYTES_PER_PX;
|
|
||||||
#if LVGL_PORT_LCD_BUFFER_NUMS >= 3
|
|
||||||
esp_lcd_dpi_panel_get_frame_buffer(disp_panel, 3, &fbs[0], &fbs[1], &fbs[2]);
|
|
||||||
#elif LVGL_PORT_LCD_BUFFER_NUMS == 2
|
|
||||||
esp_lcd_dpi_panel_get_frame_buffer(disp_panel, 2, &fbs[0], &fbs[1]);
|
|
||||||
#else
|
|
||||||
esp_lcd_dpi_panel_get_frame_buffer(disp_panel, 1, &fbs[0]);
|
|
||||||
#endif
|
|
||||||
for (int i = 0; i < 3; i++) {
|
|
||||||
if (fbs[i]) {
|
|
||||||
memset(fbs[i], 0, fb_size);
|
|
||||||
esp_cache_msync(fbs[i], fb_size, ESP_CACHE_MSYNC_FLAG_DIR_C2M);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_lcd_dpi_panel_event_callbacks_t cbs = {
|
|
||||||
#if LVGL_PORT_AVOID_TEAR_MODE
|
|
||||||
.on_refresh_done = on_vsync,
|
|
||||||
#else
|
|
||||||
.on_color_trans_done = on_vsync,
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
esp_lcd_dpi_panel_register_event_callbacks(disp_panel, &cbs, NULL);
|
|
||||||
|
|
||||||
esp_lcd_panel_io_handle_t tp_io_handle = NULL;
|
|
||||||
esp_lcd_touch_handle_t tp_handle;
|
|
||||||
esp_lcd_panel_io_i2c_config_t tp_io_config = ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG();
|
|
||||||
tp_io_config.scl_speed_hz = 100000;
|
|
||||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
||||||
// GT9271 des Waveshare-Panels: gleiche Registerbelegung wie der GT911, aber
|
|
||||||
// andere I2C-Adresse.
|
|
||||||
tp_io_config.dev_addr = WS7_TOUCH_I2C_ADDR;
|
|
||||||
#endif
|
|
||||||
esp_lcd_new_panel_io_i2c(s_i2c_handle, &tp_io_config, &tp_io_handle);
|
|
||||||
const esp_lcd_touch_config_t tp_cfg = {
|
|
||||||
.x_max = BSP_LCD_H_RES,
|
|
||||||
.y_max = BSP_LCD_V_RES,
|
|
||||||
.rst_gpio_num = BSP_LCD_TOUCH_RST,
|
|
||||||
.int_gpio_num = BSP_LCD_TOUCH_INT,
|
|
||||||
.levels = {
|
|
||||||
.reset = 0,
|
|
||||||
.interrupt = 0,
|
|
||||||
},
|
|
||||||
.flags = {
|
|
||||||
.swap_xy = 0,
|
|
||||||
.mirror_x = 0,
|
|
||||||
.mirror_y = 0,
|
|
||||||
},
|
|
||||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
||||||
.process_coordinates = ws7_touch_map,
|
|
||||||
#elif JC_PANEL_TYPE == JC_PANEL_70
|
|
||||||
.process_coordinates = jc_touch_scale,
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
esp_lcd_touch_new_i2c_gt911(tp_io_handle, &tp_cfg, &tp_handle);
|
|
||||||
|
|
||||||
lvgl_port_interface_t interface =
|
|
||||||
(dpi_config.flags.use_dma2d) ? LVGL_PORT_INTERFACE_MIPI_DSI_DMA
|
|
||||||
: LVGL_PORT_INTERFACE_MIPI_DSI_NO_DMA;
|
|
||||||
lvgl_port_init(disp_panel, tp_handle, interface);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // JC_USE_REAL_PANEL
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "config.h" // liefert JC_PANEL_TYPE (C-sicher, keine Rueckabhaengigkeit)
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
|
||||||
// Waveshare 7" (H): Einbaulage. Haengt das Panel auf dem Kopf (Flachbandkabel oben statt
|
|
||||||
// unten), dreht 1 das Bild UND den Touch um 180 Grad. Auf 0 setzen, wenn das Panel
|
|
||||||
// andersherum eingebaut wird.
|
|
||||||
// -------------------------------------------------------------------------------------
|
|
||||||
#define WS7_ROTATE_180 1
|
|
||||||
|
|
||||||
#define EXAMPLE_LVGL_PORT_TASK_MAX_DELAY_MS 500 //range 2 to 2000
|
|
||||||
#define EXAMPLE_LVGL_PORT_TASK_MIN_DELAY_MS 5 //range 1 to 100
|
|
||||||
#define EXAMPLE_LVGL_PORT_TASK_PRIORITY 4
|
|
||||||
#define EXAMPLE_LVGL_PORT_TASK_STACK_SIZE_KB 32 //KB (erhoeht: komplexe UI, Listen-Rendering, JSON in Callbacks)
|
|
||||||
#define EXAMPLE_LVGL_PORT_TASK_CORE -1 //range -1 to 1
|
|
||||||
#define EXAMPLE_LVGL_PORT_TICK 2 //ragne 1 to 100
|
|
||||||
|
|
||||||
#define EXAMPLE_LVGL_PORT_AVOID_TEAR_ENABLE 1
|
|
||||||
|
|
||||||
#ifdef EXAMPLE_LVGL_PORT_AVOID_TEAR_ENABLE
|
|
||||||
// 2 = Triple-Buffer + LVGL Full-Refresh: zeichnet bei jeder Aenderung das komplette
|
|
||||||
// Bild, daher zeigen statische Flaechen (z.B. Tab-Leiste) nie alten Bufferinhalt.
|
|
||||||
// (Mode 3 = Direct-Mode flackert bei nie neu gezeichneten Bereichen.)
|
|
||||||
// Bei Rotation 90 nutzen beide Modi ohnehin 3 Framebuffer -> kein Mehrverbrauch.
|
|
||||||
#define EXAMPLE_LVGL_PORT_AVOID_TEAR_MODE 2 //range 1 to 3
|
|
||||||
|
|
||||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
||||||
// Waveshare 7" (H): Panel ist nativ 1280x720 Querformat. Bei Einbau auf dem Kopf wird um
|
|
||||||
// 180 Grad gedreht - das erledigt der PPA-Grafikbeschleuniger, der auch RGB888 kann
|
|
||||||
// (die Software-Rotation des Ports rechnet nur in RGB565).
|
|
||||||
#if WS7_ROTATE_180
|
|
||||||
#define EXAMPLE_LVGL_PORT_ROTATION_DEGREE_ 180 // 0,90,180,270
|
|
||||||
#define EXAMPLE_LVGL_PORT_PPA_ROTATION_ENABLE 1
|
|
||||||
#else
|
|
||||||
#define EXAMPLE_LVGL_PORT_ROTATION_DEGREE_ 0
|
|
||||||
#define EXAMPLE_LVGL_PORT_PPA_ROTATION_ENABLE 0
|
|
||||||
#endif
|
|
||||||
#elif JC_PANEL_TYPE == JC_PANEL_70
|
|
||||||
// 7,0" JD9165: Panel ist nativ 1024x600 Querformat -> keine Rotation, kein PPA noetig.
|
|
||||||
#define EXAMPLE_LVGL_PORT_ROTATION_DEGREE_ 0 // 0,90,180,270
|
|
||||||
#define EXAMPLE_LVGL_PORT_PPA_ROTATION_ENABLE 0
|
|
||||||
#else
|
|
||||||
// 4,3" ST7701: Panel ist physisch 480x800 Hochformat.
|
|
||||||
#define EXAMPLE_LVGL_PORT_ROTATION_DEGREE_ 270 // 0,90,180,270 (270 = Querformat 800x480, um 180 Grad gedreht vs. 90)
|
|
||||||
#define EXAMPLE_LVGL_PORT_PPA_ROTATION_ENABLE 1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// LCD_H_RES/LCD_V_RES = NATIVE Panel-Aufloesung (vor der LVGL-Rotation).
|
|
||||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
||||||
|
|
||||||
#define LCD_H_RES 1280
|
|
||||||
#define LCD_V_RES 720
|
|
||||||
|
|
||||||
// Das Waveshare-Panel hat weder einen Reset-Pin noch eine PWM-Hintergrundbeleuchtung:
|
|
||||||
// Reset macht die Bridge selbst, die Helligkeit laeuft ueber deren I2C-Register.
|
|
||||||
#define LCD_RST (-1)
|
|
||||||
#define LCD_LED (-1)
|
|
||||||
|
|
||||||
// ---- MIPI-DSI-Parameter des Waveshare 7inch DSI LCD (H) -----------------------------
|
|
||||||
// Uebernommen aus dem funktionierenden Funktionstest-Sketch. Wichtig ist die Legacy-
|
|
||||||
// Referenztaktquelle PLL_F20M: nur damit liefert der ESP32-P4 Rev. 1.3 / ECO2 ein Bild.
|
|
||||||
// Das Panel akzeptiert nur RGB888 (24 Bit) - deshalb rechnet LVGL bei diesem Panel
|
|
||||||
// ebenfalls mit 24 Bit (lv_conf.h).
|
|
||||||
#define WS7_DSI_LANES 2
|
|
||||||
#define WS7_DSI_LANE_MBPS 1250
|
|
||||||
#define WS7_DPI_CLOCK_MHZ 80 // 1472 x 912 Gesamtraster -> ca. 60 Hz
|
|
||||||
#define WS7_HSYNC_BACK 64
|
|
||||||
#define WS7_HSYNC_PULSE 64
|
|
||||||
#define WS7_HSYNC_FRONT 64
|
|
||||||
#define WS7_VSYNC_BACK 64
|
|
||||||
#define WS7_VSYNC_PULSE 64
|
|
||||||
#define WS7_VSYNC_FRONT 64
|
|
||||||
|
|
||||||
// Bridge (Helligkeit/Panel-Freigabe) und Touch-Controller am selben I2C-Bus wie GT911.
|
|
||||||
#define WS7_BRIDGE_I2C_ADDR 0x45
|
|
||||||
#define WS7_TOUCH_I2C_ADDR 0x14 // GT9271
|
|
||||||
|
|
||||||
// DCS-Register MADCTL beim Panelstart. Ob die Bridge dieses Panels es auswertet, ist
|
|
||||||
// nicht bekannt; die 180-Grad-Drehung macht deshalb der PPA (WS7_ROTATE_180).
|
|
||||||
#define WS7_MADCTL 0x00
|
|
||||||
|
|
||||||
// Der GT9271 meldet im Hochformat: Roh-X 0..720, Roh-Y 0..1280. Fuer das Querformat
|
|
||||||
// werden die Achsen getauscht. Zeigt der Cursor spiegelverkehrt, hier die passende
|
|
||||||
// Achse auf 1 setzen (die Spiegelung geschieht VOR dem Tausch, auf den Rohwerten).
|
|
||||||
#define WS7_TOUCH_RAW_X_MAX 720
|
|
||||||
#define WS7_TOUCH_RAW_Y_MAX 1280
|
|
||||||
#define WS7_TOUCH_MIRROR_RAW_X 0
|
|
||||||
#define WS7_TOUCH_MIRROR_RAW_Y 0
|
|
||||||
|
|
||||||
#elif JC_PANEL_TYPE == JC_PANEL_70
|
|
||||||
|
|
||||||
#define LCD_H_RES 1024
|
|
||||||
#define LCD_V_RES 600
|
|
||||||
|
|
||||||
#define LCD_RST 27
|
|
||||||
#define LCD_LED 23
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define LCD_H_RES 480
|
|
||||||
#define LCD_V_RES 800
|
|
||||||
|
|
||||||
#define LCD_RST 5
|
|
||||||
#define LCD_LED 23
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TP_I2C_SDA 7
|
|
||||||
#define TP_I2C_SCL 8
|
|
||||||
#define TP_RST -1
|
|
||||||
#define TP_INT -1
|
|
||||||
@@ -0,0 +1,750 @@
|
|||||||
|
Version 1.8.4:
|
||||||
|
- Standby-Uhr und Aufweckdialog erscheinen jetzt sofort statt mit spürbarer Verzögerung.
|
||||||
|
Ursache waren die weichen Ein- und Ausblendungen: Eine Deckkraft-Animation ist bei einem
|
||||||
|
Bildspeicher in RGB888 das Teuerste, was die Oberfläche tun kann, weil für jedes Einzelbild
|
||||||
|
die gesamte Fläche unter der Ebene neu gezeichnet und mit ihr gemischt werden muss. Auf
|
||||||
|
1280x720 dauerte eine solche Blende deutlich länger als die 450 ms, die vorgesehen waren.
|
||||||
|
Auf dem Waveshare-Panel laufen die Übergänge deshalb ohne Animation; die JC-Panels
|
||||||
|
behalten sie.
|
||||||
|
- Beim Wechsel der Schriftgröße blitzte kurz ein blaues Bild auf. Das kommt nicht von der
|
||||||
|
Firmware: Das Panel zeigt von sich aus Blau, sobald kein Videosignal anliegt - und beim
|
||||||
|
nötigen Neustart reißt das Signal kurz ab. Die Beleuchtung wird jetzt vorher abgeschaltet;
|
||||||
|
dunkel ist unauffälliger als blau.
|
||||||
|
- Neue Einstellung unter Darstellung: „Temperaturzahl in der Zustandsfarbe". Aus bleibt die
|
||||||
|
Zahl weiß, die Zustandsfarbe steckt dann allein im Balken darunter - ruhiger, und die Zahl
|
||||||
|
bleibt eine Zahl. Ein bedeutet, sie färbt sich mit, wie bisher. Vorgabe ist aus.
|
||||||
|
Warnungen bleiben in jedem Fall rot; das ist keine Gestaltung, sondern eine Meldung.
|
||||||
|
|
||||||
|
Version 1.8.3:
|
||||||
|
- Fehlerbehebung: Bei allen Darstellungen stand hinter der Temperatur ein leeres Rechteck
|
||||||
|
statt des C. Die beiden großen Schriften waren auf Ziffern, Komma, Punkt, Minus und
|
||||||
|
Gradzeichen beschränkt - das C fehlte darin schlicht. Es ist jetzt enthalten, ebenso g
|
||||||
|
und s für die Gewichts- und Zeitanzeige während eines Bezugs.
|
||||||
|
- Fehlerbehebung: Bei der Darstellung „Verlauf" war keine Kurve zu sehen. Ein frisch
|
||||||
|
angelegtes Diagramm enthält lauter „kein Wert"-Punkte und zeichnet deshalb nichts; ohne
|
||||||
|
Hintergrund war der Bereich vollständig unsichtbar, bis nach einer Minute genug Messwerte
|
||||||
|
zusammengekommen wären. Die Kurve startet jetzt beim aktuellen Messwert, und ihre Fläche
|
||||||
|
ist leicht abgesetzt.
|
||||||
|
- Die großen Zahlen des Dashboards stehen jetzt im fetten Schnitt und etwas enger, wie im
|
||||||
|
Entwurf. Erzeugt aus der variablen Maven-Pro-Datei mit Gewicht 700 - dieselbe Schriftart
|
||||||
|
wie bisher, nur kräftiger. Die übrige Oberfläche bleibt unverändert.
|
||||||
|
|
||||||
|
Version 1.8.2:
|
||||||
|
- Die Liste der letzten Bezüge auf der Statistikseite ist jetzt eine Tabelle mit festen
|
||||||
|
Spalten: Zeitpunkt, Dauer, Gewicht und gegebenenfalls die Kennzeichnung „kalt".
|
||||||
|
- Vorher war es ein einziges mehrzeiliges Textfeld, in dem die Werte durch Leerzeichen
|
||||||
|
getrennt aneinandergereiht standen. Weil Zahlen unterschiedlich breit sind, stand nichts
|
||||||
|
untereinander - zwei Bezüge ließen sich nicht vergleichen, ohne jede Zeile einzeln zu
|
||||||
|
lesen. Genau das sah unruhig aus.
|
||||||
|
- Ziffern haben jetzt gleiche Breite, jede zweite Zeile ist leicht abgesetzt, und eine
|
||||||
|
Kopfzeile benennt die Spalten. Wurde ohne Waage bezogen, bleibt die Gewichtsspalte leer,
|
||||||
|
statt eine Null vorzutäuschen.
|
||||||
|
- Die Zeilen werden einmal angelegt und danach nur gefüllt oder ausgeblendet, statt bei
|
||||||
|
jeder Aktualisierung neu zu entstehen.
|
||||||
|
|
||||||
|
Version 1.8.1:
|
||||||
|
- Die Bezugsanzeige ist da, und zwar für alle vier Darstellungen gemeinsam: Sobald ein
|
||||||
|
Bezug oder Dampfbezug läuft, schrumpft der Temperaturbereich und die untere Zeile wächst.
|
||||||
|
Shot-Timer und Gewicht werden dabei auf 96 Pixel vergrößert - während eines Bezugs zählen
|
||||||
|
Zeit und Gewicht, die Kesseltemperaturen sind dann Nebensache.
|
||||||
|
- Es gibt keine zweite Ansicht: Die Seite verschiebt nur das Gewicht zwischen ihren beiden
|
||||||
|
Bereichen. Damit bleibt alles an seinem Platz, und es gibt nichts doppelt zu pflegen.
|
||||||
|
- Der Wechsel hält nach dem Bezug noch vier Sekunden an. Ohne dieses Nachhalten würde die
|
||||||
|
Seite bei jeder kurzen Unterbrechung hin- und herspringen - das wäre unruhiger als gar
|
||||||
|
kein Wechsel.
|
||||||
|
|
||||||
|
Version 1.8.0:
|
||||||
|
- Das Dashboard hat vier neue Darstellungen, die die bisherigen fünf ersetzen. Sie sind
|
||||||
|
keine Varianten desselben Bildes, sondern vier Antworten auf die Frage, was die große
|
||||||
|
Fläche des 7-Zöllers leisten soll:
|
||||||
|
* Gewichtet - Wasser bekommt zwei Drittel der Fläche, Dampf ein Drittel. Beim Espresso
|
||||||
|
zählt die Wassertemperatur; die Asymmetrie ist die Aussage.
|
||||||
|
* Verlauf - unter jeder Temperatur eine flache Kurve der letzten Minute. Die eigentliche
|
||||||
|
Frage an eine PID-Regelung ist nicht „wie warm", sondern „hält sie" - und das kann eine
|
||||||
|
Zahl grundsätzlich nicht zeigen. Der Ausschnitt hängt am Sollwert, damit die Abweichung
|
||||||
|
sichtbar wird statt in der Skala unterzugehen.
|
||||||
|
* Flächen - keine Kartenkanten, zwei Felder mit einem Hauch Helligkeitsunterschied.
|
||||||
|
* Band - ein farbiges Band über die volle Breite sagt den Zustand, bevor eine Zahl
|
||||||
|
gelesen wird: bereit, heizt, Bezug, Cold Extraction oder Standby. Neue Vorgabe.
|
||||||
|
- Dafür gibt es zwei neue Schriftgrade (96 und 140 Pixel). Sie enthalten nur Ziffern,
|
||||||
|
Komma, Punkt, Minus und Gradzeichen - mit vollem Zeichensatz wären sie um ein Vielfaches
|
||||||
|
größer, ohne etwas beizutragen. Die größte Textschrift hatte bisher 48 Pixel, was für die
|
||||||
|
großen Zahlen nicht reichte.
|
||||||
|
- Ältere Stände haben in den Einstellungen noch die Nummer einer der früheren Darstellungen
|
||||||
|
gespeichert; liegt sie außerhalb, fällt sie auf die Vorgabe zurück.
|
||||||
|
- Der Aufbau der Bezugsanzeige - untere Zeile wechselt während eines Bezugs auf große
|
||||||
|
Timer- und Gewichtsanzeige - folgt als nächster Schritt.
|
||||||
|
|
||||||
|
Version 1.7.3:
|
||||||
|
- Die Schriftgröße steht jetzt auf der Info-Seite im Abschnitt „Darstellung", zusammen mit
|
||||||
|
der Wahl der Temperaturanzeige und dem Live-Bezugsschirm. Dort gehört sie hin: Es ist
|
||||||
|
eine Einstellung dieses Displays, keine Wartungsaufgabe.
|
||||||
|
- Die Seite Reinigung & Wartung hat damit wieder vier Karten in zwei Spalten.
|
||||||
|
- Die Auswahl selbst ist unverändert: drei Stufen, Neustart nach der Auswahl.
|
||||||
|
- Sie steht auf allen Panels zur Verfügung, nicht nur auf dem 7-Zöller.
|
||||||
|
|
||||||
|
Version 1.7.2:
|
||||||
|
- Die Schriftgröße lässt sich jetzt einstellen: Klein, Mittel oder Groß, zu finden auf der
|
||||||
|
Seite Reinigung & Wartung in der neuen Karte „Darstellung".
|
||||||
|
- LVGL-Schriften sind fest einkompilierte Bilddaten; es gibt sie nur in den Größen, die im
|
||||||
|
Projekt liegen (14, 18, 28, 40 und 48 Pixel). Stufenlos skalieren lässt sich also nichts.
|
||||||
|
Stattdessen gibt es drei Rollen - klein, normal, hervorgehoben -, die je nach Einstellung
|
||||||
|
eine Stufe höher greifen.
|
||||||
|
- Die großen Anzeigen für Temperatur und Uhrzeit bleiben unverändert: Sie sind bereits auf
|
||||||
|
die Bildschirmgröße abgestimmt und sollen nicht mitwachsen.
|
||||||
|
- Die Einstellung liegt lokal im Display, nicht auf der Hauptplatine - sie betrifft nur
|
||||||
|
dieses Gerät. Nach der Auswahl startet der P4 neu, weil die Schriften in bereits
|
||||||
|
angelegten Bedienelementen stecken und sich nicht nachträglich umhängen lassen.
|
||||||
|
- Zu erwarten: In der Stufe Groß brauchen die Karten mehr Platz. Ob alle Seiten dann noch
|
||||||
|
vollständig auf den Bildschirm passen, zeigt erst das Gerät.
|
||||||
|
|
||||||
|
Version 1.7.1:
|
||||||
|
- Cold Extraction ist auf dem 7-Zoll-Panel dreispaltig: oben die drei Karten mit
|
||||||
|
Erklaerungstext (Modus, Vorbenetzung, Bezugsende), darunter die knappen (Grundeinstellung,
|
||||||
|
Hauptbezug, Pumpenschutz), der Speichern-Knopf frei unter allen sechs. Drei statt zwei
|
||||||
|
Spalten, weil die Erklaerungstexte keine volle Zeilenbreite brauchen und so am Ende keine
|
||||||
|
halbleere Reihe stehen bleibt.
|
||||||
|
- Der Warnhinweis stand bisher als eigene Zeile am Seitenende, weit entfernt von dem
|
||||||
|
Schalter, auf den er sich bezieht. Er sitzt jetzt in der Modus-Karte.
|
||||||
|
- Reinigung & Wartung ist zweispaltig und besteht aus vier Karten: Wartungszaehler,
|
||||||
|
Flush-Zeiten, Display-Helligkeit sowie Reinigung & Entkalkung. Bisher standen dort lose
|
||||||
|
Zeilen unter blossen Zwischenueberschriften, dazwischen freistehende Knoepfe.
|
||||||
|
- Anders als bei Bruehen und Cold Extraction sitzt der Speichern-Knopf hier IN der Karte:
|
||||||
|
Jede Karte speichert etwas anderes, deshalb gehoert der Knopf zur Karte statt unter die
|
||||||
|
Seite.
|
||||||
|
- Alle drei umgestellten Seiten passen jetzt vollstaendig auf den Bildschirm. Die JC-Panels
|
||||||
|
behalten ihr einspaltiges Layout.
|
||||||
|
|
||||||
|
Version 1.7.0:
|
||||||
|
- Brew-Control ist auf dem 7-Zoll-Panel zweispaltig: Pre-Infusion und Brew-by-Weight oben,
|
||||||
|
Brew-by-Time und Dampf-Timer darunter, der Speichern-Knopf frei unter allen Karten.
|
||||||
|
Damit passt die Seite vollstaendig auf den Bildschirm und muss nicht mehr gescrollt
|
||||||
|
werden - der teuerste Vorgang der Oberflaeche entfaellt dort ersatzlos.
|
||||||
|
- Die Anordnung folgt der Bedeutung: links steht, was den Bezug startet, rechts, was ihn
|
||||||
|
beendet.
|
||||||
|
- Der Speichern-Knopf sitzt bewusst nicht in einer der Karten. Er speichert die ganze Seite
|
||||||
|
und wuerde in einer einzelnen Karte so wirken, als gaelte er nur fuer diese.
|
||||||
|
- Die JC-Panels bleiben einspaltig - dort ist der Platz knapp, nicht ueppig.
|
||||||
|
- Cold Extraction und Reinigung/Wartung folgen als naechstes.
|
||||||
|
|
||||||
|
Version 1.6.27:
|
||||||
|
- Beim Waveshare-Panel rollen scrollbare Listen nach dem Loslassen nicht mehr aus, sondern
|
||||||
|
folgen nur dem Finger. Ohne Doppelpufferung entsteht beim Scrollen jedes Bild komplett
|
||||||
|
neu; am staerksten faellt das beim Ausrollen auf, wo sich das Bild ohne fuehrenden Finger
|
||||||
|
weiterbewegt und jedes Stocken unmittelbar sichtbar ist.
|
||||||
|
- Die JC-Panels sind ausgenommen, ihr Bediengefuehl bleibt unveraendert.
|
||||||
|
|
||||||
|
Version 1.6.26:
|
||||||
|
- Fehlerbehebung: Beim Bildlauf blitzten blaue Zwischenbilder auf. Ursache war der zweite
|
||||||
|
Zeichenpuffer aus 1.6.25. Der Panel-Treiber lehnt eine Uebertragung ab, solange die
|
||||||
|
vorige noch laeuft; mit zwei Puffern schickt LVGL die naechste aber sofort los. Die
|
||||||
|
abgelehnte Uebertragung faellt ersatzlos aus, und der betroffene Bildbereich behaelt
|
||||||
|
seinen alten Inhalt.
|
||||||
|
- Der zweite Zeichenpuffer ist deshalb wieder entfernt, die Herstellerdatei lvgl_port_v9.c
|
||||||
|
damit wieder unveraendert. Der eigentliche Gewinn beim Bildlauf bleibt erhalten: Der
|
||||||
|
Zwischenpuffer hat weiterhin volle Bildhoehe, ein Bildlauf braucht also einen Durchgang
|
||||||
|
statt sechs.
|
||||||
|
|
||||||
|
Version 1.6.25:
|
||||||
|
- Der Bildlauf war nach der Umstellung auf einen Bildspeicher sehr zaeh. Grund war der
|
||||||
|
Zwischenpuffer, in den LVGL zeichnet: Mit 120 Zeilen brauchte ein Bildlauf ueber die
|
||||||
|
ganze Seite sechs Durchgaenge, jeder mit eigener Uebertragung in den Bildspeicher.
|
||||||
|
- Der Zwischenpuffer hat jetzt volle Bildhoehe - ein Durchgang statt sechs. Dazu kommt ein
|
||||||
|
zweiter Puffer, damit LVGL bereits den naechsten Bereich zeichnen kann, waehrend der
|
||||||
|
vorige noch uebertragen wird.
|
||||||
|
- Kosten: 2 x 2,8 MB PSRAM zusaetzlich, bei 32 MB unkritisch. Am Startverhalten aendert
|
||||||
|
sich nichts: Diese Puffer sind Zeichenpuffer, keine Bildspeicher der Anzeige - es bleibt
|
||||||
|
bei EINEM Bildspeicher, und nur der war fuer den Startfehler verantwortlich.
|
||||||
|
|
||||||
|
Version 1.6.24:
|
||||||
|
- Ursache des unzuverlaessigen Starts gefunden und behoben: die Anzahl der Bildspeicher.
|
||||||
|
Mit zwei Bildspeichern kam nach dem Einschalten kein Bild - der Hochlauf meldete
|
||||||
|
durchgehend Erfolg, das Panel blieb dunkel, und erst ein Reset half. Mit genau einem
|
||||||
|
startet es zuverlaessig. Belegt wurde das mit den Prueffarbbalken: Sie erscheinen mit
|
||||||
|
einem Speicher sofort, mit zweien nicht. Der Werks-Testsketch benutzt ebenfalls einen -
|
||||||
|
das war der letzte verbliebene Unterschied zu ihm.
|
||||||
|
- Die Oberflaeche laeuft deshalb ohne Doppelpufferung: LVGL zeichnet in einen
|
||||||
|
Zwischenpuffer von 120 Zeilen im PSRAM, der dann in den einen Bildspeicher uebertragen
|
||||||
|
wird. Bei schnellen Bildwechseln kann kurz eine Kante sichtbar werden; ein zuverlaessig
|
||||||
|
startendes Display wiegt das auf.
|
||||||
|
- Schalter WS7_SINGLE_FB in pins_config.h. WS7_PARTIAL_REFRESH ist damit wirkungslos, weil
|
||||||
|
es ohne Doppelpufferung nichts umzuschalten gibt.
|
||||||
|
- Der PSRAM-Bedarf sinkt von 5,4 MB auf 2,8 MB.
|
||||||
|
- Die Umgehungen aus den Vorversionen bleiben erhalten: Anlaufzeit, wiederholte
|
||||||
|
Bridge-Grundeinstellung, wiederholte Weckbefehle und der Neustart nach Kaltstart. Ob
|
||||||
|
jede davon noch noetig ist, laesst sich jetzt einzeln pruefen - der Startfehler selbst
|
||||||
|
ist behoben.
|
||||||
|
|
||||||
|
Version 1.6.23:
|
||||||
|
- Der Selbst-Neustart aus 1.6.22 reicht nicht: Ein Software-Neustart setzt offenbar nicht
|
||||||
|
dasselbe zurueck wie die Reset-Taste. Der Schalter bleibt eingeschaltet, er schadet nicht,
|
||||||
|
loest das Problem aber nicht allein.
|
||||||
|
- Zurueck zu dem einen Unterschied zum funktionierenden Werks-Testsketch, der bisher nie
|
||||||
|
ueberprueft wurde: Dieser legt EINEN Bildspeicher an, die Firmware zwei. Der Pruefbild-Test
|
||||||
|
lief bislang ebenfalls mit zwei und war damit nie ein echter Nachbau des Testsketches - er
|
||||||
|
wich an genau der Stelle ab, die noch offen ist.
|
||||||
|
- Mit WS7_TEST_PATTERN = 1 wird jetzt genau ein Bildspeicher angelegt, wie im Testsketch.
|
||||||
|
Erscheinen die Farbbalken damit zuverlaessig, liegt es an der Anzahl der Bildspeicher, und
|
||||||
|
die Oberflaeche laesst sich darauf umstellen.
|
||||||
|
|
||||||
|
Version 1.6.22:
|
||||||
|
- Der Ab- und Wiederaufbau der DSI-Strecke aus 1.6.21 hat nicht geholfen, sondern das Bild
|
||||||
|
um einen Schritt verschlechtert: Nach dem Einschalten kam gar nichts mehr, nach dem
|
||||||
|
ersten Reset nur die Beleuchtung, erst nach dem zweiten das Bild. Ein Ab- und Wiederaufbau
|
||||||
|
im laufenden Betrieb ist einem echten Chip-Reset also nicht gleichwertig. WS7_DSI_RESTART
|
||||||
|
steht deshalb wieder auf 0; der Schalter bleibt samt Begruendung erhalten.
|
||||||
|
- Stattdessen der Weg, den die Messungen eindeutig stuetzen: Nach einem Kaltstart startet
|
||||||
|
der P4 sich genau einmal selbst neu, sobald der erste Hochlauf durch ist. Damit passiert
|
||||||
|
genau das, was bei jedem Versuch zuverlaessig geholfen hat - ohne dass jemand die
|
||||||
|
Reset-Taste druecken muss.
|
||||||
|
- Eine Schleife ist ausgeschlossen: Beim zweiten Durchlauf ist der Startgrund kein Kaltstart
|
||||||
|
mehr, die Bedingung greift nicht erneut. Der Fruehstart-Zaehler der Absturzsicherung wird
|
||||||
|
vor dem gewollten Neustart zurueckgesetzt, damit dieser nicht als Absturz zaehlt.
|
||||||
|
- Kostet rund drei Sekunden, und nur beim Einschalten. Schalter WS7_COLD_BOOT_RESTART in
|
||||||
|
pins_config.h.
|
||||||
|
- Das ist eine Umgehung, keine Erklaerung: Warum das Panel den ersten Anlauf nach dem
|
||||||
|
Einschalten nicht annimmt, ist weiterhin offen. Der Hochlauf meldet durchgehend Erfolg.
|
||||||
|
|
||||||
|
Version 1.6.21:
|
||||||
|
- Der Hochlauf lief zuletzt vollstaendig fehlerfrei durch - Bridge zweimal eingestellt,
|
||||||
|
Panel zweimal geweckt, alle I2C-Bausteine erreichbar - und trotzdem kam beim ersten
|
||||||
|
Einschalten kein Bild. Erst ein Reset half, und der zuverlaessig. Es fehlte also kein
|
||||||
|
Befehl mehr; es fehlte der Vorgang selbst.
|
||||||
|
- Ein Reset unterscheidet sich an dieser Stelle in genau einem Punkt: Die DSI-Verbindung
|
||||||
|
geht einmal weg und neu auf, waehrend Bridge und Panel bereits versorgt und eingestellt
|
||||||
|
sind. Weder die wiederholte Grundeinstellung noch die wiederholten Weckbefehle ersetzen
|
||||||
|
das - beide laufen ueber eine Verbindung, die durchgehend bestand.
|
||||||
|
- Der Hochlauf baut die DSI-Strecke jetzt einmal komplett ab und wieder auf: Bildausgabe,
|
||||||
|
Kommandokanal und Bus werden freigegeben und neu angelegt. Damit passiert ohne Reset,
|
||||||
|
was vorher erst der zweite Start brachte. Schalter WS7_DSI_RESTART in pins_config.h,
|
||||||
|
Pause dazwischen WS7_DSI_RESTART_MS (Vorgabe 200 ms).
|
||||||
|
- Der DSI-Aufbau steckt dafuer in einer eigenen Funktion, damit der Vorgang wiederholbar
|
||||||
|
ist statt zweimal im Quelltext zu stehen.
|
||||||
|
|
||||||
|
Version 1.6.20:
|
||||||
|
- Nach 1.6.19 lief es reproduzierbar so ab: Beim Einschalten ging nach zwei bis drei
|
||||||
|
Sekunden die Hintergrundbeleuchtung an, dann kam nichts mehr; nach einem Reset ging die
|
||||||
|
Beleuchtung kurz aus und danach erschien Beleuchtung samt Bild. Daraus folgt der letzte
|
||||||
|
fehlende Schritt: Auch die Grundeinstellung der Bridge lief bisher nur einmal, und zwar
|
||||||
|
bevor die DSI-Strecke ueberhaupt existierte. Beim Reset half es nur deshalb, weil die
|
||||||
|
Bridge ihre Einstellung aus dem vorigen Durchlauf noch hatte und diesmal ein DSI-Signal
|
||||||
|
vorfand.
|
||||||
|
- Die Grundeinstellung der Bridge wird jetzt ein zweites Mal geschrieben, sobald die
|
||||||
|
Videoausgabe laeuft - dasselbe Vorgehen wie bei den Weckbefehlen des Panels in 1.6.19.
|
||||||
|
Damit wird ohne Reset erreicht, was vorher erst der zweite Durchlauf brachte.
|
||||||
|
- Im Start-Log sind beide Durchgaenge benannt ("Bridge-Grundeinstellung vor dem DSI-Start"
|
||||||
|
und "... nach dem Start der Videoausgabe").
|
||||||
|
|
||||||
|
Version 1.6.19:
|
||||||
|
- Die Wartezeit aus 1.6.18 hat den Start deutlich verbessert, aber noch nicht zuverlässig
|
||||||
|
gemacht. Aus dem verbliebenen Fehlerbild folgt der nächste Schritt: Die Beleuchtung ging
|
||||||
|
an, das Bild fehlte. Die Beleuchtung hängt an der Bridge und wird über I2C geschaltet -
|
||||||
|
sie funktioniert also. Verloren gehen die Weckbefehle an das Panel selbst.
|
||||||
|
- Diese Befehle wurden bisher genau einmal geschickt, bevor die Videoausgabe lief. War der
|
||||||
|
Panel-Controller in dem Moment noch nicht aufnahmebereit, waren sie weg, und danach hat
|
||||||
|
nie wieder jemand nachgefragt. Sie werden jetzt ein zweites Mal gesendet, sobald die
|
||||||
|
Videoausgabe steht. Die Befehle sind wiederholbar, der zweite Anlauf kostet nichts.
|
||||||
|
- Die Pause dazwischen steht als WS7_PANEL_SETTLE_MS in pins_config.h (Vorgabe 200 ms).
|
||||||
|
- Im Start-Log ist jeder Anlauf einzeln zu sehen ("Weckbefehle vor/nach dem Start der
|
||||||
|
Videoausgabe").
|
||||||
|
|
||||||
|
Version 1.6.18:
|
||||||
|
- Ursache des unzuverlässigen Starts gefunden: Der P4 sprach Bridge und Panel sofort nach
|
||||||
|
dem Einschalten an. Das Displaymodul braucht danach aber einen Moment, bis es bereit ist.
|
||||||
|
Kam der Hochlauf zu früh, nahm die Bridge ihre Register nicht an oder das Panel zeigte
|
||||||
|
trotz korrekt gesendeter DSI-Daten nichts - beides ohne Fehlermeldung, weil aus Sicht des
|
||||||
|
P4 jeder Schritt geklappt hatte. Das Ergebnis war ein Display, das mal ansprang und mal
|
||||||
|
nicht, und beim ersten Anstecken meist gar nicht.
|
||||||
|
- Der Hochlauf wartet jetzt WS7_PANEL_WARMUP_MS (Vorgabe 2000 ms), bevor er beginnt. Der
|
||||||
|
Werks-Testsketch wartet aus demselben Grund 2 Sekunden am Anfang.
|
||||||
|
- Damit erklärt sich auch, warum es mit geöffnetem seriellen Monitor fast immer klappte:
|
||||||
|
Dessen USB-Anmeldung verzögert den Start und ersetzte damit unbeabsichtigt die Wartezeit.
|
||||||
|
- Der Wert steht in pins_config.h. Läuft der Start zuverlässig, lässt er sich vorsichtig
|
||||||
|
senken; springt die Anzeige nicht an, ist er der erste Wert zum Erhöhen.
|
||||||
|
|
||||||
|
Version 1.6.17:
|
||||||
|
- Der I2C-Stoerimpulsfilter aus 1.6.16 wirkt: Nach dem Panel-Start melden sich wieder alle
|
||||||
|
drei Bausteine, Bridge und Touch bleiben ansprechbar.
|
||||||
|
- Das Pruefbild aus 1.6.15 war allerdings wirkungslos und damit als Test untauglich: Es
|
||||||
|
wurde zwar gesetzt, doch unmittelbar danach startete LVGL und schrieb in den Bildspeicher,
|
||||||
|
womit das Pruefbild wieder verschwand. Der Test sah deshalb genauso aus wie der Fehler,
|
||||||
|
den er finden sollte.
|
||||||
|
- Mit WS7_TEST_PATTERN = 1 endet der Hochlauf jetzt direkt nach dem Pruefbild: Beleuchtung
|
||||||
|
an, Farbbalken stehen, kein LVGL. Damit ist die Frage eindeutig zu beantworten, ob die
|
||||||
|
Anzeigekette bis zum Panel arbeitet.
|
||||||
|
|
||||||
|
Version 1.6.16:
|
||||||
|
- Ursache des schwarzen Bildes gefunden. Der Start-Log zeigte es eindeutig: Vor dem
|
||||||
|
Panel-Start meldeten sich alle drei I2C-Bausteine (Touch 0x14, Audio 0x18, Bridge 0x45),
|
||||||
|
danach nur noch der Audio-Baustein. Es fielen also genau die beiden weg, die am
|
||||||
|
Displaykabel haengen - der Bus selbst arbeitete weiter. Sobald die DSI-Ausgabe laeuft,
|
||||||
|
stoeren deren schnelle Signale auf das lange Flachbandkabel ein, und ohne Filterung
|
||||||
|
bringen diese Stoerspitzen die I2C-Uebertragung aus dem Tritt. Die Bridge liess sich
|
||||||
|
daraufhin nicht mehr ansprechen, das Panel blieb dunkel.
|
||||||
|
- Der I2C-Bus laeuft fuer das Waveshare-Panel jetzt mit Stoerimpulsfilter und internen
|
||||||
|
Abschlusswiderstaenden, so wie es auch das Waveshare-Beispiel tut. Beides fehlte, weil
|
||||||
|
die Bus-Einrichtung urspruenglich von den JC-Panels uebernommen wurde, die kein
|
||||||
|
Flachbandkabel dieser Laenge haben.
|
||||||
|
- Das erklaert rueckwirkend auch, warum sich der Fehler so sprunghaft verhielt: Ob eine
|
||||||
|
Uebertragung durchkam, hing von der Stoerlage ab.
|
||||||
|
|
||||||
|
Version 1.6.15:
|
||||||
|
- Diagnose fuer das schwarze Bild, das der Log bisher nicht erklaeren konnte: Alle Schritte
|
||||||
|
liefen fehlerfrei durch, trotzdem blieb die Anzeige leer.
|
||||||
|
- Die drei Weckbefehle an das Panel (MADCTL, Sleep Out, Display On) liefen bislang
|
||||||
|
ungeprueft durch und sind jetzt in die Fehlerausgabe einbezogen.
|
||||||
|
- Neuer Schalter WS7_TEST_PATTERN in pins_config.h: zeigt statt der Oberflaeche
|
||||||
|
Prueffarbbalken an. Sie entstehen im DSI-Baustein selbst und benutzen weder Bildspeicher
|
||||||
|
noch LVGL. Damit laesst sich in einem Durchgang trennen, ob die Anzeigekette bis zum
|
||||||
|
Panel arbeitet oder ob der Fehler weiter oben liegt.
|
||||||
|
- Das Ende des Hochlaufs wird gemeldet ("Bringup fertig" / "LVGL laeuft"). Bisher endete
|
||||||
|
die Ausgabe nach dem Panel-Start, und ein Haengenbleiben in LVGL war von einem
|
||||||
|
fehlenden Bild nicht zu unterscheiden.
|
||||||
|
|
||||||
|
Version 1.6.14:
|
||||||
|
- Der Touch-Controller wird jetzt erst angesprochen, nachdem die Bridge freigegeben und die
|
||||||
|
Hintergrundbeleuchtung eingeschaltet ist. Der GT9271 haengt an derselben Versorgung und
|
||||||
|
antwortet vorher nicht auf I2C - deshalb schlug seine Initialisierung bisher schon beim
|
||||||
|
Kaltstart fehl. In der Werks-Testskizze steht die Touch-Initialisierung aus demselben
|
||||||
|
Grund hinter dem Einschalten der Beleuchtung; beim Uebertragen in die Firmware war diese
|
||||||
|
Reihenfolge verloren gegangen.
|
||||||
|
- Die Wartezeit dazwischen steht als WS7_TOUCH_POWER_MS in pins_config.h (Vorgabe 120 ms).
|
||||||
|
- Neu im Start-Log: eine Liste aller Bausteine am I2C-Bus, einmal vor und einmal nach dem
|
||||||
|
Panel-Start. Erwartet werden 0x45 (Bridge) und 0x14 (Touch). Damit ist auf einen Blick zu
|
||||||
|
sehen, ob ein Baustein gar nicht antwortet, statt aus Treiberfehlern raten zu muessen.
|
||||||
|
|
||||||
|
Version 1.6.13:
|
||||||
|
- Ursache des schwarzen Bildes gefunden: ein haengender I2C-Bus. Trifft ein Reset des P4
|
||||||
|
mitten in eine laufende Uebertragung, bleibt der angesprochene Baustein in seiner
|
||||||
|
Bitausgabe stehen und haelt die Datenleitung dauerhaft auf Masse. Damit schlaegt jede
|
||||||
|
weitere Uebertragung fehl. Bridge und Touch-Controller haengen an Dauerstrom, weshalb
|
||||||
|
dieser Zustand jeden Reset und sogar das Flashen ueberlebt - nur echtes Stromabziehen
|
||||||
|
loest ihn. Die Folge: Die Bridge wird nie initialisiert, das Bild bleibt schwarz, und
|
||||||
|
weil sie ihre Register behaelt, brennt die Hintergrundbeleuchtung weiter.
|
||||||
|
- Vor dem Anlegen des I2C-Busses wird die Taktleitung jetzt von Hand getaktet, bis der
|
||||||
|
Baustein die Datenleitung freigibt, danach folgt eine Stopp-Bedingung. Das ist der in
|
||||||
|
der I2C-Spezifikation vorgesehene Weg und laeuft bei freiem Bus wirkungslos durch.
|
||||||
|
- Fehlerbehebung: Schreibzugriffe auf die Bridge liefen stillschweigend ins Leere. Genau
|
||||||
|
deshalb war der Fehler so schwer zu finden - das Bild blieb ohne jeden Hinweis schwarz.
|
||||||
|
Sie melden Fehler jetzt im Klartext.
|
||||||
|
- Fehlerbehebung: In pins_config.h stand seit 1.6.10 "#elsealle" statt "#else". Der
|
||||||
|
Tippfehler traf nur den Zweig des 4,3-Zoll-Panels, das damit nicht mehr uebersetzbar war.
|
||||||
|
Beide Panel-Varianten sind jetzt wieder gegengebaut.
|
||||||
|
|
||||||
|
Version 1.6.12:
|
||||||
|
- Die Abschaltfolge für die Bridge aus 1.6.11 ist zurückgenommen. Sie hat den Fehler nicht
|
||||||
|
behoben, sondern verschlimmert: Nach dem Nullsetzen von C0/C2/AC kam das Panel auch
|
||||||
|
direkt nach dem Flashen nicht mehr hoch, die normale Einschaltfolge holt es aus diesem
|
||||||
|
Zustand nicht zurück. Der Start entspricht damit wieder 1.6.10.
|
||||||
|
- Stattdessen zwei Diagnosen, um die Ursache des schwarzen Bildes nach einem Reset
|
||||||
|
einzugrenzen: Der Startgrund wird beim Hochlauf ausgegeben (1 = Kaltstart, alles andere
|
||||||
|
Warmstart), und das Anfordern der Stromversorgung für die MIPI-Strecke wird jetzt auf
|
||||||
|
Fehler geprüft - bislang lief dieser Schritt als einziger ungeprüft durch.
|
||||||
|
|
||||||
|
Version 1.6.10:
|
||||||
|
- WS7_PARTIAL_REFRESH ist jetzt auch im Auslieferungsstand 1. Am Gerät geprüft: kein
|
||||||
|
Flackern, und der Gewinn ist der größte der drei Tempo-Maßnahmen - vor allem während
|
||||||
|
eines Bezugs, wo die Zeitanzeige zehnmal je Sekunde weiterläuft.
|
||||||
|
- Der Hintergrund der Seiten ist deckend statt durchsichtig. Sichtbar ändert sich nichts,
|
||||||
|
die Ebenen darunter haben dieselbe Farbe; LVGL muss sie beim Scrollen aber nicht mehr
|
||||||
|
mitzeichnen und durchmischen.
|
||||||
|
- Neuer Schalter WS7_PERF_MONITOR in pins_config.h: blendet unten rechts Bilder je Sekunde
|
||||||
|
und Prozessorlast ein. Damit lässt sich beantworten, ob weitere Mühe beim Zeichnen
|
||||||
|
überhaupt noch etwas bringt, statt ins Blaue zu optimieren.
|
||||||
|
|
||||||
|
Version 1.6.9:
|
||||||
|
- Fehlerbehebung: Ein Tipp auf einen Knopf löste oft mehrfach aus. Der GT9271 lässt
|
||||||
|
gelegentlich einen Messzyklus aus oder liefert ein unplausibles Paket; der
|
||||||
|
Hersteller-Treiber kann "gerade nichts Neues" nicht von "Finger weg" unterscheiden und
|
||||||
|
meldet beides als losgelassen. Seit die Oberfläche mit 1.6.8 doppelt so oft abtastet,
|
||||||
|
wurde daraus sichtbar Drücken-Loslassen-Drücken-Loslassen.
|
||||||
|
- Vor den Treiber ist deshalb ein Filter gesetzt: Er verwirft unplausible Rohwerte und hält
|
||||||
|
den letzten gültigen Berührpunkt noch WS7_TOUCH_HOLD_MS lang (Vorgabe 40 ms). Losgelassen
|
||||||
|
wird erst gemeldet, wenn wirklich nichts mehr kommt. Der Wert steht in pins_config.h;
|
||||||
|
0 schaltet die Überbrückung ab. Zu groß gewählt verzögert er das Loslassen und dämpft
|
||||||
|
den Schwung beim Wischen.
|
||||||
|
- Der Filter hängt sich zur Laufzeit in den Treiber ein, die Herstellerdateien bleiben
|
||||||
|
unverändert.
|
||||||
|
|
||||||
|
Version 1.6.8:
|
||||||
|
- Scrollen und Wischen laufen am Waveshare-Panel flüssiger: LVGL rechnet dort jetzt im
|
||||||
|
16-Millisekunden-Takt statt alle 33 ms. Dieser Wert steuert nicht nur die Bildrate,
|
||||||
|
sondern auch, wie oft der Touch abgetastet und wie fein eine Animation gerechnet wird -
|
||||||
|
mit 30 Schritten je Sekunde war vor allem das Ziehen mit dem Finger sichtbar ruckelig.
|
||||||
|
Das Panel läuft mit 60 Hz, mehr als 16 ms bringt also nichts.
|
||||||
|
- Kommt das Zeichnen einmal nicht hinterher, wird ein Bild später fertig; kaputt geht
|
||||||
|
dabei nichts. Die JC-Panels bleiben bei 33 ms.
|
||||||
|
|
||||||
|
Version 1.6.7:
|
||||||
|
- Der Menue-Knopf oben links fängt Tipps jetzt auch knapp daneben ab. Mit 48x36 Pixeln war
|
||||||
|
er auf dem 7-Zoll-Panel ein sehr kleines Ziel; gemessen wurde ein Fehlgriff von rund
|
||||||
|
10 Pixeln neben der Fläche, weshalb sich das Menü scheinbar nicht öffnen ließ. Optisch
|
||||||
|
bleibt der Knopf unverändert, die Trefferfläche wächst um 20 Pixel nach allen Seiten.
|
||||||
|
Sie wirkt nur innerhalb der Kopfleiste - dem Seiteninhalt darunter wird nichts genommen.
|
||||||
|
- Die Touch-Zuordnung selbst war korrekt: Eine Messung mit WS7_TOUCH_DEBUG hat gezeigt,
|
||||||
|
dass Achsen und Spiegelung stimmen.
|
||||||
|
|
||||||
|
Version 1.6.6:
|
||||||
|
- Neuer Schalter WS7_TOUCH_DEBUG in pins_config.h: Auf 1 gesetzt, gibt jeder Berührpunkt
|
||||||
|
seine Rohwerte und die daraus errechnete Bildposition auf der seriellen Konsole aus.
|
||||||
|
Gedacht zum Einmessen des Touch, wenn Bedienelemente nicht reagieren - insbesondere am
|
||||||
|
oberen Bildrand, wo die 44 Pixel hohe Kopfleiste sitzt.
|
||||||
|
|
||||||
|
Version 1.6.5:
|
||||||
|
- Zwei der drei Tempo-Maßnahmen aus 1.6.4 haben sich am Gerät als untauglich erwiesen und
|
||||||
|
stehen wieder auf ihrem alten Wert. Sie bleiben als Schalter erhalten, mit Notiz, woran
|
||||||
|
sie gescheitert sind.
|
||||||
|
* WS7_COLOR_BITS wieder 24: Die Bridge dieses Panels nimmt kein RGB565 an, mit 16 Bit
|
||||||
|
kommt kein brauchbares Bild.
|
||||||
|
* WS7_PARTIAL_REFRESH wieder 0: Der Menü-Vorhang ließ sich nicht mehr öffnen. Er ist
|
||||||
|
halbtransparent und wird deshalb in den gerade aktiven Bildpuffer eingemischt; die
|
||||||
|
nächste Zustandsmeldung der S3 zeichnet aber in den zweiten Puffer, der ihn nie
|
||||||
|
bekommen hat - der Vorhang war also sofort wieder weg. Nutzbar wäre der Modus erst,
|
||||||
|
wenn der LVGL-Port die geänderten Bereiche zwischen beiden Puffern abgleicht.
|
||||||
|
- WS7_PARALLEL_RENDER bleibt eingeschaltet: LVGL zeichnet weiterhin mit zwei Threads auf
|
||||||
|
beiden Prozessorkernen. Von den drei Maßnahmen trägt nur diese.
|
||||||
|
|
||||||
|
Version 1.6.4:
|
||||||
|
- Waveshare 7" (H): Drei Maßnahmen gegen die träge Bedienung am großen Panel. 1280x720
|
||||||
|
sind 2,4-mal so viele Pixel wie beim 4,3-Zöller, und bis 1.6.3 wurde bei jeder Änderung
|
||||||
|
das komplette Bild in 24 Bit neu gezeichnet.
|
||||||
|
* Farbtiefe RGB565 statt RGB888 (WS7_COLOR_BITS): halbiert die Datenmenge je Bild.
|
||||||
|
Feinere Farbabstufungen entfallen, sichtbar allenfalls in den dunklen Verläufen der
|
||||||
|
Rundanzeige - die JC-Panels laufen seit jeher so.
|
||||||
|
* Nur geänderte Bildbereiche neu zeichnen statt des ganzen Bildes
|
||||||
|
(WS7_PARTIAL_REFRESH, LVGL-Direct-Mode mit zwei Puffern). Eine sich ändernde
|
||||||
|
Temperaturanzeige kostet damit ein paar tausend statt 921.600 Pixel.
|
||||||
|
* LVGL zeichnet mit zwei Threads auf beiden Prozessorkernen (WS7_PARALLEL_RENDER).
|
||||||
|
- Jeder der drei Schalter steht in pins_config.h und lässt sich einzeln zurückstellen;
|
||||||
|
die README nennt zu jedem, woran man erkennt, dass er zurück muss. Die JC-Panels sind
|
||||||
|
von allen dreien nicht betroffen.
|
||||||
|
- Nebeneffekt: Der Framebuffer-Bedarf sinkt von rund 8,3 MB auf 3,7 MB PSRAM.
|
||||||
|
|
||||||
|
Version 1.6.3:
|
||||||
|
- Waveshare ESP32-P4-Pico: UART zur Hauptplatine liegt jetzt auf TX = GPIO20 und
|
||||||
|
RX = GPIO21 (vorher GPIO17/GPIO18). Die JC-Panels bleiben bei GPIO33/GPIO31.
|
||||||
|
- Das Bild steht in der tatsächlichen Einbaulage richtig herum, die 180-Grad-Drehung aus
|
||||||
|
1.6.1 ist deshalb wieder abgeschaltet (WS7_ROTATE_180 = 0). Sie bleibt als Schalter
|
||||||
|
erhalten, falls das Panel später anders montiert wird.
|
||||||
|
- Der Touch war dagegen oben/unten spiegelverkehrt: Der Digitizer sitzt gegenüber dem Bild
|
||||||
|
um die Hochachse gedreht. WS7_TOUCH_MIRROR_RAW_X steht dafür jetzt auf 1. Bild- und
|
||||||
|
Touch-Ausrichtung sind damit zwei getrennte Schalter, weil sie an diesem Panel eben
|
||||||
|
nicht zusammenfallen.
|
||||||
|
|
||||||
|
Version 1.6.2:
|
||||||
|
- Kommt das Panel nicht hoch, stürzt der P4 nicht mehr wortlos ab. Die Bringup-Schritte
|
||||||
|
melden ihren Fehler jetzt im Klartext auf der seriellen Konsole (auch bei abgeschaltetem
|
||||||
|
Core-Debug-Level), zusammen mit PSRAM-Größe, freiem PSRAM und dem tatsächlich benötigten
|
||||||
|
Framebuffer-Bedarf. Vorher endete ein fehlgeschlagener Panel-Aufbau in einem
|
||||||
|
Speicherauszug, aus dem die Ursache nicht hervorging.
|
||||||
|
- Schlägt der Panel-Aufbau fehl, läuft die Firmware ohne Anzeige weiter, statt ein zweites
|
||||||
|
Mal abzustürzen: UART-Verbindung und OTA bleiben offen, die S3 kann also neu flashen.
|
||||||
|
Alle Oberflächenfunktionen prüfen dafür, ob das Dashboard überhaupt aufgebaut wurde.
|
||||||
|
- Fehlerbehebung: Findet der Touch-Controller nicht statt, lieferte der Hersteller-Treiber
|
||||||
|
einen bereits freigegebenen Zeiger zurück, der ungeprüft weiterverwendet wurde. Das
|
||||||
|
Display läuft in diesem Fall jetzt einfach ohne Bedienung weiter.
|
||||||
|
|
||||||
|
Version 1.6.1:
|
||||||
|
- Waveshare 7" (H): Bild und Touch lassen sich um 180 Grad drehen, wenn das Panel auf dem
|
||||||
|
Kopf eingebaut ist. Schalter WS7_ROTATE_180 in pins_config.h, Vorgabe ist gedreht.
|
||||||
|
Die Drehung übernimmt der PPA-Grafikbeschleuniger des ESP32-P4 - die Software-Rotation
|
||||||
|
des LVGL-Ports rechnet nur in RGB565 und wäre für dieses Panel unbrauchbar.
|
||||||
|
- Der Touch dreht mit, sonst läge die Bedienung spiegelbildlich zum Bild.
|
||||||
|
|
||||||
|
Version 1.6.0:
|
||||||
|
- Neu: Dieselbe Firmware läuft jetzt auch auf einem Waveshare ESP32-P4-Pico mit dem
|
||||||
|
Waveshare 7inch DSI LCD (H) (1280x720). Umgeschaltet wird über „JC_PANEL_TYPE" in
|
||||||
|
config.h; WS_PANEL_7H ist ab dieser Version die Vorgabe, JC_PANEL_43 und JC_PANEL_70
|
||||||
|
bleiben unverändert verfügbar.
|
||||||
|
- Das Waveshare-Panel hängt hinter einer Bridge, die ausschließlich RGB888 annimmt. LVGL
|
||||||
|
rechnet für dieses Panel deshalb mit 24 statt 16 Bit Farbtiefe. lv_conf.h liest dazu
|
||||||
|
JC_PANEL_TYPE aus config.h, damit Sketch und LVGL-Bibliothek garantiert dieselbe
|
||||||
|
Farbtiefe benutzen; display_hal.cpp bricht den Build ab, falls sie auseinanderlaufen.
|
||||||
|
Der Panelwechsel muss aus diesem Grund in config.h erfolgen und nicht per Compiler-Flag.
|
||||||
|
- Bringup ohne Hersteller-Panel-Treiber: DSI-Bus, Kommandokanal und DPI-Panel werden direkt
|
||||||
|
angelegt. Entscheidend ist die Legacy-Referenztaktquelle PLL_F20M - mit der Standardquelle
|
||||||
|
bleibt der Bildschirm auf ESP32-P4 Rev. 1.3 / ECO2 schwarz. Die Zeitbasis (2 Lanes zu
|
||||||
|
1250 Mbit/s, 80 MHz DPI-Takt, Austastlücken 64/64/64, rund 60 Hz) steht als WS7_*-Werte
|
||||||
|
in pins_config.h und ist dort anpassbar, falls das Bild reißt.
|
||||||
|
- Panel-Freigabe und Helligkeit laufen beim Waveshare nicht über einen PWM-Pin, sondern über
|
||||||
|
Register der Bridge auf I2C-Adresse 0x45. Die Hintergrundbeleuchtung wird bewusst erst
|
||||||
|
eingeschaltet, wenn die DSI-Ausgabe steht - sonst blitzt beim Start Bildrauschen auf.
|
||||||
|
Standby-Abdunklung und „Uhrzeit im Standby" funktionieren wie bei den JC-Panels.
|
||||||
|
- Touch: Der GT9271 des Waveshare-Panels benutzt dieselbe Registerbelegung wie der GT911,
|
||||||
|
liegt aber auf I2C-Adresse 0x14 und meldet im Hochformat. X und Y werden deshalb getauscht
|
||||||
|
und auf die Bildfläche begrenzt; Ausreißer des Controllers landen nicht mehr als Klick am
|
||||||
|
Bildrand. Sollte die Bedienung spiegelverkehrt reagieren, lässt sich das mit
|
||||||
|
WS7_TOUCH_MIRROR_RAW_X / _Y in pins_config.h umdrehen.
|
||||||
|
- Der Framebuffer wächst auf 3 x 2,8 MB (rund 8,3 MB PSRAM). Auf dem P4-Pico mit 32 MB
|
||||||
|
PSRAM ist das unkritisch.
|
||||||
|
- Die UART-Pins zur Hauptplatine sind für das Waveshare-Board getrennt eingestellt, weil
|
||||||
|
dessen 40-poliger Header eine andere Belegung hat als die JC-Panels: TX = GPIO17,
|
||||||
|
RX = GPIO18 (JC-Panels unverändert TX = GPIO33, RX = GPIO31).
|
||||||
|
|
||||||
|
Version 1.5.0:
|
||||||
|
- Neu: Dieselbe Firmware unterstützt jetzt auch das 7-Zoll-Display Guition JC1060P470C-I-W
|
||||||
|
(JD9165, 1024x600) zusätzlich zum bisherigen 4,3-Zöller JC4880P443C-I-W (ST7701, 480x800).
|
||||||
|
Umgeschaltet wird über „JC_PANEL_TYPE" in config.h (JC_PANEL_43 / JC_PANEL_70) oder per
|
||||||
|
Compiler-Flag -DJC_PANEL_TYPE=70. Vorgabe bleibt das 4,3-Zoll-Panel, dessen Verhalten sich
|
||||||
|
nicht ändert.
|
||||||
|
- Panel-Treiber esp_lcd_jd9165.c/.h aus dem Hersteller-Paket übernommen; board_bringup.c legt
|
||||||
|
je nach Panel den passenden DSI-Bus, die DPI-Zeitbasis und den Herstellertreiber an.
|
||||||
|
- pins_config.h liefert Auflösung, LCD-Reset-Pin (4,3": GPIO5, 7,0": GPIO27) und Ausrichtung
|
||||||
|
panelabhängig. Das 7-Zoll-Panel ist nativ Querformat, deshalb entfällt dort die 270-Grad-
|
||||||
|
Rotation samt PPA-Beschleunigung.
|
||||||
|
- Der GT911 des 7-Zöllers meldet Rohkoordinaten im Raster 800x480 statt 1024x600. Die
|
||||||
|
Umrechnung hängt am process_coordinates-Hook von esp_lcd_touch, damit die Herstellerdatei
|
||||||
|
esp_lcd_touch_gt911.c unverändert bleibt. Ohne sie wäre nur der linke obere Bildteil
|
||||||
|
bedienbar.
|
||||||
|
- Die Oberfläche rechnet nicht mehr mit fest verdrahteten 480 Pixeln Höhe, sondern mit
|
||||||
|
DISP_VER_RES. Layout und Schriften bleiben sonst unverändert: Das Dashboard arbeitet fast
|
||||||
|
durchgehend mit Prozentmaßen, und die feineren Pixelabstände des 7-Zöllers (170 statt 213 dpi)
|
||||||
|
lassen dieselben Schriftgrößen physisch größer erscheinen.
|
||||||
|
- Die UART-Verkabelung ist bei beiden Panels gleich (P4 GPIO33 = TX, GPIO31 = RX). Beim
|
||||||
|
7-Zöller liegen diese Pins allerdings auf der FPC-Buchse FPC4 (1,0 mm, 16-polig) statt auf
|
||||||
|
einer Stiftleiste - dort wird ein Adapterkabel gebraucht.
|
||||||
|
|
||||||
|
Version 1.4.2:
|
||||||
|
- Bug-Fix: Beim Aufwecken über Antippen erschien die Auswahl „Espresso oder Cold Extraction"
|
||||||
|
manchmal nicht. Der Dialog entschied nach einer anderen Bedingung, ob er die Auswahl ANZEIGT
|
||||||
|
(verlangte zusätzlich cxArmable), als er beim Absenden benutzte, um die Rückfrage der S3 zu
|
||||||
|
UNTERDRÜCKEN. In der Lücke dazwischen zeigte er nur „Aufwecken", sendete aber „wakeEspresso" -
|
||||||
|
und damit war die Frage auch auf der S3 erledigt. Beide Stellen benutzen jetzt dieselbe Funktion
|
||||||
|
wake_choice_offered().
|
||||||
|
- Hat der Dialog die Auswahl nicht angeboten, sendet er wieder „deactivateStandby". Dann öffnet die
|
||||||
|
S3 ihr eigenes Auswahlfenster, und die Frage kommt trotzdem - derselbe Weg wie beim Aufwecken über
|
||||||
|
den Schalter. Die Auswahl kann damit nicht mehr ersatzlos entfallen.
|
||||||
|
|
||||||
|
Version 1.4.1:
|
||||||
|
- Passend zu S3 5.6.2: Die Auswahl beim Aufwecken erscheint auch dann, wenn der Cold-Extraction-Modus
|
||||||
|
bereits aktiv ist - sie geht in beide Richtungen. „Espresso" schaltet den Modus dann ab.
|
||||||
|
- Der Cold-Extraction-Knopf zeigt den Ist-Zustand: Bei aktivem Modus ist er hervorgehoben und heißt
|
||||||
|
„Cold Extraction (aktiv lassen)", sonst „Cold Extraction (Wasser bleibt kalt)".
|
||||||
|
|
||||||
|
Version 1.4.0:
|
||||||
|
- Die Auswahl „Espresso oder Cold Extraction" erscheint jetzt auch beim Aufwecken über den Schalter
|
||||||
|
(braucht S3-Firmware ab 5.6.0). Meldet die S3 ein offenes Auswahlfenster (cxWakeChoice), blendet das
|
||||||
|
Display den Dialog von sich aus ein - ohne Antippen - und zeigt die verbleibende Bedenkzeit als
|
||||||
|
Countdown. „Abbrechen" entfällt in diesem Fall, weil es nichts abzubrechen gibt: Läuft die Zeit ab,
|
||||||
|
heizt die Maschine normal auf.
|
||||||
|
- Der Espresso-Knopf sendet „wakeEspresso" statt „deactivateStandby", sobald die Auswahl relevant ist.
|
||||||
|
Damit wird die Entscheidung auf der S3 vermerkt und nicht direkt danach erneut gefragt.
|
||||||
|
- Der Cold-Extraction-Knopf beendet den Standby nur noch, wenn er überhaupt aktiv ist - im Auswahlfenster
|
||||||
|
nach dem Aufwecken schaltet er nur den Modus.
|
||||||
|
|
||||||
|
Version 1.3.0:
|
||||||
|
- Der Aufweck-Dialog wird zur Auswahl: „Womit aufwecken?" mit den Knöpfen „Espresso" (heizt normal auf)
|
||||||
|
und „Cold Extraction (Wasser bleibt kalt)". Braucht S3-Firmware ab 5.5.0.
|
||||||
|
Bei „Cold Extraction" wird erst der Modus scharf geschaltet und dann der Standby beendet, damit der
|
||||||
|
Wasserkreis nicht zwischendurch anheizt.
|
||||||
|
- Steuerbar über die neue Einstellung „Beim Aufwecken fragen" (Cold-Extraction-Seite, Abschnitt
|
||||||
|
Grundeinstellung; identisch zur Web-UI). Ist sie aus, erscheint wieder der bisherige Dialog mit
|
||||||
|
„Aufwecken" und „Abbrechen" - der Zwischenschritt entfällt dann komplett.
|
||||||
|
|
||||||
|
Version 1.2.1:
|
||||||
|
- Bug-Fix: Während einer kalten Extraktion zeigten Waage-Kachel und Live-Bezugsschirm das Zielgewicht
|
||||||
|
des normalen Espresso-Bezugs (bbwTarget) statt des Ziels der kalten Extraktion (cxTarget). Außerdem
|
||||||
|
erschienen Gewichtsanzeige und Fortschrittsbalken nur, wenn Brew-by-Weight aktiv war - bei kalter
|
||||||
|
Extraktion ist das typischerweise aus, obwohl ein Ziel existiert. Beide Anzeigen nutzen jetzt
|
||||||
|
cxTarget, sobald cxShot gesetzt ist.
|
||||||
|
|
||||||
|
Version 1.2.0:
|
||||||
|
- Neue Seite „Cold Extraction" mit eigenem Menüeintrag (braucht S3-Firmware ab 5.4.0). Dort stehen jetzt
|
||||||
|
alle Parameter der kalten Extraktion und lassen sich direkt am Display ändern: Freigabetemperatur,
|
||||||
|
Vorbenetzung (Dauer + Pumpenleistung), Hauptbezug (Pulsperiode + Pumpenleistung), Zielgewicht,
|
||||||
|
maximale Bezugsdauer sowie der Pumpenschutz. Gespeichert wird über das erweiterte saveBrew-Kommando.
|
||||||
|
- Der Modus-Schalter ist von der Temperatur-Seite auf die neue Seite umgezogen (eine Stelle statt zwei).
|
||||||
|
Der Knopf „Aufwecken mit Cold Extraction" im Standby-Dialog bleibt unverändert.
|
||||||
|
- Brew-Control-Seite neu gegliedert: Statt einer durchlaufenden Liste unter Zwischenüberschriften liegt
|
||||||
|
jede Funktion (Pre-Infusion, Brew-by-Time, Brew-by-Weight, Dampf-Timer) jetzt in einer eigenen Karte
|
||||||
|
mit Titel und einer Zeile, die erklärt, was sie tut. Die neue Cold-Extraction-Seite nutzt dieselbe
|
||||||
|
Gliederung.
|
||||||
|
- Eingabefelder werden nur beim Öffnen der Seite aus dem Zustand gefüllt, damit laufende State-Pushes
|
||||||
|
eine begonnene Eingabe nicht überschreiben (gleiches Verhalten wie auf der Brew-Control-Seite).
|
||||||
|
|
||||||
|
Version 1.1.3:
|
||||||
|
- Aufweck-Dialog hat einen dritten Knopf: „Aufwecken mit Cold Extraction" (braucht S3 ab 5.3.5).
|
||||||
|
Er stellt den Modus scharf und beendet erst danach den Standby - in dieser Reihenfolge, damit
|
||||||
|
der Wasserkreis gar nicht erst anheizt. Ohne diesen Weg musste man normal aufwecken (Maschine
|
||||||
|
heizt an) und den Modus danach umschalten. Der Knopf erscheint nur, wenn die Funktion
|
||||||
|
freigeschaltet und umschaltbar ist und der Modus nicht ohnehin schon läuft.
|
||||||
|
- Der Schalter „Cold Extraction" auf der Temperatur-Seite hängt jetzt am neuen State-Feld
|
||||||
|
cxArmable statt an cxAllowed: umschaltbar auch im Standby und bei warmem Kessel, gesperrt nur
|
||||||
|
während eines laufenden kalten Bezugs. Bei älterer S3-Firmware fällt das Feld auf cxEnabled
|
||||||
|
zurück, der Schalter bleibt also bedienbar.
|
||||||
|
- Erklärzeile im Standby: „Nach dem Aufwecken bleibt der Wasserkreis aus."
|
||||||
|
|
||||||
|
Version 1.1.2:
|
||||||
|
- Cold Extraction: Fehlt eine nutzbare Waage, weist das Display jetzt dauerhaft darauf hin.
|
||||||
|
Ohne Waage greifen weder Zielgewicht noch Stillstands-Erkennung, der Bezug endet erst nach der
|
||||||
|
maximalen Bezugsdauer (braucht S3-Firmware ab 5.3.4).
|
||||||
|
- Statuszeile: „Cold Extraction aktiv - ohne Waage, Ende nach Zeit" (gelb) statt des blauen
|
||||||
|
Normalhinweises; beim Aktivieren zusätzlich kurz die Meldung zum neuen cxNotice-Code 4.
|
||||||
|
- Erklärzeile unter dem Schalter und die Parameter-Anzeige auf der Brew-Seite ergänzen den
|
||||||
|
Hinweis; bei aktivem Modus ohne Waage nennt die Zeile die Zeit statt des Zielgewichts.
|
||||||
|
|
||||||
|
Version 1.1.1:
|
||||||
|
- Compiler-Warnungen des P4-Builds aufgeräumt (rein technisch, keine Funktionsänderung):
|
||||||
|
- „LV_FS_DEFAULT_DRIVE_LETTER is deprecated": Die Option heißt ab LVGL 9.3
|
||||||
|
LV_FS_DEFAULT_DRIVER_LETTER. Der alte Name funktionierte zwar noch, löste aber in
|
||||||
|
lv_api_map_v9_1.h ein #warning aus - und zwar in JEDER Übersetzungseinheit, die lvgl.h
|
||||||
|
einbindet. Das allein waren rund 60 Warnungen pro Build, die alles andere zugedeckt haben.
|
||||||
|
In lv_conf.h umbenannt.
|
||||||
|
- „bitwise operation between different enumeration types is deprecated": LV_PART_* und
|
||||||
|
LV_STATE_* sind in LVGL 9 zwei verschiedene Enum-Typen; sie direkt mit | zu verknüpfen ist
|
||||||
|
in C++20 abgekündigt. Neues Makro TH_SEL(part, state) in theme.h castet beide auf
|
||||||
|
lv_style_selector_t (ohnehin uint32_t). Betraf 5 Stellen in ui.cpp und theme.h.
|
||||||
|
- Bug-Fix: Der Puffer für die Cold-Extraction-Infozeile auf der Brew-Seite war mit 192 Bytes
|
||||||
|
zu klein - der Text ist rund 205 Zeichen lang (das „°" zählt als zwei Bytes), die letzte
|
||||||
|
Zeile wurde also abgeschnitten. Jetzt 256 Bytes.
|
||||||
|
|
||||||
|
Version 1.1.0:
|
||||||
|
- Cold Extraction am Display bedienbar (braucht S3-Firmware ab 5.3.2):
|
||||||
|
- Neuer Schalter „Cold Extraction" auf der Seite „Temperaturen" unter „Modi", darunter eine
|
||||||
|
Erklärzeile mit dem aktuellen Zustand bzw. dem Sperrgrund. Schalter und Zeile bleiben
|
||||||
|
unsichtbar, solange die S3 die Funktion nicht freigeschaltet meldet (auch bei älterer
|
||||||
|
S3-Firmware, die die Felder gar nicht sendet).
|
||||||
|
- Einschalten ist nur bei erteilter Freigabe möglich (Wasserkessel kalt genug, kein Standby /
|
||||||
|
Wartung / Tuning); ausschalten immer, außer während eines laufenden kalten Bezugs. Gesendet
|
||||||
|
wird gezielt startColdExtraction/stopColdExtraction statt eines Toggles, damit ein
|
||||||
|
abgewiesener Befehl den Schalter nicht in einen nie bestätigten Zustand bringt.
|
||||||
|
- Statuszeile: eigener Slot direkt hinter der Sicherheitsmeldung. Zeigt dauerhaft
|
||||||
|
„Cold Extraction aktiv - Wasserkreis heizt nicht", bei fehlender Freigabe den Grund,
|
||||||
|
während der Pumpen-Zwangspause den Pumpenschutz und transient einen abgewiesenen Start
|
||||||
|
bzw. einen Abbruch wegen fehlenden Zulaufs.
|
||||||
|
- Wasser-Kachel im Dashboard zeigt bei aktivem Modus „Cold Extraction - Heizen aus" statt
|
||||||
|
eines Sollwerts, der nicht erreicht wird; der Aufheiz-Countdown ist dann unterdrückt.
|
||||||
|
- Phasenleiste und Live-Bezugsschirm benennen die erste Phase eines kalten Bezugs
|
||||||
|
„Vorbenetzung" (keine Pause-Phase) und zeigen die Pumpenpause an.
|
||||||
|
- Brew-Seite: Cold-Extraction-Parameter als Anzeige (Freigabeschwelle, Vorbenetzung,
|
||||||
|
Zielgewicht, Timeout) mit Hinweis, dass sie in der Web-UI eingestellt werden.
|
||||||
|
- Statistik-Seite: kalte Bezüge sind mit „(kalt)" markiert und gehen nicht in die mittlere
|
||||||
|
Bezugsdauer ein - gleiche Regel wie in der S3-Statistik.
|
||||||
|
- Bug-Fix: Das Limit für eingehende UART-Zeilen (PROTO_RX_LINE_MAX) lag bei 2048 Bytes, während
|
||||||
|
die State-Zeile der S3 bereits rund 2,1 KB erreicht - mit langem Status-, Profil- oder
|
||||||
|
SSID-Text konnte sie darüber liegen. In dem Fall wurde die GANZE Zeile verworfen und das
|
||||||
|
Display fror auf dem letzten Stand ein, ohne dass die Verbindung als tot erkannt wurde.
|
||||||
|
Das Limit ist jetzt 4096 Bytes; der RX-Puffer selbst bleibt bei 2 KB reserviert, weil der
|
||||||
|
interne RAM knapp ist und eine Arduino-String nicht ins PSRAM alloziert werden kann.
|
||||||
|
|
||||||
|
Version 1.0.13:
|
||||||
|
- Profil-Schnellwahl + Anzeige des aktiven Profils (braucht S3-Firmware ab 5.1.1):
|
||||||
|
- Neuer Profil-Chip im Header (auf allen Seiten sichtbar): zeigt das zuletzt geladene bzw.
|
||||||
|
gespeicherte Profil; ein „*" hinter dem Namen bedeutet, dass seitdem profil-relevante
|
||||||
|
Einstellungen geändert wurden. Lange Namen werden gekürzt; ohne bekanntes Profil
|
||||||
|
(oder mit älterer S3-Firmware) bleibt der Chip unsichtbar.
|
||||||
|
- Antippen des Chips öffnet die Profil-Schnellwahl: ein Overlay mit allen gespeicherten
|
||||||
|
Profilen, das aktive mit Häkchen und Akzentfarbe hervorgehoben. Ein Tap lädt das Profil
|
||||||
|
direkt (Toast bestätigt, Chip aktualisiert sich mit dem nächsten State) — zwei Berührungen
|
||||||
|
vom Dashboard zum Profilwechsel statt Umweg über die Profile-Seite.
|
||||||
|
- Profile-Seite: das aktive Profil wird in der Liste mit Häkchen-Symbol und Akzentfarbe
|
||||||
|
markiert.
|
||||||
|
|
||||||
|
Version 1.0.12:
|
||||||
|
- Verlauf-Chart: Flackernde Heizleistungs-Kurven in den großen Zeitfenstern behoben. Die
|
||||||
|
Dezimierung pickte pro Chart-Punkt ein Einzelsample, dessen Abtast-Raster mit jedem
|
||||||
|
Sekundentick um eine Position wanderte — die schnell schaltende Heizleistung (PWM)
|
||||||
|
sprang dadurch sichtbar zwischen zwei Kurvenbildern hin und her. Jetzt wird über den
|
||||||
|
gesamten Zeitabschnitt eines Chart-Punkts gemittelt: das Bild steht ruhig, und die
|
||||||
|
Leistungs-Kurve zeigt die tatsächliche mittlere Heizleistung statt zufälliger
|
||||||
|
Momentwerte. Im 2-min-Fenster (1 Sample je Punkt) ändert sich nichts.
|
||||||
|
|
||||||
|
Version 1.0.11:
|
||||||
|
- Verlauf-Seite ausgebaut (nur P4, keine S3-/Protokolländerung nötig):
|
||||||
|
- Umschaltbares Zeitfenster: Buttons „2 min / 10 min / 30 min / 60 min" in der Kopfzeile.
|
||||||
|
Intern läuft eine 1-s-Historie als Ringpuffer über volle 60 Minuten; das Chart zeigt
|
||||||
|
weiterhin 120 Punkte und dezimiert je Fenster. Dadurch ist beim Fensterwechsel der
|
||||||
|
komplette Verlauf sofort da (kein leeres Chart, kein Neuaufbau). Die Wahl wird P4-lokal
|
||||||
|
im NVS gespeichert und überlebt Neustarts.
|
||||||
|
- Gestrichelte Soll-Linien für Wasser und Dampf im Chart (Farbe der jeweiligen Kurve,
|
||||||
|
gedimmt). Die Y-Skala bezieht die Soll-Werte mit ein, damit die Linien im Bild liegen —
|
||||||
|
aber nur für Kreise, deren Ist-Kurve im Fenster sichtbar ist (ein kalter Dampfkessel
|
||||||
|
zieht die Skala nicht auseinander).
|
||||||
|
- Heizleistung zuschaltbar: Button „Leistung" blendet Duty-Cycle Wasser/Dampf als gedimmte
|
||||||
|
Zusatzkurven auf einer zweiten Achse (0–100 %) ein, inkl. Live-Legende. Einstellung
|
||||||
|
ebenfalls P4-lokal im NVS.
|
||||||
|
- Feinere Kurven: Die Temperatur-Historie wird jetzt in Zehntelgrad geführt und gezeichnet
|
||||||
|
(vorher ganzzahlig gerundet) — PID-Schwingungen um ±1 °C sind damit sauber ablesbar.
|
||||||
|
- Die ~29 KB Historie liegen im PSRAM (heap_caps_malloc, wie die LVGL-Framebuffer) —
|
||||||
|
als statische Arrays sprengten sie den internen RAM (Linker: 107 % belegt).
|
||||||
|
- Shot-Zusammenfassung: Karte auf 560 px verbreitert und Spaltenabstand zwischen
|
||||||
|
Dauer/Gewicht/Flow deutlich vergrößert (28 px statt 10 px) — die drei Werte standen
|
||||||
|
zu nahe beisammen und waren schlecht lesbar.
|
||||||
|
- PID-AutoTune sichtbar gemacht: Während eines Tuning-Laufs erscheint auf der Verlauf-Seite
|
||||||
|
eine Live-Karte (mit Spinner) — je Kreis Laufzeit, aktuelle Phase (heizt/kühlt ab) und
|
||||||
|
Schwingungshub samt Mittelpunkt (Min/Max der Ist-Temperatur seit Start). Nach dem Ende
|
||||||
|
zeigt die Karte ~30 s das Ergebnis (Erfolg/Abbruch samt Grund, farbcodiert). Die
|
||||||
|
PID-Tuning-Meldung in der Statuszeile ist jetzt antippbar und springt zur Verlauf-Seite,
|
||||||
|
wo die Schwingung auch als Kurve zu sehen ist.
|
||||||
|
|
||||||
|
Version 1.0.10:
|
||||||
|
- Live-Bezugsschirm (abschaltbar): Beim Start eines echten Bezugs blendet sich ein Vollbild-Overlay
|
||||||
|
weich ein — große Bezugszeit, Live-Gewicht und Flow samt Flow-Verlaufskurve der letzten 30 Sekunden
|
||||||
|
(nur bei verbundener Waage), Fortschrittsbalken Richtung Zielgewicht (Brew-by-Weight) bzw. Zielzeit
|
||||||
|
(Brew-by-Time) und Pre-Infusion-Phasenhinweis mit Restzeit. Über das X oben rechts für den laufenden
|
||||||
|
Bezug schließbar; beim nächsten Bezug erscheint er wieder. Ein/Aus-Schalter auf der Info-Seite unter
|
||||||
|
„Darstellung", die Einstellung wird P4-lokal im NVS gespeichert und überlebt Neustarts. Während
|
||||||
|
Flush und Reinigungsassistent erscheint das Overlay bewusst nicht.
|
||||||
|
- Shot-Zusammenfassung aufgewertet: Die Karte nach Bezugsende blendet jetzt weich ein/aus (Fade),
|
||||||
|
wirft einen Schlagschatten und zeigt Dauer, Endgewicht und mittleren Flow als große Werte mit
|
||||||
|
gedimmter Beschriftung statt reiner Textzeilen (Gewicht/Flow nur bei aktiver Waage).
|
||||||
|
- Pre-Infusion-Phasenanzeige auf dem Dashboard: Während eines Bezugs mit aktiver Pre-Infusion zeigt
|
||||||
|
eine Schrittleiste die Phasen „Pre-Infusion → Pause → Extraktion" an — erledigte Schritte mit Haken,
|
||||||
|
die aktive Phase hervorgehoben (Gold) inkl. Restzeit-Countdown (100-ms-Takt). Die aktive Phase kommt
|
||||||
|
quelltreu von der S3 (neues State-Feld "piState", ab S3-Firmware 5.0.12); bei älterer S3-Firmware wird
|
||||||
|
sie zeitbasiert aus den konfigurierten Phasendauern abgeleitet. Ist keine Pause konfiguriert (0 s),
|
||||||
|
wird der Pause-Schritt ausgeblendet.
|
||||||
|
- Temperatur-Seite: Solltemperaturen für Wasser und Dampf werden jetzt über radiale Drehregler (Arc,
|
||||||
|
270°) mit großem Wert mittig und −/+-Feinjustage eingestellt. Gesendet wird entprellt (nach kurzer
|
||||||
|
Bedienpause bzw. sofort beim Loslassen des Reglers oder Verlassen der Seite), damit Drag-Gesten die
|
||||||
|
S3 nicht mit setTemp-Kommandos und EEPROM-Schreibzugriffen fluten. Tippen in die Reglermitte löst
|
||||||
|
bewusst keinen Wertsprung aus (ADV_HITTEST: nur Ring/Griff reagieren).
|
||||||
|
- Dashboard-Feinschliff (nur P4, keine S3-/Protokolländerung nötig):
|
||||||
|
- Weiche Temperatur-Zustandsfarben: Der große Ist-Wert färbt sich stufenlos über den Abstand
|
||||||
|
zum Soll (kontinuierliche Farbinterpolation statt harter Stufen) — Blau beim Aufheizen,
|
||||||
|
Gold kurz vor dem Ziel, Grün im Zielband (±0,5 °C), Richtung Warngelb bei deutlichem
|
||||||
|
Überschwinger. Dazu neue „BEREIT"-Pille im Header (auf allen Seiten sichtbar), wenn der
|
||||||
|
Wasserkessel — und der Dampfkessel, sofern er heizt — im Zielband liegt, kein Fehler/
|
||||||
|
Standby/Eco aktiv ist und kein Aufheiz-Countdown läuft; mit Hysterese gegen Flackern
|
||||||
|
an der Bandgrenze, erscheint und verschwindet weich (Fade).
|
||||||
|
- Umschaltbares Temperatur-Design: Die Dashboard-Temperaturanzeige gibt es jetzt in fünf
|
||||||
|
Varianten — „Klassisch" (bisherige Karten mit Prozentbalken), „Instrumente" (freistehende
|
||||||
|
Rundinstrumente im Manometer-Look: Metall-Bezel mit Verlauf und Schlagschatten für eine
|
||||||
|
leichte 3D-Wirkung, 270°-Bogen füllt sich in der Zustandsfarbe, Soll-Wert in der
|
||||||
|
Bogen-Lücke), „Minimal" (komplett rahmenlos, nur große Werte mit dünner Ist/Soll-Linie),
|
||||||
|
„Soft-3D" (Neumorph: Fläche fast im Hintergrundton wirkt herausgedrückt — dunkler
|
||||||
|
Schatten unten rechts, heller Lichtschein oben links, eingelassener Balken) und
|
||||||
|
„Thermometer" (vertikale Säulen, die sich von unten in der Zustandsfarbe füllen, mit
|
||||||
|
Glanzstreifen als Glas-Effekt und rundem Kolben unten). Außer bei „Klassisch" folgt
|
||||||
|
auch die Füllfarbe von Balken/Bogen/Säule stufenlos der Zustandsfarbe des Ist-Werts.
|
||||||
|
Umschalter auf der Info-Seite unter „Darstellung"; die Wahl wird P4-lokal im NVS
|
||||||
|
gespeichert und überlebt Neustarts. Standard: Instrumente.
|
||||||
|
- Konsolidierte Statuszeile: Die sechs gestapelten Dashboard-Banner (Sicherheit, Dampf,
|
||||||
|
Reinigung, PID-Tuning, Wartung, Aufheiz-Countdown) teilen sich jetzt EINE feste einzeilige
|
||||||
|
Meldung — mehrere aktive Hinweise rotieren alle 4 s weich durch (Fade) statt das Layout
|
||||||
|
zu verschieben, Priorität Rot > Gelb > Blau. Wartungs- und Reinigungsmeldung bleiben
|
||||||
|
antippbar (Serviceseite bzw. Reinigungs-Sub-Screen), Überlängen laufen als Laufschrift durch.
|
||||||
|
|
||||||
|
Version 1.0.9:
|
||||||
|
- Weiche Übergänge (dezente Fade-Animationen) hinzugefügt:
|
||||||
|
- Start-Animation: Boot-Splash mit Logo, Untertitel, Lade-Spinner ("Verbinde mit Maschine...")
|
||||||
|
und Firmware-Stand; blendet sich beim Start weich ein und beim ersten State von der S3
|
||||||
|
(Verbindung steht) wieder aus.
|
||||||
|
- Einschlaf-Animation: Die Standby-Uhr wird beim Wechsel in den Standby weich eingeblendet.
|
||||||
|
- Aufweck-Animation: Beim Aufwecken blendet das Standby-Overlay weich aus und gibt das
|
||||||
|
Dashboard frei.
|
||||||
|
- Umsetzung speicher-neutral über das 'opa'-Style (kein opa_layered/Vollbild-Puffer), um den
|
||||||
|
LVGL-Speicherpool nicht zu belasten. Bei ausgeschalteter Standby-Uhr (Display aus) gibt es
|
||||||
|
weiterhin keine Einschlaf-Animation (schwarzer Bildschirm bietet keine Anzeigefläche).
|
||||||
|
|
||||||
|
Version 1.0.8:
|
||||||
|
- Statistik-Seite hinzugefügt
|
||||||
|
|
||||||
|
Version 1.0.7:
|
||||||
|
- Brew-by-Weight-Gewichtseingabelimit auf 150g erhöht, um auch Heißwasserbzug für Americano oder ähnliches via BBW zu ermöglichen
|
||||||
|
|
||||||
|
Version 1.0.6:
|
||||||
|
- Boot-Loop-Schutz implementiert:
|
||||||
|
P4-Boot-Loop-Schutz + „Update-Modus", der den UART-OTA offenhält.
|
||||||
|
Wenn die P4-Firmware in eine Absturzschleife läuft, erkennt sie das (RTC-Zähler wie beim S3) und
|
||||||
|
startet in einen abgespeckten Modus, der bewusst das riskanteste überspringt — vor allem die Display-/LVGL-Init (der wahrscheinlichste P4-Absturzgrund, siehe unser LVGL-Mem-Pool-Thema) — und nur den UART-Empfang + OTA-Receiver laufen lässt. Dann kann der S3 die P4-Firmware jederzeit per UART neu flashen, auch wenn die normale P4-Oberfläche kaputt ist. (Optional: eine ganz simple statische „Update-Modus"-Bildschirmmeldung, falls das Panel-Bringup als sicher genug gilt.)
|
||||||
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |