fix(P4): Hintergrundbeleuchtung kommt sofort - Bridge braucht zwei Latches (1.9.12) #81

Merged
thomas merged 1 commits from fix/helligkeit-doppelte-uebernahme into main 2026-09-03 15:46:17 +02:00
4 changed files with 49 additions and 9 deletions
+13
View File
@@ -1,3 +1,16 @@
Version 1.9.12:
- Die Hintergrundbeleuchtung kommt beim Wechsel in den und aus dem Standby jetzt sofort.
Bisher stand das Bild bereits fertig da - im Gegenlicht war es zu sehen -, blieb aber
mehrere Sekunden dunkel. Das war die ganze gesuchte Verzögerung.
- Ursache: Die Bridge übernimmt eine neue Helligkeit nicht zuverlässig beim ersten Mal. Der
Beispielcode von Waveshare setzt sie deshalb zweimal, mit einer Pause dazwischen,
ausdrücklich „sicherheitshalber". Genau diese Wiederholung fehlte.
- Die Panel-Freigabe wird nur noch beim ersten Mal gesetzt. Sie erneut zu setzen, während die
Beleuchtung läuft, stößt die Helligkeitsstufe der Bridge neu an; der Beispielcode setzt sie
ebenfalls nur ein einziges Mal.
- Jeder Helligkeitswechsel meldet jetzt seine Dauer. Bleibt die Beleuchtung wieder hinterher,
lässt sich die Pause zwischen den beiden Übernahmen über WS7_BACKLIGHT_LATCH_MS erhöhen.
Version 1.9.11: Version 1.9.11:
- Endlose Startschleife behoben: Beleuchtung an, nie ein Bild. Der P4 startet sich nach dem - 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 Einschalten absichtlich einmal neu, weil das Panel sonst schwarz bleibt. Die Absicherung
+1 -7
View File
@@ -80,13 +80,7 @@ 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 hal_backlight(bl); // meldet seine Dauer selbst, siehe jc_backlight_set()
// zwei Sekunden. Der Schreibzugriff geht ueber denselben I2C-Bus wie der Touch.
uint32_t t0 = millis();
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;
} }
} }
+27 -2
View File
@@ -235,9 +235,34 @@ void jc_backlight_set(int percent)
if (percent > 100) percent = 100; if (percent > 100) percent = 100;
if (percent < 0) percent = 0; if (percent < 0) percent = 0;
uint8_t brightness = (uint8_t)((255 * percent) / 100); uint8_t brightness = (uint8_t)((255 * percent) / 100);
ws7_bridge_write(0xAD, 0x01); // Panel-/Backlight-Freigabe uint8_t wert = (uint8_t)(255 - brightness);
ws7_bridge_write(0xAB, (uint8_t)(255 - brightness)); int64_t t0 = esp_timer_get_time();
// Die Bridge uebernimmt eine neue Helligkeit nicht zuverlaessig beim ersten Mal. Der
// Beispielcode von Waveshare setzt sie deshalb zweimal, mit einer Pause dazwischen,
// ausdruecklich "sicherheitshalber". Uns fehlte diese Wiederholung: Das Bild stand
// dann fertig da, blieb aber dunkel, bis die Uebernahme irgendwann doch griff - beim
// Ein- und Ausschalten des Standby waren das mehrere Sekunden.
//
// Die Freigabe (0xAD) bleibt beim ersten Aufruf, danach nicht mehr: Sie erneut zu
// setzen, waehrend die Beleuchtung laeuft, stoesst die Helligkeitsstufe der Bridge neu
// an - der Beispielcode setzt sie darum ebenfalls nur ein einziges Mal.
static bool freigegeben = false;
if (!freigegeben) {
ws7_bridge_write(0xAD, 0x01); // Panel-/Backlight-Freigabe
vTaskDelay(pdMS_TO_TICKS(20)); // wie im Beispielcode: Bridge setzen lassen
freigegeben = true;
}
ws7_bridge_write(0xAB, wert);
ws7_bridge_write(0xAA, 0x01); // Helligkeit uebernehmen ws7_bridge_write(0xAA, 0x01); // Helligkeit uebernehmen
vTaskDelay(pdMS_TO_TICKS(WS7_BACKLIGHT_LATCH_MS));
ws7_bridge_write(0xAB, wert); // Wiederholung, siehe oben
ws7_bridge_write(0xAA, 0x01);
esp_rom_printf("[HAL] %u ms: Helligkeit %d %% gesetzt, brauchte %u ms\n",
(unsigned)(esp_timer_get_time() / 1000), percent,
(unsigned)((esp_timer_get_time() - t0) / 1000));
} }
// ===================================================================================== // =====================================================================================
+8
View File
@@ -182,6 +182,14 @@
// auf I2C antwortet. Meldet sich 0x14 beim Start nicht, diesen Wert erhoehen. // auf I2C antwortet. Meldet sich 0x14 beim Start nicht, diesen Wert erhoehen.
#define WS7_TOUCH_POWER_MS 120 #define WS7_TOUCH_POWER_MS 120
// Pause zwischen den beiden Helligkeitsuebernahmen der Bridge. Sie uebernimmt eine neue
// Helligkeit nicht zuverlaessig beim ersten Mal; der Beispielcode von Waveshare setzt sie
// darum zweimal. Ohne die Wiederholung stand das Bild fertig da, blieb aber dunkel - beim
// Wechsel in den und aus dem Standby mehrere Sekunden lang. Der Beispielcode wartet 100 ms;
// weniger genuegt hier, weil die Wiederholung ohnehin folgt. Bleibt die Beleuchtung wieder
// hinterher, diesen Wert erhoehen.
#define WS7_BACKLIGHT_LATCH_MS 20
// Prueffarbbalken statt Oberflaeche anzeigen. Sie entstehen im DSI-Baustein selbst und // Prueffarbbalken statt Oberflaeche anzeigen. Sie entstehen im DSI-Baustein selbst und
// benutzen weder Bildspeicher noch LVGL. Damit laesst sich trennen, ob die Anzeigekette // benutzen weder Bildspeicher noch LVGL. Damit laesst sich trennen, ob die Anzeigekette
// bis zum Panel arbeitet (Balken sichtbar) oder nicht (schwarz). Nur zur Fehlersuche. // bis zum Panel arbeitet (Balken sichtbar) oder nicht (schwarz). Nur zur Fehlersuche.