Zum gezeigten Quelltext: `subprocess`, `sys`, und `datetime` werden importiert aber nirgends verwendet.
`project()` wurde ich `Tx1()` umbenannt: Wie gesagt schlechte Namen. `Tx1` noch schlechter weil kryptische Abkürzung. Zu `tx_rx` hatte ich ja schon mal gesagt, dass der Name nicht gut ist. In Deiner Variante der Funktion braucht man im Grunde *gar keinen* Namen definieren.
`main()` greift auf die globale Variablen `device` zu. Globale Variablen verwendet man nicht. In dem ``if __name__ …``-Zweig sollte wirklich nur der Funktionsaufruf stehen.
Der Pfad zu den Schriftarten ist im Grunde eine Konstante, den braucht man nicht immer wieder neu definieren.
Man nummeriert keine Namen. So Nummernanhängsel sind nichtssagend. Entweder will man bessere Namen oder gar keine Einzelnamen für einzelWerte sondern eine Datenstruktur. Oft eine Liste. Im `font`-Fall werden bis auf einen der Namen die anderen aber auch gar nicht verwendet, also macht die Nummerierung noch weniger Sinn.
Entsprechend überarbeitet (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import os
import time
from pathlib import Path
from demo_opts import get_device
from luma.core.render import canvas
from PIL import ImageFont
FONT_PATH = Path(__file__).resolve().parent / "fonts" / "arial.ttf"
def get_last_log_line():
return (
os.popen("tail -n1 /var/log/svxlink | cut -c22-")
.read()
.replace("Tx1: Turning the transmitter OFF", "Offline")
.replace("Tx1: Turning the transmitter ON", "Online")
)
def stats(device):
with canvas(device) as draw:
draw.text(
(0, 20),
get_last_log_line(),
font=ImageFont.truetype(str(FONT_PATH), 12),
fill="white",
)
def main():
try:
device = get_device()
while True:
stats(device)
time.sleep(0.1)
except KeyboardInterrupt:
pass
if __name__ == "__main__":
main()
Mit einer simplen ``tail``-Implementierung könnte das so aussehen (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import os
import time
from pathlib import Path
from demo_opts import get_device
from luma.core.render import canvas
from PIL import ImageFont
LOG_FILE_PATH = Path("/var/log/svxlink")
TIMESTAMP_LENGTH = 21
TRANSMITTER_STATE_PREFIX = "Tx1: Turning the transmitter "
TRANSMITTER_STATE_TO_DISPLAY_TEXT = {"ON": "Online", "OFF": "Offline"}
FONT_PATH = Path(__file__).resolve().parent / "fonts" / "arial.ttf"
def follow_lines(filename):
with open(filename, encoding="ascii") as file:
file.seek(0, os.SEEK_END)
position = file.tell()
while True:
line = file.readline()
if line and line.endswith("\n"):
yield line
position = file.tell()
else:
file.seek(position)
time.sleep(0.5)
def update_display(device, transmitter_state):
with canvas(device) as draw:
draw.text(
(0, 20),
transmitter_state,
font=ImageFont.truetype(str(FONT_PATH), 12),
fill="white",
)
def main():
try:
device = get_device()
transmitter_state = "Unknown"
update_display(device, transmitter_state)
for line in follow_lines(LOG_FILE_PATH):
line = line[TIMESTAMP_LENGTH:].rstrip()
if line.startswith(TRANSMITTER_STATE_PREFIX):
transmitter_state = TRANSMITTER_STATE_TO_DISPLAY_TEXT[
line[len(TRANSMITTER_STATE_PREFIX) :]
]
update_display(device, transmitter_state)
except KeyboardInterrupt:
pass
if __name__ == "__main__":
main()