Skip to content
Snippets Groups Projects
Commit f5356ed1 authored by David Huss's avatar David Huss :speech_balloon:
Browse files

use multiple base ports for ruggedness

parent d0b26af5
No related branches found
No related tags found
No related merge requests found
...@@ -8,12 +8,15 @@ import projctl ...@@ -8,12 +8,15 @@ import projctl
class Connection(projctl.WithLogger): 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) super().__init__(logger)
self.ser = None self.ser = None
self.port = None self.port = None
self.port_base = port_base self.port_bases = port_bases
self.potential_ports = [self.port_base + str(i) for i in range(10)] 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.connected = False
self.logged_connection_error = False self.logged_connection_error = False
self.started_reconnection = False self.started_reconnection = False
...@@ -53,16 +56,15 @@ class Connection(projctl.WithLogger): ...@@ -53,16 +56,15 @@ class Connection(projctl.WithLogger):
pass pass
if not self.connected: if not self.connected:
if not self.logged_connection_error: 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 self.logged_connection_error = True
# Exponential backoff # Exponential backoff
backoff_time = min(120, tries * tries) 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( 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) time.sleep(backoff_time)
tries += 1 tries += 1
......
import os
from fastapi import FastAPI, Request, WebSocket, WebSocketDisconnect from fastapi import FastAPI, Request, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
...@@ -9,6 +10,8 @@ from datetime import datetime ...@@ -9,6 +10,8 @@ from datetime import datetime
import projctl import projctl
tty_base_ports = ["/dev/serial", "/dev/ttyUSB"]
app = FastAPI(title="ProjCtl") app = FastAPI(title="ProjCtl")
app.mount("/static", StaticFiles(directory="static"), name="static") app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates") templates = Jinja2Templates(directory="templates")
...@@ -17,7 +20,7 @@ logger = logging.getLogger("uvicorn.error") # (__name__) ...@@ -17,7 +20,7 @@ logger = logging.getLogger("uvicorn.error") # (__name__)
logger.setLevel(logging.INFO) logger.setLevel(logging.INFO)
projector = projctl.OptomaZu820Tst( projector = projctl.OptomaZu820Tst(
projector_id="00", tty_base_port="/dev/ttyUSB", logger=logger projector_id="00", tty_base_ports=tty_base_ports, logger=logger
) )
......
...@@ -196,11 +196,11 @@ COMMANDS = { ...@@ -196,11 +196,11 @@ COMMANDS = {
class OptomaZu820Tst(projctl.WithLogger): 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) super().__init__(logger)
self.id = projector_id self.id = projector_id
self.locked = False self.locked = False
self.serial = projctl.Connection(tty_base_port, self.logger) self.serial = projctl.Connection(tty_base_ports, self.logger)
self.status = { self.status = {
"power": {"state": PowerState.unknown, "time": datetime.now()}, "power": {"state": PowerState.unknown, "time": datetime.now()},
"shutter": {"state": "unknown", "time": datetime.now()}, "shutter": {"state": "unknown", "time": datetime.now()},
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment