From 5b74c45e58eedddf3432b595822989afba8bf3a4 Mon Sep 17 00:00:00 2001 From: Wolfgang Ginolas Date: Thu, 31 Dec 2020 17:18:13 +0100 Subject: apps: timer: Add a countdown timer application Signed-off-by: Wolfgang Ginolas [daniel@redfelineninja.org.uk: squashed into a single commit, rebase to latest master, integrate with the Software application and rename the screenshots to match the application name] Signed-off-by: Daniel Thompson diff --git a/README.rst b/README.rst index 8985e40..5ca32a9 100644 --- a/README.rst +++ b/README.rst @@ -137,7 +137,7 @@ simulator (the "blank" screen is the torch application): :alt: Heart rate application running on the wasp-os simulator :width: 179 -.. image:: res/TimerApp.png +.. image:: res/StopclockApp.png :alt: Stop watch application running on the wasp-os simulator :width: 179 @@ -192,3 +192,7 @@ using one of the techniques is the Application Writer's guide. .. image:: res/SnakeApp.png :alt: Snake Game running in the wasp-os simulator :width: 179 + +.. image:: res/TimerApp.png + :alt: Countdown timer application running in the wasp-os simulator + :width: 179 diff --git a/docs/apps.rst b/docs/apps.rst index ae9fb15..5cadd94 100644 --- a/docs/apps.rst +++ b/docs/apps.rst @@ -40,3 +40,5 @@ Integration .. automodule:: apps.alarm .. automodule:: apps.musicplayer + +.. automodule:: apps.timer diff --git a/res/StopclockApp.png b/res/StopclockApp.png new file mode 100644 index 0000000..3c14c74 Binary files /dev/null and b/res/StopclockApp.png differ diff --git a/res/TimerApp.png b/res/TimerApp.png index eaa91de..8edb17e 100644 Binary files a/res/TimerApp.png and b/res/TimerApp.png differ diff --git a/res/timer_icon.png b/res/timer_icon.png new file mode 100644 index 0000000..6493f8d Binary files /dev/null and b/res/timer_icon.png differ diff --git a/wasp/apps/software.py b/wasp/apps/software.py index a39cce0..b8bea2c 100644 --- a/wasp/apps/software.py +++ b/wasp/apps/software.py @@ -22,6 +22,7 @@ class SoftwareApp(): ('snake', wasp.widgets.Checkbox(0, 40, 'Snake Game')), ('flashlight', wasp.widgets.Checkbox(0, 80, 'Torch')), ('testapp', wasp.widgets.Checkbox(0, 120, 'Test')), + ('timer', wasp.widgets.Checkbox(0, 160, 'Timer')), ) self.si = wasp.widgets.ScrollIndicator() self.page = 0 diff --git a/wasp/apps/stopwatch.py b/wasp/apps/stopwatch.py index 0d572af..f46baa0 100644 --- a/wasp/apps/stopwatch.py +++ b/wasp/apps/stopwatch.py @@ -8,12 +8,13 @@ import fonts class StopwatchApp(): """Stopwatch application. - .. figure:: res/TimerApp.png + .. figure:: res/StopclockApp.png :width: 179 Screenshot of the stopwatch application """ - NAME = 'Timer' + # Stopwatch requires too many pixels to fit into the launcher + NAME = 'Stopclock' ICON = icons.app def __init__(self): diff --git a/wasp/apps/timer.py b/wasp/apps/timer.py new file mode 100644 index 0000000..f1543f8 --- /dev/null +++ b/wasp/apps/timer.py @@ -0,0 +1,173 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (C) 2020 Wolfgang Ginolas +"""Timer Application +~~~~~~~~~~~~~~~~~~~~ + +An application to set a vibration in a specified amount of time. Like a kitchen timer. + + .. figure:: res/TimerApp.png + :width: 179 + + Screenshot of the Timer Application + +""" + +import wasp +import fonts +import time +import widgets +import math +from micropython import const + +# 2-bit RLE, generated from res/timer_icon.png, 345 bytes +icon = ( + b'\x02' + b'`@' + b'?\xff\r@\xb4I?\x14Q?\rW?\x08[?' + b'\x04_?\x00c= _BUTTON_Y: + self._start() + + + def _start(self): + self.state = _RUNNING + now = wasp.watch.rtc.time() + self.current_alarm = now + self.minutes.value * 60 + self.seconds.value + wasp.system.set_alarm(self.current_alarm, self._alert) + self._draw() + + def _stop(self): + self.state = _STOPPED + wasp.system.cancel_alarm(self.current_alarm, self._alert) + self._draw() + + def _draw(self): + """Draw the display from scratch.""" + draw = wasp.watch.drawable + draw.fill() + sbar = wasp.system.bar + sbar.clock = True + sbar.draw() + + if self.state == _RINGING: + draw.set_font(fonts.sans24) + draw.string(self.NAME, 0, 150, width=240) + draw.blit(icon, 73, 50) + elif self.state == _RUNNING: + self._draw_stop(104, _BUTTON_Y) + draw.string(':', 110, 120-14, width=20) + self._update() + else: # _STOPPED + draw.set_font(fonts.sans28) + draw.string(':', 110, 120-14, width=20) + + self.minutes.draw() + self.seconds.draw() + + self._draw_play(114, _BUTTON_Y) + + def _update(self): + wasp.system.bar.update() + draw = wasp.watch.drawable + if self.state == _RUNNING: + now = wasp.watch.rtc.time() + s = self.current_alarm - now + if s<0: + s = 0 + m = str(math.floor(s // 60)) + s = str(math.floor(s) % 60) + if len(m) < 2: + m = '0' + m + if len(s) < 2: + s = '0' + s + draw.set_font(fonts.sans28) + draw.string(m, 50, 120-14, width=60) + draw.string(s, 130, 120-14, width=60) + + def _draw_play(self, x, y): + draw = wasp.watch.drawable + for i in range(0,20): + draw.fill(0xffff, x+i, y+i, 1, 40 - 2*i) + + def _draw_stop(self, x, y): + wasp.watch.drawable.fill(0xffff, x, y, 40, 40) + + def _alert(self): + self.state = _RINGING + wasp.system.wake() + wasp.system.switch(self) diff --git a/wasp/boards/manifest_240x240.py b/wasp/boards/manifest_240x240.py index 4d91566..ed3a692 100644 --- a/wasp/boards/manifest_240x240.py +++ b/wasp/boards/manifest_240x240.py @@ -21,6 +21,7 @@ manifest = ( 'apps/stopwatch.py', 'apps/snake.py', 'apps/testapp.py', + 'apps/timer.py', 'fonts/__init__.py', 'fonts/clock.py', 'fonts/sans24.py', -- cgit v0.10.2