Merge pull request 'fix(P4): Hintergrundbeleuchtung kommt sofort - Bridge braucht zwei Latches (1.9.12)' (#81) from fix/helligkeit-doppelte-uebernahme into main
This commit was merged in pull request #81.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
// =====================================================================================
|
// =====================================================================================
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user