Compare commits

...
Author SHA1 Message Date
raw-designsandClaude Opus 5 e8308a9182 fix(P4): Schwarzes Bild nach Reset am Waveshare-Panel (1.6.11)
Nach einem Reset des P4 blieb das Bild schwarz, die Hintergrundbeleuchtung
brannte; nur direkt nach dem Flashen lief es.

Die Bridge des Panels hat keine Reset-Leitung und hängt an Dauerstrom. Ein
Reset des P4 setzt sie nicht zurück - ihre Register standen noch auf den
Werten der vorigen Sitzung, während der P4 seine DSI-Strecke komplett neu
aufbaut. Beim Flashen wird die Versorgung getrennt, deshalb trat der Fehler
dort nicht auf.

ws7_bridge_pre_init() schaltet die Bridge jetzt zuerst definiert ab
(AB/AA, AD, dann AC/C2/C0), wartet WS7_BRIDGE_RESET_MS und schreibt erst
danach die Grundinitialisierung.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018QoLDQeUh1dCQz7yYZVb4Y
2026-09-01 15:22:11 +02:00
thomas edb1e333f0 Merge pull request 'perf(P4): Teil-Neuzeichnen als Vorgabe, Messeinblendung, deckende Seiten (1.6.10)' (#38) from perf/scrollen-messen-und-vorgaben into main 2026-09-01 14:46:56 +02:00
raw-designsandClaude Opus 5 528c8d5500 perf(P4): Teil-Neuzeichnen als Vorgabe, Messeinblendung, deckende Seiten (1.6.10)
- WS7_PARTIAL_REFRESH = 1 auch im Auslieferungsstand. Am Gerät geprüft: kein
  Flackern; von den drei Tempo-Maßnahmen aus 1.6.4 ist es der größte Gewinn.
- make_page() setzt einen deckenden Hintergrund in COL_BG statt LV_OPA_TRANSP.
  Optisch identisch, spart LVGL beim Scrollen aber das Zeichnen und Mischen
  der darunterliegenden Ebenen.
- Neuer Schalter WS7_PERF_MONITOR schaltet LV_USE_SYSMON/LV_USE_PERF_MONITOR
  ein und blendet Bilder je Sekunde und Prozessorlast ein. Vorgabe 0, mit 1
  gegengebaut.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018QoLDQeUh1dCQz7yYZVb4Y
2026-09-01 14:45:33 +02:00
thomas 117715dc3b Merge pull request 'fix(P4): Tipp auf einen Knopf löst nicht mehr mehrfach aus (1.6.9)' (#37) from fix/touch-mehrfachausloesung into main 2026-09-01 14:19:51 +02:00
raw-designsandClaude Opus 5 328dc06983 fix(P4): Tipp auf einen Knopf löst nicht mehr mehrfach aus (1.6.9)
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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018QoLDQeUh1dCQz7yYZVb4Y
2026-09-01 14:18:28 +02:00
thomas 480708c992 Merge pull request 'perf(P4): Scrollen am Waveshare-Panel flüssiger (1.6.8)' (#36) from perf/scrollen-taktrate into main 2026-09-01 14:02:46 +02:00
raw-designsandClaude Opus 5 9a0761f6da perf(P4): Scrollen am Waveshare-Panel flüssiger (1.6.8)
LV_DEF_REFR_PERIOD steuert nicht nur die Bildrate, sondern auch die
Abtastrate des Touch und die Schrittweite von Animationen. Mit 33 ms waren
das 30 Schritte je Sekunde - beim Ziehen mit dem Finger sichtbar ruckelig.

Für das Waveshare-Panel jetzt 16 ms, passend zu dessen 60 Hz. Kommt das
Zeichnen nicht hinterher, wird ein Bild später fertig; kaputt geht nichts.
Die JC-Panels bleiben unverändert bei 33 ms.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018QoLDQeUh1dCQz7yYZVb4Y
2026-09-01 14:01:23 +02:00
thomas e6c09b7a9a Merge pull request 'fix(P4): Menü-Knopf fängt Tipps auch knapp daneben ab (1.6.7)' (#35) from fix/menue-knopf-trefferflaeche into main 2026-09-01 13:49:17 +02:00
7 changed files with 186 additions and 15 deletions
+47
View File
@@ -1,3 +1,50 @@
Version 1.6.11:
- Fehlerbehebung: Nach einem Reset des P4 blieb das Bild schwarz, während die
Hintergrundbeleuchtung brannte; erst ein erneutes Flashen half. Die Bridge des
Waveshare-Panels hat keine Reset-Leitung und hängt an Dauerstrom - ein Reset des P4
setzt sie also nicht zurück, ihre Register standen noch auf den Werten der vorigen
Sitzung. Der P4 baut seine DSI-Strecke aber komplett neu auf, und ein frischer DSI-Start
auf einer bereits laufenden Bridge liefert kein Bild. Beim Flashen wird die Versorgung
getrennt, deshalb war der Fehler dort nicht zu sehen.
- Der Start schaltet die Bridge jetzt zuerst definiert ab (Beleuchtung, dann Ausgabe,
dann Grundregister), wartet WS7_BRIDGE_RESET_MS und fährt sie erst danach hoch. Der
Wert steht in pins_config.h (Vorgabe 120 ms) und ist die erste Stellschraube, falls
nach einem Reset doch einmal ein schwarzes Bild auftaucht.
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: Version 1.6.7:
- Der Menue-Knopf oben links fängt Tipps jetzt auch knapp daneben ab. Mit 48x36 Pixeln war - 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 er auf dem 7-Zoll-Panel ein sehr kleines Ziel; gemessen wurde ein Fehlgriff von rund
+5
View File
@@ -67,6 +67,11 @@ Das Panel hängt hinter einer Waveshare-Bridge und braucht **keinen** Hersteller
- Reihenfolge: Bridge-Grundinitialisierung (`C0`/`C2`/`AC`) → DSI → DCS `MADCTL`/`Sleep Out`/ - Reihenfolge: Bridge-Grundinitialisierung (`C0`/`C2`/`AC`) → DSI → DCS `MADCTL`/`Sleep Out`/
`Display On` → DPI-Start → **erst dann** Hintergrundbeleuchtung. Wird das Licht früher `Display On` → DPI-Start → **erst dann** Hintergrundbeleuchtung. Wird das Licht früher
eingeschaltet, blitzt beim Start Bildrauschen auf. eingeschaltet, blitzt beim Start Bildrauschen auf.
- **Nach einem Reset:** Die Bridge hat keine Reset-Leitung und hängt an Dauerstrom — ein
Reset des P4 setzt sie **nicht** zurück. Der Bringup schaltet sie deshalb zuerst
definiert ab, wartet `WS7_BRIDGE_RESET_MS` und fährt sie dann neu hoch. Ohne das trifft
ein frischer DSI-Start auf eine noch laufende Bridge: Bild schwarz, Beleuchtung an.
Nach dem Flashen fällt das nicht auf, weil dabei die Versorgung getrennt wird.
- **Einbaulage:** `WS7_ROTATE_180` in [`pins_config.h`](pins_config.h) dreht Bild **und** - **Einbaulage:** `WS7_ROTATE_180` in [`pins_config.h`](pins_config.h) dreht Bild **und**
Touch um 180°, falls das Panel auf dem Kopf montiert wird. Vorgabe ist **0** — in der Touch um 180°, falls das Panel auf dem Kopf montiert wird. Vorgabe ist **0** — in der
jetzigen Einbaulage steht das Bild richtig herum. Die Drehung macht der jetzigen Einbaulage steht das Bild richtig herum. Die Drehung macht der
+87 -2
View File
@@ -29,6 +29,7 @@
#include "esp_cache.h" #include "esp_cache.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_rom_sys.h" #include "esp_rom_sys.h"
#include "esp_timer.h"
#include "esp_ldo_regulator.h" #include "esp_ldo_regulator.h"
#include "esp_lcd_panel_io.h" #include "esp_lcd_panel_io.h"
#include "esp_lcd_panel_ops.h" #include "esp_lcd_panel_ops.h"
@@ -109,8 +110,16 @@ static void ws7_bridge_write(uint8_t reg, uint8_t value)
i2c_master_transmit(s_bridge_handle, buf, sizeof(buf), 100); i2c_master_transmit(s_bridge_handle, buf, sizeof(buf), 100);
} }
// Bridge am I2C-Bus anmelden und Grundinitialisierung schreiben. Muss VOR dem // Bridge in einen definierten Grundzustand bringen und neu initialisieren.
// DSI-Bringup laufen; die Hintergrundbeleuchtung bleibt dabei noch aus. //
// WICHTIG - der Grund fuer das Abschalten am Anfang: Die Bridge hat keine Reset-Leitung
// und haengt an Dauerstrom. Ein Reset des P4 setzt sie also NICHT zurueck; ihre Register
// stehen noch so, wie die vorige Sitzung sie hinterlassen hat. Der P4 baut seine
// DSI-Strecke aber komplett neu auf. Trifft ein frischer DSI-Start auf eine bereits
// laufende Bridge, bleibt das Bild schwarz, waehrend die Hintergrundbeleuchtung brennt.
// Nach dem Flashen faellt das nicht auf, weil dabei die Versorgung getrennt wird.
//
// Deshalb erst ausschalten (Beleuchtung, dann Bridge), kurz warten, dann normal hochfahren.
static void ws7_bridge_pre_init(void) static void ws7_bridge_pre_init(void)
{ {
i2c_device_config_t dev_cfg = { i2c_device_config_t dev_cfg = {
@@ -122,9 +131,22 @@ static void ws7_bridge_pre_init(void)
s_bridge_handle = NULL; s_bridge_handle = NULL;
return; return;
} }
// --- definierter Aus-Zustand (umgekehrte Reihenfolge zum Einschalten) ---
ws7_bridge_write(0xAB, 0xFF); // Helligkeit 0
ws7_bridge_write(0xAA, 0x01); // uebernehmen
ws7_bridge_write(0xAD, 0x00); // Bridge-Ausgabe aus
vTaskDelay(pdMS_TO_TICKS(20));
ws7_bridge_write(0xAC, 0x00);
ws7_bridge_write(0xC2, 0x00);
ws7_bridge_write(0xC0, 0x00);
vTaskDelay(pdMS_TO_TICKS(WS7_BRIDGE_RESET_MS));
// --- Grundinitialisierung wie im Linux-Treiber ---
ws7_bridge_write(0xC0, 0x01); ws7_bridge_write(0xC0, 0x01);
ws7_bridge_write(0xC2, 0x01); ws7_bridge_write(0xC2, 0x01);
ws7_bridge_write(0xAC, 0x01); ws7_bridge_write(0xAC, 0x01);
vTaskDelay(pdMS_TO_TICKS(20));
} }
void jc_backlight_init(void) void jc_backlight_init(void)
@@ -184,6 +206,63 @@ IRAM_ATTR static bool on_vsync(esp_lcd_panel_handle_t panel,
} }
#if JC_PANEL_TYPE == WS_PANEL_7H #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), // 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) // 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 // deshalb ueber den process_coordinates-Hook, der VOR den swap/mirror-Flags von
@@ -467,6 +546,12 @@ bool jc_board_bringup(void)
esp_rom_printf("[Panel] Touch-Controller nicht gefunden - Anzeige laeuft ohne Bedienung.\n"); esp_rom_printf("[Panel] Touch-Controller nicht gefunden - Anzeige laeuft ohne Bedienung.\n");
tp_handle = NULL; 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 = lvgl_port_interface_t interface =
(dpi_config.flags.use_dma2d) ? LVGL_PORT_INTERFACE_MIPI_DSI_DMA (dpi_config.flags.use_dma2d) ? LVGL_PORT_INTERFACE_MIPI_DSI_DMA
+1 -1
View File
@@ -126,7 +126,7 @@
// ------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------
// Firmware // Firmware
// ------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------
#define DISPLAY_FW_VERSION "1.6.7" // Firmware-Stand der P4-Display-Steuerung (Info-Seite) #define DISPLAY_FW_VERSION "1.6.11" // Firmware-Stand der P4-Display-Steuerung (Info-Seite)
// ------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------
// Protokoll // Protokoll
+16 -1
View File
@@ -91,7 +91,17 @@
*====================*/ *====================*/
/*Default display refresh, input device read and animation step period.*/ /*Default display refresh, input device read and animation step period.*/
/* Der Wert bestimmt nicht nur die Bildrate, sondern auch, wie oft der Touch abgetastet
* und wie fein eine Animation gerechnet wird. 33 ms sind 30 Schritte je Sekunde - beim
* Ziehen mit dem Finger deutlich als Stocken zu sehen. Das Waveshare-Panel laeuft mit
* 60 Hz, deshalb dort 16 ms; mehr als das Panel zeigen kann, bringt nichts. Kommt das
* Zeichnen nicht hinterher, wird es einfach seltener fertig - kaputt geht dabei nichts.
* Die JC-Panels bleiben bei 33 ms, damit sich ihr Verhalten nicht aendert. */
#if JC_PANEL_TYPE == WS_PANEL_7H
#define LV_DEF_REFR_PERIOD 16 /*[ms]*/
#else
#define LV_DEF_REFR_PERIOD 33 /*[ms]*/ #define LV_DEF_REFR_PERIOD 33 /*[ms]*/
#endif
/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. /*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings.
*(Not so important, you can adjust it to modify default sizes and spaces)*/ *(Not so important, you can adjust it to modify default sizes and spaces)*/
@@ -905,14 +915,19 @@
#define LV_USE_SNAPSHOT 0 #define LV_USE_SNAPSHOT 0
/*1: Enable system monitor component*/ /*1: Enable system monitor component*/
/* Nur fuer die Messeinblendung des Waveshare-Panels, siehe WS7_PERF_MONITOR. */
#if (JC_PANEL_TYPE == WS_PANEL_7H) && WS7_PERF_MONITOR
#define LV_USE_SYSMON 1
#else
#define LV_USE_SYSMON 0 #define LV_USE_SYSMON 0
#endif
#if LV_USE_SYSMON #if LV_USE_SYSMON
/*Get the idle percentage. E.g. uint32_t my_get_idle(void);*/ /*Get the idle percentage. E.g. uint32_t my_get_idle(void);*/
#define LV_SYSMON_GET_IDLE lv_timer_get_idle #define LV_SYSMON_GET_IDLE lv_timer_get_idle
/*1: Show CPU usage and FPS count /*1: Show CPU usage and FPS count
* Requires `LV_USE_SYSMON = 1`*/ * Requires `LV_USE_SYSMON = 1`*/
#define LV_USE_PERF_MONITOR 0 #define LV_USE_PERF_MONITOR 1
#if LV_USE_PERF_MONITOR #if LV_USE_PERF_MONITOR
#define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT
+25 -10
View File
@@ -20,20 +20,19 @@
// an - mit 16 kommt kein brauchbares Bild. Einstellbar bleibt es // an - mit 16 kommt kein brauchbares Bild. Einstellbar bleibt es
// nur, weil andere Waveshare-Panels an derselben Firmware // nur, weil andere Waveshare-Panels an derselben Firmware
// haengen koennten. // haengen koennten.
// WS7_PARTIAL_REFRESH 0 = Vollbild neu zeichnen. GEPRUEFT: Mit 1 (nur geaenderte // WS7_PARTIAL_REFRESH 1 = nur geaenderte Bildbereiche neu zeichnen statt jedes Mal des
// Bereiche, zwei wechselnde Bildpuffer) laesst sich der // gesamten Bildes (LVGL-Direct-Mode, zwei wechselnde Puffer).
// Menue-Vorhang nicht mehr oeffnen. Er ist halbtransparent und // Groesster Tempogewinn, besonders waehrend eines Bezugs: Die
// wird in den gerade aktiven Puffer eingemischt; die naechste // Zeitanzeige laeuft zehnmal je Sekunde weiter, und mit 0 wuerde
// Zustandsmeldung der S3 zeichnet in den anderen, der ihn nie // dafuer jedes Mal das ganze Bild neu gezeichnet. Am Geraet
// bekommen hat. Am 4,3-Zoll-Panel hatte derselbe Modus // geprueft, kein Flackern - am 4,3-Zoll-Panel hatte derselbe
// geflackert. Nutzbar erst, wenn der LVGL-Port die geaenderten // Modus dagegen geflackert.
// Bereiche zwischen beiden Puffern abgleicht.
// WS7_PARALLEL_RENDER 1 = LVGL zeichnet mit zwei Threads auf beiden Prozessorkernen. // WS7_PARALLEL_RENDER 1 = LVGL zeichnet mit zwei Threads auf beiden Prozessorkernen.
// Kostet zwei zusaetzliche Task-Stacks im knappen internen RAM; // Kostet zwei zusaetzliche Task-Stacks im knappen internen RAM;
// startet der P4 nicht mehr, hier zuerst auf 0 stellen. // startet der P4 nicht mehr, hier zuerst auf 0 stellen.
// ------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------
#define WS7_COLOR_BITS 24 #define WS7_COLOR_BITS 24
#define WS7_PARTIAL_REFRESH 0 #define WS7_PARTIAL_REFRESH 1
#define WS7_PARALLEL_RENDER 1 #define WS7_PARALLEL_RENDER 1
#define EXAMPLE_LVGL_PORT_TASK_MAX_DELAY_MS 500 //range 2 to 2000 #define EXAMPLE_LVGL_PORT_TASK_MAX_DELAY_MS 500 //range 2 to 2000
@@ -115,6 +114,12 @@
// nicht bekannt; die 180-Grad-Drehung macht deshalb der PPA (WS7_ROTATE_180). // nicht bekannt; die 180-Grad-Drehung macht deshalb der PPA (WS7_ROTATE_180).
#define WS7_MADCTL 0x00 #define WS7_MADCTL 0x00
// So lange bleibt die Bridge beim Start stromlos geschaltet, bevor sie neu
// initialisiert wird. Sie hat keine Reset-Leitung und ueberlebt einen Reset des P4;
// ohne diese Pause trifft ein frischer DSI-Start auf eine noch laufende Bridge und das
// Bild bleibt schwarz. Bei schwarzem Bild nach Reset zuerst diesen Wert erhoehen.
#define WS7_BRIDGE_RESET_MS 120
// Der GT9271 meldet im Hochformat: Roh-X 0..720, Roh-Y 0..1280. Fuer das Querformat // Der GT9271 meldet im Hochformat: Roh-X 0..720, Roh-Y 0..1280. Fuer das Querformat
// werden die Achsen getauscht. Die Spiegelung geschieht VOR dem Tausch, also noch auf den // werden die Achsen getauscht. Die Spiegelung geschieht VOR dem Tausch, also noch auf den
// Rohwerten: Roh-X wird zur Bildschirmhoehe, Roh-Y zur Bildschirmbreite. // Rohwerten: Roh-X wird zur Bildschirmhoehe, Roh-Y zur Bildschirmbreite.
@@ -127,10 +132,20 @@
#define WS7_TOUCH_MIRROR_RAW_X 1 #define WS7_TOUCH_MIRROR_RAW_X 1
#define WS7_TOUCH_MIRROR_RAW_Y 0 #define WS7_TOUCH_MIRROR_RAW_Y 0
// Zeigt unten rechts Bilder je Sekunde und Prozessorlast ein. Nur zum Messen gedacht:
// Der Wert sagt, ob sich weitere Muehe beim Zeichnen ueberhaupt lohnt.
#define WS7_PERF_MONITOR 0
// Zum Einmessen des Touch: 1 gibt jeden Beruehrpunkt roh und umgerechnet auf der // Zum Einmessen des Touch: 1 gibt jeden Beruehrpunkt roh und umgerechnet auf der
// seriellen Konsole aus. Danach wieder auf 0, sonst laeuft das Log dauernd mit. // seriellen Konsole aus. Danach wieder auf 0, sonst laeuft das Log dauernd mit.
#define WS7_TOUCH_DEBUG 0 #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 #elif JC_PANEL_TYPE == JC_PANEL_70
#define LCD_H_RES 1024 #define LCD_H_RES 1024
@@ -139,7 +154,7 @@
#define LCD_RST 27 #define LCD_RST 27
#define LCD_LED 23 #define LCD_LED 23
#else #elsealle
#define LCD_H_RES 480 #define LCD_H_RES 480
#define LCD_V_RES 800 #define LCD_V_RES 800
+5 -1
View File
@@ -453,7 +453,11 @@ static lv_obj_t* make_page(lv_obj_t* parent) {
lv_obj_t* p = lv_obj_create(parent); lv_obj_t* p = lv_obj_create(parent);
lv_obj_set_size(p, LV_PCT(100), LV_PCT(100)); lv_obj_set_size(p, LV_PCT(100), LV_PCT(100));
lv_obj_set_pos(p, 0, 0); lv_obj_set_pos(p, 0, 0);
lv_obj_set_style_bg_opa(p, LV_OPA_TRANSP, 0); // Deckend in der Hintergrundfarbe statt durchsichtig. Sieht identisch aus - die Ebenen
// darunter haben dieselbe Farbe -, erspart LVGL beim Scrollen aber, sie mitzuzeichnen
// und durchzumischen.
lv_obj_set_style_bg_color(p, COL_BG, 0);
lv_obj_set_style_bg_opa(p, LV_OPA_COVER, 0);
lv_obj_set_style_border_width(p, 0, 0); lv_obj_set_style_border_width(p, 0, 0);
lv_obj_set_style_pad_all(p, 8, 0); lv_obj_set_style_pad_all(p, 8, 0);
lv_obj_set_style_pad_row(p, 6, 0); lv_obj_set_style_pad_row(p, 6, 0);