Changeset - d149a2c2236c
[Not reviewed]
default
0 3 0
drewp@bigasterisk.com - 9 years ago 2016-06-11 20:41:04
drewp@bigasterisk.com
always send trailing zeros to dmx
Ignore-this: 973ae36ba571f865150710d304e255c8
3 files changed with 12 insertions and 8 deletions:
0 comments (0 inline, 0 general)
bin/collector
Show inline comments
 
@@ -59,14 +59,14 @@ def startZmq(port, collector):
 
    s.onPull = onPull
 

	
 
def launch(graph):
 

	
 
    # todo: drive outputs with config files
 
    outputs = [
 
        EnttecDmx(L9['output/dmx0/'], '/dev/dmx3'),
 
        Udmx(L9['output/udmx/']),
 
        EnttecDmx(L9['output/dmx0/'], '/dev/dmx3', 80),
 
        Udmx(L9['output/udmx/'], 510),
 
    ]
 
    c = Collector(graph, outputs)
 

	
 
    server = WebServer(c)
 
    startZmq(networking.collectorZmq.port, c)
 
    
light9/collector/collector.py
Show inline comments
 
@@ -102,25 +102,27 @@ class Collector(object):
 
            except KeyError:
 
                log.warn("request for output to unconfigured device %s" % d)
 
                continue
 
            outputAttrs[d] = toOutputAttrs(devType, deviceAttrs[d])
 
        
 
        pendingOut = {} # output : values
 
        for out in self.outputs:
 
            pendingOut[out] = [0] * out.numChannels
 
        for device, attrs in outputAttrs.iteritems():
 
            for outputAttr, value in attrs.iteritems():
 
                self.setAttr(device, outputAttr, value, pendingOut)
 

	
 
        dt1 = 1000 * (time.time() - now)
 
        self.flush(pendingOut)
 
        dt2 = 1000 * (time.time() - now)
 
        if dt1 > 10:
 
            print "slow setAttrs: %.1fms -> flush -> %.1fms" % (dt1, dt2)
 

	
 
    def setAttr(self, device, outputAttr, value, pendingOut):
 
        output, index = self.outputMap[(device, outputAttr)]
 
        outList = pendingOut.setdefault(output, [])
 
        outList = pendingOut[output]
 
        setListElem(outList, index, value, combine=max)
 

	
 
    def flush(self, pendingOut):
 
        """write any changed outputs"""
 
        for out, vals in pendingOut.iteritems():
 
            out.update(vals)
light9/collector/output.py
Show inline comments
 
@@ -5,12 +5,13 @@ import time
 
import usb.core
 
import logging
 
from twisted.internet import task, threads, reactor
 
from greplin import scales
 
log = logging.getLogger('output')
 

	
 
# eliminate this: lists are always padded now
 
def setListElem(outList, index, value, fill=0, combine=lambda old, new: new):
 
    if len(outList) < index:
 
        outList.extend([fill] * (index - len(outList)))
 
    if len(outList) <= index:
 
        outList.append(value)
 
    else:
 
@@ -45,14 +46,15 @@ class Output(object):
 
        send latest data to output
 
        """
 
        raise NotImplementedError
 

	
 

	
 
class DmxOutput(Output):
 
    def __init__(self, uri):
 
    def __init__(self, uri, numChannels):
 
        self.uri = uri
 
        self.numChannels = numChannels
 

	
 
    def flush(self):
 
        pass
 

	
 
    def _loop(self):
 
        start = time.time()
 
@@ -71,14 +73,14 @@ class DmxOutput(Output):
 

	
 
class EnttecDmx(DmxOutput):
 
    stats = scales.collection('/output/enttecDmx',
 
                              scales.PmfStat('write'),
 
                              scales.PmfStat('update'))
 

	
 
    def __init__(self, uri, devicePath='/dev/dmx0'):
 
        DmxOutput.__init__(self, uri)
 
    def __init__(self, uri, devicePath='/dev/dmx0', numChannels=80):
 
        DmxOutput.__init__(self, uri, numChannels)
 

	
 
        sys.path.append("dmx_usb_module")
 
        from dmx import Dmx
 
        self.dev = Dmx(devicePath)
 
        self.currentBuffer = ''
 
        self.lastLog = 0
 
@@ -105,14 +107,14 @@ class EnttecDmx(DmxOutput):
 
                                  
 
class Udmx(DmxOutput):
 
    stats = scales.collection('/output/udmx',
 
                              scales.PmfStat('update'),
 
                              scales.PmfStat('write'),
 
                              scales.IntStat('usbErrors'))
 
    def __init__(self, uri):
 
        DmxOutput.__init__(self, uri)
 
    def __init__(self, uri, numChannels):
 
        DmxOutput.__init__(self, uri, numChannels)
 
        
 
        from light9.io.udmx import Udmx
 
        self.dev = Udmx()
 
        self.currentBuffer = ''
 
        self.lastSentBuffer = None
 
        self.lastLog = 0
0 comments (0 inline, 0 general)