Der Log nach einem Reset zeigte alle Panel-Schritte fehlerfrei, aber "i2c transaction failed" beim GT911. Bridge und Touch teilen sich den Bus: Trifft ein Reset des P4 mitten in eine Übertragung, bleibt der Baustein in seiner Bitausgabe stehen und hält SDA dauerhaft low. Beide hängen an Dauerstrom, der Zustand überlebt also Reset und Flashen. - ws7_i2c_bus_recover() taktet SCL vor dem Anlegen des Busses bis zu neunmal von Hand, bis SDA freigegeben wird, und erzeugt dann eine Stop-Bedingung. Bei freiem Bus läuft die Funktion wirkungslos durch. - ws7_bridge_write() prüft den Rückgabewert. Bisher liefen fehlgeschlagene Schreibzugriffe stillschweigend ins Leere - der eigentliche Grund, warum das schwarze Bild keinerlei Spur hinterließ. - pins_config.h: "#elsealle" statt "#else" seit 1.6.10 korrigiert. Der Tippfehler traf nur den JC_PANEL_43-Zweig, der dadurch nicht mehr übersetzbar war. Beide Panel-Varianten wieder gegengebaut. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018QoLDQeUh1dCQz7yYZVb4Y
435 lines
31 KiB
Plaintext
435 lines
31 KiB
Plaintext
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.) |