From fa3ceaf50a19c02ea2f585aa69e4e852b2396f81 Mon Sep 17 00:00:00 2001 From: Ben Clifford Date: Mon, 12 Jan 2026 12:01:34 +0000 Subject: [PATCH 1/3] Add emote event definitions These are intended for foreground apps to signal to other components (for example hexpansion drivers) that something interesting, good or bad, happened in the user interface, so that the other component can present that in its own way to the user. Guidelines for use: Only send emotes when you are the foreground app: these events are intended to be UI output like writing to the screen is. Send at most a handful of emotes per minute. These events might generate relatively long behaviours on the order of a few seconds, for example playing a short jingle on an audio hexpansion. --- modules/events/emote.py | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 modules/events/emote.py diff --git a/modules/events/emote.py b/modules/events/emote.py new file mode 100644 index 00000000..baa5dcab --- /dev/null +++ b/modules/events/emote.py @@ -0,0 +1,7 @@ +from events import Event + +class EmoteEvent(Event): ... + +class EmotePositiveEvent(EmoteEvent): ... + +class EmoteNegativeEvent(EmoteEvent): ... From d6e5acd8ddd2ca863301bfd7e899744b1d256977 Mon Sep 17 00:00:00 2001 From: Ben Clifford Date: Tue, 13 Jan 2026 18:59:29 +0000 Subject: [PATCH 2/3] Add emotes to onboard apps Not tested: the app store, because it isn't working for me The sponsor one maybe shouldn't stay around - it's not like there's any actual good UI happening here --- modules/firmware_apps/app_store.py | 4 ++++ modules/firmware_apps/sponsors.py | 3 +++ 2 files changed, 7 insertions(+) diff --git a/modules/firmware_apps/app_store.py b/modules/firmware_apps/app_store.py index 0dd1bd36..021d9f5d 100644 --- a/modules/firmware_apps/app_store.py +++ b/modules/firmware_apps/app_store.py @@ -15,6 +15,7 @@ import shutil import machine from app_components import Menu, fourteen_pt, sixteen_pt, ten_pt +from events.emote import EmoteNegativeEvent, EmotePositiveEvent from events.input import BUTTON_TYPES, ButtonDownEvent from requests import get from system.eventbus import eventbus @@ -157,11 +158,13 @@ def install_app(self, app): self.update_state("main_menu") eventbus.emit(InstallNotificationEvent()) eventbus.emit(ShowNotificationEvent("Installed the app!")) + eventbus.emit(EmotePositiveEvent()) except MemoryError: self.update_state("install_oom") except Exception as e: print(e) eventbus.emit(ShowNotificationEvent("Couldn't install app")) + eventbus.emit(EmoteNegativeEvent()) self.update_state("main_menu") def update_state(self, state): @@ -305,6 +308,7 @@ def compare_version(v1, v2): else: self.update_state("main_menu") eventbus.emit(ShowNotificationEvent("All apps up to date!")) + eventbus.emit(EmotePositiveEvent()) def prepare_installed_menu(self): def on_cancel(): diff --git a/modules/firmware_apps/sponsors.py b/modules/firmware_apps/sponsors.py index b1675744..b82e6205 100644 --- a/modules/firmware_apps/sponsors.py +++ b/modules/firmware_apps/sponsors.py @@ -1,6 +1,8 @@ from app import App from app_components import Menu from app_components.background import Background as bg +from events.emote import EmotePositiveEvent +from system.eventbus import eventbus main_menu_items = [ "AND Digital", @@ -22,6 +24,7 @@ def __init__(self): back_handler=self.back_handler, ) self.notification = None + eventbus.emit(EmotePositiveEvent()) def back_handler(self): self.minimise() From 55950f43a91728335df44410c1c0679b687043ac Mon Sep 17 00:00:00 2001 From: Ben Clifford Date: Tue, 13 Jan 2026 19:12:05 +0000 Subject: [PATCH 3/3] Flash back LEDs on emotes This is not intended for immediate merge into the main tree. But I wanted to have some demo to iterate on of what emote events could do. This commit I'm interested in other people's feedback on if/how the default LEDs should do emotes. Behaviour now: back leds flash: red for negative, green for positive. --- modules/main.py | 5 ++++ modules/system/emotebackleds/app.py | 39 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 modules/system/emotebackleds/app.py diff --git a/modules/main.py b/modules/main.py index 0f77f04c..f8b17dcb 100644 --- a/modules/main.py +++ b/modules/main.py @@ -5,6 +5,7 @@ from system.scheduler import scheduler from system.hexpansion.app import HexpansionManagerApp from system.patterndisplay.app import PatternDisplay +from system.emotebackleds.app import EmoteBackLEDs from system.notification.app import NotificationService from system.launcher.app import Launcher from system.power.handler import PowerEventHandler @@ -22,6 +23,10 @@ # Start led pattern displayer app scheduler.start_app(PatternDisplay()) +# Start back-leds emoter + +scheduler.start_app(EmoteBackLEDs()) + # Start root app scheduler.start_app(Launcher(), foreground=True) diff --git a/modules/system/emotebackleds/app.py b/modules/system/emotebackleds/app.py new file mode 100644 index 00000000..eac20179 --- /dev/null +++ b/modules/system/emotebackleds/app.py @@ -0,0 +1,39 @@ +# BUGS: overrides what hexpansion driver has set to and +# doesn't restore them. + +import asyncio +import time +from tildagonos import tildagonos + +from machine import PWM + +from app import App +from app_components import clear_background +from events.input import BUTTON_TYPES, ButtonDownEvent +from system.hexpansion.config import HexpansionConfig +from system.eventbus import eventbus + +from events.emote import EmotePositiveEvent, EmoteNegativeEvent + +class EmoteBackLEDs(App): + def __init__(self): + eventbus.on_async(EmotePositiveEvent, self._positive_event, self) + eventbus.on_async(EmoteNegativeEvent, self._negative_event, self) + + async def _positive_event(self, event): + for lednum in range(13,19): + tildagonos.leds[lednum] = (0,255,0) + tildagonos.leds.write() + await asyncio.sleep(0.5) + for lednum in range(13,19): + tildagonos.leds[lednum] = (0,0,0) + tildagonos.leds.write() + + async def _negative_event(self, event): + for lednum in range(13,19): + tildagonos.leds[lednum] = (255,0,0) + tildagonos.leds.write() + await asyncio.sleep(0.5) + for lednum in range(13,19): + tildagonos.leds[lednum] = (0,0,0) + tildagonos.leds.write()