diff --git a/cdoseaplay/config.py b/cdoseaplay/config.py index d057978..04fe497 100644 --- a/cdoseaplay/config.py +++ b/cdoseaplay/config.py @@ -14,6 +14,8 @@ font_size = 28 letter_offset = False lights_brightness = 255 +led_lights = 24 +letter_base_light = 25 conf = os.path.expanduser('~/.config/cdosea.json') if os.path.exists(conf): diff --git a/cdoseaplay/lights.py b/cdoseaplay/lights.py index 0a18981..60c33c7 100755 --- a/cdoseaplay/lights.py +++ b/cdoseaplay/lights.py @@ -55,7 +55,7 @@ CURRENT_STATE = [0] * 16 # avoid overload and turn light on with a fade -def fade_to(sender, start, end, duration, channels=16, universe=1): +def fade_to(sender, start, end, duration, channels=16, universe=1, lights=[]): distance = end - start steps = int(duration * 10) if not steps: @@ -79,33 +79,45 @@ def fade_to(sender, start, end, duration, channels=16, universe=1): else: a = old b = target - sender[universe].dmx_data = [a[x] if x % 2 else b[x] for x in range(channels)] + channel_data = [a[x] if x % 2 else b[x] for x in range(channels)] + sender[universe].dmx_data = channel_data + lights[channels:] time.sleep(step) steps -= 1 + channel_data = [end] * channels + sender[universe].dmx_data = channel_data + lights[channels:] + +def dmx_base(letter): + lights = [0] * 512 + letter_offset = 101 - 1 + for offset in range(letter_offset, letter_offset+27): + lights[offset] = config.letter_base_light + if letter: + lights[letter_offset + string.ascii_lowercase.index(letter.lower())] = 255 + lights[letter_offset + 26] = 255 + return lights -def flash(flashes): +def flash(sender, universe, flashes, letter): step = 0.2 flash_duration = 0.02 base = 0 brightness = config.lights_brightness - universe = 1 - channels = 16 + channels = config.led_lights - sender = sacn.sACNsender() - sender.start() - sender.activate_output(universe) - sender[universe].multicast = True sender[universe].dmx_data = [0] * channels while flashes: - fade_to(sender, base, brightness, flash_duration, channels, universe) + lights = dmx_base(letter) + fade_to(sender, base, brightness, flash_duration, channels, universe, lights) time.sleep(step) - sender[1].dmx_data = [0] * channels + lights = dmx_base(None) + channel_data = [0] * channels + sender[universe].dmx_data = channel_data + lights[channels:] time.sleep(step) flashes -= 1 - sender[universe].dmx_data = [0] * channels + lights = dmx_base(None) + channel_data = [0] * channels + sender[universe].dmx_data = channel_data + lights[channels:] time.sleep(step) - sender.stop() def switch(state, seq): @@ -128,7 +140,14 @@ if __name__ == '__main__': letter_offset = 0 letter = path.split('/')[-1][0].lower() if config.letter_offset: - letter_offset = 11 + string.ascii_lowercase.index(letter) * 10 + if config.lanbox: + letter_offset = 11 + string.ascii_lowercase.index(letter) * 10 + if not config.lanbox: + universe = 1 + sender = sacn.sACNsender() + sender.start() + sender.activate_output(universe) + sender[universe].multicast = True while pos < duration - 15: sleep = seq() + 15 light = seq() @@ -140,5 +159,7 @@ if __name__ == '__main__': if config.lanbox: switch(light + letter_offset, seq) else: - flash(light + 1) + flash(sender, universe, light + 1, letter) pos += sleep + if not config.lanbox: + sender.stop()