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.)