qmsk/dmx/heads.py
author Tero Marttila <terom@paivola.fi>
Sat, 07 Jun 2014 16:22:56 +0300
changeset 95 478b9d0485aa
parent 88 c923295ee520
permissions -rw-r--r--
qmsk.dmx.heads: python3, and make dmx optional
"""
    High-level DMX output.
"""

class Head :
    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 :
    """
        An universe of Heads for DMX output.
    """

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

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

    def __iter__ (self) :
        return iter(self.heads.items())

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

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