terom@83: """ terom@83: High-level DMX output. terom@83: """ terom@83: terom@83: class Head (object) : terom@83: CHANNELS = None terom@83: terom@83: def __init__ (self, channel) : terom@83: self.channel = channel terom@83: self.channels = self.init() terom@83: self.attrs = { } terom@83: terom@83: def init (self) : terom@83: if self.CHANNELS : terom@83: return self.CHANNELS terom@83: else : terom@83: raise NotImplementedError() terom@83: terom@83: def __setitem__ (self, attr, value) : terom@83: if attr in self.channels : terom@83: self.attrs[attr] = value terom@83: else : terom@83: raise KeyError(attr) terom@83: terom@83: def __getitem__ (self, attr) : terom@83: if attr in self.channels : terom@83: return self.attrs.get(attr, 0) terom@83: else : terom@83: raise KeyError(attr) terom@83: terom@83: def alpha (self, alpha=None) : terom@83: if alpha is not None : terom@83: self['alpha'] = alpha terom@83: terom@83: if 'alpha' in self.channels : terom@83: return dict(alpha=self['alpha']) terom@83: else : terom@83: return None terom@83: terom@83: def color (self, red=None, green=None, blue=None) : terom@83: if red is not None : terom@83: self['red'] = red terom@83: if green is not None : terom@83: self['green'] = green terom@83: if blue is not None : terom@83: self['blue'] = blue terom@83: terom@83: if 'red' in self.channels and 'green' in self.channels and 'blue' in self.channels : terom@83: return dict(red=self['red'], green=self['green'], blue=self['blue']) terom@83: else : terom@83: return None terom@83: terom@83: def __iter__ (self) : terom@83: for attr in self.channels : terom@83: yield self.attrs.get(attr, 0) terom@83: terom@83: class Stairville_LEDPar56 (Head) : terom@83: CHANNELS = [ terom@83: 'control1', terom@83: 'red', terom@83: 'green', terom@83: 'blue', terom@83: 'control2', terom@83: ] terom@83: terom@83: class Dimmer (Head) : terom@83: CHANNELS = [ terom@83: 'alpha', terom@83: ] terom@83: terom@83: class AmericanDJ_MegaTri60_Mode2 (Head) : terom@83: CHANNELS = [ terom@83: 'red', terom@83: 'green', terom@83: 'blue', terom@83: 'control', terom@83: 'alpha', terom@83: ] terom@83: terom@88: terom@88: class Universe (object) : terom@88: """ terom@88: An universe of Heads for DMX output. terom@88: """ terom@88: terom@88: def __init__ (self, dmx, heads) : terom@88: self.dmx = dmx terom@88: self.heads = heads terom@88: terom@88: def __getitem__ (self, name) : terom@88: return self.heads[name] terom@88: terom@88: def __iter__ (self) : terom@88: return self.heads.iteritems() terom@88: terom@88: def update (self, head, attrs) : terom@88: """ terom@88: Update per-head values.. terom@88: """ terom@88: terom@88: for attr, value in attrs.iteritems(): terom@88: head[attr] = value terom@88: terom@88: # output terom@88: self.dmx.set(head.channel, *head) terom@88: