Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5df6c20171 | ||
|
|
7d7893cf08 | ||
|
|
db707ffd8c | ||
|
|
9eb386095d | ||
|
|
7fec5d9fb5 | ||
|
|
32280a7ea3 | ||
|
|
5988668026 | ||
|
|
4f2700d59a | ||
|
|
0ec3d89973 | ||
|
|
06d9710b16 | ||
|
|
b3b96362c3 | ||
|
|
14f1a4789d | ||
|
|
326af4288a | ||
|
|
2e8651bc00 | ||
|
|
b13e5fdaf1 | ||
|
|
671a6696ce |
@@ -1,3 +1,97 @@
|
|||||||
|
Version 1.9.11:
|
||||||
|
- Endlose Startschleife behoben: Beleuchtung an, nie ein Bild. Der P4 startet sich nach dem
|
||||||
|
Einschalten absichtlich einmal neu, weil das Panel sonst schwarz bleibt. Die Absicherung
|
||||||
|
dagegen verließ sich darauf, dass der zweite Start kein Kaltstart mehr ist - der Chip
|
||||||
|
meldet aber auch nach dem selbst ausgelösten Neustart wieder einen Kaltstart. Damit griff
|
||||||
|
die Bedingung erneut, endlos.
|
||||||
|
- Der Neustart wird jetzt vermerkt und beim zweiten Durchlauf erkannt, unabhängig davon, was
|
||||||
|
der Chip als Startgrund meldet. Beim nächsten echten Einschalten erfolgt wieder genau ein
|
||||||
|
Neustart.
|
||||||
|
- Die Meldung über diesen Neustart lief bisher über die USB-Verbindung und war im seriellen
|
||||||
|
Monitor nicht zu sehen - deshalb war von der Schleife nichts zu erkennen. Sie läuft jetzt
|
||||||
|
denselben Weg wie die übrigen Panel-Meldungen.
|
||||||
|
|
||||||
|
Version 1.9.10:
|
||||||
|
- Alle Messzeilen laufen jetzt auf derselben Uhr. Die des Zeichenablaufs startete später als
|
||||||
|
die des Hauptablaufs; die Zeiten ließen sich nur mit Umrechnung vergleichen.
|
||||||
|
- Der Touch meldet jetzt, wenn er Rohwerte verwirft, weil sie außerhalb des gültigen
|
||||||
|
Bereichs liegen, und nennt bei jeder erkannten Berührung, wie viele vorher verworfen
|
||||||
|
wurden. Eine Berührung, deren Rohwerte lange verworfen werden, sieht von außen genauso aus
|
||||||
|
wie ein Display, das nicht reagiert - das war bisher nicht zu unterscheiden.
|
||||||
|
|
||||||
|
Version 1.9.9:
|
||||||
|
- Die kleinen Kacheln unten im Dashboard behalten beim Bezug ihre Höhe. Bisher bekam die
|
||||||
|
untere Zeile während des Bezugs deutlich mehr Platz - die Kacheln wurden enorm hoch und
|
||||||
|
das Dashboard sprang bei jedem Bezugsbeginn sichtbar um.
|
||||||
|
- Die Messzeilen gingen bisher teils über die USB-Verbindung hinaus und waren im seriellen
|
||||||
|
Monitor gar nicht zu sehen - die Messung der Helligkeit lief damit ins Leere. Alle
|
||||||
|
Messzeilen laufen jetzt über denselben Weg wie die Panel-Meldungen.
|
||||||
|
- Jede Messzeile trägt jetzt eine Zeitmarke. Nur so sind die Lücken zu sehen, in denen die
|
||||||
|
fünf Sekunden vergehen.
|
||||||
|
- Der Wechsel in den und aus dem Standby wird an jeder Station vermessen: Ankunft der
|
||||||
|
Meldung, Warten auf die Anzeigesperre, Dauer der Aktualisierung. Ebenso der Weg vom Tippen
|
||||||
|
auf die Standby-Uhr bis zur fertig aufgebauten Rückfrage.
|
||||||
|
|
||||||
|
Version 1.9.8:
|
||||||
|
- Der Stillstand beim Wechsel in den Standby ist gefunden und behoben. LVGL legt für JEDE
|
||||||
|
Textglyphe einen eigenen Zwischenpuffer an - bei der großen Uhr rund 48 KB pro Ziffer, mit
|
||||||
|
zwei parallel arbeitenden Zeicheneinheiten fast 100 KB gleichzeitig. Der interne
|
||||||
|
LVGL-Speicher hatte nur rund 98 KB am Stück frei; es reichte knapp nicht. Schlägt die
|
||||||
|
Anforderung fehl, hält LVGL per Zusicherung in einer Endlosschleife an - kein Absturz,
|
||||||
|
keine Meldung, das Display steht einfach. Deshalb brach der Mitschnitt ohne Fehler ab.
|
||||||
|
- Große Glyphenpuffer liegen jetzt im externen Speicher (PSRAM, 32 MB frei). Kleine bleiben
|
||||||
|
im internen, der ist schneller - sonst würde jeder Text langsamer.
|
||||||
|
- Hält LVGL künftig wegen einer verletzten Zusicherung an, sagt es das jetzt, statt stumm
|
||||||
|
stehen zu bleiben.
|
||||||
|
|
||||||
|
Version 1.9.7:
|
||||||
|
- Messpunkte für den Stillstand beim Wechsel in den Standby: Beide Abläufe - der Haupt- und
|
||||||
|
der Zeichenablauf - melden jetzt alle zwei Sekunden einen Herzschlag mit Speicherstand.
|
||||||
|
Bleibt nur einer von beiden aus, ist klar, welcher stehen bleibt.
|
||||||
|
- Das Einblenden der Standby-Uhr meldet Anfang und Ende mit Dauer. Bleibt die zweite Meldung
|
||||||
|
aus, hängt es genau dort.
|
||||||
|
- Jeder Helligkeitswechsel, der länger als 50 ms braucht, wird mit seiner Dauer gemeldet. Der
|
||||||
|
Schreibzugriff geht über denselben Bus wie der Touch - ein Verdacht für die bekannte
|
||||||
|
Verzögerung von ein bis zwei Sekunden.
|
||||||
|
- Die Rückmeldung aus 1.9.5, die einen komplett ungültigen Inhaltsbereich melden sollte, ist
|
||||||
|
wieder entfernt. Sie konnte nie auslösen: LVGL schickt diese Meldung an das Display, nicht
|
||||||
|
an einzelne Elemente. Ihr Ausbleiben war also kein Beweis.
|
||||||
|
|
||||||
|
Version 1.9.6:
|
||||||
|
- Die Darstellungseinstellungen haben einen eigenen Menüpunkt „Darstellung" bekommen. Sie
|
||||||
|
standen bisher oben auf der Info-Seite, zwischen Sachen, mit denen sie nichts zu tun
|
||||||
|
haben. Die Info-Seite zeigt jetzt nur noch Firmware-Stände und Verbindungsdaten.
|
||||||
|
- Die Uhr im Standby ist auf dem 7-Zoll-Panel deutlich größer geworden: Die drei Stufen
|
||||||
|
liegen jetzt bei 180, 270 und 360 Pixeln statt bei 120, 180 und 240. Auf dem 4,3-Zoll-
|
||||||
|
Panel bleiben die bisherigen Stufen, dort passen größere schlicht nicht auf den Schirm.
|
||||||
|
|
||||||
|
Version 1.9.5:
|
||||||
|
- Die festen Breiten aus 1.9.4 haben nicht gereicht: Auch die HÖHE muss festliegen. LVGL
|
||||||
|
prüft beim Setzen eines Textes, ob sich die Eigengröße der Beschriftung geändert haben
|
||||||
|
könnte - ist eines der beiden Maße frei, gilt das Layout des Elternteils als neu zu
|
||||||
|
berechnen, und das macht die ganze Seite ungültig. Temperaturwerte, Sollwerte, die Werte
|
||||||
|
der unteren Zeile und die Uhrzeit in der Kopfleiste haben jetzt feste Maße in beide
|
||||||
|
Richtungen.
|
||||||
|
- Die Uhrzeit hatte denselben Effekt in der Kopfleiste: Beim Wechsel der Minute wurde die
|
||||||
|
Leiste samt Menü-Knopf neu berechnet. Das erklärt den Bereich „x 6..57, y 2..41", der in
|
||||||
|
fast jedem Durchgang auftauchte.
|
||||||
|
- Zusätzlich meldet die Firmware jetzt, wenn der Inhaltsbereich oder die Dashboard-Seite als
|
||||||
|
Ganzes ungültig gemacht wird. Damit ist zu unterscheiden, ob eine einzelne Beschriftung
|
||||||
|
den Bildaufbau auslöst oder gleich der komplette Bereich - zwei verschiedene Ursachen mit
|
||||||
|
verschiedenen Gegenmitteln.
|
||||||
|
|
||||||
|
Version 1.9.4:
|
||||||
|
- Die Messung mit Koordinaten hat den Verursacher benannt: Der ungültige Bereich war
|
||||||
|
„x 0..1279, y 44..719" - also der gesamte Inhalt unterhalb der Kopfleiste, bei jeder
|
||||||
|
Zustandsmeldung.
|
||||||
|
- Grund: Die Anzeigewerte hatten keine feste Breite. Wächst oder schrumpft eine Beschriftung
|
||||||
|
mit ihrem Inhalt - etwa von „92,4 °C" auf „100,1 °C" -, rechnet LVGL das Layout der
|
||||||
|
gesamten Seite neu und macht sie dabei komplett ungültig. Es genügt also nicht, den Text
|
||||||
|
nur bei echter Änderung zu setzen; er darf beim Ändern auch die Breite nicht verändern.
|
||||||
|
- Temperaturwerte, Sollwerte und die Werte der unteren Zeile haben jetzt eine feste Breite
|
||||||
|
mit zentriertem Text. Sichtbar ändert sich dadurch nichts - die Werte standen ohnehin
|
||||||
|
mittig.
|
||||||
|
|
||||||
Version 1.9.3:
|
Version 1.9.3:
|
||||||
- Fehlerbehebung: Bei geöffnetem Menü war der Seiteninhalt dahinter verschwunden. Der
|
- Fehlerbehebung: Bei geöffnetem Menü war der Seiteninhalt dahinter verschwunden. Der
|
||||||
Vorhang des Menüs war in 1.8.7 deckend gemacht worden, um Zeichenlast zu sparen - dabei
|
Vorhang des Menüs war in 1.8.7 deckend gemacht worden, um Zeichenlast zu sparen - dabei
|
||||||
|
|||||||
@@ -47,10 +47,23 @@ static bool g_bootCountCleared = false;
|
|||||||
|
|
||||||
// --- Protokoll-Callbacks ---------------------------------------------------------------
|
// --- Protokoll-Callbacks ---------------------------------------------------------------
|
||||||
static void onState(const MachineState& st) {
|
static void onState(const MachineState& st) {
|
||||||
|
// Vermessen: Zwischen dem Umschalten und dem sichtbaren Ergebnis vergehen rund fuenf
|
||||||
|
// Sekunden. Jede Station bekommt eine Zeitmarke, damit die Luecke zu sehen ist.
|
||||||
|
static bool s_lastStandby = false;
|
||||||
|
bool wechsel = (st.standbyActive != s_lastStandby);
|
||||||
|
s_lastStandby = st.standbyActive;
|
||||||
|
uint32_t t0 = millis();
|
||||||
|
if (wechsel) esp_rom_printf("[Zustand] %u ms: Standby jetzt %s - Meldung angekommen\n",
|
||||||
|
(unsigned)t0, st.standbyActive ? "an" : "aus");
|
||||||
// LVGL laeuft im realen Modus in einem eigenen Task -> UI-Zugriff sperren.
|
// LVGL laeuft im realen Modus in einem eigenen Task -> UI-Zugriff sperren.
|
||||||
hal_lock();
|
hal_lock();
|
||||||
|
uint32_t t1 = millis();
|
||||||
ui_update(st);
|
ui_update(st);
|
||||||
|
uint32_t t2 = millis();
|
||||||
hal_unlock();
|
hal_unlock();
|
||||||
|
if (wechsel || (t2 - t0) > 200)
|
||||||
|
esp_rom_printf("[Zustand] %u ms: Sperre %u ms, Anzeige aktualisiert %u ms\n",
|
||||||
|
(unsigned)millis(), (unsigned)(t1 - t0), (unsigned)(t2 - t1));
|
||||||
|
|
||||||
// Display im Standby aus; ist "Uhrzeit im Standby anzeigen" aktiv, bleibt es an,
|
// Display im Standby aus; ist "Uhrzeit im Standby anzeigen" aktiv, bleibt es an,
|
||||||
// aber abgedunkelt (nicht blendend bei Nacht). Helligkeiten kommen von der S3
|
// aber abgedunkelt (nicht blendend bei Nacht). Helligkeiten kommen von der S3
|
||||||
@@ -67,11 +80,27 @@ static void onState(const MachineState& st) {
|
|||||||
}
|
}
|
||||||
if (bl < 0) bl = 0; if (bl > 100) bl = 100;
|
if (bl < 0) bl = 0; if (bl > 100) bl = 100;
|
||||||
if (bl != s_lastBacklight) {
|
if (bl != s_lastBacklight) {
|
||||||
|
// Vermessen: Rund um jeden Helligkeitswechsel hing die Bedienung bisher ein bis
|
||||||
|
// zwei Sekunden. Der Schreibzugriff geht ueber denselben I2C-Bus wie der Touch.
|
||||||
|
uint32_t t0 = millis();
|
||||||
hal_backlight(bl);
|
hal_backlight(bl);
|
||||||
|
uint32_t dt = millis() - t0;
|
||||||
|
if (dt > 50) esp_rom_printf("[HAL] %u ms: Helligkeit %d %% gesetzt, brauchte %u ms\n",
|
||||||
|
(unsigned)millis(), bl, (unsigned)dt);
|
||||||
s_lastBacklight = bl;
|
s_lastBacklight = bl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Herzschlag aus dem Haupt-Ablauf. Zusammen mit dem Herzschlag aus dem Zeichen-Ablauf
|
||||||
|
// laesst sich unterscheiden, welcher der beiden stehen bleibt, wenn nichts mehr geht.
|
||||||
|
static void main_heartbeat() {
|
||||||
|
static uint32_t s_last = 0;
|
||||||
|
if (millis() - s_last < 2000) return;
|
||||||
|
s_last = millis();
|
||||||
|
esp_rom_printf("[Haupt] %u ms: Herzschlag, freier Speicher %u Byte\n",
|
||||||
|
(unsigned)millis(), (unsigned)ESP.getFreeHeap());
|
||||||
|
}
|
||||||
|
|
||||||
static void onAck(uint32_t id, bool ok, const String& message) {
|
static void onAck(uint32_t id, bool ok, const String& message) {
|
||||||
// Automatische/Heartbeat-Acks nicht als Toast zeigen (pong, Handshake, Listen-Refresh).
|
// Automatische/Heartbeat-Acks nicht als Toast zeigen (pong, Handshake, Listen-Refresh).
|
||||||
bool routine = ok && (message == "pong" || message == "hello" ||
|
bool routine = ok && (message == "pong" || message == "hello" ||
|
||||||
@@ -307,19 +336,36 @@ void setup() {
|
|||||||
// nicht (siehe WS7_DSI_RESTART).
|
// nicht (siehe WS7_DSI_RESTART).
|
||||||
//
|
//
|
||||||
// Deshalb startet der P4 sich nach einem Kaltstart genau einmal selbst neu, nachdem
|
// Deshalb startet der P4 sich nach einem Kaltstart genau einmal selbst neu, nachdem
|
||||||
// der erste Hochlauf durch ist. Beim zweiten Durchlauf ist der Startgrund kein
|
// der erste Hochlauf durch ist. Kostet rund drei Sekunden, aber nur beim Einschalten.
|
||||||
// Kaltstart mehr, die Bedingung greift also nicht erneut - eine Schleife ist
|
//
|
||||||
// ausgeschlossen. Kostet rund drei Sekunden, aber nur beim Einschalten.
|
// Frueher stuetzte sich die Absicherung dagegen allein auf den Startgrund: Beim zweiten
|
||||||
|
// Durchlauf sei es kein Kaltstart mehr, eine Schleife also ausgeschlossen. Das stimmt
|
||||||
|
// nicht - der Chip meldet auch nach dem selbst ausgeloesten Neustart wieder einen
|
||||||
|
// Kaltstart, und dann startet er endlos neu. Genau das ist aufgetreten: Beleuchtung an,
|
||||||
|
// nie ein Bild. Deshalb wird jetzt zusaetzlich vermerkt, dass der Neustart schon
|
||||||
|
// stattgefunden hat; darauf ist Verlass, unabhaengig vom gemeldeten Startgrund.
|
||||||
#if (JC_PANEL_TYPE == WS_PANEL_7H) && WS7_COLD_BOOT_RESTART
|
#if (JC_PANEL_TYPE == WS_PANEL_7H) && WS7_COLD_BOOT_RESTART
|
||||||
if (esp_reset_reason() == ESP_RST_POWERON) {
|
if (esp_reset_reason() == ESP_RST_POWERON) {
|
||||||
// Der Fruehstart-Zaehler wurde oben bereits erhoeht. Diesen gewollten Neustart
|
Preferences p;
|
||||||
// darf er nicht mitzaehlen, sonst laeuft die Absturzsicherung nach ein paar
|
p.begin("bootguard", false);
|
||||||
// Einschaltvorgaengen in den Update-Modus.
|
bool schonNeugestartet = p.getUChar("kaltneu", 0) != 0;
|
||||||
{ Preferences p; p.begin("bootguard", false); p.putUShort("early", 0); p.end(); }
|
if (schonNeugestartet) {
|
||||||
DBG_SERIAL.println(F("[Panel] Kaltstart - einmaliger Neustart fuer das Displaypanel"));
|
// Zweiter Durchlauf: Vermerk loeschen, damit beim naechsten echten Einschalten
|
||||||
DBG_SERIAL.flush();
|
// wieder genau ein Neustart erfolgt.
|
||||||
delay(50);
|
p.putUChar("kaltneu", 0);
|
||||||
esp_restart();
|
p.end();
|
||||||
|
esp_rom_printf("[Panel] Neustart bereits erfolgt - Hochlauf wird fortgesetzt\n");
|
||||||
|
} else {
|
||||||
|
p.putUChar("kaltneu", 1);
|
||||||
|
// Der Fruehstart-Zaehler wurde oben bereits erhoeht. Diesen gewollten Neustart
|
||||||
|
// darf er nicht mitzaehlen, sonst laeuft die Absturzsicherung nach ein paar
|
||||||
|
// Einschaltvorgaengen in den Update-Modus.
|
||||||
|
p.putUShort("early", 0);
|
||||||
|
p.end();
|
||||||
|
esp_rom_printf("[Panel] Kaltstart - einmaliger Neustart fuer das Displaypanel\n");
|
||||||
|
delay(50);
|
||||||
|
esp_restart();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
g_client.begin(); // UART starten, hello folgt automatisch in loop()
|
g_client.begin(); // UART starten, hello folgt automatisch in loop()
|
||||||
@@ -332,6 +378,7 @@ static unsigned long s_lastDbgMs = 0;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
main_heartbeat();
|
||||||
g_client.loop(); // UART lesen, hello/heartbeat, state -> UI
|
g_client.loop(); // UART lesen, hello/heartbeat, state -> UI
|
||||||
hal_loop(); // realer Modus: leer; Stub-Modus: lv_timer_handler()
|
hal_loop(); // realer Modus: leer; Stub-Modus: lv_timer_handler()
|
||||||
|
|
||||||
|
|||||||
@@ -310,14 +310,26 @@ static bool ws7_touch_get_xy(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y
|
|||||||
bool got = s_touch_get_xy_orig(tp, x, y, strength, point_num, max_point_num);
|
bool got = s_touch_get_xy_orig(tp, x, y, strength, point_num, max_point_num);
|
||||||
int64_t now = esp_timer_get_time();
|
int64_t now = esp_timer_get_time();
|
||||||
|
|
||||||
// Unplausible Rohwerte gelten als Aussetzer, nicht als Beruehrung.
|
// Unplausible Rohwerte gelten als Aussetzer, nicht als Beruehrung. Wie viele davon
|
||||||
|
// anfallen, war bisher nirgends zu sehen - eine Beruehrung, deren Rohwerte lange
|
||||||
|
// verworfen werden, sieht von aussen wie ein Display aus, das nicht reagiert.
|
||||||
|
static uint32_t s_verworfen = 0;
|
||||||
if (got && *point_num > 0 &&
|
if (got && *point_num > 0 &&
|
||||||
(x[0] > WS7_TOUCH_RAW_X_MAX || y[0] > WS7_TOUCH_RAW_Y_MAX)) {
|
(x[0] > WS7_TOUCH_RAW_X_MAX || y[0] > WS7_TOUCH_RAW_Y_MAX)) {
|
||||||
|
if (s_verworfen == 0)
|
||||||
|
esp_rom_printf("[Touch] %u ms: Rohwert verworfen (x %u, y %u liegen ausserhalb)\n",
|
||||||
|
(unsigned)(now / 1000), (unsigned)x[0], (unsigned)y[0]);
|
||||||
|
s_verworfen++;
|
||||||
got = false;
|
got = false;
|
||||||
*point_num = 0;
|
*point_num = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (got && *point_num > 0) {
|
if (got && *point_num > 0) {
|
||||||
|
if (!s_touch_down)
|
||||||
|
esp_rom_printf("[Touch] %u ms: Beruehrung erkannt bei x %u, y %u; %u Rohwerte vorher verworfen\n",
|
||||||
|
(unsigned)(now / 1000), (unsigned)x[0], (unsigned)y[0],
|
||||||
|
(unsigned)s_verworfen);
|
||||||
|
s_verworfen = 0;
|
||||||
s_touch_last_x = x[0];
|
s_touch_last_x = x[0];
|
||||||
s_touch_last_y = y[0];
|
s_touch_last_y = y[0];
|
||||||
s_touch_last_us = now;
|
s_touch_last_us = now;
|
||||||
|
|||||||
@@ -374,8 +374,10 @@
|
|||||||
#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/
|
#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/
|
||||||
|
|
||||||
/*Add a custom handler when assert happens e.g. to restart the MCU*/
|
/*Add a custom handler when assert happens e.g. to restart the MCU*/
|
||||||
#define LV_ASSERT_HANDLER_INCLUDE <stdint.h>
|
#define LV_ASSERT_HANDLER_INCLUDE <esp_rom_sys.h>
|
||||||
#define LV_ASSERT_HANDLER while(1); /*Halt by default*/
|
// Frueher hielt LVGL hier stumm in einer Endlosschleife an - das Display stand, ohne dass
|
||||||
|
// irgendwo etwas davon zu sehen war. Jetzt sagt es wenigstens, dass es angehalten hat.
|
||||||
|
#define LV_ASSERT_HANDLER esp_rom_printf("[LVGL] Zusicherung verletzt - Zeichenablauf haelt an\n"); while(1);
|
||||||
|
|
||||||
/*-------------
|
/*-------------
|
||||||
* Debug
|
* Debug
|
||||||
@@ -571,7 +573,9 @@
|
|||||||
LV_FONT_DECLARE(lv_font_maven_pro_bold_140) \
|
LV_FONT_DECLARE(lv_font_maven_pro_bold_140) \
|
||||||
LV_FONT_DECLARE(lv_font_clock_120) \
|
LV_FONT_DECLARE(lv_font_clock_120) \
|
||||||
LV_FONT_DECLARE(lv_font_clock_180) \
|
LV_FONT_DECLARE(lv_font_clock_180) \
|
||||||
LV_FONT_DECLARE(lv_font_clock_240)
|
LV_FONT_DECLARE(lv_font_clock_240) \
|
||||||
|
LV_FONT_DECLARE(lv_font_clock_270) \
|
||||||
|
LV_FONT_DECLARE(lv_font_clock_360)
|
||||||
|
|
||||||
/*Always set a default font*/
|
/*Always set a default font*/
|
||||||
#define LV_FONT_DEFAULT &lv_font_maven_pro_14
|
#define LV_FONT_DEFAULT &lv_font_maven_pro_14
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+108
-12
@@ -18,6 +18,7 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <Preferences.h> // Dashboard-Design P4-lokal merken (NVS)
|
#include <Preferences.h> // Dashboard-Design P4-lokal merken (NVS)
|
||||||
|
#include <esp_memory_utils.h> // esp_ptr_external_ram(): welcher Speicher einen Puffer traegt
|
||||||
#include <esp_heap_caps.h> // Verlaufs-Historie im PSRAM allozieren (interner RAM ist knapp)
|
#include <esp_heap_caps.h> // Verlaufs-Historie im PSRAM allozieren (interner RAM ist knapp)
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
#include <Preferences.h>
|
#include <Preferences.h>
|
||||||
@@ -127,8 +128,8 @@ static lv_obj_t* g_otaStatus = nullptr;
|
|||||||
static lv_obj_t* g_otaBytes = nullptr;
|
static lv_obj_t* g_otaBytes = nullptr;
|
||||||
|
|
||||||
// Navigation
|
// Navigation
|
||||||
enum { PG_DASH = 0, PG_CHART, PG_STATS, PG_TEMP, PG_BREW, PG_COLDEX, PG_SERVICE, PG_PROFILE, PG_LIGHT, PG_WIFI, PG_INFO, PG_COUNT };
|
enum { PG_DASH = 0, PG_CHART, PG_STATS, PG_TEMP, PG_BREW, PG_COLDEX, PG_SERVICE, PG_PROFILE, PG_LIGHT, PG_WIFI, PG_DISPLAY, PG_INFO, PG_COUNT };
|
||||||
static const char* PAGE_NAMES[PG_COUNT] = { "Dashboard", "Verlauf", "Statistik", "Temperatur", "Brew-Control", "Cold Extraction", "Reinigung/Wartung", "Profile", "Licht", "WiFi", "Info" };
|
static const char* PAGE_NAMES[PG_COUNT] = { "Dashboard", "Verlauf", "Statistik", "Temperatur", "Brew-Control", "Cold Extraction", "Reinigung/Wartung", "Profile", "Licht", "WiFi", "Darstellung", "Info" };
|
||||||
static lv_obj_t* g_content = nullptr;
|
static lv_obj_t* g_content = nullptr;
|
||||||
static lv_obj_t* g_pages[PG_COUNT] = { nullptr };
|
static lv_obj_t* g_pages[PG_COUNT] = { nullptr };
|
||||||
static lv_obj_t* g_drawer = nullptr;
|
static lv_obj_t* g_drawer = nullptr;
|
||||||
@@ -700,9 +701,17 @@ static lv_obj_t* g_clockSizeBtn[3] = {};
|
|||||||
|
|
||||||
static const lv_font_t* clock_font() {
|
static const lv_font_t* clock_font() {
|
||||||
switch (g_clockSize) {
|
switch (g_clockSize) {
|
||||||
|
#if JC_PANEL_TYPE == WS_PANEL_7H
|
||||||
|
// 7 Zoll, 1280x720: Hier war selbst die groesste Stufe noch zu klein.
|
||||||
|
case UHR_KLEIN: return &lv_font_clock_180;
|
||||||
|
case UHR_MITTEL: return &lv_font_clock_270;
|
||||||
|
default: return &lv_font_clock_360;
|
||||||
|
#else
|
||||||
|
// 4,3 Zoll, 480x480: Groessere Stufen passen schlicht nicht auf das Panel.
|
||||||
case UHR_KLEIN: return &lv_font_clock_120;
|
case UHR_KLEIN: return &lv_font_clock_120;
|
||||||
case UHR_MITTEL: return &lv_font_clock_180;
|
case UHR_MITTEL: return &lv_font_clock_180;
|
||||||
default: return &lv_font_clock_240;
|
default: return &lv_font_clock_240;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -921,7 +930,14 @@ static bool wake_choice_offered() {
|
|||||||
return g_state.cxWakeChoice ||
|
return g_state.cxWakeChoice ||
|
||||||
(g_state.cxEnabled && g_state.cxArmable && g_state.cxAskOnWake);
|
(g_state.cxEnabled && g_state.cxArmable && g_state.cxAskOnWake);
|
||||||
}
|
}
|
||||||
static void standby_screen_cb(lv_event_t*) { wake_confirm_show(); } // Tipp auf Standby-Uhr -> nachfragen
|
static void standby_screen_cb(lv_event_t*) { // Tipp auf Standby-Uhr -> nachfragen
|
||||||
|
// Vermessen: Vom Tippen bis zur sichtbaren Rueckfrage vergehen rund fuenf Sekunden.
|
||||||
|
uint32_t t0 = millis();
|
||||||
|
esp_rom_printf("[Touch] %u ms: Tipp auf die Standby-Uhr erkannt\n", (unsigned)t0);
|
||||||
|
wake_confirm_show();
|
||||||
|
esp_rom_printf("[Touch] %u ms: Rueckfrage aufgebaut, brauchte %u ms\n",
|
||||||
|
(unsigned)millis(), (unsigned)(millis() - t0));
|
||||||
|
}
|
||||||
static void wake_cancel() { // Abbrechen -> zurueck in die Standby-Helligkeit
|
static void wake_cancel() { // Abbrechen -> zurueck in die Standby-Helligkeit
|
||||||
wake_timeout_stop();
|
wake_timeout_stop();
|
||||||
wake_confirm_hide();
|
wake_confirm_hide();
|
||||||
@@ -1056,6 +1072,18 @@ static lv_obj_t* tempField(lv_obj_t* parent, const char* title, lv_color_t accen
|
|||||||
lv_label_set_text(*big, "--.-");
|
lv_label_set_text(*big, "--.-");
|
||||||
lv_obj_set_style_text_color(*big, COL_TEXT, 0);
|
lv_obj_set_style_text_color(*big, COL_TEXT, 0);
|
||||||
lv_obj_set_style_text_font(*big, valueFont, 0);
|
lv_obj_set_style_text_font(*big, valueFont, 0);
|
||||||
|
// Feste Breite, Text zentriert. Waechst oder schrumpft eine Beschriftung mit ihrem
|
||||||
|
// Inhalt - etwa von "92,4 °C" auf "100,1 °C" -, rechnet LVGL das Flex-Layout der
|
||||||
|
// gesamten Seite neu und macht sie damit komplett ungueltig. Genau das war im
|
||||||
|
// Messprotokoll als "x 0..1279, y 44..719" zu sehen: der ganze Inhaltsbereich, bei
|
||||||
|
// jeder Zustandsmeldung. Mit fester Breite bleibt nur die Beschriftung selbst ungueltig.
|
||||||
|
lv_obj_set_width(*big, LV_PCT(100));
|
||||||
|
lv_obj_set_style_text_align(*big, LV_TEXT_ALIGN_CENTER, 0);
|
||||||
|
// Auch die HOEHE muss fest sein. LVGL prueft beim Setzen eines Textes, ob sich die
|
||||||
|
// Eigengroesse der Beschriftung geaendert haben koennte - ist eines der beiden Masse
|
||||||
|
// frei, gilt das Layout des Elternteils als neu zu berechnen, und das macht die ganze
|
||||||
|
// Seite ungueltig. Erst mit festen Massen bleibt nur die Beschriftung selbst ungueltig.
|
||||||
|
lv_obj_set_height(*big, lv_font_get_line_height(valueFont) + 6);
|
||||||
// Grosse Zahlen etwas enger setzen. Bei dieser Groesse wirken die Werksabstaende
|
// Grosse Zahlen etwas enger setzen. Bei dieser Groesse wirken die Werksabstaende
|
||||||
// auseinandergezogen; ein paar Pixel weniger binden die Ziffern zu einer Zahl zusammen.
|
// auseinandergezogen; ein paar Pixel weniger binden die Ziffern zu einer Zahl zusammen.
|
||||||
if (valueFont == &lv_font_maven_pro_bold_140) lv_obj_set_style_text_letter_space(*big, -3, 0);
|
if (valueFont == &lv_font_maven_pro_bold_140) lv_obj_set_style_text_letter_space(*big, -3, 0);
|
||||||
@@ -1065,6 +1093,9 @@ static lv_obj_t* tempField(lv_obj_t* parent, const char* title, lv_color_t accen
|
|||||||
lv_label_set_text(*setp, "Soll --.-");
|
lv_label_set_text(*setp, "Soll --.-");
|
||||||
lv_obj_set_style_text_color(*setp, COL_TEXT_DIM, 0);
|
lv_obj_set_style_text_color(*setp, COL_TEXT_DIM, 0);
|
||||||
lv_obj_set_style_text_font(*setp, font_text(), 0);
|
lv_obj_set_style_text_font(*setp, font_text(), 0);
|
||||||
|
lv_obj_set_width(*setp, LV_PCT(100));
|
||||||
|
lv_obj_set_style_text_align(*setp, LV_TEXT_ALIGN_CENTER, 0);
|
||||||
|
lv_obj_set_height(*setp, lv_font_get_line_height(font_text()) + 6);
|
||||||
|
|
||||||
*bar = lv_bar_create(c);
|
*bar = lv_bar_create(c);
|
||||||
lv_obj_set_size(*bar, LV_PCT(92), 8);
|
lv_obj_set_size(*bar, LV_PCT(92), 8);
|
||||||
@@ -1210,6 +1241,10 @@ static lv_obj_t* infoCell(lv_obj_t* parent, const char* title, lv_obj_t** val, l
|
|||||||
lv_obj_set_style_text_color(*val, COL_TEXT, 0);
|
lv_obj_set_style_text_color(*val, COL_TEXT, 0);
|
||||||
lv_obj_set_style_text_font(*val, font_title(), 0);
|
lv_obj_set_style_text_font(*val, font_title(), 0);
|
||||||
lv_obj_set_style_text_align(*val, LV_TEXT_ALIGN_CENTER, 0); // fuer mehrzeilige Werte
|
lv_obj_set_style_text_align(*val, LV_TEXT_ALIGN_CENTER, 0); // fuer mehrzeilige Werte
|
||||||
|
// Feste Masse in BEIDE Richtungen - siehe die ausfuehrliche Begruendung in tempField.
|
||||||
|
// Zwei Zeilen Platz, weil manche Werte zweizeilig sind ("32,4 g / 36,0 g").
|
||||||
|
lv_obj_set_width(*val, LV_PCT(100));
|
||||||
|
lv_obj_set_height(*val, lv_font_get_line_height(font_title()) * 2 + 6);
|
||||||
return card;
|
return card;
|
||||||
}
|
}
|
||||||
// Tipp auf die Statuszeile: Wartung -> Serviceseite, Reinigung -> Sub-Screen,
|
// Tipp auf die Statuszeile: Wartung -> Serviceseite, Reinigung -> Sub-Screen,
|
||||||
@@ -3081,8 +3116,10 @@ static void brew_live_sw_cb(lv_event_t* e) {
|
|||||||
{ Preferences prefs; prefs.begin("ui", false); prefs.putBool("brewlive", g_brewLiveEnabled); prefs.end(); }
|
{ Preferences prefs; prefs.begin("ui", false); prefs.putBool("brewlive", g_brewLiveEnabled); prefs.end(); }
|
||||||
if (!g_brewLiveEnabled) brew_live_hide(); // laeuft gerade ein Bezug: sofort ausblenden
|
if (!g_brewLiveEnabled) brew_live_hide(); // laeuft gerade ein Bezug: sofort ausblenden
|
||||||
}
|
}
|
||||||
static void build_info(lv_obj_t* p) {
|
// Eigener Menuepunkt "Darstellung". Die Einstellungen sassen frueher oben auf der
|
||||||
section_title(p, "Darstellung");
|
// Info-Seite; dort standen sie zwischen Firmware-Staenden und Verbindungsdaten,
|
||||||
|
// mit denen sie nichts zu tun haben.
|
||||||
|
static void build_display(lv_obj_t* p) {
|
||||||
lv_obj_t* dcard = th_card(p);
|
lv_obj_t* dcard = th_card(p);
|
||||||
lv_obj_set_width(dcard, LV_PCT(100));
|
lv_obj_set_width(dcard, LV_PCT(100));
|
||||||
lv_obj_set_height(dcard, LV_SIZE_CONTENT);
|
lv_obj_set_height(dcard, LV_SIZE_CONTENT);
|
||||||
@@ -3135,6 +3172,9 @@ static void build_info(lv_obj_t* p) {
|
|||||||
sw_set(swBrewLive, g_brewLiveEnabled);
|
sw_set(swBrewLive, g_brewLiveEnabled);
|
||||||
lv_obj_add_event_cb(swBrewLive, brew_live_sw_cb, LV_EVENT_VALUE_CHANGED, nullptr);
|
lv_obj_add_event_cb(swBrewLive, brew_live_sw_cb, LV_EVENT_VALUE_CHANGED, nullptr);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void build_info(lv_obj_t* p) {
|
||||||
section_title(p, "Firmware-Stände & Verbindung");
|
section_title(p, "Firmware-Stände & Verbindung");
|
||||||
|
|
||||||
lv_obj_t* card = th_card(p);
|
lv_obj_t* card = th_card(p);
|
||||||
@@ -3523,7 +3563,7 @@ static void refr_ready_cb(lv_event_t*) {
|
|||||||
uint32_t d = lv_tick_get() - g_refrStart;
|
uint32_t d = lv_tick_get() - g_refrStart;
|
||||||
if (d < REFR_WARN_MS) return;
|
if (d < REFR_WARN_MS) return;
|
||||||
unsigned pct = (unsigned)((uint64_t)g_refrPixels * 100ULL / ((uint64_t)LCD_H_RES * LCD_V_RES));
|
unsigned pct = (unsigned)((uint64_t)g_refrPixels * 100ULL / ((uint64_t)LCD_H_RES * LCD_V_RES));
|
||||||
esp_rom_printf("[UI] Bildaufbau %u ms, %u Bereiche, %u %% der Flaeche\n",
|
esp_rom_printf("[UI] %u ms: Bildaufbau %u ms, %u Bereiche, %u %% der Flaeche\n", (unsigned)millis(),
|
||||||
(unsigned)d, (unsigned)g_refrAreas, pct);
|
(unsigned)d, (unsigned)g_refrAreas, pct);
|
||||||
// Lage der Bereiche mit ausgeben. Erst daran ist zu erkennen, WELCHER Teil der
|
// Lage der Bereiche mit ausgeben. Erst daran ist zu erkennen, WELCHER Teil der
|
||||||
// Oberflaeche das Neuzeichnen ausloest - die Groesse allein sagt das nicht.
|
// Oberflaeche das Neuzeichnen ausloest - die Groesse allein sagt das nicht.
|
||||||
@@ -3533,6 +3573,43 @@ static void refr_ready_cb(lv_event_t*) {
|
|||||||
(int)g_refrArea[i].y1, (int)g_refrArea[i].y2);
|
(int)g_refrArea[i].y1, (int)g_refrArea[i].y2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ui_heartbeat_cb(lv_timer_t*) {
|
||||||
|
lv_mem_monitor_t m; lv_mem_monitor(&m);
|
||||||
|
esp_rom_printf("[UI] %u ms: Herzschlag, LVGL-Speicher frei %u von %u Byte, groesster Block %u\n",
|
||||||
|
(unsigned)millis(), (unsigned)m.free_size, (unsigned)m.total_size,
|
||||||
|
(unsigned)m.free_biggest_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// LVGL legt fuer JEDE Textglyphe einen eigenen Zwischenpuffer an - Breite mal Hoehe, ein
|
||||||
|
// Byte je Bildpunkt. Bei der grossen Standby-Uhr sind das 190 x 256 = rund 48 KB pro Ziffer,
|
||||||
|
// und mit zwei parallel arbeitenden Zeicheneinheiten fast 100 KB gleichzeitig. Der interne
|
||||||
|
// LVGL-Speicher fasst nur 245 KB, wovon rund 98 KB am Stueck frei sind - es reichte knapp
|
||||||
|
// nicht. Schlaegt die Anforderung fehl, haelt LVGL per Zusicherung in einer Endlosschleife
|
||||||
|
// an: kein Absturz, keine Meldung, das Display steht einfach. Genau das war der Stillstand
|
||||||
|
// beim Wechsel in den Standby.
|
||||||
|
//
|
||||||
|
// Diese Puffer wandern daher in den externen Speicher (PSRAM, 32 MB frei). Kleine Glyphen
|
||||||
|
// bleiben im internen Speicher, weil der schneller ist und Text sonst ueberall langsamer
|
||||||
|
// wuerde; nur die grossen gehen nach aussen.
|
||||||
|
#define FONT_BUF_EXTERN_AB 16384 // ab dieser Groesse in den externen Speicher
|
||||||
|
|
||||||
|
static void* font_buf_malloc(size_t size, lv_color_format_t cf) {
|
||||||
|
LV_UNUSED(cf);
|
||||||
|
size += LV_DRAW_BUF_ALIGN - 1;
|
||||||
|
if (size >= FONT_BUF_EXTERN_AB) {
|
||||||
|
void* p = heap_caps_malloc(size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
||||||
|
if (p) return p;
|
||||||
|
}
|
||||||
|
return lv_malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void font_buf_free(void* buf) {
|
||||||
|
// Der externe Speicher liegt ausserhalb des LVGL-Bereichs; daran ist zu erkennen,
|
||||||
|
// welcher der beiden Wege den Puffer vergeben hat.
|
||||||
|
if (esp_ptr_external_ram(buf)) heap_caps_free(buf);
|
||||||
|
else lv_free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
static void refr_monitor_install() {
|
static void refr_monitor_install() {
|
||||||
lv_display_t* d = lv_display_get_default();
|
lv_display_t* d = lv_display_get_default();
|
||||||
if (!d) return;
|
if (!d) return;
|
||||||
@@ -3650,6 +3727,11 @@ void ui_init(ProtocolClient* client) {
|
|||||||
lv_obj_set_style_text_color(g_clock, COL_TEXT, 0);
|
lv_obj_set_style_text_color(g_clock, COL_TEXT, 0);
|
||||||
lv_obj_set_style_pad_right(g_clock, 10, 0);
|
lv_obj_set_style_pad_right(g_clock, 10, 0);
|
||||||
lv_obj_set_style_text_font(g_clock, font_text(), 0);
|
lv_obj_set_style_text_font(g_clock, font_text(), 0);
|
||||||
|
// Feste Masse, sonst rechnet LVGL beim Wechsel der Minute das Layout der Kopfleiste neu
|
||||||
|
// und macht sie samt Menue-Knopf ungueltig (siehe tempField).
|
||||||
|
lv_obj_set_width(g_clock, 130);
|
||||||
|
lv_obj_set_height(g_clock, lv_font_get_line_height(font_text()) + 4);
|
||||||
|
lv_obj_set_style_text_align(g_clock, LV_TEXT_ALIGN_RIGHT, 0);
|
||||||
|
|
||||||
g_wifiIcon = lv_label_create(header);
|
g_wifiIcon = lv_label_create(header);
|
||||||
lv_label_set_text(g_wifiIcon, LV_SYMBOL_WIFI);
|
lv_label_set_text(g_wifiIcon, LV_SYMBOL_WIFI);
|
||||||
@@ -3677,6 +3759,7 @@ void ui_init(ProtocolClient* client) {
|
|||||||
g_pages[PG_SERVICE] = make_page(g_content); build_service(g_pages[PG_SERVICE]);
|
g_pages[PG_SERVICE] = make_page(g_content); build_service(g_pages[PG_SERVICE]);
|
||||||
g_pages[PG_WIFI] = make_page(g_content); build_wifi(g_pages[PG_WIFI]);
|
g_pages[PG_WIFI] = make_page(g_content); build_wifi(g_pages[PG_WIFI]);
|
||||||
g_pages[PG_PROFILE] = make_page(g_content); build_profiles(g_pages[PG_PROFILE]);
|
g_pages[PG_PROFILE] = make_page(g_content); build_profiles(g_pages[PG_PROFILE]);
|
||||||
|
g_pages[PG_DISPLAY] = make_page(g_content); build_display(g_pages[PG_DISPLAY]);
|
||||||
g_pages[PG_INFO] = make_page(g_content); build_info(g_pages[PG_INFO]);
|
g_pages[PG_INFO] = make_page(g_content); build_info(g_pages[PG_INFO]);
|
||||||
|
|
||||||
// --- Schublade (Scrim + Menue-Panel) ---
|
// --- Schublade (Scrim + Menue-Panel) ---
|
||||||
@@ -3937,7 +4020,12 @@ void ui_init(ProtocolClient* client) {
|
|||||||
show_page(PG_DASH);
|
show_page(PG_DASH);
|
||||||
if (g_client) g_client->sendListProfiles();
|
if (g_client) g_client->sendListProfiles();
|
||||||
|
|
||||||
|
// Glyphenpuffer umlenken, bevor der erste Text gezeichnet wird.
|
||||||
|
lv_draw_buf_handlers_t* fh = lv_draw_buf_get_font_handlers();
|
||||||
|
fh->buf_malloc_cb = font_buf_malloc;
|
||||||
|
fh->buf_free_cb = font_buf_free;
|
||||||
refr_monitor_install();
|
refr_monitor_install();
|
||||||
|
lv_timer_create(ui_heartbeat_cb, 2000, nullptr);
|
||||||
g_uiReady = true;
|
g_uiReady = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4034,12 +4122,14 @@ static void dash_brew_mode(bool on) {
|
|||||||
if (on == g_dashBrewMode) return; // nur bei echtem Wechsel neu anordnen
|
if (on == g_dashBrewMode) return; // nur bei echtem Wechsel neu anordnen
|
||||||
g_dashBrewMode = on;
|
g_dashBrewMode = on;
|
||||||
if (!g_tempRow || !g_infoRow) return;
|
if (!g_tempRow || !g_infoRow) return;
|
||||||
lv_obj_set_flex_grow(g_tempRow, on ? 1 : 3);
|
// Die Zeilenhoehen bleiben unveraendert. Frueher bekam die untere Zeile waehrend des
|
||||||
lv_obj_set_flex_grow(g_infoRow, on ? 3 : 2);
|
// Bezugs deutlich mehr Platz - die kleinen Kacheln wurden dadurch enorm hoch und das
|
||||||
// Die Schrift von Shot-Timer und Waage bleibt unveraendert. Frueher wechselte sie
|
// Dashboard sprang bei jedem Bezugsbeginn sichtbar um. Der Bezug hebt sich jetzt allein
|
||||||
// waehrend des Bezugs auf den grossen fetten Schnitt - das wirkte gegenueber dem
|
// ueber seine Inhalte hervor, nicht ueber die Groesse.
|
||||||
// restlichen Dashboard zu laut. Der Bereich bekommt weiterhin mehr Platz, die Zahlen
|
(void)on;
|
||||||
// stehen dadurch freier, aber in derselben Schrift wie sonst auch.
|
// Die Schrift von Shot-Timer und Waage bleibt ebenfalls unveraendert. Frueher wechselte
|
||||||
|
// sie waehrend des Bezugs auf den grossen fetten Schnitt - das wirkte gegenueber dem
|
||||||
|
// restlichen Dashboard zu laut.
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dash_brew_mode_tick(const MachineState& st) {
|
static void dash_brew_mode_tick(const MachineState& st) {
|
||||||
@@ -4127,8 +4217,14 @@ void ui_update(const MachineState& st) {
|
|||||||
if (shouldShow) {
|
if (shouldShow) {
|
||||||
label_set_if_changed(g_standbyClock, zeit.length() ? zeit.c_str() : "--:--");
|
label_set_if_changed(g_standbyClock, zeit.length() ? zeit.c_str() : "--:--");
|
||||||
if (!g_standbyShown) {
|
if (!g_standbyShown) {
|
||||||
|
// Vermessen: Das Einblenden der Uhr ist der Moment, in dem das Display
|
||||||
|
// zuletzt stehen geblieben ist. Bleibt die zweite Zeile aus, haengt es hier.
|
||||||
|
esp_rom_printf("[UI] Standby-Uhr wird eingeblendet\n");
|
||||||
|
uint32_t t0 = millis();
|
||||||
ui_fade_in(g_standbyScreen, UI_FADE_MS); // Einschlaf-Animation
|
ui_fade_in(g_standbyScreen, UI_FADE_MS); // Einschlaf-Animation
|
||||||
g_standbyShown = true;
|
g_standbyShown = true;
|
||||||
|
esp_rom_printf("[UI] Standby-Uhr eingeblendet, %u ms\n",
|
||||||
|
(unsigned)(millis() - t0));
|
||||||
}
|
}
|
||||||
// Frueher wurde die Uhr hier bei JEDER Zustandsmeldung nach vorn geholt. Das
|
// Frueher wurde die Uhr hier bei JEDER Zustandsmeldung nach vorn geholt. Das
|
||||||
// ordnet die Ebenen neu und laesst LVGL den gesamten Bildschirm neu zeichnen -
|
// ordnet die Ebenen neu und laesst LVGL den gesamten Bildschirm neu zeichnen -
|
||||||
|
|||||||
Reference in New Issue
Block a user