summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--wasp/apps/testapp.py60
-rw-r--r--wasp/wasp.py80
2 files changed, 109 insertions, 31 deletions
diff --git a/wasp/apps/testapp.py b/wasp/apps/testapp.py
index 711feda..849ed5f 100644
--- a/wasp/apps/testapp.py
+++ b/wasp/apps/testapp.py
@@ -9,7 +9,7 @@ class TestApp():
"""
def __init__(self):
- self.tests = ('Touch', 'String')
+ self.tests = ('Touch', 'String', 'Button')
self.test = self.tests[0]
def foreground(self):
@@ -17,7 +17,8 @@ class TestApp():
self.on_screen = ( -1, -1, -1, -1, -1, -1 )
self.draw()
wasp.system.request_event(wasp.EventMask.TOUCH |
- wasp.EventMask.SWIPE_UPDOWN)
+ wasp.EventMask.SWIPE_UPDOWN |
+ wasp.EventMask.BUTTON)
def background(self):
"""De-activate the application (without losing state)."""
@@ -26,34 +27,51 @@ class TestApp():
def sleep(self):
return False
+ def press(self, button, state):
+ draw = wasp.watch.drawable
+ if self.test == 'Touch':
+ draw.string('Button', 0, 108, width=240)
+ if self.test == 'String':
+ self.benchmark_string()
+ elif self.test == 'Button':
+ draw.string('{}: {}'.format(button, state), 0, 108, width=240)
+
def swipe(self, event):
tests = self.tests
- i = tests.index(self.test) + 1
- if i >= len(tests):
- i = 0
+ i = tests.index(self.test)
+
+ if event[0] == wasp.EventType.UP:
+ i += 1
+ if i >= len(tests):
+ i = 0
+ else:
+ i -= 1
+ if i < 0:
+ i = len(tests) - 1
self.test = tests[i]
self.draw()
def touch(self, event):
- draw = wasp.watch.drawable
if self.test == 'Touch':
- draw.string('({}, {})'.format(event[1], event[2]),
- 0, 108, width=240)
+ wasp.watch.drawable.string('({}, {})'.format(
+ event[1], event[2]), 0, 108, width=240)
elif self.test == 'String':
- draw.fill(0, 0, 30, 240, 240-30)
- t = machine.Timer(id=1, period=8000000)
- t.start()
- draw.string("The quick brown", 12, 24+24)
- draw.string("fox jumped over", 12, 24+48)
- draw.string("the lazy dog.", 12, 24+72)
- draw.string("0123456789", 12, 24+120)
- draw.string('!"£$%^&*()', 12, 24+144)
- elapsed = t.time()
- t.stop()
- del t
- draw.string('{}s'.format(elapsed / 1000000), 12, 24+192)
+ self.benchmark_string()
- return True
+ def benchmark_string(self):
+ draw = wasp.watch.drawable
+ draw.fill(0, 0, 30, 240, 240-30)
+ t = machine.Timer(id=1, period=8000000)
+ t.start()
+ draw.string("The quick brown", 12, 24+24)
+ draw.string("fox jumped over", 12, 24+48)
+ draw.string("the lazy dog.", 12, 24+72)
+ draw.string("0123456789", 12, 24+120)
+ draw.string('!"£$%^&*()', 12, 24+144)
+ elapsed = t.time()
+ t.stop()
+ del t
+ draw.string('{}s'.format(elapsed / 1000000), 12, 24+192)
def draw(self):
"""Redraw the display from scratch."""
diff --git a/wasp/wasp.py b/wasp/wasp.py
index 6d3f3a5..f624a8f 100644
--- a/wasp/wasp.py
+++ b/wasp/wasp.py
@@ -39,6 +39,36 @@ class EventMask():
SWIPE_UPDOWN = 0x0004
BUTTON = 0x0008
+class Debounce(object):
+ """Pin (and Signal) debounce wrapper.
+
+ TODO: Currently this driver doesn't actually implement any
+ debounce but it will!
+ """
+
+ def __init__(self, pin):
+ """
+ :param Pin pin: The pin to generate events from
+ """
+ self._pin = pin
+ self._value = pin.value()
+
+ def get_event(self):
+ """Receive a pin change event.
+
+ Check for a pending pin change event and, if an event is pending,
+ return it.
+
+ :return: boolean of the pin state if an event is received, None
+ otherwise.
+ """
+ new_value = self._pin.value()
+ if self._value == new_value:
+ return None
+
+ self._value = new_value
+ return new_value
+
class Manager():
"""WASP system manager
@@ -53,14 +83,23 @@ class Manager():
def __init__(self):
self.app = None
- self.applications = [
- ClockApp(),
- FlashlightApp(),
- TestApp()
- ]
- self.charging = True
+ self.applications = []
+ self.charging = True
self._brightness = 2
+ self._button = Debounce(watch.button)
+
+ # TODO: Eventually these should move to main.py
+ self.register(ClockApp(), True)
+ self.register(FlashlightApp(), True)
+ self.register(TestApp(), True)
+
+ def register(self, app, quick_ring=True):
+ """Register an application with the system.
+
+ :param object app: The application to regsister
+ """
+ self.applications.append(app)
@property
def brightness(self):
@@ -115,6 +154,12 @@ class Manager():
if i < 0:
i = len(app_list)-1
self.switch(app_list[i])
+ elif direction == EventType.HOME:
+ i = app_list.index(self.app)
+ if i != 0:
+ self.switch(app_list[0])
+ else:
+ self.sleep()
def request_event(self, event_mask):
"""Subscribe to events.
@@ -159,6 +204,20 @@ class Manager():
self.keep_awake()
+ def _handle_button(self, state):
+ """Process a button-press (or unpress) event.
+ """
+ self.keep_awake()
+
+ if bool(self.event_mask & EventMask.BUTTON):
+ # Currently we only support one button
+ if not self.app.press(EventType.HOME, state):
+ # If app reported None or False then we are done
+ return
+
+ if state:
+ self.navigate(EventType.HOME)
+
def _handle_touch(self, event):
"""Process a touch event.
"""
@@ -196,14 +255,15 @@ class Manager():
ticks += 1
self.app.tick(ticks)
- if watch.button.value():
- self.keep_awake()
+ state = self._button.get_event()
+ if None != state:
+ self._handle_button(state)
event = watch.touch.get_event()
if event:
self._handle_touch(event)
- if watch.rtc.uptime > self.sleep_at:
+ if self.sleep_at and watch.rtc.uptime > self.sleep_at:
self.sleep()
gc.collect()
@@ -211,7 +271,7 @@ class Manager():
watch.rtc.update()
charging = watch.battery.charging()
- if watch.button.value() or self.charging != charging:
+ if 1 == self._button.get_event() or self.charging != charging:
self.wake()
def run(self):