diff --git a/README.rst b/README.rst index 4116cce..f565531 100644 --- a/README.rst +++ b/README.rst @@ -165,6 +165,10 @@ wasp-os also contains a library of additional applications for you to choose. These are disabled by default but can be easily enabled by adding them using one of the techniques is the Application Writer's guide. +.. image:: res/ChronoApp.png + :alt: Analogue clock application running in the wasp-os simulator + :width: 179 + .. image:: res/FiboApp.png :alt: Fibonacci clock application running in the wasp-os simulator :width: 179 diff --git a/TODO.rst b/TODO.rst index 636605c..78c9fe4 100644 --- a/TODO.rst +++ b/TODO.rst @@ -39,6 +39,7 @@ Wasp-os * [ ] Introduce fwd/back/vol+/vol- buttons to the music player * [ ] Update icon for Alarm app * [ ] Update art work for buttons in Confirmation view + * [ ] Reduce the size of the battery charge icon slightly (match bell) * [ ] Applications diff --git a/docs/apps.rst b/docs/apps.rst index c9a6bb4..f8779f0 100644 --- a/docs/apps.rst +++ b/docs/apps.rst @@ -23,6 +23,17 @@ treated as examples they are described in detail as part of the Watch faces ----------- +.. automodule:: apps.chrono + +This application is very simple and largely serves as an example of how to +implement traditional watch faces. +It is not included by default in any image. +Instead it can be transferred to the device dynamically using wasptool: + +.. code-block:: sh + + ./tools/wasptool --exec wasp/apps/chrono.py --eval 'wasp.system.register(ChronoApp())' + .. automodule:: apps.fibonacci_clock This app is enabled by default in the simulator. diff --git a/res/ChronoApp.png b/res/ChronoApp.png new file mode 100644 index 0000000..bbcd751 Binary files /dev/null and b/res/ChronoApp.png differ 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)