# app/bluetooth/manager.py """ Bluetooth-Verbindungsmanagement: MouldKing-Instanz, Monitor-Thread, Cleanup """ import threading import time import logging from mkconnect.mouldking.MouldKing import MouldKing from mkconnect.tracer.TracerConsole import TracerConsole from mkconnect.advertiser.AdvertiserBTSocket import AdvertiserBTSocket logger = logging.getLogger(__name__) # Globale Bluetooth-Komponenten (einmalig initialisiert) tracer = TracerConsole() advertiser = AdvertiserBTSocket() # Globale Zustände (werden von den Routen gesetzt und hier überwacht) current_hub = None current_module = None current_device = None def init_bluetooth(): """ Initialisiert die Bluetooth-Komponenten (einmalig beim App-Start). """ global tracer, advertiser logger.info("Bluetooth-Komponenten initialisiert (Advertiser + Tracer)") # Hier ggf. weitere Initialisierung (z. B. hci0 prüfen) from app.state import current_device, current_module, current_hub def connection_monitor(): """ Background-Thread: Prüft alle 5 Sekunden, ob der Hub noch antwortet. Bei Fehlern wird die Verbindung sauber getrennt. """ global current_device, current_module, current_hub while True: if current_device is not None: try: # Harter Test: Kanal 0 kurz auf 0.1 und zurück auf 0.0 setzen current_device.SetChannel(0, 0.1) time.sleep(0.05) # winzige Pause current_device.SetChannel(0, 0.0) logger.debug("Monitor: Hub antwortet → SetChannel-Test OK") except Exception as e: logger.warning(f"Monitor: Hub scheint weg zu sein: {str(e)}") # Sauber trennen try: current_device.Disconnect() except Exception as disconnect_err: logger.debug(f"Disconnect fehlgeschlagen (harmlos): {disconnect_err}") # Globale Zustände zurücksetzen current_device = None current_module = None current_hub = None # Optional: Frontend benachrichtigen (z. B. später über WebSocket) time.sleep(5) # Prüfintervall: 5 Sekunden # Thread beim Import starten (einmalig) monitor_thread = threading.Thread(target=connection_monitor, daemon=True) monitor_thread.start() logger.info("Bluetooth-Monitor-Thread gestartet (5s Intervall)")