|
|
|
@@ -3553,8 +3553,16 @@ void ui_init(ProtocolClient* client) {
|
|
|
|
|
g_drawer = lv_obj_create(scr);
|
|
|
|
|
lv_obj_set_size(g_drawer, LV_PCT(100), DISP_VER_RES - 44);
|
|
|
|
|
lv_obj_set_pos(g_drawer, 0, 44);
|
|
|
|
|
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
|
|
|
// Deckend statt halbdurchsichtig - aus demselben Grund wie beim Aufweckdialog: Ein
|
|
|
|
|
// durchscheinender Vorhang laesst LVGL die ganze Flaeche darunter mitzeichnen und
|
|
|
|
|
// mischen. Auf dunklem Grund sieht ein dunkles Deckend praktisch genauso aus.
|
|
|
|
|
lv_obj_set_style_bg_color(g_drawer, lv_color_hex(0x0d0d0d), 0);
|
|
|
|
|
lv_obj_set_style_bg_opa(g_drawer, LV_OPA_COVER, 0);
|
|
|
|
|
#else
|
|
|
|
|
lv_obj_set_style_bg_color(g_drawer, lv_color_hex(0x000000), 0);
|
|
|
|
|
lv_obj_set_style_bg_opa(g_drawer, LV_OPA_50, 0);
|
|
|
|
|
#endif
|
|
|
|
|
lv_obj_set_style_border_width(g_drawer, 0, 0);
|
|
|
|
|
lv_obj_set_style_pad_all(g_drawer, 0, 0);
|
|
|
|
|
lv_obj_set_style_radius(g_drawer, 0, 0);
|
|
|
|
@@ -3634,13 +3642,25 @@ void ui_init(ProtocolClient* client) {
|
|
|
|
|
g_wakeConfirm = lv_obj_create(lv_layer_top());
|
|
|
|
|
lv_obj_set_size(g_wakeConfirm, LV_PCT(100), LV_PCT(100));
|
|
|
|
|
lv_obj_set_style_bg_color(g_wakeConfirm, lv_color_hex(0x000000), 0);
|
|
|
|
|
#if JC_PANEL_TYPE == WS_PANEL_7H
|
|
|
|
|
// Deckend statt halbtransparent. Ein durchscheinender Vorhang ueber den ganzen
|
|
|
|
|
// Bildschirm zwingt LVGL, einen Vollbild-Zwischenpuffer anzulegen und die gesamte
|
|
|
|
|
// Flaeche zu mischen - bei 1280x720 in 24 Bit dauerte das rund fuenf Sekunden, in
|
|
|
|
|
// denen nach dem Fingertipp nur der schwarze Standby-Bildschirm zu sehen war.
|
|
|
|
|
// Verloren geht dabei nichts: Dahinter liegt im Standby ohnehin nur Schwarz.
|
|
|
|
|
lv_obj_set_style_bg_opa(g_wakeConfirm, LV_OPA_COVER, 0);
|
|
|
|
|
#else
|
|
|
|
|
lv_obj_set_style_bg_opa(g_wakeConfirm, LV_OPA_70, 0);
|
|
|
|
|
#endif
|
|
|
|
|
lv_obj_set_style_border_width(g_wakeConfirm, 0, 0);
|
|
|
|
|
lv_obj_set_style_radius(g_wakeConfirm, 0, 0);
|
|
|
|
|
lv_obj_clear_flag(g_wakeConfirm, LV_OBJ_FLAG_SCROLLABLE);
|
|
|
|
|
lv_obj_add_flag(g_wakeConfirm, LV_OBJ_FLAG_CLICKABLE); // Scrim faengt Tipps ab
|
|
|
|
|
lv_obj_t* wakeCard = th_card(g_wakeConfirm);
|
|
|
|
|
lv_obj_set_width(wakeCard, 420);
|
|
|
|
|
// Breite waechst mit der gewaehlten Schriftgroesse mit. Bei fester Breite brach der
|
|
|
|
|
// Text in der Stufe Gross an unguenstigen Stellen um.
|
|
|
|
|
lv_obj_set_width(wakeCard, (g_fontStep == FONT_GROSS) ? 900
|
|
|
|
|
: (g_fontStep == FONT_MITTEL) ? 640 : 420);
|
|
|
|
|
lv_obj_set_height(wakeCard, LV_SIZE_CONTENT);
|
|
|
|
|
lv_obj_center(wakeCard);
|
|
|
|
|
lv_obj_set_flex_flow(wakeCard, LV_FLEX_FLOW_COLUMN);
|
|
|
|
@@ -3895,6 +3915,44 @@ static void dash_brew_mode_tick(const MachineState& st) {
|
|
|
|
|
dash_brew_mode(aktiv || (war && (uint32_t)(jetzt - zuletzt) < DASH_BREW_HOLD_MS));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
|
|
|
// Uhr läuft lokal weiter
|
|
|
|
|
//
|
|
|
|
|
// Die Uhrzeit kommt von der Hauptplatine und ist leer, solange dort keine Zeitquelle
|
|
|
|
|
// synchronisiert ist. Bei einem erneuten Abgleich ist sie kurz weg - auf dem Display
|
|
|
|
|
// verschwand die Uhr dann fuer ein paar Sekunden, was gerade im Standby unruhig wirkt.
|
|
|
|
|
//
|
|
|
|
|
// Deshalb merkt sich der P4 die zuletzt empfangene Zeit und zaehlt zwischen den Meldungen
|
|
|
|
|
// selbst weiter. Er stellt nichts richtig: Sobald die Hauptplatine wieder eine Zeit
|
|
|
|
|
// schickt, gilt deren Wert. Die lokale Uhr ueberbrueckt nur die Luecke.
|
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
|
|
|
static bool g_clockKnown = false; // schon einmal eine Zeit empfangen?
|
|
|
|
|
static uint32_t g_clockMinute = 0; // zuletzt bekannte Uhrzeit in Minuten seit Mitternacht
|
|
|
|
|
static uint32_t g_clockTick = 0; // Zeitpunkt (lv_tick), zu dem sie galt
|
|
|
|
|
|
|
|
|
|
// "HH:MM" der Hauptplatine uebernehmen. Andere Formate werden nicht angetastet.
|
|
|
|
|
static void clock_note(const String& hhmm) {
|
|
|
|
|
if (hhmm.length() < 5 || hhmm.charAt(2) != ':') return;
|
|
|
|
|
int h = hhmm.substring(0, 2).toInt();
|
|
|
|
|
int m = hhmm.substring(3, 5).toInt();
|
|
|
|
|
if (h < 0 || h > 23 || m < 0 || m > 59) return;
|
|
|
|
|
g_clockMinute = (uint32_t)(h * 60 + m);
|
|
|
|
|
g_clockTick = lv_tick_get();
|
|
|
|
|
g_clockKnown = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Anzuzeigende Uhrzeit: die der Hauptplatine, solange sie eine schickt - sonst die lokal
|
|
|
|
|
// weitergezaehlte. Leerer Rueckgabewert heisst: noch nie eine Zeit gehabt, nichts anzeigen.
|
|
|
|
|
static String clock_text(const String& vonS3) {
|
|
|
|
|
if (vonS3.length()) return vonS3;
|
|
|
|
|
if (!g_clockKnown) return String();
|
|
|
|
|
uint32_t min = g_clockMinute + (uint32_t)((lv_tick_get() - g_clockTick) / 60000UL);
|
|
|
|
|
char b[6];
|
|
|
|
|
snprintf(b, sizeof(b), "%02u:%02u", (unsigned)((min / 60) % 24), (unsigned)(min % 60));
|
|
|
|
|
return String(b);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ui_update(const MachineState& st) {
|
|
|
|
|
if (!g_uiReady) return;
|
|
|
|
|
|
|
|
|
@@ -3911,10 +3969,13 @@ void ui_update(const MachineState& st) {
|
|
|
|
|
bool wifiOk = st.wifiConnected && !st.apMode;
|
|
|
|
|
if (g_wifiIcon) lv_obj_set_style_text_color(g_wifiIcon, wifiOk ? COL_OK : (st.apMode ? COL_WARN : COL_TEXT_MUT), 0);
|
|
|
|
|
|
|
|
|
|
// Uhrzeit (nur wenn NTP synchronisiert)
|
|
|
|
|
// Uhrzeit. Angezeigt wird die der Hauptplatine; faellt sie voruebergehend aus, zaehlt
|
|
|
|
|
// der P4 die zuletzt bekannte Zeit selbst weiter (siehe clock_text).
|
|
|
|
|
clock_note(st.timeStr);
|
|
|
|
|
String zeit = clock_text(st.timeStr);
|
|
|
|
|
if (g_clock) {
|
|
|
|
|
if (st.timeStr.length()) {
|
|
|
|
|
lv_label_set_text(g_clock, st.timeStr.c_str());
|
|
|
|
|
if (zeit.length()) {
|
|
|
|
|
label_set_if_changed(g_clock, zeit.c_str());
|
|
|
|
|
lv_obj_remove_flag(g_clock, LV_OBJ_FLAG_HIDDEN);
|
|
|
|
|
} else {
|
|
|
|
|
lv_obj_add_flag(g_clock, LV_OBJ_FLAG_HIDDEN);
|
|
|
|
@@ -3927,7 +3988,7 @@ void ui_update(const MachineState& st) {
|
|
|
|
|
if (g_standbyScreen) {
|
|
|
|
|
bool shouldShow = st.standbyActive && st.standbyShowClock;
|
|
|
|
|
if (shouldShow) {
|
|
|
|
|
lv_label_set_text(g_standbyClock, st.timeStr.length() ? st.timeStr.c_str() : "--:--");
|
|
|
|
|
label_set_if_changed(g_standbyClock, zeit.length() ? zeit.c_str() : "--:--");
|
|
|
|
|
if (!g_standbyShown) {
|
|
|
|
|
ui_fade_in(g_standbyScreen, UI_FADE_MS); // Einschlaf-Animation
|
|
|
|
|
g_standbyShown = true;
|
|
|
|
|