diff --git a/dmx.py b/dmx.py index 64c5a1b..ccd0993 100644 --- a/dmx.py +++ b/dmx.py @@ -13,21 +13,23 @@ def ledlog(value): class RGB: - def __init__(self, dmx, slot, offset=0): - self.dmx = dmx + def __init__(self, slot, offset=0): self.slot = slot self.offset = offset - def rgb(self, color): + def rgb(self, dmx, color): (r, g, b) = color - self.dmx.set(self.slot + self.offset + 0, ledlog(r)) - self.dmx.set(self.slot + self.offset + 1, ledlog(g)) - self.dmx.set(self.slot + self.offset + 2, ledlog(b)) + dmx.set(self.slot + self.offset + 0, ledlog(r)) + dmx.set(self.slot + self.offset + 1, ledlog(g)) + dmx.set(self.slot + self.offset + 2, ledlog(b)) class Bar252(RGB): def __init__(self, dmx, slot=1): super(Bar252, self).__init__(dmx, slot, 2) + + def rgb(self, dmx, color): + super().rgb(dmx, color) dmx.set(self.slot + 0, 81) dmx.set(self.slot + 1, 0) @@ -37,6 +39,10 @@ class REDSpot18RGB(RGB): super(REDSpot18RGB, self).__init__(dmx, slot, 1) dmx.set(self.slot + 0, 0) + def rgb(self, dmx, color): + super().rgb(dmx, color) + dmx.set(self.slot + 0, 81) + class StairvilleLedPar56(RGB): def __init__(self, dmx, slot=1): @@ -46,6 +52,28 @@ class StairvilleLedPar56(RGB): dmx.set(self.slot + 5, 0) dmx.set(self.slot + 6, 255) +class Group: + def __init__(self, rgbs : list[RGB]): + self._rgbs = rgbs + self._color = (0, 0, 0) + self._animation = FadeTo((255, 255, 255)) + + @property + def animation(self) -> Animation: + return self._animation + + @animation.setter + def animation(self, animation: Animation): + self._animation = animation + + @property + def color(self) -> list[int]: + return self._color + + @color.setter + def color(self, color: list[int]): + self._color = color + class DMX: def __init__(self, host, port=0x1936, universe=1, maxchan=512): @@ -62,12 +90,13 @@ class DMX: packet.extend([0x00, 0x0e]) # Protocol version 14 self._header = packet self._sequence = 1 - self._color = (0, 0, 0) - self._animation = FadeTo((255, 255, 255)) - self._rgbs = [] + self._groups = [] self._thread = None self._updating = False + def group(self, group: int, rgbs : list[RGB]): + self._groups[group] = Group(rgbs) + def start(self): if self._thread and self._thread.is_alive(): return @@ -84,11 +113,12 @@ class DMX: sleep(1.0 / 30) def update(self): - if not self._animation: + if not self._groups[0]._animation: return - for i in range(0, len(self._rgbs)): - self._rgbs[i].rgb(self._animation.update(i, len(self._rgbs))) + for g in self._groups: + for i in range(0, len(g._rgbs)): + g._rgbs[i].rgb(self, g._animation.update(i, len(g._rgbs))) packet = self._header[:] packet.append(self._sequence) # Sequence, @@ -110,7 +140,7 @@ class DMX: @property def animation(self) -> str: - return self._animation.name() + return self._groups[0]._animation.name() @animation.setter def animation(self, animation: Union[Animation, str]): @@ -118,34 +148,35 @@ class DMX: if animation == "off": animation = Off() elif animation == "chase": - animation = Chase(self._color) + animation = Chase(self._groups[0]._color) elif animation == "fade": - animation = FadeTo(self._color) + animation = FadeTo(self._groups[0]._color) elif animation == "rainbow": animation = RotatingRainbow() elif animation == "steady": - animation = Steady(self._color) + animation = Steady(self._groups[0]._color) else: raise ValueError(f"No such animation {animation}") - self._animation = animation + self._groups[0]._animation = animation if isinstance(animation, Off): self._updating = False if self._thread and self._thread.is_alive(): self._thread.join() # one frame black - self._animation = Steady((0, 0, 0)) + self._groups[0]._animation = Steady((0, 0, 0)) self.update() - self._animation = Off() + self._groups[0]._animation = Off() else: self.start() print(f"Animation: {animation}", file=sys.stderr) @property def color(self): - return self._color + return self._groups[0].color @color.setter def color(self, color): - if self._color != color: - self._color = color + if self._groups[0]._color != color: + self._groups[0].color = color self.animation = self.animation + diff --git a/foobaz.py b/foobaz.py index 35722dc..e9b8355 100644 --- a/foobaz.py +++ b/foobaz.py @@ -53,27 +53,28 @@ def main(args): artnet = args.artnet print(f"Starting DMX via Art-Net to {artnet}", file=sys.stderr) - # dmx = DMX("10.31.242.35") dmx = DMX(artnet, maxchan=128) if args.room == "shop": - dmx._rgbs = [ - REDSpot18RGB(dmx, 1), - REDSpot18RGB(dmx, 5), - REDSpot18RGB(dmx, 9), - REDSpot18RGB(dmx, 13), - ] + dmx.group(0, [ + REDSpot18RGB(1), + REDSpot18RGB(5), + REDSpot18RGB(9), + REDSpot18RGB(13), + ]) elif args.room == "big": - dmx._rgbs = [ - StairvilleLedPar56(dmx, 1), - StairvilleLedPar56(dmx, 8), - StairvilleLedPar56(dmx, 15), - StairvilleLedPar56(dmx, 22), - Bar252(dmx, 29), - Bar252(dmx, 40), - Bar252(dmx, 51), - Bar252(dmx, 62), - ] + dmx.group(0, [ + StairvilleLedPar56(1), # Window/Kitchen + StairvilleLedPar56(15), # Hallway/Kitchen + Bar252(29), # Window/Blackboard + Bar252(40), # Hallway/Blackboard + Bar252(51), # Window/Kitchen + Bar252(62), # Hallway/Kitchen + ]) + dmx.group(0, [ + StairvilleLedPar56(8), # Window/Blackboard + StairvilleLedPar56(22), # Hallway/Blackboard + ]) else: print(f"Unknown room {args.room}", file=sys.stderr) sys.exit(64)