sync with current state
This commit is contained in:
111
apps/textscroll.py
Executable file
111
apps/textscroll.py
Executable file
@@ -0,0 +1,111 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import pygame
|
||||
import paho.mqtt.client as mqtt
|
||||
import random
|
||||
|
||||
class ScrollingTextDisplay:
|
||||
def __init__(self, width: int, height: int):
|
||||
pygame.init()
|
||||
self.width = width
|
||||
self.height = height
|
||||
self.screen = pygame.Surface((width, height))
|
||||
self.clock = pygame.time.Clock()
|
||||
|
||||
# Liste der Standardtexte
|
||||
self.default_texts = [
|
||||
"Text per MQTT an: mqtt.chaospott.de Topic: test/topic ", # Hardcodierte IP-Adresse
|
||||
"Willkommen beim MQTT-Display!",
|
||||
"Aktuelle Nachrichten hier empfangen.",
|
||||
"MQTT-Server verbindet...",
|
||||
"Textnachricht anzeigen...",
|
||||
]
|
||||
self.error_text = "MQTT-Server nicht erreichbar!"
|
||||
self.text = self.get_random_default_text() # Zufälligen Standardtext auswählen
|
||||
self.text_x = width
|
||||
|
||||
# Schriftart 'PressStart2P-Regular' aus dem Verzeichnis 'apps' laden
|
||||
self.font = pygame.font.Font("PressStart2P-Regular.ttf", 16) # Schriftgröße anpassen
|
||||
|
||||
# Fest codierte MQTT-Einstellungen
|
||||
self.mqtt_broker = "mqtt.chaospott.de" # Beispiel IP-Adresse des MQTT-Brokers
|
||||
self.topic = "test/topic" # Beispiel Topic
|
||||
self.mqtt_client = mqtt.Client()
|
||||
self.mqtt_client.on_connect = self.on_connect
|
||||
self.mqtt_client.on_message = self.on_message
|
||||
self.mqtt_client.on_disconnect = self.on_disconnect
|
||||
|
||||
# Versuche die Verbindung aufzubauen
|
||||
self.connect_to_mqtt()
|
||||
|
||||
# Zähler für die angezeigte Nachricht
|
||||
self.message_display_count = 0
|
||||
|
||||
def get_random_default_text(self):
|
||||
"""Wählt zufällig einen Standardtext aus der Liste aus."""
|
||||
return random.choice(self.default_texts)
|
||||
|
||||
def connect_to_mqtt(self):
|
||||
try:
|
||||
self.mqtt_client.connect(self.mqtt_broker)
|
||||
self.mqtt_client.loop_start()
|
||||
except Exception as e:
|
||||
print(f"Verbindungsfehler zu MQTT-Server: {e}")
|
||||
self.text = self.error_text # Setze Fehlertext für die Anzeige
|
||||
self.text_x = self.width # Text von rechts starten
|
||||
|
||||
def on_connect(self, client, userdata, flags, rc):
|
||||
if rc == 0:
|
||||
client.subscribe(self.topic)
|
||||
self.text = self.get_random_default_text() # Setze einen zufälligen Standardtext
|
||||
else:
|
||||
print(f"Fehler beim Verbinden mit MQTT: Code {rc}")
|
||||
self.text = self.error_text
|
||||
|
||||
def on_disconnect(self, client, userdata, rc):
|
||||
if rc != 0:
|
||||
print("Verbindung zum MQTT-Server verloren. Erneuter Verbindungsversuch...")
|
||||
self.text = self.error_text
|
||||
self.text_x = self.width # Fehlertext von rechts starten
|
||||
# Erneut die Verbindung aufbauen
|
||||
self.connect_to_mqtt()
|
||||
|
||||
def on_message(self, client, userdata, msg):
|
||||
self.text = msg.payload.decode("utf-8") if msg.payload.decode("utf-8") else self.get_random_default_text()
|
||||
self.text_x = self.width # Text von rechts starten
|
||||
self.message_display_count = 3 # Setze den Zähler auf 3
|
||||
|
||||
def draw_text(self):
|
||||
self.screen.fill((0, 0, 0)) # Bildschirm leeren
|
||||
text_surface = self.font.render(self.text, True, (255, 255, 255))
|
||||
text_width = text_surface.get_width() # Breite des Textes ermitteln
|
||||
text_y = (self.height - text_surface.get_height()) // 2 # Y-Position zentrieren
|
||||
self.screen.blit(text_surface, (self.text_x, text_y)) # Text zentriert zeichnen
|
||||
|
||||
def display(self):
|
||||
while True:
|
||||
text_surface = self.font.render(self.text, True, (255, 255, 255))
|
||||
text_width = text_surface.get_width() # Breite des Textes ermitteln
|
||||
|
||||
self.text_x -= 1 # Text nach links verschieben
|
||||
if self.text_x < -text_width: # Wenn der Text komplett verschwunden ist
|
||||
self.text_x = self.width # Text von rechts neu starten
|
||||
# Falls der Text leer ist, setze Standardtext oder Fehlertext
|
||||
if self.message_display_count > 0:
|
||||
self.message_display_count -= 1
|
||||
else:
|
||||
self.text = self.get_random_default_text() # Setze zurück auf zufälligen Standardtext
|
||||
|
||||
self.draw_text()
|
||||
os.write(1, pygame.image.tostring(self.screen, "RGB"))
|
||||
self.clock.tick(30)
|
||||
|
||||
if __name__ == "__main__":
|
||||
Nx = int(sys.argv[1]) # Breite des Displays
|
||||
Ny = int(sys.argv[2]) # Höhe des Displays
|
||||
|
||||
display = ScrollingTextDisplay(Nx, Ny)
|
||||
display.display()
|
||||
|
Reference in New Issue
Block a user