summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Thompson <daniel@redfelineninja.org.uk>2020-03-07 11:52:42 (GMT)
committerDaniel Thompson <daniel@redfelineninja.org.uk>2020-03-07 11:52:42 (GMT)
commit138425f4d42bbe22ab389139916812384aedb972 (patch)
treea12f63d1633edf4b40413bd0223d4829e00efc84
parent1ebafc083b3bcc1fd162834054a1b854201da2dc (diff)
wasp: manager: Start refining the application interface
This is the first step in starting to formalize the seperation of applications from the system manager.
-rw-r--r--wasp/clock.py30
-rw-r--r--wasp/manager.py38
2 files changed, 60 insertions, 8 deletions
diff --git a/wasp/clock.py b/wasp/clock.py
index 54a5a0e..c3b3c3a 100644
--- a/wasp/clock.py
+++ b/wasp/clock.py
@@ -1,5 +1,7 @@
import fonts.clock as digits
+import watch
import widgets
+import manager
from draw565 import Draw565
@@ -25,20 +27,40 @@ class ClockApp(object):
"""
def __init__(self):
- self.on_screen = ( -1, -1, -1, -1, -1, -1 )
self.meter = widgets.BatteryMeter()
- def draw(self, watch):
+ def handle_event(self, event_view):
+ """Process events that the app is subscribed to."""
+ if event_view[0] == manager.EVENT_TICK:
+ self.update()
+ else:
+ # TODO: Raise an unexpected event exception
+ pass
+
+ def foreground(self, manager, effect=None):
+ """Activate the application."""
+ self.on_screen = ( -1, -1, -1, -1, -1, -1 )
+ self.draw(effect)
+ manager.request_tick(1000)
+
+ def tick(self, ticks):
+ self.update()
+
+ def background(self):
+ """De-activate the application (without losing state)."""
+ pass
+
+ def draw(self, effect=None):
"""Redraw the display from scratch."""
display = watch.display
display.fill(0)
display.rleblit(digits.clock_colon, pos=(2*48, 80), fg=0xb5b6)
self.on_screen = ( -1, -1, -1, -1, -1, -1 )
- self.update(watch)
+ self.update()
self.meter.draw()
- def update(self, watch):
+ def update(self):
"""Update the display (if needed).
The updates are a lazy as possible and rely on an prior call to
diff --git a/wasp/manager.py b/wasp/manager.py
index 2c9ab8c..879c3f2 100644
--- a/wasp/manager.py
+++ b/wasp/manager.py
@@ -2,21 +2,51 @@ import clock
import gc
import machine
+EVENT_TICK = 0x100
+EVENT_KEYMASK = 0xff
+
class Manager(object):
def __init__(self, watch):
self.watch = watch
+
+ self.app = None
self.switch(clock.ClockApp())
self.sleep_at = watch.rtc.uptime + 90
self.charging = True
def switch(self, app):
+ if self.app:
+ self.app.background(self)
+
+ # Clear out any configuration from the old application
+ self.tick_period_ms = 0
+ self.tick_expiry = None
+
self.app = app
- app.draw(self.watch)
+ app.foreground(self)
+
+ def request_tick(self, period_ms=None):
+ """Request (and subscribe to) a periodic tick event.
+
+ Note: With the current simplistic timer implementation sub-second
+ tick intervals are not possible.
+ """
+ self.tick_period_ms = period_ms
+ self.tick_expiry = self.watch.rtc.get_uptime_ms() + period_ms
def tick(self):
+ rtc = self.watch.rtc
+
if self.sleep_at:
- if self.watch.rtc.update():
- self.app.update(self.watch)
+ if rtc.update() and self.tick_expiry:
+ now = rtc.get_uptime_ms()
+
+ if self.tick_expiry <= now:
+ ticks = 0
+ while self.tick_expiry <= now:
+ self.tick_expiry += self.tick_period_ms
+ ticks += 1
+ self.app.tick(ticks)
if self.watch.button.value():
self.sleep_at = self.watch.rtc.uptime + 15
@@ -34,7 +64,7 @@ class Manager(object):
charging = self.watch.battery.charging()
if self.watch.button.value() or self.charging != charging:
self.watch.display.poweron()
- self.app.update(self.watch)
+ self.app.tick(None)
self.watch.backlight.set(2)
self.sleep_at = self.watch.rtc.uptime + 15