changeset 2208:091909b4b727

seems kind of important that effecteval return DeviceSettings, not more EffectSettings
author drewp@bigasterisk.com
date Mon, 22 May 2023 01:08:31 -0700
parents 0ff5adb554ba
children 449dfd8a0f40
files light9/collector/collector.py light9/collector/service.py light9/effect/effecteval.py light9/effect/effecteval_test.py
diffstat 4 files changed, 48 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/light9/collector/collector.py	Mon May 22 01:06:51 2023 -0700
+++ b/light9/collector/collector.py	Mon May 22 01:08:31 2023 -0700
@@ -157,9 +157,9 @@
             del self.lastRequest[clientSession]
 
     # todo: move to settings.py
-    def resolvedSettingsDict(self, settingsList: List[DeviceSetting]) -> Dict[Tuple[DeviceUri, DeviceAttr], VTUnion]:
+    def _resolvedSettingsDict(self, settingsList: DeviceSettings) -> Dict[Tuple[DeviceUri, DeviceAttr], VTUnion]:
         out: Dict[Tuple[DeviceUri, DeviceAttr], VTUnion] = {}
-        for devUri, devAttr, val in settingsList:
+        for devUri, devAttr, val in settingsList.asList():
             if (devUri, devAttr) in out:
                 existingVal = out[(devUri, devAttr)]
                 out[(devUri, devAttr)] = resolve(self._deviceType[devUri], devAttr, [existingVal, val])
--- a/light9/collector/service.py	Mon May 22 01:06:51 2023 -0700
+++ b/light9/collector/service.py	Mon May 22 01:08:31 2023 -0700
@@ -57,7 +57,7 @@
 
 async def PutAttrs(collector: Collector, request):
     with STAT_SETATTR.time():
-        client, clientSession, settings, sendTime = parseJsonMessage(await request.body())
+        client, clientSession, settings, sendTime = parseJsonMessage(collector.graph, await request.body())
         collector.setAttrs(client, clientSession, settings, sendTime)
         return Response('', status_code=202)
 
--- a/light9/effect/effecteval.py	Mon May 22 01:06:51 2023 -0700
+++ b/light9/effect/effecteval.py	Mon May 22 01:08:31 2023 -0700
@@ -12,7 +12,7 @@
 from webcolors import hex_to_rgb, rgb_to_hex
 
 from light9.effect.scale import scale
-from light9.effect.settings import BareEffectSettings, EffectSettings
+from light9.effect.settings import BareEffectSettings, DeviceSettings, EffectSettings
 from light9.effect.simple_outputs import SimpleOutputs
 from light9.namespaces import DEV, L9
 from light9.newtypes import (DeviceAttr, DeviceUri, EffectAttr, EffectClass, VTUnion)
@@ -80,19 +80,21 @@
     effect: EffectClass
     simpleOutputs: SimpleOutputs
 
-    def outputFromEffect(self, effectSettings: BareEffectSettings, songTime: float, noteTime: float) -> Tuple[EffectSettings, Dict]:
+    def outputFromEffect(self, effectSettings: BareEffectSettings, songTime: float, noteTime: float) -> Tuple[DeviceSettings, Dict]:
         """
         From effect attr settings, like strength=0.75, to output device
         settings like light1/bright=0.72;light2/bright=0.78. This runs
         the effect code.
         """
+        # todo: what does the next comment line mean?
         # both callers need to apply note overrides
+
         strength = float(effectSettings.s[EffectAttr(L9['strength'])])
         if strength <= 0:
-            return EffectSettings(self.graph, []), {'zero': True}
+            return DeviceSettings(self.graph, []), {'zero': True}
 
         report = {}
-        out: Dict[Tuple[DeviceUri, DeviceAttr], VTUnion] = {}  # (dev, attr): value
+        out: Dict[Tuple[DeviceUri, DeviceAttr], VTUnion] = {}
 
         out.update(self.simpleOutputs.values(self.effect, strength, effectSettings.s.get(EffectAttr(L9['colorScale']), None)))
 
@@ -106,7 +108,7 @@
                 out.update(func(effectSettings, strength, songTime, noteTime))
 
         outList = [(d, a, v) for (d, a), v in out.items()]
-        return EffectSettings(self.graph, outList), report
+        return DeviceSettings(self.graph, outList), report
 
 
 def effect_Curtain(effectSettings, strength, songTime, noteTime):
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/light9/effect/effecteval_test.py	Mon May 22 01:08:31 2023 -0700
@@ -0,0 +1,38 @@
+import time
+import unittest
+
+from freezegun import freeze_time
+from light9.effect.effecteval import EffectEval
+from light9.effect.settings import BareEffectSettings, DeviceSettings, EffectSettings
+from light9.effect.simple_outputs import SimpleOutputs
+from rdflib import Namespace
+
+from light9.collector.collector import Collector
+from light9.collector.output import Output
+from light9.collector.weblisteners import WebListeners
+from light9.mock_syncedgraph import MockSyncedGraph
+from light9.namespaces import DEV, L9
+from light9.newtypes import (ClientSessionType, ClientType, DeviceAttr, DeviceUri, EffectAttr, EffectClass, HexColor, UnixTime)
+
+PREFIX = '''
+    @prefix : <http://light9.bigasterisk.com/> .
+    @prefix dev: <http://light9.bigasterisk.com/device/> .
+'''
+
+THEATER = '''
+
+    :effectClass1 a :EffectClass .
+#add light to here
+'''
+effectClass1 = EffectClass(L9['effectClass1'])
+
+
+class TestEffectEval:
+
+    def test_scalesColors(self):
+        g = MockSyncedGraph(THEATER)
+        so = SimpleOutputs(g)
+        ee = EffectEval(g, effectClass1, so)
+        s = BareEffectSettings(s={EffectAttr(L9['strength']): 0.5})
+        ds,report = ee.outputFromEffect(s, songTime=0, noteTime=0)
+        assert ds == DeviceSettings(g, [(DeviceUri(L9['light1']), DeviceAttr(L9['color']), HexColor('#888888'))])