diff --git a/demos/rainbow.py b/demos/rainbow.py --- a/demos/rainbow.py +++ b/demos/rainbow.py @@ -1,6 +1,7 @@ ### rainbow.py ### Author: Matthew Reed ### Rainbow array scrolls across the display. Rainbow generated using overlapping sin waves. The frequency, phase shift, center, and width all affect the output. +### Inspired by https://krazydad.com/tutorials/makecolors.php import sys import time @@ -10,9 +11,15 @@ import configparser from enum import Enum import math +import matrix class Rainbow: + class MODES(Enum): + TWO_D = 0 + LINEAR = 1 + SOLID = 2 + def __init__(self, config, parent, matrix, controller): self.logger = logging.getLogger('paint') self.config = config @@ -24,14 +31,39 @@ class Rainbow: pass def splash(self): - self.matrix.set_matrix((0,255,0)) + + r = matrix.Colors.RED.value + o = matrix.Colors.ORANGE.value + y = matrix.Colors.YELLOW.value + g = matrix.Colors.GREEN.value + b = matrix.Colors.BLUE.value + p = matrix.Colors.PURPLE.value + q = matrix.Colors.OFF.value + + splash = [ + [q, q, q, q, q, q, q, q], + [q, q, q, q, q, q, q, q], + [q, q, q, q, q, q, q, q], + [q, r, o, y, g, b, p, q], + [q, r, o, y, g, b, p, q], + [q, q, q, q, q, q, q, q], + [q, q, q, q, q, q, q, q], + [q, q, q, q, q, q, q, q], + ] + + for x in range(0, self.matrix.WIDTH): + for y in range(0, self.matrix.HEIGHT): + self.matrix.set_pixel(x, y, splash[y][x]) + self.matrix.update() def run(self): center = 128; - width = 100; + width = 127; frequency = .1; + + mode = self.MODES.TWO_D #start timers and counters self.start_time = time.time() @@ -47,14 +79,43 @@ class Rainbow: for event in self.controller.read_input(): if event.code == 313 and event.value == 1: keep_going = False + elif event.code == 305 and event.value == 1: + mode = self.MODES((mode.value + 1) % len(self.MODES)) + elif event.code == 16: + if event.value == 1: + #dpad right + pass + if event.value == -1: + #dpad left + pass + elif event.code == 17: + if event.value == 1: + #dpad down + frequency = frequency - 0.05 + if frequency <= 0.05: + frequency = 0.05 + print(frequency) + if event.value == -1: + #dpad up + frequency = frequency + 0.05 + if frequency >= 1: + frequency = 1 + print(frequency) + if time.time() > last_time + 0.1: last_time = time.time() for y in range(self.matrix.HEIGHT): - phaseShift = 2*math.pi - y*(1.5*math.pi/(self.matrix.HEIGHT-1)) + if mode == self.MODES.TWO_D: + phaseShift = 2*math.pi - y*(math.pi/(self.matrix.HEIGHT-1)) + else: + phaseShift = 4 for x in range(self.matrix.WIDTH): - i = (x + frame_count) % 128 + if mode == self.MODES.SOLID: + i = frame_count % 128 + else: + i = (x + frame_count) % 128 red = math.sin(frequency*i + 0) * width + center; green = math.sin(frequency*i + phaseShift/2) * width + center; blue = math.sin(frequency*i + phaseShift) * width + center; @@ -66,4 +127,4 @@ class Rainbow: led_iteration_count = (led_iteration_count + 1) % self.matrix.NUM_LEDS frame_count = frame_count + 1 - time.sleep(0.01) \ No newline at end of file + time.sleep(0.01)