Files @ 835bac5d3b3c
Branch filter:

Location: led-matrix-software/demos/rainbow.py

matthewreed
Added new demos and handle splash screens and controller input
### 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
import signal
import logging
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
        self.parent = parent
        self.matrix = matrix
        self.controller = controller
        
    def reset(self):
        pass
        
    def splash(self):
    
        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 = 127;
        frequency = .1;
        
        mode = self.MODES.TWO_D
    
        #start timers and counters
        self.start_time = time.time()
        last_time = time.time()
        
        led_iteration_count = 0
        frame_count = 0
        
        keep_going = True
        
        while keep_going:
            
            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):
                    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):
                        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;
                        
                        self.matrix.set_pixel(x, y, (red, green, blue))
                
                self.matrix.update()
                
                led_iteration_count = (led_iteration_count + 1) % self.matrix.NUM_LEDS
                frame_count = frame_count + 1
                
            time.sleep(0.01)