Files @ 6e77747319ab
Branch filter:

Location: led-matrix-software/matrix.py

matthewreed
Added base software to select and run demos/games, along with a couple demos
### matrix.py
### Author: Matthew Reed

import sys
import time
import signal
import logging
import threading
import configparser
from enum import Enum

import opc
import color_utils
import math


class Colors(Enum):
    OFF = (0, 0, 0)
    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    PURPLE = (128, 0, 128)
    YELLOW = (255, 255, 0)
    ORANGE = (255, 140, 0)
    WHITE = (255, 255, 255)
    WHITE_LOW = (100, 100, 100)

class Matrix:

    def __init__(self, config):
        self.logger = logging.getLogger('matrix')
        self.config = config
        
        #init leds
        self.ADDRESS = 'localhost:7890'
        # Create a client object
        self.led_client = opc.Client(self.ADDRESS)
        
        # Test if it can connect (optional)
        if self.led_client.can_connect():
            self.logger.info('connected to FadeCandy %s' % self.ADDRESS)
        else:
            # We could exit here, but instead let's just print a warning
            # and then keep trying to send pixels in case the server
            # appears later
            self.logger.error('WARNING: could not connect to %s' % self.ADDRESS)
            
        self.num_channels = int(self.config.get('leds', 'num_channels'))
        self.NUM_LEDS = int(self.config.get('leds', 'num_leds'))
        
        self.my_pixels = [(0,0,0)] * self.NUM_LEDS
        self.led_client.put_pixels(self.my_pixels)
        
        #map out a matrix that represents the physical layout of the display
        self.led_map = [
            [63, 48, 47, 32, 31, 16, 15,  0],
            [62, 49, 46, 33, 30, 17, 14,  1],
            [61, 50, 45, 34, 29, 18, 13,  2],
            [60, 51, 44, 35, 28, 19, 12,  3],
            [59, 52, 43, 36, 27, 20, 11,  4],
            [58, 53, 42, 37, 26, 21, 10,  5],
            [57, 54, 41, 38, 25, 22,  9,  6],
            [56, 55, 40, 39, 24, 23,  8,  7],
        ]
        
        #x axis
        self.WIDTH = 8
        #y axis
        self.HEIGHT = 8
        
        #initialize matrix with zeros
        self.led_matrix = [[(0,0,0) for x in range(self.WIDTH)] for y in range(self.HEIGHT)]
        
    def update(self):
        
        for x in range(self.WIDTH):
            for y in range(self.HEIGHT):
                self.my_pixels[self.led_map[x][y]] = self.led_matrix[x][y]
                
        self.led_client.put_pixels(self.my_pixels)
        
    def set_pixel(self, x, y, color):
        self.led_matrix[x][y] = color
        
    def get_pixel(self, x, y):
        return self.led_matrix[x][y]
        
    def set_matrix(self, color):
        for x in range(self.WIDTH):
            for y in range(self.HEIGHT):
                self.led_matrix[x][y] = color
        
        
    def stop(self):
        self.logger.info('Turning off leds')
        self.my_pixels = [(0,0,0)] * self.NUM_LEDS
        self.led_client.put_pixels(self.my_pixels)