diff options
| author | Daniel Thompson <daniel@redfelineninja.org.uk> | 2020-12-27 09:13:49 (GMT) |
|---|---|---|
| committer | Daniel Thompson <daniel@redfelineninja.org.uk> | 2020-12-27 09:13:49 (GMT) |
| commit | 726d5c855428239bba598a95f9a4a3e0e9c4f3aa (patch) | |
| tree | 2ec5d07b3782d17dde6af523022b72d7615d0b7d /wasp/apps | |
| parent | 0ae31a53b35332c590cae416dcaeebf88376ee65 (diff) | |
apps: chrono: Implement a simple analogue watch face
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Diffstat (limited to 'wasp/apps')
| -rw-r--r-- | wasp/apps/chrono.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/wasp/apps/chrono.py b/wasp/apps/chrono.py new file mode 100644 index 0000000..63a8e23 --- /dev/null +++ b/wasp/apps/chrono.py @@ -0,0 +1,102 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (C) 2020 Daniel Thompson + +"""Analogue clock +~~~~~~~~~~~~~~~~~ + +Shows the time as a traditional watch face together with a battery meter. + +.. figure:: res/ChronoApp.png + :width: 179 + + Screenshot of the analogue clock application +""" + +import wasp + +class ChronoApp(): + """Simple analogue clock application. + """ + NAME = 'Chrono' + + def foreground(self): + """Activate the application. + + Configure the status bar, redraw the display and request a periodic + tick callback every second. + """ + wasp.system.bar.clock = False + self._draw(True) + wasp.system.request_tick(1000) + + def sleep(self): + """Prepare to enter the low power mode. + + :returns: True, which tells the system manager not to automatically + switch to the default application before sleeping. + """ + return True + + def wake(self): + """Return from low power mode. + + Time will have changes whilst we have been asleep so we must + udpate the display (but there is no need for a full redraw because + the display RAM is preserved during a sleep. + """ + self._draw() + + def tick(self, ticks): + """Periodic callback to update the display.""" + self._draw() + + def _draw(self, redraw=False): + """Draw or lazily update the display. + + The updates are as lazy by default and avoid spending time redrawing + if the time on display has not changed. However if redraw is set to + True then a full redraw is be performed. + """ + draw = wasp.watch.drawable + hi = wasp.system.theme('accent-hi') + mid = wasp.system.theme('accent-mid') + lo = wasp.system.theme('accent-lo') + + if redraw: + now = wasp.watch.rtc.get_localtime() + + # Clear the display and draw that static parts of the watch face + draw.fill() + + # Redraw the status bar + wasp.system.bar.draw() + + # Draw the dividers + draw.set_color(mid) + for theta in range(12): + draw.polar(120, 120, theta * 360 // 12, 111, 119, 2) + + self._hh = 0 + self._mm = 0 + else: + now = wasp.system.bar.update() + if not now or self._mm == now[4]: + # Skip the update + return + + # Undraw old time + hh = (30 * (self._hh % 12)) + (self._mm / 2) + mm = 6 * self._mm + draw.polar(120, 120, hh, 5, 80, 5, 0) + draw.polar(120, 120, mm, 5, 110, 3, 0) + + # Record the minute that is currently being displayed + self._hh = now[3] + self._mm = now[4] + + # Draw the new time + hh = (30 * (self._hh % 12)) + (self._mm / 2) + mm = 6 * self._mm + draw.polar(120, 120, hh, 5, 80, 5, hi) + draw.polar(120, 120, hh, 5, 60, 3, lo) + draw.polar(120, 120, mm, 5, 110, 3, hi) |
