diff --git a/light9/collector/collector.py b/light9/collector/collector.py --- a/light9/collector/collector.py +++ b/light9/collector/collector.py @@ -157,9 +157,9 @@ class Collector: 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]) diff --git a/light9/collector/service.py b/light9/collector/service.py --- a/light9/collector/service.py +++ b/light9/collector/service.py @@ -57,7 +57,7 @@ class Updates(WebSocketEndpoint, UiListe 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) diff --git a/light9/effect/effecteval.py b/light9/effect/effecteval.py --- a/light9/effect/effecteval.py +++ b/light9/effect/effecteval.py @@ -12,7 +12,7 @@ from rdflib import Literal, Namespace 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 @@ class EffectEval: 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 @@ class EffectEval: 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): diff --git a/light9/effect/effecteval_test.py b/light9/effect/effecteval_test.py new file mode 100644 --- /dev/null +++ b/light9/effect/effecteval_test.py @@ -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 : . + @prefix dev: . +''' + +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'))])