From f5356ed13dc484fee20820a45d8cf4880ab53134 Mon Sep 17 00:00:00 2001 From: David Huss <dh@atoav.com> Date: Mon, 19 Aug 2024 11:54:35 +0200 Subject: [PATCH] use multiple base ports for ruggedness --- src/projctl/connection.py | 20 +++++++++++--------- src/projctl/main.py | 5 ++++- src/projctl/projector.py | 4 ++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/projctl/connection.py b/src/projctl/connection.py index f07c898..52f98bb 100644 --- a/src/projctl/connection.py +++ b/src/projctl/connection.py @@ -8,12 +8,15 @@ import projctl class Connection(projctl.WithLogger): - def __init__(self, port_base="/dev/ttyUSB", logger=None): + def __init__(self, port_bases=["/dev/ttyUSB"], logger=None): super().__init__(logger) self.ser = None self.port = None - self.port_base = port_base - self.potential_ports = [self.port_base + str(i) for i in range(10)] + self.port_bases = port_bases + self.potential_ports = [] + for base in self.port_bases: + for port in [base + str(i) for i in range(10)]: + self.potential_ports.append(port) self.connected = False self.logged_connection_error = False self.started_reconnection = False @@ -53,16 +56,15 @@ class Connection(projctl.WithLogger): pass if not self.connected: if not self.logged_connection_error: - # projctl.database.log_event( - # message=f"Could not establish serial connection to Projector{'' if tries == 1 else ' after '+str(tries)+' tries'}!", - # event_type=projctl.EventType.server, - # problematic=True, - # ) self.logged_connection_error = True # Exponential backoff backoff_time = min(120, tries * tries) + ports = [] + for base in self.port_bases: + ports.append(f"{base}0 to {base}9") + ports = f'({", ".join(ports)})' self.log_fatal( - f"Error: Could not connect to any of the {len(self.potential_ports)} USB-Serial Ports ({self.port_base}0 to {self.port_base}9): Try {tries}, waiting {backoff_time}s before retrying" + f"Error: Could not connect to any of the {len(self.potential_ports)} USB-Serial Ports {ports}: Try {tries}, waiting {backoff_time}s before retrying" ) time.sleep(backoff_time) tries += 1 diff --git a/src/projctl/main.py b/src/projctl/main.py index c37f015..2fa443b 100644 --- a/src/projctl/main.py +++ b/src/projctl/main.py @@ -1,3 +1,4 @@ +import os from fastapi import FastAPI, Request, WebSocket, WebSocketDisconnect from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles @@ -9,6 +10,8 @@ from datetime import datetime import projctl +tty_base_ports = ["/dev/serial", "/dev/ttyUSB"] + app = FastAPI(title="ProjCtl") app.mount("/static", StaticFiles(directory="static"), name="static") templates = Jinja2Templates(directory="templates") @@ -17,7 +20,7 @@ logger = logging.getLogger("uvicorn.error") # (__name__) logger.setLevel(logging.INFO) projector = projctl.OptomaZu820Tst( - projector_id="00", tty_base_port="/dev/ttyUSB", logger=logger + projector_id="00", tty_base_ports=tty_base_ports, logger=logger ) diff --git a/src/projctl/projector.py b/src/projctl/projector.py index b106e37..bcf921a 100644 --- a/src/projctl/projector.py +++ b/src/projctl/projector.py @@ -196,11 +196,11 @@ COMMANDS = { class OptomaZu820Tst(projctl.WithLogger): - def __init__(self, projector_id="00", tty_base_port="/dev/ttyUSB", logger=None): + def __init__(self, projector_id="00", tty_base_ports=["/dev/ttyUSB"], logger=None): super().__init__(logger) self.id = projector_id self.locked = False - self.serial = projctl.Connection(tty_base_port, self.logger) + self.serial = projctl.Connection(tty_base_ports, self.logger) self.status = { "power": {"state": PowerState.unknown, "time": datetime.now()}, "shutter": {"state": "unknown", "time": datetime.now()}, -- GitLab