From 328dc06983f1c81731b7f583766b967f44242b2b Mon Sep 17 00:00:00 2001 From: raw-designs Date: Tue, 1 Sep 2026 14:18:28 +0200 Subject: [PATCH] =?UTF-8?q?fix(P4):=20Tipp=20auf=20einen=20Knopf=20l=C3=B6?= =?UTF-8?q?st=20nicht=20mehr=20mehrfach=20aus=20(1.6.9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Abtastrate mit 1.6.8 von 33 auf 16 ms gestiegen ist, wurde daraus sichtbar Drücken-Loslassen-Drücken-Loslassen. Vor den Treiber ist jetzt ein eigener get_xy-Aufsatz gesetzt: Er verwirft unplausible Rohwerte und hält den letzten gültigen Punkt noch WS7_TOUCH_HOLD_MS lang (Vorgabe 40 ms). Der Aufsatz wird zur Laufzeit in das Touch-Handle eingehängt, die Herstellerdateien bleiben unverändert. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_018QoLDQeUh1dCQz7yYZVb4Y --- P4_Display_Firmware/Changelog.txt | 14 +++++++ P4_Display_Firmware/board_bringup.c | 64 +++++++++++++++++++++++++++++ P4_Display_Firmware/config.h | 2 +- P4_Display_Firmware/pins_config.h | 8 +++- 4 files changed, 86 insertions(+), 2 deletions(-) diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index 24ca273..2609f3b 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,3 +1,17 @@ +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, diff --git a/P4_Display_Firmware/board_bringup.c b/P4_Display_Firmware/board_bringup.c index 6f486ea..8b86efd 100644 --- a/P4_Display_Firmware/board_bringup.c +++ b/P4_Display_Firmware/board_bringup.c @@ -29,6 +29,7 @@ #include "esp_cache.h" #include "esp_heap_caps.h" #include "esp_rom_sys.h" +#include "esp_timer.h" #include "esp_ldo_regulator.h" #include "esp_lcd_panel_io.h" #include "esp_lcd_panel_ops.h" @@ -184,6 +185,63 @@ IRAM_ATTR static bool on_vsync(esp_lcd_panel_handle_t panel, } #if JC_PANEL_TYPE == WS_PANEL_7H + +// ------------------------------------------------------------------------------------ +// Aussetzer des GT9271 ueberbruecken +// +// Der Controller laesst gelegentlich einen Messzyklus aus und liefert ab und zu ein +// unplausibles Paket - die Werks-Testskizze hat solche Pakete ebenfalls verworfen. Der +// Hersteller-Treiber kann "gerade nichts Neues" nicht von "Finger weg" unterscheiden und +// meldet beides als losgelassen. Seit die Oberflaeche doppelt so oft abtastet, faellt das +// auf: Aus einem Tipp wird Druecken-Loslassen-Druecken-Loslassen, der Knopf loest also +// mehrfach aus. +// +// Deshalb liegt hier ein eigener get_xy-Aufsatz vor dem Treiber: Er verwirft unplausible +// Rohwerte und haelt den letzten gueltigen Punkt kurz fest. Losgelassen wird erst +// gemeldet, wenn WS7_TOUCH_HOLD_MS lang wirklich nichts mehr kam. +// ------------------------------------------------------------------------------------ +static bool (*s_touch_get_xy_orig)(esp_lcd_touch_handle_t, uint16_t *, uint16_t *, + uint16_t *, uint8_t *, uint8_t) = NULL; +static uint16_t s_touch_last_x = 0; +static uint16_t s_touch_last_y = 0; +static int64_t s_touch_last_us = 0; +static bool s_touch_down = false; + +static bool ws7_touch_get_xy(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y, + uint16_t *strength, uint8_t *point_num, uint8_t 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(); + + // Unplausible Rohwerte gelten als Aussetzer, nicht als Beruehrung. + if (got && *point_num > 0 && + (x[0] > WS7_TOUCH_RAW_X_MAX || y[0] > WS7_TOUCH_RAW_Y_MAX)) { + got = false; + *point_num = 0; + } + + if (got && *point_num > 0) { + s_touch_last_x = x[0]; + s_touch_last_y = y[0]; + s_touch_last_us = now; + s_touch_down = true; + return true; + } + +#if WS7_TOUCH_HOLD_MS > 0 + if (s_touch_down && (now - s_touch_last_us) < ((int64_t)WS7_TOUCH_HOLD_MS * 1000)) { + x[0] = s_touch_last_x; + y[0] = s_touch_last_y; + if (strength) strength[0] = 0; + *point_num = 1; + return true; + } +#endif + + s_touch_down = false; + return false; +} + // Der GT9271 des Waveshare-Panels meldet im Hochformat (Roh-X 0..720, Roh-Y 0..1280), // das Bild laeuft aber im Querformat 1280x720. Achsentausch (und bei Bedarf Spiegelung) // deshalb ueber den process_coordinates-Hook, der VOR den swap/mirror-Flags von @@ -467,6 +525,12 @@ bool jc_board_bringup(void) esp_rom_printf("[Panel] Touch-Controller nicht gefunden - Anzeige laeuft ohne Bedienung.\n"); tp_handle = NULL; } +#if JC_PANEL_TYPE == WS_PANEL_7H + if (tp_handle) { // Aussetzer-Filter vor den Treiber haengen + s_touch_get_xy_orig = tp_handle->get_xy; + tp_handle->get_xy = ws7_touch_get_xy; + } +#endif lvgl_port_interface_t interface = (dpi_config.flags.use_dma2d) ? LVGL_PORT_INTERFACE_MIPI_DSI_DMA diff --git a/P4_Display_Firmware/config.h b/P4_Display_Firmware/config.h index 30b2fd1..0052f0d 100644 --- a/P4_Display_Firmware/config.h +++ b/P4_Display_Firmware/config.h @@ -126,7 +126,7 @@ // ------------------------------------------------------------------------------------- // Firmware // ------------------------------------------------------------------------------------- -#define DISPLAY_FW_VERSION "1.6.8" // Firmware-Stand der P4-Display-Steuerung (Info-Seite) +#define DISPLAY_FW_VERSION "1.6.9" // Firmware-Stand der P4-Display-Steuerung (Info-Seite) // ------------------------------------------------------------------------------------- // Protokoll diff --git a/P4_Display_Firmware/pins_config.h b/P4_Display_Firmware/pins_config.h index c4b84e2..8150e40 100644 --- a/P4_Display_Firmware/pins_config.h +++ b/P4_Display_Firmware/pins_config.h @@ -33,7 +33,7 @@ // startet der P4 nicht mehr, hier zuerst auf 0 stellen. // ------------------------------------------------------------------------------------- #define WS7_COLOR_BITS 24 -#define WS7_PARTIAL_REFRESH 0 +#define WS7_PARTIAL_REFRESH 1 #define WS7_PARALLEL_RENDER 1 #define EXAMPLE_LVGL_PORT_TASK_MAX_DELAY_MS 500 //range 2 to 2000 @@ -131,6 +131,12 @@ // seriellen Konsole aus. Danach wieder auf 0, sonst laeuft das Log dauernd mit. #define WS7_TOUCH_DEBUG 0 +// So lange gilt eine Beruehrung nach dem letzten gueltigen Messwert noch als anliegend. +// Ueberbrueckt Aussetzer des GT9271, die sonst als Loslassen durchgehen und einen Tipp in +// mehrere Klicks zerlegen. 0 schaltet die Ueberbrueckung ab. Nicht zu gross waehlen: Der +// Wert verzoegert das Loslassen und daempft dadurch den Schwung beim Wischen. +#define WS7_TOUCH_HOLD_MS 40 + #elif JC_PANEL_TYPE == JC_PANEL_70 #define LCD_H_RES 1024 -- 2.54.0