fix(display): Freigabe-Ziel lesbar, Tests schriftunabhaengig
Sechs Review-Befunde an e2d836a/2aab1b0. C1: die Pixelschwellen in test_render.py waren gegen Pillow 12/Arial kalibriert und auf dem Pi wie auf Debian 13 (DejaVu) rot - "> 150 schwarze Pixel in Zeile 11" sind dort nur 143. Die Zusagen ueber den Kopfbalken sind jetzt Anteile und Symmetrien statt Pixelzahlen (mindestens 55 % des Balkens schwarz, weisse Schrift links UND rechts der Mitte, Balken ueber die volle Breite). Zwei weitere schriftabhaengige Schwellen ebenso: die grosse Zeile hebt sich ueber das VERHAELTNIS der Tintenhoehen vom Beiwerk ab, und die Randgrenze zaehlt Zeilenbaender statt Tinten-Cluster. I2: im Zustand "armed" stand "FREIGEGEBEN: <ziel>" in der Kopfzeile, wo 112 px Platz sind und der Text 182 px misst - gezeichnet wurde "FREIGEGEBE…", bei jedem Ziel gleich. Im Kopf steht jetzt nur noch das Label, der Zielname als eigene Beiwerkzeile ueber die volle Breite; die SSID-Zeile gibt dafuer in "armed" ihren Platz ab. Geprueft wird das gezeichnete Bild (Pixelvergleich gegen eine Referenzzeile), nicht lines(). I3: der Kommentar an display_handover() begruendete die Rueckgabewert-Durchreichung damit, dass der Handgriff bei stummem Panel rot werde. Das stimmt nicht - display.py beendet sich bei fehlendem Panel/SPI/Pillow mit 0. Der Kommentar sagt jetzt, dass man die Revision am Panel beurteilt und nicht am Exit-Code. I4: zwischen "systemctl stop" und "systemctl start" gab es keinen Signalhandler - ein Strg-C waehrend "display test" (der dokumentierte Weg, die Revision zu bestimmen, bei falscher Revision haengt das Panel) liess den Anzeigedienst gestoppt zurueck. trap auf INT/TERM/HUP, das Wiederanfahren in display_service_resume(), Handler beenden selbst mit 128 + Signalnummer. M2: HEADER_PHASE_MIN_WIDTH_PX bleibt als Sicherheitsnetz, ist jetzt aber getestet statt toter Code. M4: compose() baute je Aufruf fuenf Schriften neu. Prozess-Cache (mit ImageFont-Modul und FONT_SEARCH_PATHS im Schluessel, damit die Tests nicht verfaelscht werden) und faules Laden je Rolle: 25,0 ms -> 7,0 ms. Die Pixeltests laufen zusaetzlich unter Pillow 11.1 mit echtem DejaVu und unter fuenf weiteren Schriften. Sieben Mutationsproben angewandt, angesehen und zurueckgenommen. tools/test_host.sh gruen.
This commit is contained in:
@@ -282,9 +282,24 @@ display_run() {
|
||||
# veraendert, was 'off' zuvor bewusst hergestellt hatte. Deshalb "is-active" vorher
|
||||
# fragen statt blind "stop" und "start".
|
||||
#
|
||||
# Rueckgabewert ist der von display.py - der Handgriff muss weiterhin rot werden, wenn
|
||||
# das Panel nicht antwortet; das Wiederanfahren des Dienstes darf ihn weder verdecken
|
||||
# noch (bei eigenem Fehlschlag) einen Panel-Erfolg in einen Fehler verwandeln.
|
||||
# Der Rueckgabewert von display.py wird unveraendert durchgereicht, und das
|
||||
# Wiederanfahren des Dienstes darf ihn weder verdecken noch (bei eigenem Fehlschlag) in
|
||||
# einen Fehler verwandeln.
|
||||
#
|
||||
# Was dieser Rueckgabewert NICHT ist: eine Aussage ueber das Panel. display.py's main()
|
||||
# faengt DisplayUnavailable/ImportError ab, protokolliert eine Zeile und beendet sich mit
|
||||
# sys.exit(0) - die ueber mehrere Fixrunden erkaempfte Zusage "die Anzeige ist nirgends
|
||||
# Voraussetzung". Fehlendes Panel, fehlendes SPI, fehlendes Pillow, lgpio 'GPIO busy':
|
||||
# alles rc=0. Rot wird der Handgriff nur bei einem echten Absturz (ein Traceback kommt
|
||||
# unveraendert durch). Ob die Revision stimmt, beurteilst du deshalb AM PANEL - zeigt es
|
||||
# ein sauberes, seitenrichtiges Testbild? - und nie am Exit-Code; "Exit 0" heisst hier
|
||||
# ausdruecklich nicht "Panel in Ordnung".
|
||||
display_service_resume() {
|
||||
[ "${_was_active:-0}" -eq 1 ] || return 0
|
||||
sudo systemctl start ninlight-display 2>/dev/null \
|
||||
|| echo "Warnung: Anzeigedienst konnte nicht wieder gestartet werden - 'systemctl status ninlight-display' pruefen" >&2
|
||||
}
|
||||
|
||||
display_handover() {
|
||||
_was_active=0
|
||||
if systemctl is-active --quiet ninlight-display 2>/dev/null; then
|
||||
@@ -292,13 +307,26 @@ display_handover() {
|
||||
sudo systemctl stop ninlight-display 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Zwischen "stop" und "start" darf uns kein Signal aus der Hand nehmen, den Dienst
|
||||
# wieder anzufahren. Der Fall ist nicht theoretisch: die Abnahmeprozedur in
|
||||
# display.py's Modul-Docstring sagt ausdruecklich, dass bei falscher Revision
|
||||
# ReadBusy() NIE zurueckkehrt - der Abnehmer probiert EPD_REVISION=V3, das Panel
|
||||
# haengt, er drueckt Strg-C. Ohne Handler stirbt display_handover mit, der
|
||||
# Anzeigedienst bleibt aus, das Panel bleibt schwarz, und mitten in der Lampenabnahme
|
||||
# sieht das aus wie "Panel kaputt".
|
||||
#
|
||||
# Die Handler beenden SELBST (130/143/129 = 128 + Signalnummer): ein Handler ohne
|
||||
# "exit" laesst die Shell hinter dem unterbrochenen Kommando weiterlaufen - in diesem
|
||||
# Projekt schon einmal ein Befund (setup_pi.sh, Profilschreiben).
|
||||
trap 'display_service_resume; exit 130' INT
|
||||
trap 'display_service_resume; exit 143' TERM
|
||||
trap 'display_service_resume; exit 129' HUP
|
||||
|
||||
_rc=0
|
||||
display_run "$1" || _rc=$?
|
||||
|
||||
if [ "$_was_active" -eq 1 ]; then
|
||||
sudo systemctl start ninlight-display 2>/dev/null \
|
||||
|| echo "Warnung: Anzeigedienst konnte nicht wieder gestartet werden - 'systemctl status ninlight-display' pruefen" >&2
|
||||
fi
|
||||
trap - INT TERM HUP
|
||||
display_service_resume
|
||||
return "$_rc"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user