changeset 2223:9b6f4b3c329c

correct some output loop rates; clean up
author drewp@bigasterisk.com
date Tue, 23 May 2023 23:42:33 -0700
parents b0e6fe19dc3b
children 0dd05e9d4ae7
files light9/collector/output.py light9/effect/sequencer/eval_faders.py light9/effect/sequencer/service.py
diffstat 3 files changed, 13 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/light9/collector/output.py	Tue May 23 23:40:02 2023 -0700
+++ b/light9/collector/output.py	Tue May 23 23:42:33 2023 -0700
@@ -86,8 +86,10 @@
 
     async def _loop(self):
         while True:
+            t1 = time.time()
             self._loop_one()
-            await asyncio.sleep(.1)
+            remain = max(0, 1 / self.rate - (time.time() - t1))
+            await asyncio.sleep(remain)
 
     def _loop_one(self):
         start = time.time()
--- a/light9/effect/sequencer/eval_faders.py	Tue May 23 23:40:02 2023 -0700
+++ b/light9/effect/sequencer/eval_faders.py	Tue May 23 23:42:33 2023 -0700
@@ -38,11 +38,8 @@
     """
     def __init__(self,
                  graph: SyncedGraph,
-                 sendToCollector: Callable[[DeviceSettings], Coroutine[None ,None,None]],
                  ):
         self.graph = graph
-        self.sendToCollector = sendToCollector
-
         self.faders: List[Fader] = []
 
         # self.simpleOutputs = SimpleOutputs(self.graph)
@@ -85,7 +82,6 @@
                 raise TypeError('f.value should be set by now')
             effectSettings = EffectSettings(self.graph, [(f.effect, f.setEffectAttr, f.value)])
 
-            print(f'{effectSettings=}')
             notesSettings.append(f.ee.compute(effectSettings))
 
             # ee = effecteval.EffectEval(self.graph, f.effectClass, self.simpleOutputs)
@@ -98,11 +94,3 @@
             # if deviceSettings:
             #     notesSettings.append(deviceSettings)
         return DeviceSettings.merge(self.graph, notesSettings)
-
-
-    # @metrics('update_call_fader').time()
-    # async def update(self):
-    #     log.info(f'update {len(self.notes)=}')
-    #     devSettings = self.computeOutput()
-    #     with metrics('update_s3_send_fader').time():  # our measurement
-    #         sendSecs = await self.sendToCollector(devSettings)
--- a/light9/effect/sequencer/service.py	Tue May 23 23:40:02 2023 -0700
+++ b/light9/effect/sequencer/service.py	Tue May 23 23:42:33 2023 -0700
@@ -7,7 +7,6 @@
 import logging
 import time
 
-import aiohttp
 from louie import dispatcher
 from rdfdb.syncedgraph.syncedgraph import SyncedGraph
 from sse_starlette.sse import EventSourceResponse
@@ -15,15 +14,16 @@
 from starlette.routing import Route
 from starlette_exporter import PrometheusMiddleware, handle_metrics
 
+from lib.background_loop import loop_forever
 from light9 import networking
 from light9.collector.collector_client_asyncio import sendToCollector
 from light9.effect.sequencer.eval_faders import FaderEval
 from light9.effect.sequencer.sequencer import Sequencer, StateUpdate
-from light9.effect.settings import DeviceSettings
 from light9.metrics import metrics
 from light9.run_local import log
 
-from lib.background_loop import loop_forever
+RATE = 30
+
 
 async def changes():
     state = {}
@@ -48,18 +48,6 @@
     return EventSourceResponse(changes())
 
 
-###################################################################
-
-
-async def _send_one(faders: FaderEval):
-    ds = faders.computeOutput()
-    await sendToCollector('effectSequencer', session='0', settings=ds)
-
-
-
-####################################################################
-
-
 def main():
     graph = SyncedGraph(networking.rdfdb.url, "effectSequencer")
     logging.getLogger('autodepgraphapi').setLevel(logging.INFO)
@@ -67,11 +55,14 @@
     logging.getLogger('sse_starlette.sse').setLevel(logging.INFO)
 
     # seq = Sequencer(graph, send)  # per-song timed notes
-    faders = FaderEval(graph)  # bin/fade's untimed notes
+    faders = FaderEval(graph)  # bin/fade's untimed effects
 
-    async def so(first_run):
-        await _send_one(faders)
-    faders_loop = loop_forever(so, metric_prefix='faders', sleep_period=.05, log_fps=True)
+    #@metrics('computeAndSend').time() # needs rework with async
+    async def update(first_run):
+        ds = faders.computeOutput()
+        await sendToCollector('effectSequencer', session='0', settings=ds)
+
+    faders_loop = loop_forever(update, metric_prefix='faders', sleep_period=1 / RATE)
 
     app = Starlette(
         debug=True,