Changeset - d050b8efda9d
[Not reviewed]
default
0 1 0
drewp@bigasterisk.com - 20 months ago 2023-06-02 01:42:36
drewp@bigasterisk.com
fix bug with uninitialized effect ,and prefer a dead effect over a graph reload
1 file changed with 3 insertions and 2 deletions:
0 comments (0 inline, 0 general)
light9/effect/effecteval2.py
Show inline comments
 
import traceback
 
import inspect
 
import logging
 
from dataclasses import dataclass
 
from typing import Callable, List, Optional
 

	
 
from rdfdb.syncedgraph.syncedgraph import SyncedGraph
 
from rdflib import RDF
 
from rdflib.term import Node
 

	
 
from light9.effect.effect_function_library import EffectFunctionLibrary
 
from light9.effect.settings import DeviceSettings, EffectSettings
 
from light9.namespaces import L9
 
@@ -29,25 +30,25 @@ class Config:
 
class EffectEval2:
 
    """Runs one effect code to turn EffectSettings (e.g. strength) into DeviceSettings"""
 
    graph: SyncedGraph
 
    uri: EffectUri
 
    lib: EffectFunctionLibrary
 

	
 
    config: Optional[Config] = None
 

	
 
    def __post_init__(self):
 
        self.graph.addHandler(self._compile)
 

	
 
    def _compile(self):
 
        self.effectFunction = None
 
        self.config = None
 
        if not self.graph.contains((self.uri, RDF.type, L9['Effect'])):
 
            return
 

	
 
        try:
 
            effectFunction = typedValue(EffectFunction, self.graph, self.uri, L9['effectFunction'])
 
            effSets = []
 
            devSettings = None
 
            for s in self.graph.objects(self.uri, L9['setting']):
 
                attr = typedValue(EffectAttr, self.graph, s, L9['effectAttr'])
 
                if attr == L9['deviceSettings']:
 
                    value = typedValue(Node, self.graph, s, L9['value'])
 

	
 
@@ -66,25 +67,25 @@ class EffectEval2:
 
            try:
 
                effectFunction = typedValue(EffectFunction, self.graph, self.uri, L9['effectFunction'])
 
            except ValueError:
 
                raise ValueError(f'{self.uri} has no :effectFunction')
 
            func = self.lib.getFunc(effectFunction)
 

	
 
            # This should be in EffectFunctionLibrary
 
            funcArgs = list(inspect.signature(func).parameters.values())
 

	
 
            self.config = Config(effectFunction, esettings, devSettings, func, funcArgs)
 
        except Exception:
 
            log.error(f"while compiling {self.uri}")
 
            raise
 
            traceback.print_exc()
 

	
 
    def compute(self, songTime: float, inputs: EffectSettings) -> DeviceSettings:
 
        """
 
        calls our function using inputs (publishedAttr attrs, e.g. :strength)
 
        and effect-level settings including a special attr called :deviceSettings
 
        with DeviceSettings as its value
 
        """
 
        if self.config is None:
 
            return DeviceSettings(self.graph, [])
 

	
 
        c = self.config
 
        kw = {}
0 comments (0 inline, 0 general)