74 lines
2.4 KiB
Python

# 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)")