diff --git a/src/control_server.py b/src/control_server.py index fd37799..413c947 100644 --- a/src/control_server.py +++ b/src/control_server.py @@ -14,12 +14,12 @@ import threading import time from bar_config import LED_BAR_NAMES, DEFAULT_BAR_SETTINGS from color_utils import adjust_brightness +from networking import WebSocketClient as SPIClient # SPI transport client # Configure logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') # Configuration -LED_SERVER_URI = "ws://192.168.4.1:80/ws" CONTROL_SERVER_PORT = 8765 SOUND_CONTROL_HOST = "127.0.0.1" SOUND_CONTROL_PORT = 65433 @@ -40,57 +40,23 @@ PATTERN_NAMES = { class LEDController: - """Handles communication with LED bars via WebSocket.""" - - def __init__(self, led_server_uri): - self.led_server_uri = led_server_uri - self.websocket = None - self.is_connected = False - self.reconnect_task = None + """Handles communication with LED bars via SPI (through ESP32 relay).""" + + def __init__(self, spi_bus: int = 0, spi_device: int = 0, spi_speed_hz: int = 1_000_000): + self.client = SPIClient(bus=spi_bus, device=spi_device, speed_hz=spi_speed_hz) + + @property + def is_connected(self) -> bool: + return getattr(self.client, "is_connected", False) async def connect(self): - """Connect to LED server.""" - if self.is_connected and self.websocket: - return - - try: - logging.info(f"Connecting to LED server at {self.led_server_uri}...") - self.websocket = await websockets.connect(self.led_server_uri) - self.is_connected = True - logging.info("Connected to LED server") - - except Exception as e: - logging.error(f"Failed to connect to LED server: {e}") - self.is_connected = False - self.websocket = None - + await self.client.connect() async def send_data(self, data): - """Send data to LED server.""" - if not self.is_connected or not self.websocket: - logging.warning("Not connected to LED server. Attempting to reconnect...") - await self.connect() - if not self.is_connected: - logging.error("Failed to reconnect to LED server. Cannot send data.") - return - - try: - await self.websocket.send(json.dumps(data)) - logging.debug(f"Sent to LED server: {data}") - except Exception as e: - logging.error(f"Failed to send data to LED server: {e}") - self.is_connected = False - self.websocket = None - # Attempt to reconnect - await self.connect() + await self.client.send_data(data) async def close(self): - """Close LED server connection.""" - if self.websocket and self.is_connected: - await self.websocket.close() - self.is_connected = False - self.websocket = None - logging.info("Disconnected from LED server") + await self.client.close() class SoundController: @@ -119,7 +85,8 @@ class LightingController: """Main lighting control logic.""" def __init__(self): - self.led_controller = LEDController(LED_SERVER_URI) + # SPI defaults: bus 0, CE0, 1MHz; adjust here if needed + self.led_controller = LEDController(spi_bus=0, spi_device=0, spi_speed_hz=1_000_000) self.sound_controller = SoundController(SOUND_CONTROL_HOST, SOUND_CONTROL_PORT) # Lighting state