diff --git a/README.md b/README.md index 5f2ce3f..ccb0ba1 100644 --- a/README.md +++ b/README.md @@ -8,20 +8,9 @@ Projekt Litsimaja - Lapikute tagatoa seintele programmeeritavad ARGB ribad #### Running with emulation This is mainly for testing, development. -In ``lib/Litsimaja.py`` change the following: -``` -# from lib.strip.TkinterStrip import TkinterStrip +Create .env file: +```cp .env.example .env``` - def __init__(self): - self._strip = PixelStrip(290, 18, 800000, 10, False, 255, 0, 4104) -``` -to -``` -from lib.strip.TkinterStrip import TkinterStrip +and see: ```USE_EMULATOR``` - def __init__(self): - self._strip = TkinterStrip(290, 18, 800000, 10, False, 255, 0, 4104) -``` Now when you run the program, you will see a Tkinter window pop up with a rectangle simulating the LED strip. - -Don't commit this change. \ No newline at end of file diff --git a/pyleds/.env.defaults b/pyleds/.env.defaults new file mode 100644 index 0000000..2beceed --- /dev/null +++ b/pyleds/.env.defaults @@ -0,0 +1,17 @@ +ENVIRONMENT=prod +USE_EMULATOR=false +BIND_ADDR=127.0.0.1 +BIND_PORT=8080 + +# Strip configuration +STRIP_PIXELS=290 +STRIP_GPIO_PIN=18 +STRIP_HZ=800000 +STRIP_DMA=10 +STRIP_INVERT=false +STRIP_BRIGHTNESS=255 +STRIP_CHANNEL=0 +STRIP_TYPE=4104 + +REGIONS=46,96,191,241 +BPM_DEFAULT=60 diff --git a/pyleds/.env.example b/pyleds/.env.example new file mode 100644 index 0000000..e484596 --- /dev/null +++ b/pyleds/.env.example @@ -0,0 +1,2 @@ +ENVIRONMENT=dev +USE_EMULATOR=true diff --git a/pyleds/.gitignore b/pyleds/.gitignore index 7d264db..4bbb9b2 100644 --- a/pyleds/.gitignore +++ b/pyleds/.gitignore @@ -1 +1,2 @@ +.env litsimaja.log diff --git a/pyleds/lib/Config.py b/pyleds/lib/Config.py new file mode 100644 index 0000000..544ba6f --- /dev/null +++ b/pyleds/lib/Config.py @@ -0,0 +1,36 @@ +from dotenv import dotenv_values + + +def populate_values(load: {}): + conf = load + conf['IS_DEV']: bool = str.lower(load['ENVIRONMENT']) == 'dev' + conf['USE_EMULATOR']: bool = str.lower(load['USE_EMULATOR']) == 'true' + conf['BIND_PORT']: int = int(load['BIND_PORT']) + + conf['STRIP_PIXELS']: int = int(load['STRIP_PIXELS']) + conf['STRIP_GPIO_PIN']: int = int(load['STRIP_GPIO_PIN']) + conf['STRIP_HZ']: int = int(load['STRIP_HZ']) + conf['STRIP_DMA']: int = int(load['STRIP_DMA']) + conf['STRIP_INVERT']: bool = str.lower(load['STRIP_INVERT']) == 'true' + conf['STRIP_BRIGHTNESS']: int = int(load['STRIP_BRIGHTNESS']) + conf['STRIP_CHANNEL']: int = int(load['STRIP_CHANNEL']) + conf['STRIP_TYPE']: int = int(load['STRIP_TYPE']) + + conf['REGIONS']: [] = [int(x) for x in load['REGIONS'].split(',')] + conf['BPM_DEFAULT']: int = int(load['BPM_DEFAULT']) + + return conf + + +class Config(object): + _config: {} = {} + + def __init__(self): + load_conf = { + **dotenv_values(".env.defaults"), + **dotenv_values(".env"), + } + self._config = populate_values(load_conf) + + def get(self, key: str): + return self._config[key] diff --git a/pyleds/lib/Litsimaja.py b/pyleds/lib/Litsimaja.py index 183c74c..0427d77 100644 --- a/pyleds/lib/Litsimaja.py +++ b/pyleds/lib/Litsimaja.py @@ -1,6 +1,4 @@ -from rpi_ws281x import PixelStrip -# from lib.strip.WindowStrip import WindowStrip -# from lib.strip.TkinterStrip import TkinterStrip +from lib.Config import Config from lib.LoopSwitch import LoopSwitch from lib.Regions import Regions from lib.Tempo import Tempo @@ -8,11 +6,24 @@ from lib.Tempo import Tempo class Litsimaja(object): def __init__(self): - self._strip = PixelStrip(290, 18, 800000, 10, False, 255, 0, 4104) + self._config = Config() + if self.conf('USE_EMULATOR'): + module = __import__('lib.strip.TkinterStrip', None, None, ['TkinterStrip']) + class_name = 'TkinterStrip' + else: + module = __import__('rpi_ws281x', None, None, ['PixelStrip']) + class_name = 'PixelStrip' + + loaded_class = getattr(module, class_name) + self._strip = loaded_class( + self.conf('STRIP_PIXELS'), self.conf('STRIP_GPIO_PIN'), self.conf('STRIP_HZ'), self.conf('STRIP_DMA'), + self.conf('STRIP_INVERT'), self.conf('STRIP_BRIGHTNESS'), self.conf('STRIP_CHANNEL'), + self.conf('STRIP_TYPE') + ) self._loops = [] self._strip.begin() - self._regions: Regions = Regions(self.count_pixels(), [46, 96, 191, 241]) - self._tempo: Tempo = Tempo(60) + self._regions: Regions = Regions(self.count_pixels(), self.conf('REGIONS')) + self._tempo: Tempo = Tempo(self.conf('BPM_DEFAULT')) self._selected_program = None def count_pixels(self) -> int: @@ -62,6 +73,9 @@ class Litsimaja(object): def get_tempo(self): return self._tempo - + def set_selected_program(self, program_name: str): self._selected_program = program_name + + def conf(self, key: str): + return self._config.get(key) diff --git a/pyleds/run.py b/pyleds/run.py index 7a46813..5a64a87 100755 --- a/pyleds/run.py +++ b/pyleds/run.py @@ -5,11 +5,13 @@ import sys import lib.ProgramLoading as Pl from lib.Litsimaja import Litsimaja from flask import Flask, request, Response, render_template, json -from flask_accept import accept + +# start litsimaja +lm = Litsimaja() # logging logger = logging.getLogger('litsimaja') -logger.setLevel(logging.DEBUG) +logger.setLevel(logging.DEBUG if lm.conf('IS_DEV') else logging.WARN) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler = logging.FileHandler('litsimaja.log') file_handler.setFormatter(formatter) @@ -18,8 +20,6 @@ stdout_handler = logging.StreamHandler(sys.stdout) stdout_handler.setFormatter(formatter) logger.addHandler(stdout_handler) -# start litsimaja -lm = Litsimaja() app = Flask(__name__, static_url_path='', static_folder='templates') Pl.run('siinus', 'Wipes', lm, logger, {'color': [0, 0, 0]}) Pl.run('peter', 'DiskoPidu', lm, logger, {}) @@ -30,7 +30,6 @@ def lm_standard_xhr_response() -> Response: @app.route('/', methods=['GET']) -@accept('text/html') def respond_root(): return render_template( 'index.html', @@ -41,7 +40,6 @@ def respond_root(): @app.route('/status', methods=['GET']) -@accept('application/json') def respond_status(): return lm_standard_xhr_response() @@ -79,4 +77,4 @@ def sync_beat(): return lm_standard_xhr_response() -app.run('0.0.0.0', 8080) +app.run(lm.conf('BIND_ADDR'), lm.conf('BIND_PORT'))