Hallo zusammen,
angeregt durch diesen Thread, habe ich mich eben damit beschäftigt, ob und falls ja, welche der On-Board LEDs man softwareseitig steuern kann.
Hier das Ergebnis meiner Recherche. Gilt für RPi 2, 3, 4, Zero
PWR-LED
Einschalten
Ausschalten
ACT-LED
Einschalten
Ausschalten
CAPS-LOCK-LED (RPI 400)
Einschalten
Ausschalten
NUM-LED (RPi 400)
Einschalten
Ausschalten
Und die Umsetzung in den Programmierprachen Ion und Unicon sieht dann so aus:
procedure show_progress_success(led, modus)
static caps_lock, num_lock, pwr
initial
{
system("sudo chown pi /sys/class/leds/input1::capslock/brightness")
system("sudo chown pi /sys/class/leds/input1::numlock/brightness")
system("sudo chown pi /sys/class/leds/led0/brightness")
}
case led of
{
"CAPS_LOCK": {
/caps_lock := 0
if /modus then caps_lock := ixor(caps_lock, 1) else caps_lock := modus
if led := open("/sys/class/leds/input1::capslock/brightness", "w") then
{
write(led, caps_lock)
close(led)
}
}
"NUM_LOCK": {
/num_lock := 0
if /modus then num_lock := ixor(num_lock, 1) else num_lock := modus
if led := open("/sys/class/leds/input1::numlock/brightness", "w") then
{
write(led, num_lock)
close(led)
}
}
"PWR": {
/pwr := 0
if /modus then pwr := ixor(pwr, 1) else pwr := modus
if led := open("/sys/class/leds/led0/brightness", "w") then
{
write(led, pwr)
close(led)
}
}
}
end
Display More
Code-Deutung:
Die Funktion bekommt einen Namen und erwartet zwei Argumente. Das erste ist eine Zeichenkette, die die OnBoard-LED bezeichnet (CAPS_LOCK, NUM_LOCK, PWR). Das zweite ist ein Modus, der entweder den Status der LED angibt (0 für aus und 1 für leuchtet) oder leer bleibt. In letzterem Fall soll der Status bei jedem Aufruf hin- und herschalten (sog. toggeln).
Es werden drei statische Variablen definiert. Diese behalten nach Verlassen der Funktion ihren Wert und stehen beim nächsten Aufruf unverändert zur Verfügung. Die Verwendung statischer Variablen ist eine Möglichkeit, globale Variablen zu vermeiden. Globale Variablen werden in Icon und Unicon nicht so als Teufelszeug betrachtet wie in Python. Aber egal...
Ursprünglich wollte ich das Schalten der OnBoard-LEDs über kleine Bash-Skripte machen. Das war aber zu langsam.
Dann zeigte sich das Ganze sehr störrisch im Zusammenspiel mit meiner Anwendung, wenn da plötzlich der Anwender wechselt und kein Weg zurück führt.
Und in einer Hochsprache in eine Datei eine 0 oder eine 1 zu schreiben, ist jetzt auch nicht so'n Ding.
Also muss der Weg darüber gehen, dass der Eigentümer der LEDs auf den User pi gesetzt werden muss.
Dann folgt ein Initial-Block, der nur beim allerersten Aufruf dieser Funktion aufgerufen wird. Hier passiert also etwas, was nur einmalig geschehen soll.
Hier wird der Eigentümer der LED-Dateien auf den User pi gesetzt
Dann folgt eine Fallunterscheidung. Je nach zu verwendender LED passiert so ziemlich das Gleiche (hier hätte man den Code auch in eine weitere Funktion ausgliedern können).
Der Ausdruck /caps_lock := 1 bedeutet, dass die statische Variable caps_lock nur dann auf 1 gesetzt wird, wenn die Variable noch keine Zuweisung auf etwas anderres als &null erfahren hat.
In der Zeile if /modus then caps_lock := ixor(caps_lock, 1) else caps_lock := modus passiert folgendes:
Falls beim Funktionsaufruf das Argument modus nicht beachtet wurde, dann soll der Status der LED "getogglet" werden. Dieses Umschalten geht am aller einfachten durch einen Exklusiv-Oder der betreffenden Variablen mit 1. Dadurch wird streg genommen das niederwertigste Bit umgeschaltet.
Wenn das Argument modus doch einen Wert enthält, dann soll dieser Wert der LED zugeordnet werden.
Dann wird die betreffende Datei zum Schreiben geöffnet und der Wert, der der LED zugewiesen wurde (also 0 oder 1 ) in die Datei geschrieben. Die LED leuchtet und erlischt.
Die geöffnete Datei wird dann schnellstmöglich wieder geschlossen.
Was für CAPS-LOCK gemacht wurde wird analog für NUM_LOCK und PWR wiederholt.
Dadurch erreicht man, das mit einer Funktion 3 LED unabhängig voneinander gesteuert werden können.
Beste Grüße
Andreas
P.S.: [30-AUG-2022]:
Wenn das hier beschriebene aufgrund von Updates nicht mehr funktionieren sollte, dann kann das hier hier helfen:
Link 1 und Link 2 [Quelle der Links: Thread] Martin28 :
Demnach sollen in der Datei /boot/config.txt folgende Einträge vorgenommen (oder ersetzt werden):
Statt
ersetzen oder überhaupt einfügen:
Siehe auch den angegebenen Thread zur Diskussion.