# HG changeset patch # User drewp@bigasterisk.com # Date 1715901333 25200 # Node ID bbff83207963fb8aa3fe02a04ab6f4e1965ff6ea # Parent 87de3fada4831c9ecec6a827b43d2e82e67b81cb minor cleanups and timings diff -r 87de3fada483 -r bbff83207963 src/light9/collector/output.py --- a/src/light9/collector/output.py Thu May 16 16:13:18 2024 -0700 +++ b/src/light9/collector/output.py Thu May 16 16:15:33 2024 -0700 @@ -1,17 +1,15 @@ import asyncio import logging +import os import socket import struct import time -from typing import cast -from light9.newtypes import uriTail import usb.core from rdflib import URIRef -from twisted.internet import reactor, task -from twisted.internet.interfaces import IReactorCore from light9.metrics import metrics +from light9.newtypes import uriTail log = logging.getLogger('output') logAllDmx = logging.getLogger('output.allDmx') @@ -35,7 +33,7 @@ if log.isEnabledFor(logging.DEBUG): self._lastLoggedMsg = '' - task.LoopingCall(self._periodicLog).start(1) + log.warning('unported: task.LoopingCall(self._periodicLog).start(1)') def reconnect(self): pass @@ -63,7 +61,7 @@ def crash(self): log.error('unrecoverable- exiting') - cast(IReactorCore, reactor).crash() + os.abort() class DummyOutput(Output): @@ -256,7 +254,7 @@ raise dt = time.time() - t1 - if dt > 1/self.rate*1.5: + if dt > 1 / self.rate * 1.5: log.warning(f'usb stall- took {(dt*1000):.2f}ms') diff -r 87de3fada483 -r bbff83207963 src/light9/collector/service.py --- a/src/light9/collector/service.py Thu May 16 16:13:18 2024 -0700 +++ b/src/light9/collector/service.py Thu May 16 16:15:33 2024 -0700 @@ -33,7 +33,6 @@ import zmq import zmq.asyncio - # this is the rate sent to usb RATE = 20 @@ -59,8 +58,6 @@ async def on_disconnect(self, websocket: WebSocket, close_code: int): self.listeners.delClient(self) - pass - async def PutAttrs(collector: Collector, request): try: @@ -90,15 +87,17 @@ traceback.print_exc() raise + def findDevice(): for line in subprocess.check_output("lsusb").decode('utf8').splitlines(): if '16c0:05dc' in line: words = line.split(':')[0].split() dev = f'/dev/bus/usb/{words[1]}/{words[3]}' log.info(f'device will be {dev}') - return dev ,int(words[3]) + return dev, int(words[3]) raise ValueError("no matching uDMX found") + def main(): logging.getLogger('autodepgraphapi').setLevel(logging.INFO) logging.getLogger('syncedgraph').setLevel(logging.INFO) @@ -109,7 +108,7 @@ graph = SyncedGraph(networking.rdfdb.url, "collector") devPath, usbAddress = findDevice() - # if user doesn't have r/w, fail now + # if user doesn't have r/w, fail now try: # todo: drive outputs with config files outputs: List[Output] = [ @@ -158,4 +157,6 @@ return app +# import yappi; yappi.start() app = main() +# app.add_route('/profile', lambda req: yappi.get_func_stats().print_all(columns={0: ("name", 80), 1: ("ncall", 5), 2: ("tsub", 8), 3: ("ttot", 8), 4: ("tavg", 8)})) diff -r 87de3fada483 -r bbff83207963 src/light9/collector/weblisteners.py --- a/src/light9/collector/weblisteners.py Thu May 16 16:13:18 2024 -0700 +++ b/src/light9/collector/weblisteners.py Thu May 16 16:15:33 2024 -0700 @@ -9,6 +9,8 @@ from fastavro.schema import load_schema from light9.collector.output import Output as OutputInstance from light9.newtypes import (DeviceUri, DmxIndex, DmxMessageIndex, OutputAttr, OutputUri, OutputValue) +import starlette.websockets +import websockets log = logging.getLogger('weblisteners') @@ -49,14 +51,16 @@ # maybe put on a stack for flusher or something async def flusher(self): - await asyncio.sleep(3) # help startup faster? while True: - await self._flush() - await asyncio.sleep(.05) + try: + await self._flush() + except (starlette.websockets.WebSocketDisconnect, websockets.exceptions.ConnectionClosed): + pass + await asyncio.sleep(.02) async def _flush(self): now = time.time() - if now < self.lastFlush + .05 or not self.clients: + if now < self.lastFlush + .02 or not self.clients: return self.lastFlush = now diff -r 87de3fada483 -r bbff83207963 src/light9/effect/sequencer/eval_faders.py --- a/src/light9/effect/sequencer/eval_faders.py Thu May 16 16:13:18 2024 -0700 +++ b/src/light9/effect/sequencer/eval_faders.py Thu May 16 16:15:33 2024 -0700 @@ -54,7 +54,7 @@ def _compile(self) -> None: """rebuild our data from the graph""" self.faders = [] - for fader in self.graph.subjects(RDF.type, L9['Fader']): + for fader in cast(list[URIRef], self.graph.subjects(RDF.type, L9['Fader'])): try: self.faders.append(self._compileFader(fader)) except ValueError: diff -r 87de3fada483 -r bbff83207963 src/light9/midifade/midifade.py --- a/src/light9/midifade/midifade.py Thu May 16 16:13:18 2024 -0700 +++ b/src/light9/midifade/midifade.py Thu May 16 16:15:33 2024 -0700 @@ -79,7 +79,7 @@ mido.set_backend('alsa_midi.mido_backend') - MAX_SEND_RATE = 30 + MAX_SEND_RATE = 50 _lastSet = {} #midictlchannel:value7bit @@ -90,7 +90,7 @@ listenToMidiInputs(queue) connectToMidiOutput(graph, pages, _lastSet) graph.addHandler(pages.compileCurrents) - + # todo: serve fps metrics, at least await queue.run()