From 2865183f08b9259eff8cef8f5b61f16938a2dbeb Mon Sep 17 00:00:00 2001 From: Bob Clough Date: Mon, 27 May 2024 20:13:33 +0100 Subject: [PATCH] add events to enable / disable the pattern generator --- modules/firmware_apps/patterninhibit.py | 44 +++++++++++++++++++++++++ modules/system/launcher/app.py | 1 + modules/system/patterndisplay/app.py | 26 +++++++++++---- modules/system/patterndisplay/events.py | 7 ++++ 4 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 modules/firmware_apps/patterninhibit.py create mode 100644 modules/system/patterndisplay/events.py diff --git a/modules/firmware_apps/patterninhibit.py b/modules/firmware_apps/patterninhibit.py new file mode 100644 index 0000000..07eb854 --- /dev/null +++ b/modules/firmware_apps/patterninhibit.py @@ -0,0 +1,44 @@ +import asyncio +import app + +from events.input import Buttons, BUTTON_TYPES +from system.eventbus import eventbus +from system.patterndisplay.events import * + +from tildagonos import tildagonos + + +class PatternInhibit(app.App): + def __init__(self): + self.button_states = Buttons(self) + eventbus.emit(PatternDisable()) + self._make_red() + self._inhibiting = True + + def _make_red(self): + asyncio.sleep(0.5) + for i in range(1, 13): + tildagonos.leds[i] = (int(i * (255/12)), 0, 0) + tildagonos.leds.write() + + def update(self, delta): + if self.button_states.get(BUTTON_TYPES["CANCEL"]): + eventbus.emit(PatternDisable()) + self._inhibiting = True + self._make_red() + elif self.button_states.get(BUTTON_TYPES["CONFIRM"]): + eventbus.emit(PatternEnable()) + self._inhibiting = False + + def draw(self, ctx): + ctx.save() + ctx.font_size = 20 + ctx.text_align = ctx.CENTER + ctx.text_baseline = ctx.MIDDLE + if self._inhibiting: + ctx.rgb(0.2, 0, 0).rectangle(-120, -120, 240, 240).fill() + ctx.rgb(1, 0, 0).move_to(0, 0).text("Inhibiting LEDs") + else: + ctx.rgb(0, 0.2, 0).rectangle(-120, -120, 240, 240).fill() + ctx.rgb(0, 1, 0).move_to(0, 0).text("Not Inhibiting LEDs") + ctx.restore() diff --git a/modules/system/launcher/app.py b/modules/system/launcher/app.py index c525d5b..6c0508d 100644 --- a/modules/system/launcher/app.py +++ b/modules/system/launcher/app.py @@ -80,6 +80,7 @@ def list_core_apps(self): ("Menu demo", "firmware_apps.menu_demo", "MenuDemo"), ("Kbd demo", "firmware_apps.text_demo", "TextDemo"), # ("Update Firmware", "otaupdate", "OtaUpdate"), + # ("Inhibit LEDs", "firmware_apps.patterninhibit", "PatternInhibit"), # ("Wi-Fi Connect", "wifi_client", "WifiClient"), # ("Sponsors", "sponsors", "Sponsors"), # ("Battery", "battery", "Battery"), diff --git a/modules/system/patterndisplay/app.py b/modules/system/patterndisplay/app.py index e92e066..4a1ebc0 100644 --- a/modules/system/patterndisplay/app.py +++ b/modules/system/patterndisplay/app.py @@ -2,10 +2,14 @@ from tildagonos import tildagonos import settings import asyncio +from system.patterndisplay.events import * +from system.eventbus import eventbus class PatternDisplay(App): def __init__(self): + eventbus.on_async(PatternEnable, self._enable, self) + eventbus.on_async(PatternDisable, self._disable, self) self.pattern = settings.get("pattern", "rainbow") try: _patternpath = "patterns." + self.pattern @@ -13,19 +17,29 @@ def __init__(self): _pmodule = __import__(_patternpath, globals(), locals(), [_patternclass]) _pclass = getattr(_pmodule, _patternclass) self._p = _pclass() + self.enabled = True except: raise ImportError(f"Pattern {self.pattern} not found!") + async def _enable(self, event: PatternEnable): + self.enabled = True + + async def _disable(self, event: PatternDisable): + self.enabled = False + async def background_task(self): while True: brightness = settings.get("pattern_brightness", 1.0) next_frame = self._p.next() - for l in range(12): - if brightness < 1.0: - tildagonos.leds[l + 1] = tuple(int(i*brightness) for i in next_frame[l]) - else: - tildagonos.leds[l + 1] = next_frame[l] - tildagonos.leds.write() + if self.enabled: + for l in range(12): + if brightness < 1.0: + tildagonos.leds[l + 1] = tuple( + int(i * brightness) for i in next_frame[l] + ) + else: + tildagonos.leds[l + 1] = next_frame[l] + tildagonos.leds.write() if not self._p.fps: break await asyncio.sleep(1 / self._p.fps) diff --git a/modules/system/patterndisplay/events.py b/modules/system/patterndisplay/events.py new file mode 100644 index 0000000..3f9fd7d --- /dev/null +++ b/modules/system/patterndisplay/events.py @@ -0,0 +1,7 @@ +from events import Event + + +class PatternEnable(Event): ... + + +class PatternDisable(Event): ...