def step(self, amt=1):
        self._led.all_off()

        self._last = self._start + self._step

        for j in range(0, self._num_segments):
            self._led.set((j * self._segment_size) + self._last, self._color)

        for i in range(self._tail):
            for j in range(0, self._num_segments):
                base_led = j * self._segment_size
                top_led = (j + 1) * self._segment_size
                lower_led = base_led + self._last - i
                if lower_led >= base_led:
                    self._led.set(
                        lower_led,
                        colors.color_scale(self._color,
                                           255 - (self._fadeAmt * i)))
                upper_led = base_led + self._last + i
                if upper_led < top_led:
                    self._led.set(
                        upper_led,
                        colors.color_scale(self._color,
                                           255 - (self._fadeAmt * i)))

        if self._start + self._step >= self._segment_size - 1:
            self._direction = -self._direction
        elif self._step <= 0:
            self._direction = -self._direction

        self._step += self._direction * amt
Example #2
0
    def step(self, amt=1):
        self._ledcolors = [(0, 0, 0) for i in range(self._size)]
        self.layout.all_off()

        for i in range(0, 3):
            self._currentpos[i] = self._start + self._steps[i]

            # average the colors together so they blend
            self._ledcolors[self._currentpos[i]] = map(
                lambda x, y: (x + y) // 2, self._color[i],
                self._ledcolors[self._currentpos[i]])
            for j in range(1, self._tail):
                if self._currentpos[i] - j >= 0:
                    self._ledcolors[self._currentpos[i] - j] = map(
                        lambda x, y: (x + y) // 2,
                        self._ledcolors[self._currentpos[i] - j],
                        colors.color_scale(self._color[i],
                                           255 - (self._fadeAmt * j)))
                if self._currentpos[i] + j < self._size:
                    self._ledcolors[self._currentpos[i] + j] = map(
                        lambda x, y: (x + y) // 2,
                        self._ledcolors[self._currentpos[i] + j],
                        colors.color_scale(self._color[i],
                                           255 - (self._fadeAmt * j)))
            if self._start + self._steps[i] >= self._end:
                self._direction[i] = -1
            elif self._start + self._steps[i] <= 0:
                self._direction[i] = 1

            # advance each searchlight at a slightly different speed
            self._steps[i] += self._direction[i] * amt * int(
                random.random() > (i * 0.05))

        for i, thiscolor in enumerate(self._ledcolors):
            self.layout.set(i, thiscolor)
Example #3
0
    def step(self, amt=1):
        now = datetime.datetime.now()
        minute = now.minute
        hour = now.hour + now.minute / 60.0

        if hour < 6.0:
            backgroundColor = self._color2
        elif hour < 18.0:
            backgroundColor = self._backgroundColor
        elif hour < 20.0:
            a = int(math.floor(max(0.0, (hour - 18.0) * 128.0)))
            backgroundColor = self._myadd(
                colors.color_scale(self._backgroundColor, 255 - a), colors.color_scale(self._color1, a)
            )
        elif hour < 22.0:
            a = int(math.floor(max(0.0, (hour - 20.0) * 128.0)))
            backgroundColor = self._myadd(
                colors.color_scale(self._color1, 255 - a), colors.color_scale(self._color2, a)
            )
        else:
            backgroundColor = self._color2

        height_f = 6 * minute / 60
        y = int(math.floor(height_f))
        fraction = height_f - y

        led = self._led
        led.fillScreen(backgroundColor)
        led.drawLine(0, y, led.width - 1, y, self._color)

        self._step += amt
Example #4
0
    def step(self, amt=1):
        self.layout.all_off()
        self.pick_led(self.speed)

        for i, val in enumerate(self.pixels):
            p_dir, p_color, p_level = val
            if p_dir == 1:
                p_level += self.speed
                if p_level > 255:
                    p_level = 255
                    p_dir = 2  # start dimming
                self.layout._set_base(i,
                                      bp_colors.color_scale(p_color, p_level))
            elif p_dir == 2:
                p_level -= self.speed
                if p_level < 0:
                    p_level = 0
                    p_dir = 0  # turn off
                self.layout._set_base(i,
                                      bp_colors.color_scale(p_color, p_level))

            self.pixels[i] = (p_dir, p_color, p_level)

        self._step += amt
        delay_time = MidiTransform.remap_cc_value(self.delay_control, 0, 1)
        time.sleep(delay_time)
Example #5
0
 def __init__(self, led, start=0, end=-1, period = 20):
     #The base class MUST be initialized by calling super like this
     super(Leuchtturm, self).__init__(led, start, end)
     self._period = period
     #Create a color array to use in the animation
     redColor = colors.color_scale(colors.Red, 140)
     whiteColor = colors.color_scale(colors.White, 100)
     self._colors = [ redColor, whiteColor, redColor, whiteColor, redColor, colors.Off]
    def step(self, amt=1):
        """step the animation forward."""
        # self._internalDelay = 35
        leds = self._size
        num_sections = len(self._color_array)
        section_len = leds / num_sections

        # clear the strip
        # self._led.fill((0, 0, 0), self._start, self._end)

        section_count = 0
        for color in self._color_array:
            curr_section_start = self._start + (section_count * section_len)

            if section_count == num_sections:
                curr_section_end = self._end
            else:
                curr_section_end = ((section_count + 1) * section_len) - 1

            # fill section with 25% brightness
            base_brightness = 60
            fill_color = colors.color_scale(color, base_brightness)
            self._led.fill(fill_color, curr_section_start, curr_section_end)

            # leader LED pos
            leader = self._step + curr_section_start

            # % of strip that should be trailers
            trailers_len = section_len / 3

            # set the leader
            self._led.set(leader, color)

            # trailer brightness steps
            b_step = (255 - base_brightness) / trailers_len

            # set the trailers
            for x in range(0, trailers_len):
                curr_trailer_index = leader - x
                # wrap-around
                if curr_trailer_index < curr_section_start:
                    curr_trailer_index = curr_section_end - \
                        abs(curr_trailer_index - curr_section_start)

                trailer_brightness = (
                    b_step * (trailers_len - x)) + base_brightness
                scaled_color = colors.color_scale(color, trailer_brightness)
                self._led.set(curr_trailer_index, scaled_color)

            section_count += 1

        self._step += amt
        if self._step > section_len:
            self._step = 0
    def rain(self):

        if not self._rainTiming:
            self._rainTiming = random.randint(1, 5)

            numCols = random.randint(0, 3)
            cols = random.sample([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], numCols)

            for col in cols:
                temp = [0]
                temp.extend(self._rainCols[col])
                self._rainCols[col] = temp

            # self._rainCols[0].append(3)

        for colIdx, col in enumerate(self._rainCols):
            if col:  # Is this column active?
                addressed = {}
                for valIdx, val in enumerate(
                        col):  # Which elements in the column are active?
                    for packetIdx, packet in enumerate(individualCol[colIdx]):
                        if (colIdx == 0
                                or colIdx == 9) and 0 <= val - packetIdx <= 3:
                            addressed[packetIdx] = True
                            color = color_scale(
                                self._rainColor,
                                int(255 - 63 * (val - packetIdx)))
                            for point in packet:
                                self.layout.set(point, color)
                        elif packetIdx <= val and 0 <= val - packetIdx <= 3:
                            addressed[packetIdx] = True
                            color = color_scale(
                                self._rainColor,
                                int(255 - 63 * (val - packetIdx)))
                            for point in packet:
                                self.layout.set(point, color)
                        else:
                            if not packetIdx in addressed:
                                for point in packet:
                                    self.layout.setOff(point)

                    if (colIdx == 0 or colIdx
                            == 9) and self._rainCols[colIdx][valIdx] == 9:
                        self._rainCols[colIdx].remove(
                            9)  # First and last column only have 4 elements
                    elif self._rainCols[colIdx][valIdx] == 10:
                        self._rainCols[colIdx].remove(
                            10)  # Every other column has 5 elements
                    else:
                        self._rainCols[colIdx][valIdx] += 1

        self._rainTiming -= 1
Example #8
0
	def setlights(self,substart, count):
		if (count > 8):
			count = 8
		if (count > 0):
			for j in range(count): #8 LEDS per indicator
				self._led.set(substart + j, colors.Red)
			if ((self._step/6)%2): #flash at 5fps
				for k in range(count, 8):
					self._led.set(substart + k, colors.color_scale((255,100,25),255))
			else: #all off
				for k in range(count, 8):
					self._led.set(substart + k, colors.color_scale((255,100,0),0))
		else: #no problems
					self._led.set(substart + (self._step/6)%8, colors.Green)
Example #9
0
    def step(self, amt = 1):
        self._led.all_off()

        self._last = self._start + self._step
        self._led.set(self._last, self._color)

        for i in range(self._tail):
            self._led.set(self._last - i, colors.color_scale(self._color, 255 - (self._fadeAmt * i)))
            self._led.set(self._last + i, colors.color_scale(self._color, 255 - (self._fadeAmt * i)))

        if self._start + self._step >= self._end:
            self._direction = -self._direction
        elif self._step <= 0:
            self._direction = -self._direction

        self._step += self._direction * amt
    def step(self, amt=1):
        num_colors = int(MidiTransform.remap_cc_value(self.color_control, 1, 10))
        hue = int(MidiTransform.remap_cc_value(self.color_control, 1, 255))

        levels_count = int(MidiTransform.remap_cc_value(self.width_control, 5, 25))
        self._levels = self.wave_range(30, 255, levels_count)

        if num_colors > 1:
            hues = bp_colors.hue_gradient(0, hue, num_colors)
        else:
            hues = [hue]

        self._colors = list(map(lambda x: bp_colors.hue2rgb(x), hues))

        self._level_count = len(self._levels)
        self._color_count = len(self._colors)

        if self._step > self._level_count * self._color_count:
            self._step = 0

        c_index = (self._step // self._level_count) % self._color_count
        l_index = (self._step % self._level_count)

        color = self._colors[c_index]

        self.layout.fill(bp_colors.color_scale(color, self._levels[l_index]), self._start, self._end)

        self._step += amt

        delay_time = MidiTransform.remap_cc_value(self.delay_control, 0, 1)
        time.sleep(delay_time)
    def __init__(self,
                 led,
                 imagePath,
                 offset=(0, 0),
                 bgcolor=colors.Off,
                 brightness=255):
        """Helper class for displaying image animations for GIF files or a set of bitmaps

        led - LEDMatrix instance
        imagePath - Path to either a single animated GIF image or folder of sequential bitmap files
        offset - X,Y tuple coordinates at which to place the top-left corner of the image
        bgcolor - RGB tuple color to replace any transparent pixels with. Avoids transparent showing as black
        brightness - Brightness value (0-255) to scale the image by. Otherwise uses master brightness at the time of creation
        """
        super(ImageAnim, self).__init__(led)

        self._bright = brightness
        if self._bright == 255 and led.masterBrightness != 255:
            self._bright = led.masterBrightness

        self._bgcolor = colors.color_scale(bgcolor, self._bright)
        self._offset = offset
        self._images = []
        self._count = 0

        if imagePath.endswith(".gif"):
            log.logger.info("Loading {0} ...".format(imagePath))
            img = Image.open(imagePath)
            if self._offset == (0, 0):
                w = 0
                h = 0
                if img.size[0] < self._led.width:
                    w = (self._led.width - img.size[0]) / 2
                if img.size[1] < self._led.height:
                    h = (self._led.height - img.size[1]) / 2
                self._offset = (w, h)

            for frame in ImageSequence.Iterator(img):
                self._images.append(
                    self._getBufferFromImage(frame, self._offset))
                self._count += 1
        else:
            imageList = glob.glob(imagePath + "/*.bmp")
            imageList.sort()

            self._count = len(imageList)
            if self._count == 0:
                raise ValueError("No images found!")

            for img in imageList:
                if self._offset == (0, 0):
                    if img.size[0] < self._led.width:
                        self._offset[0] = (self._led.width - img.size[0]) / 2
                    if img.size[1] < self._led.height:
                        self._offset[1] = (self._led.height - img.size[1]) / 2

                self._images.append(self._getBufferFromPath(img, self._offset))

        self._curImage = 0
Example #12
0
    def step(self, amt=1):
        led = self._led
        led.all_off()

        now = util.getNow()

        led.fillScreen(util.getSunColor(now))

        text = str(now.hour)
        (width, height) = font.str_dim(text, '6x4', final_sep=False)
        led.drawText(str(now.hour),
                     x=math.floor((led.width - width) / 2),
                     y=math.floor((led.height - height) / 2),
                     color=self.digitColor,
                     bg=None,
                     font='6x4')

        self.minutex = self.minutex * .25 + led.width * (
            now.minute * 60 + now.second) / 3600 * 0.75
        self.secondx = self.secondx * .25 + led.width * now.second / 60 * 0.75

        for x in range(0, led.width):
            minuteLevel = 128 - (x - self.minutex) * (x - self.minutex) * 60
            if minuteLevel < 0:
                minuteLevel = 0

            secondLevel = 128 - (x - self.secondx) * (x - self.secondx) * 60
            if (secondLevel < 0):
                secondLevel = 0

            pointerColor = colors.color_blend(
                colors.color_scale(colors.DarkGreen, secondLevel),
                colors.color_scale(colors.DarkRed, minuteLevel))
            if minuteLevel > secondLevel:
                pointerLevel = minuteLevel
            else:
                pointerLevel = secondLevel

            for y in range(0, led.height):
                color = colors.color_blend(
                    colors.color_scale(led.get(x, y), 256 - pointerLevel),
                    colors.color_scale(pointerColor, pointerLevel))

                led.set(x, y, color)

        self._step += amt
Example #13
0
    def step(self, amt = 1):
        for y in range(h):
			for x in range(w):
				c = colors.hue2rgb_360(self._step)
				led.set(x, y, c)
				c = led.get(x, y)
				c = colors.hsv2rgb_rainbow((c[2], c[0], c[1]))
				c = colors.hue2rgb_rainbow(c[0])
				c = colors.hue2rgb_spectrum(c[1])
				c = colors.hue2rgb_raw(c[2])
				c = colors.color_scale(c, c[0])
				c = colors.color_scale(c, c[1])
				c = colors.color_scale(c, c[2])
				led.set(x, y, c)

        self._step += 1
        if self._step >= 360:
        	self._step = 0
Example #14
0
    def step(self, amt = 1):
        if self._step > self._level_count * self._color_count:
            self._step = 0

        c_index = (self._step / self._level_count) % self._color_count
        l_index = (self._step % self._level_count)
        color = self._colors[c_index];
        self._led.fill(colors.color_scale(color, self._levels[l_index]), self._start, self._end)

        self._step += amt
Example #15
0
    def step(self, amt = 1):
	for i in range(self._led.numLEDs):
		color = colors.color_scale(self._led.get(i), 245)
		
		if i == (self._step % self._led.numLEDs):
			color = colors.color_blend(color, colors.hue2rgb_spectrum(self._step % 127))

		self._led.set(i, color);
        #Increment the internal step by the given amount
        self._step += amt
Example #16
0
    def step(self, amt = 1):
        passedTime = time.time() - self._startTime
        height_f = 6 - 6 * (passedTime) / self._duration
        y = int(math.floor(height_f))
        fraction = height_f - y
        fraction_255 = int(255 * fraction)

        led = self._led
        led.drawLine(0, y, led.width - 1, y, colors.color_scale(self._color, fraction_255))

        self._step += amt
    def __init__(self, led, imagePath, offset=(0, 0), bgcolor=colors.Off, brightness=255):
        """Helper class for displaying image animations for GIF files or a set of bitmaps

        led - LEDMatrix instance
        imagePath - Path to either a single animated GIF image or folder of sequential bitmap files
        offset - X,Y tuple coordinates at which to place the top-left corner of the image
        bgcolor - RGB tuple color to replace any transparent pixels with. Avoids transparent showing as black
        brightness - Brightness value (0-255) to scale the image by. Otherwise uses master brightness at the time of creation
        """
        super(ImageAnim, self).__init__(led)

        self._bright = brightness
        if self._bright == 255 and led.masterBrightness != 255:
            self._bright = led.masterBrightness

        self._bgcolor = colors.color_scale(bgcolor, self._bright)
        self._offset = offset
        self._images = []
        self._count = 0

        if imagePath.endswith(".gif"):
            log.logger.info("Loading {0} ...".format(imagePath))
            img = Image.open(imagePath)
            if self._offset == (0, 0):
                w = 0
                h = 0
                if img.size[0] < self._led.width:
                    w = (self._led.width - img.size[0]) / 2
                if img.size[1] < self._led.height:
                    h = (self._led.height - img.size[1]) / 2
                self._offset = (w, h)

            for frame in ImageSequence.Iterator(img):
                self._images.append(
                    self._getBufferFromImage(frame, self._offset))
                self._count += 1
        else:
            imageList = glob.glob(imagePath + "/*.bmp")
            imageList.sort()

            self._count = len(imageList)
            if self._count == 0:
                raise ValueError("No images found!")

            for img in imageList:
                if self._offset == (0, 0):
                    if img.size[0] < self._led.width:
                        self._offset[0] = (self._led.width - img.size[0]) / 2
                    if img.size[1] < self._led.height:
                        self._offset[1] = (self._led.height - img.size[1]) / 2

                self._images.append(self._getBufferFromPath(img, self._offset))

        self._curImage = 0
Example #18
0
    def __init__(self, led, start=0, end=-1, backgroundColor=colors.White, clockColor=colors.Red):
        # The base class MUST be initialized by calling super like this
        super(StripeClock, self).__init__(led, start, end)
        self._backgroundColor = backgroundColor
        self._color = colors.color_blend(colors.color_scale(backgroundColor, 128), clockColor)
        self._color1 = (255, 212, 125)
        self._color2 = (245, 135, 76)
        self._myadd = lambda xs, ys: tuple(x + y for x, y in izip(xs, ys))

        print "Clock color:" + str(self._color)
        print "Background color:" + str(self._backgroundColor)
Example #19
0
    def lightToX(self, x):
        direction = time.time() / self._period * self._led.width % self._led.width

        if 2 * (direction - x) > self._led.width:
            direction -= self._led.width

        if 2 * (x - direction) > self._led.width:
            direction += self._led.width

        intensity = int(255 - max(0, min(255, 128 * ((x - direction)) ** 2)))
        return colors.color_scale(colors.Orange, intensity)
Example #20
0
 def rayanim(self,r,g,b,bright,animpos,animtime):
     self._bright = bright 
     self._color = colors.color_scale((b,r,g), self._bright)
     self.__sleeptime = animtime / ( math.fabs(self.__lastpos - animpos) + 4 )
     self.__animpos = animpos
     for i in range(self.__lastpos):
         self._led.set(i, self._color)
     self.__isartnet = False
     self.__interrupt = True
     self.__cv.acquire()
     self.__cv.notify()
     self.__cv.release()
Example #21
0
    def step(self, amt=1):
        self.layout.all_off()

        self._randomness = int(
            MidiTransform.remap_cc_value(self.randomness_control, 0,
                                         self._max_randomness))

        scaled_tail = int(
            MidiTransform.remap_cc_value(self.count_control, self._min_tail,
                                         self._max_tail))
        self._tail = scaled_tail

        scaled_fade = int(
            MidiTransform.remap_cc_value(self.utility_control_two, 1, 500))
        self._fadeAmt = scaled_fade // self._tail

        self.get_color()

        self._last = self._start + self._step
        self.layout.set(self._last, self._color)

        for i in range(self._tail):
            self.layout.set(
                self._last - i,
                bp_colors.color_scale(self._color, 255 - (self._fadeAmt * i)))
            self.layout.set(
                self._last + i,
                bp_colors.color_scale(self._color, 255 - (self._fadeAmt * i)))

        if self._start + self._step >= self._end:
            self._direction = -self._direction
        elif self._step <= 0:
            self._direction = -self._direction

        self._step += self._direction * amt

        delay_time = MidiTransform.remap_cc_value(self.delay_control, 0, 1)
        time.sleep(delay_time)

        self._random_counter = (self._random_counter + 1) % 30
Example #22
0
def getLEDColor(event):
    # https://github.com/ManiacalLabs/BiblioPixel2/wiki/Colors-Module
    c = (0, 0, 255)

    # light purpley: ((0,255,255))
    # blue: ((0,0,255))
    # turquoise: (255,0,255))
    # red: (0,255, 0)

    if (event["Race"] == "White"):
        c = (255, 255, 255)
    if (event["Race"] == "Mexican"):
        c = (255, 0, 255)
    if (event["Race"] == "Indian" or event["Race"] == "navajo"):
        c = (0, 255, 255)

    if (event["Age"] > 18):
        c = colors.color_scale(c, 50)
    else:
        c = colors.color_scale(c, 100)

    return c
Example #23
0
    def get_color(self):
        if self.use_rgb:
            self._color = ColorMidiUtils.three_cc_to_color(
                self.red_control, self.green_control, self.blue_control)

        if self._random_counter == 0:
            self._random_seed = (self.color_control +
                                 random.randint(0, self._randomness)) % 127

        color = ColorMidiUtils.one_cc_to_color(self._random_seed)
        c_lev = MidiTransform.remap_cc_value(self.brightness_control, 0, 256)

        self._color = bp_colors.color_scale(color, c_lev)
Example #24
0
    def pick_led(self, speed):
        idx = random.randrange(0, self.layout.numLEDs)
        p_dir, p_color, p_level = self.pixels[idx]

        if random.randrange(0, 100) < self.density:
            if p_dir == 0:  # 0 is off
                p_level += speed
                p_dir = 1  # 1 is growing
                p_color = random.choice(self.colors)
                self.layout._set_base(idx,
                                      color_util.color_scale(p_color, p_level))

                self.pixels[idx] = p_dir, p_color, p_level
Example #25
0
 def step(self, amt=1):
     self.layout.all_off()
     t = time.localtime()
     for h in self.hands:
         segs = h['segments']
         point = (360 / segs) * (getattr(t, h['key']) % segs)
         self.layout.set(h['ring'], point, h['color'])
         if h['tail'] > 0:
             for i in range(h['tail']):
                 scaled = colors.color_scale(h['color'],
                                             255 - ((256 // h['tail']) * i))
                 self.layout.set(h['ring'], point + i, scaled)
                 self.layout.set(h['ring'], point - i, scaled)
Example #26
0
    def get_color(self):
        color_seed = MidiTransform.remap_cc_value(self.color_control, 0, 10)
        amount_change = MidiTransform.remap_cc_value(self.utility_control_one,
                                                     0.1, 5)
        if amount_change == 5:
            amount_change = 0

        base_color = (self._color_number + color_seed) % 359
        self._color_number = (base_color + amount_change) % 359

        color = bp_colors.hue2rgb_360(self._color_number)
        c_lev = MidiTransform.remap_cc_value(self.brightness_control, 0, 256)

        self._color = bp_colors.color_scale(color, c_lev)
    def get_color(self):
        if self.use_rgb:
            color = ColorMidiUtils.three_cc_to_color(self.red_control,
                                                     self.green_control,
                                                     self.blue_control)
        else:
            color = ColorMidiUtils.one_cc_to_color(self.color_control)
            # allow animation to be set at white at the top of a controller
            if self.color_control == 127:
                color = bp_colors.White

        brightness_level = MidiTransform.remap_cc_value(
            self.brightness_control, 0, 256)
        self._color = bp_colors.color_scale(color, brightness_level)
Example #28
0
	def progressbar(self): #Max 288 steps
		numlit = (((30-timerun)*10)/30)
		if (dataerror != 0): #flash red
			if ((self._step/6)%2): #flash at 5fps
				for n in range(10):
					self._led.set(47-n,colors.Red)
			else:
				for n in range(10):
					self._led.set(47-n,colors.color_scale((255,100,0),0))
		else:
			if (timerun < 29): 
				self._led.set(37,colors.Green) #Start indicator
				for m in range(numlit,10):
					self._led.set(47-m,colors.color_scale((255,100,0),0))
				for l in range(numlit):
					self._led.set(47-l,colors.color_scale((255-(255*timerun/30),255-(255*timerun/30),255),255))
			else:
				if ((self._step/6)%2): #flash at 5fps
					for n in range(10):
						self._led.set(47-n,colors.White)
				else:
					for n in range(10):
						self._led.set(47-n,colors.color_scale((255,100,0),0))
Example #29
0
    def step(self, amt = 1):
        for i, item in enumerate(self.items):
            self._led.set(i, item)

        if self.state == self.INITING:
            if self.init_step == 0:
                # let the blank linger
                time.sleep(1)

            # print('init')
            if self.init_step > 10:
                self.state = self.SORTING
                self.init_step = 0
            else:
                self.init_step += 1
                time.sleep(self.SLEEP_INIT)

        elif self.state == self.SORTING:
            # print('sorting')
            last = self.items[0]
            swaps = False
            for i, item in enumerate(self.items):
                hue_item = rgb2hsv(item)[0]
                hue_last = rgb2hsv(last)[0]
                if hue_item < hue_last:
                    swaps = True
                    self.items[i-1] = item
                    self._led.set(i-1, item)
                    self.items[i] = last
                    self._led.set(i, last)
                    time.sleep(self.SLEEP_SORT)
                    break
                last = self.items[i]
            if not swaps:
                self.state = self.FADING

        else:
            # print('fading')
            self.fade_step += 1
            if self.fade_step > 200:
                self._led.all_off()
                # print('done')
                self.init()
                self.state = self.INITING
                self.fade_step = 0
            else:
                for i, item in enumerate(self.items):
                    self._led.set(i, colors.color_scale(item, 255 - (self.fade_step)))
                time.sleep(self.SLEEP_FADE)
Example #30
0
    def step(self, amt=1):
        self.layout.all_off()
        self.pick_led(self.speed)

        for i, val in enumerate(self.pixels):
            p_dir, p_color, p_level = val
            if p_dir == 1:
                p_level += self.speed
                if p_level > 255:
                    p_level = 255
                    p_dir = 2  # start dimming
                self.layout._set_base(i,
                                      color_util.color_scale(p_color, p_level))
            elif p_dir == 2:
                p_level -= self.speed
                if p_level < 0:
                    p_level = 0
                    p_dir = 0  # turn off
                self.layout._set_base(i,
                                      color_util.color_scale(p_color, p_level))

            self.pixels[i] = (p_dir, p_color, p_level)

        self._step += amt
    def __init__(self, layout, imagePath=None, offset=(0, 0), bgcolor=colors.Off,
                 brightness=255, cycles=1, seconds=None, random=False, use_file_fps=True):
        """Helper class for displaying image animations for GIF files or a set of bitmaps

        layout - layoutMatrix instance
        imagePath - Path to either a single animated GIF image or folder of GIF files
        offset - X,Y tuple coordinates at which to place the top-left corner of the image
        bgcolor - RGB tuple color to replace any transparent pixels with. Avoids transparent showing as black
        brightness - Brightness value (0-255) to scale the image by. Otherwise uses master brightness at the time of creation
        """
        super(ImageAnim, self).__init__(layout)

        self.cycles = cycles
        self.cycle_count = 0

        self.seconds = seconds
        self.last_start = 0

        self.random = random
        self.use_file_fps = use_file_fps

        self._bright = brightness

        self._bgcolor = colors.color_scale(bgcolor, self._bright)
        self._offset = offset
        self._image_buffers = [None, None]
        self._cur_img_buf = 1  # start here because loadNext swaps it

        if imagePath is None:
            cur_dir = os.path.dirname(os.path.realpath(__file__))
            imagePath = os.path.abspath(os.path.join(cur_dir, '../../Graphics/MarioRotating.gif'))

        self.imagePath = imagePath
        self.folder_mode = os.path.isdir(imagePath)
        self.gif_files = []
        self.gif_indices = []
        self.folder_index = -1
        self.load_thread = None

        if self.folder_mode:
            self.gif_files = glob.glob(self.imagePath + "/*.gif")
            self.gif_indices = list(range(len(self.gif_files)))
            self.loadNextGIF()  # first load is manual
            self.swapbuf()
            self.load_thread = None
        else:
            self.loadGIFFile(self.imagePath)
            self.swapbuf()
Example #32
0
 def pick_led(self, speed):
     idx = random.randrange(0, self.layout.numLEDs)
     p_dir, p_color, p_level = self.pixels[idx]
     if self.color_control == 127:
         self.colors = [(255, 240, 255), (245, 230, 233), (250, 230, 230)]
     else:
         self.colors = list(
             map(lambda color: self.change_color(color), self.colors))
     if random.randrange(0, 100) < self.density:
         if p_dir == 0:  # 0 is off
             p_level += speed
             p_dir = 1  # 1 is growing
             p_color = random.choice(self.colors)
             self.layout._set_base(idx,
                                   bp_colors.color_scale(p_color, p_level))
             self.pixels[idx] = p_dir, p_color, p_level
Example #33
0
    def step(self, amt = 1):
        for i in range(self._size):
            c = colors.hue_helper(i, self._size, self._step)
            d = self.decibels
            d -= 68
            d = max(0, d)
            percentage = d / 20
            percentage = min(percentage, 1.0)
            brightness = int(round(percentage * 255))
	    final = min(max(brightness, 25), 175)
            self._led.set(self._start + i, colors.color_scale(c, final))

        self._step += amt
        overflow = self._step - 256
        if overflow >= 0:
            self._step = overflow
def _getBufferFromImage(img, led, bgcolor, bright, offset):
    duration = None
    if 'duration' in img.info:
        duration = img.info['duration']

    w = led.width - offset[0]
    if img.size[0] < w:
        w = img.size[0]

    h = led.height - offset[1]
    if img.size[1] < h:
        h = img.size[1]

    ox = offset[0]
    oy = offset[1]

    buffer = [0 for x in range(led.numLEDs * 3)]
    gamma = led.driver[0].gamma
    if bgcolor != (0, 0, 0):
        for i in range(led.numLEDs):
            buffer[i * 3 + 0] = gamma[bgcolor[0]]
            buffer[i * 3 + 1] = gamma[bgcolor[1]]
            buffer[i * 3 + 2] = gamma[bgcolor[2]]

    frame = Image.new("RGBA", img.size)
    frame.paste(img)

    for x in range(ox, w + ox):
        for y in range(oy, h + oy):
            if x < 0 or y < 0:
                continue
            pixel = led.matrix_map[y][x]
            r, g, b, a = frame.getpixel((x - ox, y - oy))
            if a == 0:
                r, g, b = bgcolor
            else:
                r = (r * a) >> 8
                g = (g * a) >> 8
                b = (b * a) >> 8
            if bright != 255:
                r, g, b = colors.color_scale((r, g, b), bright)

            buffer[pixel * 3 + 0] = gamma[r]
            buffer[pixel * 3 + 1] = gamma[g]
            buffer[pixel * 3 + 2] = gamma[b]

    return (duration, buffer)
    def _getBufferFromImage(self, img, offset=(0, 0)):
        duration = None
        if 'duration' in img.info:
            duration = img.info['duration']

        w = self._led.width - offset[0]
        if img.size[0] < w:
            w = img.size[0]

        h = self._led.height - offset[1]
        if img.size[1] < h:
            h = img.size[1]

        ox = offset[0]
        oy = offset[1]

        buffer = [0 for x in range(self._led.bufByteCount)]
        gamma = self._led.driver[0].gamma
        if self._bgcolor != (0, 0, 0):
            for i in range(self._led.numLEDs):
                buffer[i * 3 + 0] = gamma[self._bgcolor[0]]
                buffer[i * 3 + 1] = gamma[self._bgcolor[1]]
                buffer[i * 3 + 2] = gamma[self._bgcolor[2]]

        frame = Image.new("RGBA", img.size)
        frame.paste(img)

        for x in range(ox, w + ox):
            for y in range(oy, h + oy):
                if x < 0 or y < 0:
                    continue
                pixel = self._led.matrix_map[y][x]
                r, g, b, a = frame.getpixel((x - ox, y - oy))
                if a == 0:
                    r, g, b = self._bgcolor
                else:
                    r = (r * a) >> 8
                    g = (g * a) >> 8
                    b = (b * a) >> 8
                if self._bright != 255:
                    r, g, b = colors.color_scale((r, g, b), self._bright)

                buffer[pixel * 3 + 0] = gamma[r]
                buffer[pixel * 3 + 1] = gamma[g]
                buffer[pixel * 3 + 2] = gamma[b]

        return (duration, buffer)
Example #36
0
    def step(self, amt=1):
        """step the animation."""
        leds = self._size
        num_colors = len(self._color_array)
        led_section = leds / num_colors

        pos = self._start
        for color in self._color_array:
            scale = 255 - self._step
            scaled_color = colors.color_scale(color, scale)
            self._led.fill(scaled_color, pos, pos + led_section)
            pos += led_section

        self._step += amt
        if self._step > 255:
            self._step = 0
            self._step += amt
    def __init__(self, led, imagePath, offset=(0, 0), bgcolor=colors.Off, brightness=255, cycles=1, random=False, use_file_fps=True):
        """Helper class for displaying image animations for GIF files or a set of bitmaps

        led - LEDMatrix instance
        imagePath - Path to either a single animated GIF image or folder of GIF files
        offset - X,Y tuple coordinates at which to place the top-left corner of the image
        bgcolor - RGB tuple color to replace any transparent pixels with. Avoids transparent showing as black
        brightness - Brightness value (0-255) to scale the image by. Otherwise uses master brightness at the time of creation
        """
        super(ImageAnim, self).__init__(led)

        self.cycles = cycles
        self.cycle_count = 0

        self.random = random
        self.use_file_fps = use_file_fps

        self._bright = brightness
        if self._bright == 255 and led.masterBrightness != 255:
            self._bright = led.masterBrightness

        self._bgcolor = colors.color_scale(bgcolor, self._bright)
        self._offset = offset
        self._image_buffers = [None, None]
        self._cur_img_buf = 1  # start here because loadNext swaps it

        self.folder_mode = os.path.isdir(imagePath)
        self.gif_files = []
        self.gif_indices = []
        self.folder_index = -1
        self.load_thread = None

        if self.folder_mode:
            self.gif_files = glob.glob(imagePath + "/*.gif")
            self.gif_indices = range(len(self.gif_files))
            self.loadNextGIF()  # first load is manual
            self.swapbuf()
            self.load_thread = loadnextthread(self)
            self.load_thread.start()
            self.load_thread.loadNext()  # pre-load next image
        else:
            self.loadGIFFile(imagePath)
            self.swapbuf()

        self._curImage = 0
    def step(self, amt=1):
        for i in range(self._size):
            chunk_size = MidiTransform.remap_cc_value(self.count_control, 1,
                                                      20)
            chunks = self._size / chunk_size
            color = bp_colors.hue_helper(i, chunks, self._step)
            brightness_level = MidiTransform.remap_cc_value(
                self.brightness_control, 0, 256)
            color = bp_colors.color_scale(color, brightness_level)
            self.layout.set(self._start + i, color)

        self._step += amt
        overflow = self._step - 256
        if overflow >= 0:
            self._step = overflow

        delay_time = MidiTransform.remap_cc_value(self.delay_control, 0, 1)
        time.sleep(delay_time)
Example #39
0
    def step(self, amt=1):
        self.layout.all_off()

        tail_len = 40 # Whatever
        bullet_pos = self._step % (self.layout.width + tail_len)

        for x, y in self.grid():
            if x <= bullet_pos and x > bullet_pos - tail_len:
                beam_state.brightness = 255 - ((bullet_pos - x) * (255 / tail_len))
                self.layout.set(x, y, color_util.color_scale(self.color, beam_state.brightness))

        if bullet_pos + 1 >= self.layout.width + tail_len:
            # Sequence is about to end; Reset the Zap!
            c_int = random.randint(0, len(beam_state.colors) - 1)
            self.color = color = beam_state.colors[c_int]
            self._step = 0
        else:
            self._step += amt
Example #40
0
    def step(self, amt = 1):
        now = util.getNow()
        startOfDay = util.getStartOfDay(now)

        led = self._led
        showMarker = True
        for x in range(0, led.width):
            for y in range(0, led.height):
                current = startOfDay + datetime.timedelta(days=1) * (x * led.height + y) / led.numLEDs
                color = util.getSunColor(current)

                if showMarker and current >= now:
                    color = colors.color_blend(colors.Red, colors.color_scale(color, 128))
                    showMarker = False

                led.set(x, y, color)

        return
    def step(self, amt=1):
        self.layout.all_off()

        if self.pulse_speed == 0 and random.randrange(0, 100) <= self.chance:
            self.add_pulse()

        if self.pulse_speed > 0:
            self.layout.set(self.pulse_position, self.pulse_color)
            for i in range(self._tail):
                c = colors.color_scale(self.pulse_color,
                                       255 - (self._fadeAmt * i))
                self.layout.set(self.pulse_position - i, c)
                self.layout.set(self.pulse_position + i, c)

            if self.pulse_position > self._size + self._tail:
                self.pulse_speed = 0
            else:
                self.pulse_position += self.pulse_speed
Example #42
0
    def step(self, amt = 1):
        led = self._led
        if self._step % 5 == 0:
            index0 = (self._step / 10) % 2
            index1 = ((self._step / 10) + 1) %2
            for y in range(led.height):
                for x in range(led.width):
                    p = 0
                    n = 0
                    if x - 1 >= 0:
                        p += self._buffer[index0][x - 1][y]
                        n += 1
                    if x + 1 < led.width:
                        p += self._buffer[index0][x + 1][y]
                        n += 1

                    if y - 1 >= 0:
                        p += self._buffer[index0][x][y - 1]
                        n += 1

                    if y + 1 < led.height:
                        p += self._buffer[index0][x][y + 1]
                        n += 1

                    p = p / n - random.uniform(0.0, 0.2)
                    if p < 0:
                        p = 0

                    if y + 1 < led.height:
                        self._buffer[index1][x][y + 1] = p
            for x in range(led.width):
                self._buffer[index1][x][0] = random.uniform(0.5, 1.0)

            for y in range(led.height):
                for x in range(led.width):
                    value = int(self._buffer[index1][x][y] * 255)
                    color = colors.color_scale(self._color, value)
                    led.setRGB(x, y, color[0], color[1], color[2])

        self._step += amt
Example #43
0
 def cleargb(self):
     #self._led.all_off()
     self._color = colors.color_scale((0,0,0), 0)
     #for i in range(40):
     self._led.drawRect(0,0,self.__width,40, self._color)
     self._led.update()
 def _drawDrop(self, x, y, color):
     for i in range(self._tail):
         if y-i >= 0 and y-i < self._led.height:
             level = 255 - ((255/self._tail)*i)
             self._led.set(x, y-i, colors.color_scale(color, level))
Example #45
0
    def get_animation(self, led):
	color = colors.color_scale(colors.Red, 75)
        return Wave(led, color, 2)
    def __init__(self, led, plist, offset=(0, 0), bgcolor=colors.Off, brightness=255):
        """

        :param offset:
        :param bgcolor:
        :param brightness:
        :param led: LEDMatrix
        :param plist: dict

        Helper class for building and displaying image animations for GIF files or a set of still bitmaps (png, gif,
        bmp, jpg) built from a playlist dictionary object.

        led - LEDMatrix instance
        plist - The dictionary loaded from the playlist.json file.
        offset - X,Y tuple coordinates at which to place the top-left corner of the image
        bgcolor - RGB tuple color to replace any transparent pixels with. Avoids transparent showing as black
        brightness - Brightness value (0-255) to scale the image by. Otherwise uses master brightness at the time of
                     instantiation.

        Key features of the playlist:
        1) It's JSON.  Example:
            {
              "1": {
                "file": "./anim/matrix.gif",
                "duration_s": 30,
                "frame_time_ms": 150
              },
              "2": {
                "file": "./anim/spinning balls.gif",
                "duration_s": 30,
                "frame_time_ms": 50
              },
              "3": {
                "file": "water.gif",
                "duration_s": 30
              }
            }
        2) Each item is indexed with something sortable.
        3) Each item contains the following attributes:
            file:  path to the file.  absolute path is tried first.  If not found, searches in ./anim and ./stills
            duration_s:  The duration in seconds that you wish to display the image or animation
            frame_time_ms:  The FPS, but in milliseconds

            Soon:
            fade_in:
            fade_out

        """
        super(PlaylistImageAnim, self).__init__(led)

        self._bright = brightness
        if self._bright == 255 and led.masterBrightness != 255:
            self._bright = led.masterBrightness

        self._bgcolor = colors.color_scale(bgcolor, self._bright)
        self._offset = offset
        self._images = []
        self._count = 0
        self._loopstarttime = None

        self.drawCurrentTime(brightness=255)

        # check that our playlist has things...
        assert plist is not None, "Playlist is undefined"
        assert len(plist) > 0, "Playlist is empty"
        print ("")
        print ("Found {0} items in playlist...".format(len(plist)))

        for key in sorted(plist):
            playlist_item = plist[key]
            print "%s: %s" % (key, playlist_item)

            img_file = ""
            duration_s = 30
            frame_time_ms = 150

            # find the image file.  if not found, skip.
            try:
                img_file = findfile(playlist_item[PLAYLIST_KEY_FILE])
            except IOError:
                print "{0} not found. Skipping.".format(img_file)
                continue  # skip to next item in dictionary

            # check the duration property.  if it's not there, default to 30
            try:
                if playlist_item[PLAYLIST_KEY_DURATION] > 0:
                    duration_s = playlist_item[PLAYLIST_KEY_DURATION]
            except KeyError:
                duration_s = 30

            # check the frame rate.  if not there, default to 150ms per frame
            try:
                if playlist_item[PLAYLIST_KEY_FRAME_TIME] > 0:
                    frame_time_ms = playlist_item[PLAYLIST_KEY_FRAME_TIME]
            except KeyError:
                frame_time_ms = 150

            # load the image
            img = Image.open(img_file)

            # debug print some image properties
            print "\t>>>>>>>>>> {}".format(img.filename)
            print "\tformat: {}".format(img.format)
            print "\tmode: {}".format(img.mode)
            print "\tsize: {}".format(img.size)
            print "\twidth: {}".format(img.width)
            print "\theight: {}".format(img.height)
            print "\tinfo: {}".format(img.info)
            if getattr(img, "is_animated", False):
                print "\tis_animated: {}".format(img.is_animated)
                print "\tn_frames: {}".format(img.n_frames)
            else:
                print "\tis_animated: False"
                print "\tn_frames: 0"
            print ""

            # assign everything back into the dictionary and we will make an array of those to produce the frames
            playlist_item[PLAYLIST_KEY_FILE] = img_file
            playlist_item[PLAYLIST_KEY_DURATION] = duration_s
            playlist_item[PLAYLIST_KEY_FRAME_TIME] = frame_time_ms

            # if this is a .gif, we need to pull an image for each frame and assign that a slot in the animation.
            # if it is another raster, just load it

            # TODO: Determine if animatd gifs can be resized in PIL and all frames are processed
            # TODO: Determine if there is some universal format that the images need to be translated into

            loopstart = self._count
            playlist_item[PLAYLIST_KEY_KEYFRAME] = loopstart
            if img_file.endswith(".gif"):
                for frame in ImageSequence.Iterator(img):
                    # copy the frame info from the playlist so we can just add a new binary
                    gif_playlist_item = playlist_item.copy()
                    gif_playlist_item[PLAYLIST_KEY_BINARYIMAGE] = self._getBufferFromImage(frame)
                    self._images.append(gif_playlist_item)
                    self._count += 1
                    playlist_item[PLAYLIST_KEY_KEYFRAME] = None
                    playlist_item[PLAYLIST_KEY_DURATION] = None
                # assign some things back to the final frame of the anim
                gif_playlist_item[PLAYLIST_KEY_LOOPSTART] = loopstart
                gif_playlist_item[PLAYLIST_KEY_DURATION] = duration_s
            else:
                playlist_item[PLAYLIST_KEY_BINARYIMAGE] = self._getBufferFromImage(img)
                self._images.append(playlist_item)
                self._count += 1
                playlist_item[PLAYLIST_KEY_LOOPSTART] = loopstart

        """
        # this code centers smaller images into the LED frame then adds them into the animation array, that is
        # later used by the .step method to update the frame in the LED.
        # In the playlist version, I want to resize all images to fit the matrix, so centering will not be needed.
        # Adding to the array will be needed.

        if imagePath.endswith(".gif"):
            log.logger.info("Loading {0} ...".format(imagePath))
            img = Image.open(imagePath)
            if self._offset == (0,0):
                w = 0
                h = 0
                if img.size[0] < self._led.width:
                    w = (self._led.width - img.size[0]) / 2
                if img.size[1] < self._led.height:
                    h = (self._led.height - img.size[1]) / 2
                self._offset = (w, h)

            for frame in ImageSequence.Iterator(img):
                self._images.append(self._getBufferFromImage(frame, self._offset))
                self._count += 1
        else:
            imageList = glob.glob(imagePath + "/*.bmp")
            imageList.sort()

            self._count = len(imageList)
            if self._count == 0:
                raise ValueError("No images found!")

            for img in imageList:
                if self._offset == (0,0):
                    if img.size[0] < self._led.width:
                        self._offset[0] = (self._led.width - img.size[0]) / 2
                    if img.size[1] < self._led.height:
                        self._offset[1] = (self._led.height - img.size[1]) / 2

                self._images.append(self._getBufferFromPath(img, self._offset))
        """

        self._curImage = 0

        time.sleep(3)
        # now fade out the clock
        for b in range(255, 0, -32):
            self.drawCurrentTime(brightness=b)
        self._led.all_off()
        self._led.update()
        time.sleep(1)  # 1 second
Example #47
0
 def __init__(self, bounds, led, start=0, end=-1):
     super(RotatingColors, self).__init__(led, start, end)
     self.bounds = bounds
     names = filter(lambda x: "White" not in x and isinstance(getattr(colors, x), tuple), dir(colors))
     self.colors = map(lambda c: colors.color_scale(getattr(colors, c), 64), names)
     self.n = 0
Example #48
0
    # at the end of the month, fill with red
    led.fill(colors.Indigo)
    led.update()
    time.sleep(2)
    led.all_off()
    led.update()

## FORMAT g, r, b 
# green = (127,0,0)
# yellowish green = (255,255,0)
# white: (255,255,255)
# light purpley: ((0,255,255))
# blue: ((0,0,255))
# turquoise: (255,0,255))
# red: (0,255, 0)

led.fill((0,255, 0))
c=colors.color_scale((0,255,0), 50)
led.update()
##led.all_off()
time.sleep(2)
led.fill(c)
led.update()
led.all_off()
time.sleep(2)
led.update()




Example #49
0
def convert(arr):
    return [colors.color_scale(x, SCALE) for x in arr]
Example #50
0
def convert_one(c):
    return colors.color_scale(c, SCALE)
Example #51
0
 def _drawDrop(self, x, y, color):
     for i in range(self._tail):
         if y - i >= 0 and y - i < self._led.height:
             level = 255 - ((255 / self._tail) * i)
             self._led.set(x, y - i, colors.color_scale(color, level))
Example #52
0
def rand_color():
    #return (color_scale((randint(0,255),randint(0,255),randint(0,255)), randint(0,255)))
    return (color_scale((randint(0,255),randint(0,255),randint(0,255)), 255))
Example #53
0
 def __init__(self, led, start=0, end=-1):
     #The base class MUST be initialized by calling super like this
     super(Clock, self).__init__(led, start, end)
     self.minutex = 0
     self.secondx = 0
     self.digitColor = colors.color_scale(colors.White, 16)
Example #54
0
 def _drawDrop(self, x, y, z, color):
     for i in range(self._tail):
         if y - i >= 0 and y - i < self.y:
             level = 255 - ((255 // self._tail) * i)
             self.layout.set(x, y - i, z, colors.color_scale(color, level))
    def __init__(self, led, start=0, end=-1):
        super(RainbowCycle, self).__init__(led, start, end)
        print(self._size)
#        self.frames = [[colors.hue_helper(c, self._size, i) for c in range(self._size)] for i in range(255)]
        frames = [    list(sum([colors.hue_helper(c, self._size, i) for c in range(self._size)], ()))     for i in range(255)]
        self.frames = map(lambda x: colors.color_scale(x, 175), frames)