From 74b6cbe7e31c897128052cb90d61b5dfdc8b86b3 Mon Sep 17 00:00:00 2001 From: siinus Date: Sun, 2 May 2021 01:37:38 +0300 Subject: [PATCH] Create .env for config --- README.md | 19 +++---------------- pyleds/.env.defaults | 17 +++++++++++++++++ pyleds/.env.example | 2 ++ pyleds/.gitignore | 1 + pyleds/lib/Config.py | 36 ++++++++++++++++++++++++++++++++++++ pyleds/lib/Litsimaja.py | 28 +++++++++++++++++++++------- pyleds/run.py | 9 +++++---- 7 files changed, 85 insertions(+), 27 deletions(-) create mode 100644 pyleds/.env.defaults create mode 100644 pyleds/.env.example create mode 100644 pyleds/lib/Config.py diff --git a/README.md b/README.md index 5f2ce3f..e47826d 100644 --- a/README.md +++ b/README.md @@ -8,20 +8,7 @@ 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 - - def __init__(self): - self._strip = PixelStrip(290, 18, 800000, 10, False, 255, 0, 4104) -``` -to -``` -from lib.strip.TkinterStrip import TkinterStrip - - def __init__(self): - self._strip = TkinterStrip(290, 18, 800000, 10, False, 255, 0, 4104) -``` +Create .env file: +```cp .env.example .env``` +and see: ```USE_EMULATOR``` 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..ab01108 100755 --- a/pyleds/run.py +++ b/pyleds/run.py @@ -7,9 +7,12 @@ 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 +21,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, {}) @@ -79,4 +80,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'))