7aa2ceb05b
Signed-off-by: Benoît HERVIER <b@rvier.fr> [daniel@redfelineninja.org.uk: Removed unused dual clock fonts from clock_dual.py, fixed up the manifest] Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
122 lines
4.2 KiB
Python
122 lines
4.2 KiB
Python
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
# Copyright (C) 2020 Daniel Thompson
|
|
|
|
"""Digital dual clock
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Shows a time (as HH and MM vertically) together with a battery meter.
|
|
|
|
.. figure:: res/DualApp.png
|
|
:width: 179
|
|
"""
|
|
|
|
import wasp
|
|
|
|
import icons
|
|
import fonts.clock_dual as digits
|
|
|
|
DIGITS = (
|
|
digits.clock_dual_0, digits.clock_dual_1, digits.clock_dual_2, digits.clock_dual_3,
|
|
digits.clock_dual_4, digits.clock_dual_5, digits.clock_dual_6, digits.clock_dual_7,
|
|
digits.clock_dual_8, digits.clock_dual_9
|
|
)
|
|
|
|
|
|
class DualClockApp():
|
|
"""Simple digital clock application."""
|
|
NAME = 'Dual'
|
|
# 2-bit RLE, generated from clock_dual_icon.png, 298 bytes
|
|
ICON = (
|
|
b'\x02'
|
|
b'`@'
|
|
b'?\xff\xc1@\xacF\r\xc6?\x06H\x0b\xca?\x04H'
|
|
b'\n\xcc?\x03C\x02C\n\xc4\x05\xc4?\x07C\t\xc4'
|
|
b'\x07\xc3?\x07C\t\xc3\t\xc2?\x07C\t\xc3\t\xc3'
|
|
b'?\x06C\t\xc3\t\xc3?\x06C\t\xc3\t\xc3?\x06'
|
|
b'C\t\xc4\x07\xc4?\x06C\n\xc4\x05\xc5?\x06C\n'
|
|
b'\xca\x01\xc3?\x06C\x0b\xc9\x01\xc3?\x06C\r\xc5\x03'
|
|
b'\xc3?\x06C\x15\xc3?\x06C\x14\xc4?\x06C\x14\xc3'
|
|
b'?\x07C\x14\xc3?\x07C\x13\xc4?\x07C\x0b\xc1\x05'
|
|
b'\xc5?\x03M\x06\xca?\x04M\x06\xc9?\x05M\x07\xc6'
|
|
b'?\xff\xedE\x0b\xc8?\x07I\x07\xcc?\x04K\x06\xce'
|
|
b'?\x02D\x03D\x06\xc2\x08\xc4?\x01D\x05D\x10\xc4'
|
|
b'?\x00C\x07C\x11\xc3>D\x07D\x10\xc3>C\t'
|
|
b'C\x10\xc3>C\tC\x10\xc3>C\tC\x0f\xc4>'
|
|
b'C\tC\x0e\xc4?\x00C\tC\r\xc5?\x00C\t'
|
|
b'C\x0c\xc5?\x01C\tC\x0b\xc5?\x02C\tC\n'
|
|
b'\xc5?\x03C\tC\t\xc5?\x04D\x07D\x08\xc4?'
|
|
b'\x07C\x07C\x08\xc4?\x08C\x06D\x07\xc4?\nD'
|
|
b'\x03D\x07\xc3?\x0cK\x06\xcf?\x02I\x07\xcf?\x04'
|
|
b'E\t\xcf?\xff\xff\xe4'
|
|
)
|
|
_min = None
|
|
|
|
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('bright')
|
|
lo = wasp.system.theme('mid')
|
|
|
|
if redraw:
|
|
now = wasp.watch.rtc.get_localtime()
|
|
|
|
# Clear the display and draw that static parts of the watch face
|
|
draw.fill()
|
|
#draw.blit(digits.clock_colon, 2*48, 80, fg=mid)
|
|
|
|
# Redraw the status bar
|
|
wasp.system.bar.draw()
|
|
else:
|
|
# The update is doubly lazy... we update the status bar and if
|
|
# the status bus update reports a change in the time of day
|
|
# then we compare the minute on display to make sure we
|
|
# only update the main clock once per minute.
|
|
now = wasp.system.bar.update()
|
|
if not now or self._min == now[4]:
|
|
# Skip the update
|
|
return
|
|
|
|
# Draw the changeable parts of the watch face
|
|
draw.blit(DIGITS[now[4] % 10], 40 + 1*90, 140, fg=hi)
|
|
draw.blit(DIGITS[now[4] // 10], 40 + 0*90, 140, fg=hi)
|
|
draw.blit(DIGITS[now[3] % 10], 40 + 1*90, 40, fg=lo)
|
|
draw.blit(DIGITS[now[3] // 10], 40 + 0*90, 40, fg=lo)
|
|
#draw.roundRect(25, 135, 180, 100, 5, lo)
|
|
# Record the minute that is currently being displayed
|
|
self._min = now[4]
|