@Hypersim: Erst einmal allgemeine Anmerkungen zum Quelltext:
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Dateien sollte man wo es möglich ist mit der ``with``-Anweisung verwenden, damit die auch wieder geschlossen werden, egal warum das Programm endet.
`byte` ist ein etwas irreführender Name für 16 Bytes. Da `bytes` schon der Name eines Datentyps ist, würde sich hier als allgemeiner Name `data` anbieten. Oder man spart sich das gleich komplett dem Wert einen Namen zu geben.
`type` ist auch ein Name eines Typs/einer Funktion. Den sollte man nicht für etwas anderes verwenden. Eine Konvention wenn man einen bereits von Python vorbelegten Namen oder ein Schlüsselwort als Namen verwenden will, ist das anhängen eines einzelnen Unterstrichs.
Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` und `str()` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.
Wenn `code` einen Wert hat, kann es nicht gleichzeitig einen anderen haben, man braucht also nicht weiterprüfen wenn man eine Übereinstimmung gefunden hat. Das zweite ``if code …`` sollte also ein ``elif code …`` sein.
Zwischenstand:
Code: Alles auswählen
#!/usr/bin/env python3
import struct
import time
PATH = "/dev/input/by-id/usb-_mini_keyboard-if01-event-mouse"
def main():
with open(PATH, "rb") as usb_device:
while True:
type_, code, value = struct.unpack_from(
"hhi", usb_device.read(16), offset=8
)
print(f"Type: {type_} Code: {code} Value: {value}")
if type_ == 1 and value == 1:
if code == 272:
print("LEFT MOUSE BUTTON PRESS")
elif code == 273:
print("RIGHT MOUSE BUTTON PRESS")
time.sleep(1)
print("++++ HEARTBEAT ++++")
if __name__ == "__main__":
main()
Nebenläufige ausführung kann man beispielsweise durch das `threading`-Modul erreichen. Hier am einfachsten in dem man die Heartbeat-Ausgabe in einen eigenen Thread verlegt:
Code: Alles auswählen
#!/usr/bin/env python3
import struct
import time
from threading import Thread
PATH = "/dev/input/by-id/usb-_mini_keyboard-if01-event-mouse"
def do_heartbeat():
while True:
time.sleep(1)
print("++++ HEARTBEAT ++++")
def main():
Thread(target=do_heartbeat, daemon=True).start()
with open(PATH, "rb") as usb_device:
while True:
type_, code, value = struct.unpack_from(
"hhi", usb_device.read(16), offset=8
)
print(f"Type: {type_} Code: {code} Value: {value}")
if type_ == 1 and value == 1:
if code == 272:
print("LEFT MOUSE BUTTON PRESS")
elif code == 273:
print("RIGHT MOUSE BUTTON PRESS")
if __name__ == "__main__":
main()