qmsk/dmx/heads.py
author Tero Marttila <terom@paivola.fi>
Mon, 02 Jun 2014 18:27:08 +0300
changeset 88 c923295ee520
parent 84 9ebf1a2cee3a
child 95 478b9d0485aa
permissions -rw-r--r--
qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
"""
    High-level DMX output.
"""

class Head (object) :
    CHANNELS = None

    def __init__ (self, channel) :
        self.channel = channel
        self.channels = self.init()
        self.attrs = { }

    def init (self) :
        if self.CHANNELS :
            return self.CHANNELS
        else :
            raise NotImplementedError()

    def __setitem__ (self, attr, value) :
        if attr in self.channels :
            self.attrs[attr] = value
        else :
            raise KeyError(attr)

    def __getitem__ (self, attr) :
        if attr in self.channels :
            return self.attrs.get(attr, 0)
        else :
            raise KeyError(attr)
 
    def alpha (self, alpha=None) :
        if alpha is not None :
            self['alpha'] = alpha
        
        if 'alpha' in self.channels :
            return dict(alpha=self['alpha'])
        else :
            return None

    def color (self, red=None, green=None, blue=None) :
        if red is not None :
            self['red'] = red
        if green is not None :
            self['green'] = green
        if blue is not None :
            self['blue'] = blue
        
        if 'red' in self.channels and 'green' in self.channels and 'blue' in self.channels :
            return dict(red=self['red'], green=self['green'], blue=self['blue'])
        else :
            return None

    def __iter__ (self) :
        for attr in self.channels :
            yield self.attrs.get(attr, 0)

class Stairville_LEDPar56 (Head) :
    CHANNELS = [
        'control1',
        'red',
        'green',
        'blue',
        'control2',
    ]

class Dimmer (Head) :
    CHANNELS = [
        'alpha',
    ]

class AmericanDJ_MegaTri60_Mode2 (Head) :
    CHANNELS = [
        'red',
        'green',
        'blue',
        'control',
        'alpha',
    ]


class Universe (object) :
    """
        An universe of Heads for DMX output.
    """

    def __init__ (self, dmx, heads) :
        self.dmx = dmx
        self.heads = heads

    def __getitem__ (self, name) :
        return self.heads[name]

    def __iter__ (self) :
        return self.heads.iteritems()

    def update (self, head, attrs) :
        """
            Update per-head values..
        """

        for attr, value in attrs.iteritems():
            head[attr] = value
        
        # output
        self.dmx.set(head.channel, *head)