diff --git a/src/projctl/connection.py b/src/projctl/connection.py index f07c8986d737a4d85f4feb23fa0e1adfa31e1599..52f98bb13744e26246fdfcba8d23383cf9bc91b7 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 c37f01570ebf800e7c0e4e019134e64c751e26b9..2fa443be40e672dd62158c86a9380f29b3c65479 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 b106e3764b026e6ce871df432fca8fa34f9e50c7..bcf921a600b477039104677d519a17a7c7f57468 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()},