feat(display): grosse Schrift, invertierter Kopf, GPIO-Uebergabe
Zwei Befunde der Hardware-Abnahme. 1) Die Schrift war zu klein: compose() zeichnete alles in ImageFont.load_default() (rund 10 px) - auf 250x122 aus zwei Metern nicht lesbar. blocks() vergibt jetzt Rollen (header/hero/detail/big), compose() setzt jede Rolle eigen: Modus fett und weiss auf schwarzem Balken, die wichtigste Zeile gross (Migration: erkannte Lampe, Rettung: SSID), Beiwerk klein, "Station aus" gross und mittig. Die Schrift kommt per ImageFont.truetype() aus FONT_SEARCH_PATHS mit DejaVu (/usr/share/fonts/truetype/dejavu/) als Hauptweg - auf beiden Pis vorhanden. load_default(size=...) scheidet aus: das gibt es erst ab Pillow 10.1, Pi 2 hat 9.4.0. Letzter Rueckfall bleibt load_default() ohne Argument, damit eine fehlende Schrift die Anzeige (und damit nie eine Migration) aufhaelt. lines() bleibt ohne Pillow importierbar, die Breitenkuerzung misst weiter in Pixeln. 2) "display test" scheiterte bei laufendem Anzeigedienst mit einem rohen "lgpio.error: 'GPIO busy'": lgpio.error ist keine gpiozero.GPIOZeroError und fiel durch die Ausnahmeliste in epdconfig.module_init(). Sie ist jetzt aufgefuehrt - weiterhin gezielt, TypeError/AttributeError/NameError bleiben Programmierfehler - und die Meldung nennt bei belegten Leitungen den Anzeigedienst. "display test|clear" stoppt den Dienst fuer die Dauer des Handgriffs und startet ihn danach wieder, aber nur, wenn er vorher lief.
This commit is contained in:
@@ -265,6 +265,43 @@ display_run() {
|
||||
sudo env EPD_REVISION="$EPD_REVISION" python3 "$STATION_LIB/display/display.py" "$1"
|
||||
}
|
||||
|
||||
# Handbetrieb am Panel ("display test"/"display clear"), waehrend der Anzeigedienst
|
||||
# laufen kann. Beide wollen dieselben GPIO-Leitungen, und die kann nur einer haben: bei
|
||||
# laufendem Dienst scheiterte der Handgriff mit "lgpio.error: 'GPIO busy'", rc=1.
|
||||
#
|
||||
# Warum stoppen-und-wieder-starten statt "brich mit einer Anweisung ab": 'display test'
|
||||
# ist laut Hilfetext der ERSTE Handgriff der Hardware-Abnahme und die einzige
|
||||
# Moeglichkeit, die Panel-Revision zu bestimmen. Ein Abbruch wuerde also ausgerechnet dem
|
||||
# Abnehmer, der die Station gerade zum ersten Mal in der Hand hat, eine Hausaufgabe
|
||||
# stellen ("erst den Dienst stoppen, dann nochmal") - und zwar bei jedem einzelnen
|
||||
# Versuch, denn die Revision bestimmt man durch Ausprobieren beider Werte. Das Stoppen
|
||||
# ist ausserdem gefahrlos: der Dienst zeichnet nur, er ist an keiner Migration beteiligt.
|
||||
#
|
||||
# Der Dienst wird NUR wieder gestartet, wenn er vorher lief - sonst haette ein
|
||||
# Abnahme-Handgriff den Dienst nebenbei eingeschaltet und den Zustand der Station
|
||||
# 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.
|
||||
display_handover() {
|
||||
_was_active=0
|
||||
if systemctl is-active --quiet ninlight-display 2>/dev/null; then
|
||||
_was_active=1
|
||||
sudo systemctl stop ninlight-display 2>/dev/null || true
|
||||
fi
|
||||
|
||||
_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
|
||||
return "$_rc"
|
||||
}
|
||||
|
||||
# Nimmt die Anzeige mit aus. Reihenfolge: erst den Dienst stoppen, dann das Panel leeren -
|
||||
# umgekehrt zeichnet der noch laufende Daemon binnen 5 s sein altes Bild wieder darauf.
|
||||
#
|
||||
@@ -474,8 +511,8 @@ PY
|
||||
|
||||
display_cmd() {
|
||||
case "${1:-}" in
|
||||
test) display_run --test ;;
|
||||
clear) display_run --clear ;;
|
||||
test) display_handover --test ;;
|
||||
clear) display_handover --clear ;;
|
||||
off) display_off ;;
|
||||
*) usage; exit 2 ;;
|
||||
esac
|
||||
@@ -491,7 +528,9 @@ usage() {
|
||||
echo " /etc/ninlight-station.conf falsch - auf die andere Revision" >&2
|
||||
echo " umstellen (V2 statt V3 oder umgekehrt), das Panel kurz" >&2
|
||||
echo " stromlos machen und erneut 'display test'." >&2
|
||||
echo " display clear Panel leeren." >&2
|
||||
echo " Ein laufender Anzeigedienst wird dafuer kurz gestoppt und" >&2
|
||||
echo " danach wieder gestartet (er haelt sonst die GPIO-Leitungen)." >&2
|
||||
echo " display clear Panel leeren (ebenfalls mit kurzer Unterbrechung des Dienstes)." >&2
|
||||
echo " display off Anzeigedienst stoppen und das Panel leeren (macht 'off' mit)." >&2
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user