diff --git a/pyleds/program/peter/MegaMix.py b/pyleds/program/peter/MegaMix.py new file mode 100644 index 0000000..c498f67 --- /dev/null +++ b/pyleds/program/peter/MegaMix.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +# MegaMix +# Mis m6tted tulevad kui kuuled "MegaMix"? +# m6tlen et millal jooma saaks hakata + +from lib.Program import Program +import time +import random + + +def name(): + return 'MegaMix' + + +class MegaMix(Program): + + preset_colors = ["ffa500", "e56717", "e18b6b", "c36241", "ed9121", "f5deb3", "c35817", "ff8400", "efb261", + "c78023", "cc6600", "e66c2c", "ff8040", "ff7f50", "ffc594", "f88158", "e67451", "fc7f03", + "deaa88", "f87217", "db4200", "ff7e75"] + current_colors = [] + + # from https://chase-seibert.github.io/blog/2011/07/29/python-calculate-lighterdarker-rgb-colors.html + # edited to my own liking + def color_variant(self, hex_color, brightness_offset = 1): + """ takes a color like #87c95f and produces a lighter or darker variant """ + if len(hex_color) != 6: + print("Passed %s into color_variant(), needs to be in 87c95f format." % hex_color) + return "000000" + rgb_hex = [hex_color[x:x+2] for x in [0, 2, 4]] + new_rgb_int = [int(hex_value, 16) + brightness_offset for hex_value in rgb_hex] + new_rgb_int = [min([255, max([0, i])]) for i in new_rgb_int] # make sure new values are between 0 and 255 + # hex() produces "0x88", we want just "88" + new_hex_list = [hex(i)[2:].zfill(2) for i in new_rgb_int] + new_hex = "".join(new_hex_list) + return new_hex + + def disco(self, wait_ms): + total_length = self._lm.count_pixels() + for p in range(total_length): + if len(self.current_colors) == total_length: + color = self.current_colors[p] + color = int(self.color_variant(color, random.randint(1, 10)), 16) + if color >= 16777215: + color = int(random.choice(self.preset_colors), 16) + self.current_colors[p] = hex(color)[2:] + else: + color = int(random.choice(self.preset_colors), 16) + self.current_colors.append(hex(color)[2:]) + self._lm.set_pixel_color(p, color) + self._lm.show() + time.sleep(wait_ms / 1000.0) + + # Main program logic follows: + def run(self, args=None): + loop = False + if 'loop' in args and args['loop']: + loop = args['loop'] + + while self.get_loop().status(): + self.disco(300) + + if not loop: + break