# HG changeset patch # User Drew Perttula # Date 2014-06-12 08:26:05 # Node ID 8842f0c7a6411d4babee841fe9e9a06d3751fe1f # Parent 7e7d93bdc8df77ec1ec0fe8c02d96ce90521b4f1 refactor effectloop Ignore-this: b3728398a151a31517090caa767e8dd3 diff --git a/bin/effecteval b/bin/effecteval --- a/bin/effecteval +++ b/bin/effecteval @@ -145,7 +145,7 @@ class Code(PrettyErrorHandler, cyclone.w else: break if not codeLines: - log.info("no codelines recevied on PUT /code") + log.info("no codelines received on PUT /code") return with self.settings.graph.currentState( tripleFilter=(None, L9['effect'], effect)) as g: diff --git a/light9/effecteval/effectloop.py b/light9/effecteval/effectloop.py --- a/light9/effecteval/effectloop.py +++ b/light9/effecteval/effectloop.py @@ -70,22 +70,11 @@ class EffectLoop(object): if song is None: return - outSubs = [] - for e in self.currentEffects: - try: - outSubs.append(e.eval(songTime)) - except Exception as exc: - now = time.time() - if now > self.lastErrorLog + 5: - log.error("effect %s: %s" % (e.uri, exc)) - self.lastErrorLog = now - out = Submaster.sub_maxes(*outSubs) - - self.logLevels(t1, out) - dmx = out.get_dmx_list() - with self.stats.writeDmx.time(): - yield dmxclient.outputlevels(dmx, twisted=True) - + outputs = self.allEffectOutputs(songTime) + combined = self.combineOutputs(outputs) + self.logLevels(t1, combined) + self.sendOutput(combined) + elapsed = time.time() - t1 dt = max(0, self.period - elapsed) except Exception: @@ -94,6 +83,31 @@ class EffectLoop(object): dt = 1 reactor.callLater(dt, self.sendLevels) + + def combineOutputs(self, outputs): + """pick usable effect outputs and reduce them into one for sendOutput""" + outputs = [x for x in outputs if isinstance(x, Submaster.Submaster)] + out = Submaster.sub_maxes(*outputs) + + return out + + @inlineCallbacks + def sendOutput(self, combined): + dmx = combined.get_dmx_list() + with self.stats.writeDmx.time(): + yield dmxclient.outputlevels(dmx, twisted=True) + + def allEffectOutputs(self, songTime): + outputs = [] + for e in self.currentEffects: + try: + outputs.append(e.eval(songTime)) + except Exception as exc: + now = time.time() + if now > self.lastErrorLog + 5: + log.error("effect %s: %s" % (e.uri, exc)) + self.lastErrorLog = now + return outputs def logLevels(self, now, out): # this would look nice on the top of the effecteval web pages too