From 52391c46c94bed9b25dcd7cecbdbd57cb5f83a42 Mon Sep 17 00:00:00 2001 From: raw-designs Date: Wed, 2 Sep 2026 17:01:40 +0200 Subject: [PATCH] perf(P4): Scrollen ohne Nachlauf am Waveshare-Panel (1.6.27) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ohne Doppelpufferung entsteht beim Scrollen jedes Bild komplett neu (1280x676 in 24 Bit, per Software). Am stärksten fällt das beim Ausrollen nach dem Loslassen auf: Dort bewegt sich das Bild weiter, ohne dass ein Finger es führt, und jedes Stocken ist unmittelbar zu sehen. LV_OBJ_FLAG_SCROLL_MOMENTUM ist für die scrollbaren Container deshalb abgeschaltet - die Liste folgt nur noch dem Finger. Nur für WS_PANEL_7H; die JC-Panels haben das Tempoproblem nicht und bleiben unverändert. Co-Authored-By: Claude Opus 5 --- P4_Display_Firmware/Changelog.txt | 7 +++++++ P4_Display_Firmware/ui.cpp | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index c18e574..f3a29cb 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,3 +1,10 @@ +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 diff --git a/P4_Display_Firmware/ui.cpp b/P4_Display_Firmware/ui.cpp index f50ffb0..cc4f272 100644 --- a/P4_Display_Firmware/ui.cpp +++ b/P4_Display_Firmware/ui.cpp @@ -449,6 +449,24 @@ static void add_save_button(lv_obj_t* parent, const char* txt, lv_event_cb_t cb) lv_obj_add_event_cb(b, cb, LV_EVENT_CLICKED, nullptr); } // Eine Seite (Vollflaeche im Content-Bereich, scrollbar, Spalten-Layout) +// Nachlauf beim Scrollen abschalten. +// +// Ohne Doppelpufferung entsteht beim Scrollen jedes Bild komplett neu - 1280x676 Pixel in +// 24 Bit, per Software. Am staerksten faellt das beim Ausrollen nach dem Loslassen auf: +// Dort bewegt sich das Bild weiter, ohne dass ein Finger es fuehrt, und jedes Stocken ist +// unmittelbar zu sehen. Folgt die Liste dagegen nur dem Finger, entstehen weniger Bilder, +// und die verbleibenden fallen kaum auf. +// +// Nur fuer das Waveshare-Panel: Die JC-Panels haben das Tempoproblem nicht, ihr +// Bediengefuehl soll unveraendert bleiben. +static void scroll_ohne_nachlauf(lv_obj_t* o) { +#if JC_PANEL_TYPE == WS_PANEL_7H + lv_obj_clear_flag(o, LV_OBJ_FLAG_SCROLL_MOMENTUM); +#else + (void)o; +#endif +} + static lv_obj_t* make_page(lv_obj_t* parent) { lv_obj_t* p = lv_obj_create(parent); lv_obj_set_size(p, LV_PCT(100), LV_PCT(100)); @@ -462,6 +480,7 @@ static lv_obj_t* make_page(lv_obj_t* parent) { lv_obj_set_style_pad_all(p, 8, 0); lv_obj_set_style_pad_row(p, 6, 0); lv_obj_set_flex_flow(p, LV_FLEX_FLOW_COLUMN); + scroll_ohne_nachlauf(p); return p; } @@ -2304,6 +2323,7 @@ static void build_cleaning_screen() { lv_obj_set_style_pad_all(g_clnCfg, 0, 0); lv_obj_set_style_pad_row(g_clnCfg, 8, 0); lv_obj_set_flex_flow(g_clnCfg, LV_FLEX_FLOW_COLUMN); lv_obj_set_scroll_dir(g_clnCfg, LV_DIR_VER); + scroll_ohne_nachlauf(g_clnCfg); lv_obj_set_scrollbar_mode(g_clnCfg, LV_SCROLLBAR_MODE_AUTO); lv_obj_t* hint = lv_label_create(g_clnCfg); @@ -3289,6 +3309,7 @@ void ui_init(ProtocolClient* client) { lv_obj_set_style_pad_row(menu, 6, 0); lv_obj_set_flex_flow(menu, LV_FLEX_FLOW_COLUMN); lv_obj_set_scroll_dir(menu, LV_DIR_VER); // bei vielen Eintraegen vertikal scrollbar + scroll_ohne_nachlauf(menu); lv_obj_set_scrollbar_mode(menu, LV_SCROLLBAR_MODE_AUTO); for (int i = 0; i < PG_COUNT; i++) { lv_obj_t* mb = th_button(menu, PAGE_NAMES[i], COL_CARD, COL_TEXT);