summaryrefslogtreecommitdiff
path: root/wasp/apps/chrono.py
diff options
context:
space:
mode:
Diffstat (limited to 'wasp/apps/chrono.py')
-rw-r--r--wasp/apps/chrono.py102
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)