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:
- 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
+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 != s_lastBacklight) {
// Vermessen: Rund um jeden Helligkeitswechsel hing die Bedienung bisher ein bis
// 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);
hal_backlight(bl); // meldet seine Dauer selbst, siehe jc_backlight_set()
s_lastBacklight = bl;
}
}
+27 -2
View File
@@ -235,9 +235,34 @@ void jc_backlight_set(int percent)
if (percent > 100) percent = 100;
if (percent < 0) percent = 0;
uint8_t brightness = (uint8_t)((255 * percent) / 100);
ws7_bridge_write(0xAD, 0x01); // Panel-/Backlight-Freigabe
ws7_bridge_write(0xAB, (uint8_t)(255 - brightness));
uint8_t wert = (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
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.
#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
// benutzen weder Bildspeicher noch LVGL. Damit laesst sich trennen, ob die Anzeigekette
// bis zum Panel arbeitet (Balken sichtbar) oder nicht (schwarz). Nur zur Fehlersuche.