changeset 2399:bbff83207963

minor cleanups and timings
author drewp@bigasterisk.com
date Thu, 16 May 2024 16:15:33 -0700
parents 87de3fada483
children 9a4bc2ea264e
files src/light9/collector/output.py src/light9/collector/service.py src/light9/collector/weblisteners.py src/light9/effect/sequencer/eval_faders.py src/light9/midifade/midifade.py
diffstat 5 files changed, 22 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- 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')
 
 
--- 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)}))
--- 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
 
--- 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:
--- 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()