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
83
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    High-level DMX output.
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
95
478b9d0485aa qmsk.dmx.heads: python3, and make dmx optional
Tero Marttila <terom@paivola.fi>
parents: 88
diff changeset
     5
class Head :
83
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
    CHANNELS = None
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
    def __init__ (self, channel) :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
        self.channel = channel
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
        self.channels = self.init()
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
        self.attrs = { }
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
    def init (self) :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
        if self.CHANNELS :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
            return self.CHANNELS
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
        else :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
            raise NotImplementedError()
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
    def __setitem__ (self, attr, value) :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
        if attr in self.channels :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
            self.attrs[attr] = value
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
        else :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
            raise KeyError(attr)
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    def __getitem__ (self, attr) :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
        if attr in self.channels :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
            return self.attrs.get(attr, 0)
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
        else :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
            raise KeyError(attr)
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
 
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
    def alpha (self, alpha=None) :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
        if alpha is not None :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
            self['alpha'] = alpha
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
        
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
        if 'alpha' in self.channels :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
            return dict(alpha=self['alpha'])
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
        else :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
            return None
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
    def color (self, red=None, green=None, blue=None) :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
        if red is not None :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
            self['red'] = red
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
        if green is not None :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
            self['green'] = green
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
        if blue is not None :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
            self['blue'] = blue
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
        if 'red' in self.channels and 'green' in self.channels and 'blue' in self.channels :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
            return dict(red=self['red'], green=self['green'], blue=self['blue'])
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
        else :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
            return None
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
    def __iter__ (self) :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
        for attr in self.channels :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
            yield self.attrs.get(attr, 0)
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
class Stairville_LEDPar56 (Head) :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
    CHANNELS = [
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
        'control1',
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        'red',
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
        'green',
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
        'blue',
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        'control2',
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
    ]
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
class Dimmer (Head) :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
    CHANNELS = [
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
        'alpha',
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    ]
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
class AmericanDJ_MegaTri60_Mode2 (Head) :
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
    CHANNELS = [
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        'red',
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
        'green',
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
        'blue',
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
        'control',
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
        'alpha',
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
    ]
136e210fce82 qmsk.dmx: new Head-based model/view; output/updates not yet implemented
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
88
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    80
95
478b9d0485aa qmsk.dmx.heads: python3, and make dmx optional
Tero Marttila <terom@paivola.fi>
parents: 88
diff changeset
    81
class Universe :
88
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    82
    """
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    83
        An universe of Heads for DMX output.
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    84
    """
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    85
95
478b9d0485aa qmsk.dmx.heads: python3, and make dmx optional
Tero Marttila <terom@paivola.fi>
parents: 88
diff changeset
    86
    def __init__ (self, heads, dmx=None) :
478b9d0485aa qmsk.dmx.heads: python3, and make dmx optional
Tero Marttila <terom@paivola.fi>
parents: 88
diff changeset
    87
        self.heads = heads
88
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    88
        self.dmx = dmx
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    89
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    90
    def __getitem__ (self, name) :
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    91
        return self.heads[name]
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    92
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    93
    def __iter__ (self) :
95
478b9d0485aa qmsk.dmx.heads: python3, and make dmx optional
Tero Marttila <terom@paivola.fi>
parents: 88
diff changeset
    94
        return iter(self.heads.items())
88
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    95
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    96
    def update (self, head, attrs) :
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    97
        """
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    98
            Update per-head values..
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
    99
        """
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
   100
95
478b9d0485aa qmsk.dmx.heads: python3, and make dmx optional
Tero Marttila <terom@paivola.fi>
parents: 88
diff changeset
   101
        for attr, value in attrs.items():
88
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
   102
            head[attr] = value
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
   103
        
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
   104
        # output
95
478b9d0485aa qmsk.dmx.heads: python3, and make dmx optional
Tero Marttila <terom@paivola.fi>
parents: 88
diff changeset
   105
        if self.dmx:
478b9d0485aa qmsk.dmx.heads: python3, and make dmx optional
Tero Marttila <terom@paivola.fi>
parents: 88
diff changeset
   106
            self.dmx.set(head.channel, *head)
88
c923295ee520 qmsk.dmx: move dmx-updating logic to qmsk.dmx.heads.Universe
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
   107