apps: Add DualClock app.

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>
This commit is contained in:
Benoît HERVIER 2021-03-03 21:41:11 +01:00 committed by Daniel Thompson
parent 79744770b0
commit 7aa2ceb05b
21 changed files with 334 additions and 1 deletions

View File

@ -184,6 +184,10 @@ application (and the "blank" white screen is a torch application):
:alt: Analogue clock application running in the wasp-os simulator
:width: 179
.. image:: res/DualApp.png
:alt: An other 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

View File

@ -13,6 +13,8 @@ Watch faces
.. automodule:: apps.chrono
.. automodule:: apps.dual_clock
.. automodule:: apps.fibonacci_clock
.. automodule:: apps.word_clock

BIN
res/DualApp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

BIN
res/clock_dual.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
res/clock_dual_0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
res/clock_dual_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
res/clock_dual_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
res/clock_dual_3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
res/clock_dual_4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
res/clock_dual_5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
res/clock_dual_6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
res/clock_dual_7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
res/clock_dual_8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
res/clock_dual_9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
res/clock_dual_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -8,4 +8,9 @@ done
convert clock.png -crop 48x60+$((9*48))+0 clock_0.png
convert clock.png -crop 48x60+$((11*48))+0 clock_colon.png
for i in `seq 9`
do
convert clock_dual.png -crop 72x90+$((i*72 - 72))+0 clock_dual_$i.png
done
convert clock_dual.png -crop 72x90+$((9*72))+0 clock_dual_0.png
# Encode the clock digits

122
wasp/apps/dual_clock.py Normal file
View File

@ -0,0 +1,122 @@
# 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]

View File

@ -17,6 +17,7 @@ whilst still allowing users to activate so many awesome applications!
import wasp
import icons
class SoftwareApp():
"""Enable and disable applications."""
NAME = 'Software'
@ -34,12 +35,12 @@ class SoftwareApp():
y = 0
return cb
y = 0
db = []
db.append(('alarm', factory('Alarm')))
db.append(('calc', factory('Calculator')))
db.append(('chrono', factory('Chrono')))
db.append(('dual_clock', factory('Dual Clock')))
db.append(('fibonacci_clock', factory('Fibonacci Clock')))
db.append(('gameoflife', factory('Game Of Life')))
db.append(('musicplayer', factory('Music Player')))

View File

@ -7,6 +7,7 @@ manifest = (
'apps/calc.py',
'apps/clock.py',
'apps/chrono.py',
'apps/dual_clock.py',
'apps/fibonacci_clock.py',
'apps/flashlight.py',
'apps/gameoflife.py',
@ -26,6 +27,7 @@ manifest = (
'apps/word_clock.py',
'fonts/__init__.py',
'fonts/clock.py',
'fonts/clock_dual.py',
'fonts/sans24.py',
'fonts/sans28.py',
'fonts/sans36.py',

196
wasp/fonts/clock_dual.py Normal file
View File

@ -0,0 +1,196 @@
# 1-bit RLE, generated from clock_dual_0.png, 321 bytes
clock_dual_0 = (
72, 90,
b'\x17\x0f7\x151\x19-\x1d)!&#$%"\''
b' )\x1f)\x1e\x11\t\x11\x1c\x10\r\x10\x1b\x0f\x0f\x0f'
b'\x1a\x0f\x11\x0f\x19\x0e\x13\x0e\x18\x0e\x14\x0f\x17\r\x16\x0e'
b'\x16\x0e\x17\r\x16\r\x18\r\x15\x0e\x18\x0e\x14\x0e\x19\x0e'
b'\x13\x0e\x19\x0e\x13\r\x1a\x0e\x13\x0c\x1c\r\x12\r\x1c\x0e'
b'\x11\r\x1d\r\x11\r\x1d\r\x11\r\x1d\r\x11\r\x1d\r'
b'\x11\r\x1d\r\x11\r\x1d\r\x10\x0e\x1d\x0e\x0e\x0e\x1f\x0e'
b'\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e'
b'\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e'
b'\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e'
b'\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e'
b'\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e'
b'\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e'
b'\r\x0e\x1f\x0e\x0e\x0e\x1d\x0e\x10\r\x1d\r\x11\r\x1d\r'
b'\x11\r\x1d\r\x11\r\x1d\r\x11\r\x1d\r\x11\r\x1d\r'
b'\x11\r\x1c\x0e\x12\x0c\x1c\r\x13\r\x1a\x0e\x13\x0e\x19\x0e'
b'\x13\x0e\x19\x0e\x13\x0e\x18\x0f\x14\r\x18\x0e\x15\x0e\x17\x0e'
b'\x16\r\x16\x0e\x17\x0e\x14\x0f\x18\x0e\x13\x0e\x19\x0f\x11\x0f'
b'\x1a\x0f\x0f\x0f\x1b\x10\r\x10\x1c\x11\t\x11\x1e)\x1f)'
b' \'"%$#&!)\x1d,\x1a/\x175\x11'
b' '
)
# 1-bit RLE, generated from clock_dual_1.png, 187 bytes
clock_dual_1 = (
72, 90,
b"c\x0f4\x151\x17*\x1e( '!'!'!"
b"'!'!'\x12\x01\x0e'\x10\x03\x0e'\x0b\x08\x0e"
b"'\x04\x0f\x0e(\x02\x10\x0e:\x0e:\x0e:\x0e:\x0e"
b':\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e'
b':\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e'
b':\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e'
b':\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e'
b':\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e'
b':\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e'
b':\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e'
b':\x0e:\x0e:\x0e)0\x172\x162\x162\x162'
b'\x162\x162\x162\x162\x170T'
)
# 1-bit RLE, generated from clock_dual_2.png, 195 bytes
clock_dual_2 = (
72, 90,
b"\x14\x14/\x1e&$#'\x1d-\x1a/\x181\x172"
b'\x163\x154\x14\x14\r\x14\x13\x0f\x16\x11\x12\r\x19\x11'
b'\x11\x0b\x1c\x10\x11\t\x1f\x10\x10\x07"\x0f\x10\x05%\x0f'
b'\x0f\x03(\x0e:\x0e;\x0e;\r;\r;\r;\r'
b';\r;\r;\r;\r;\r:\x0e:\r:\x0e'
b':\x0e:\x0e9\x0e9\x0e:\x0e9\x0f9\x0e9\x0f'
b'8\x0f8\x0f8\x0f9\x0f8\x0f8\x107\x107\x10'
b'7\x107\x107\x107\x107\x107\x107\x107\x10'
b'7\x107\x107\x107\x107\x107\x107\x107\x10'
b'7\x107\x107\x107\x107\x107\x107\x107\x10'
b'7\x107\x107\x107\x107\x107\x107\x107:'
b'\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:'
b'\x0e:R'
)
# 1-bit RLE, generated from clock_dual_3.png, 205 bytes
clock_dual_3 = (
72, 90,
b'\x14\x12/\x1f&$"\'\x1f,\x1b.\x1a/\x190'
b'\x181\x172\x16\x10\x0f\x14\x15\x0b\x18\x10\x15\t\x1b\x0f'
b'\x15\x06\x1f\x0f\x14\x03#\x0f:\x0e:\x0e;\r;\x0e'
b';\r;\r;\r;\r;\r;\r;\r;\r'
b';\r:\x0e9\x0e:\x0e9\x0f8\x0f8\x106\x11'
b"3\x143\x14$#$#%!'\x1f)\x1d+\x1d"
b"+\x1f)!'#&#5\x145\x148\x119\x10"
b'9\x0f:\x0f:\x0e:\x0f:\x0e;\r;\r;\x0e'
b';\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e'
b":\x0e:\x0e9\x0f9\x0e9\x0e:\x0e\x10\x02'\x0f"
b'\x0f\x05%\x0f\x0f\x06#\x0f\x10\t\x1f\x10\x10\x0b\x1b\x11'
b'\x11\x0c\x18\x13\x11\x12\x0e\x16\x125\x134\x143\x152'
b'\x161\x18/\x1a+\x1e)$"-\x15"'
)
# 1-bit RLE, generated from clock_dual_4.png, 261 bytes
clock_dual_4 = (
72, 90,
b'l\x0e9\x0f8\x107\x116\x126\x125\x135\x13'
b'5\x134\x143\x152\x162\x161\x170\x18/\x0b'
b'\x01\r/\n\x02\r/\n\x02\r.\x0b\x02\r-\x0b'
b'\x03\r-\n\x04\r,\n\x05\r+\x0b\x05\r+\n'
b'\x06\r*\x0b\x06\r*\n\x07\r)\x0b\x07\r(\x0b'
b"\x08\r'\x0b\t\r'\x0b\t\r&\x0b\n\r%\x0b"
b'\x0b\r%\x0b\x0b\r$\x0c\x0b\r$\x0b\x0c\r#\x0c'
b'\x0c\r#\x0b\r\r"\x0b\x0e\r!\x0b\x0f\r \x0c'
b'\x0f\r \x0b\x10\r \x0b\x10\r\x1f\x0b\x11\r\x1e\x0c'
b'\x11\r\x1d\x0c\x12\r\x1d\x0b\x13\r\x1c\x0b\x14\r\x1c\x0b'
b'\x14\r\x1b\x0c\x14\r\x1b\x0b\x15\r\x1a\x0c\x15\r\x19\x0c'
b'\x16\r\x18\x0c\x17\r\x18\x0c\x17\r\x17\r\x17\r\x17\x0c'
b'\x18\r\x17\x0b\x19\r\x17=\x0b=\x0b=\x0b=\x0b='
b'\x0b=\x0b=\x0b=\x0b=\x0b=/\r;\r;\r'
b';\r;\r;\r;\r;\r;\r;\r;\r'
b';\r;\r;\r;\r;\r;\r;\r;\r'
b';\r;\r^'
)
# 1-bit RLE, generated from clock_dual_5.png, 205 bytes
clock_dual_5 = (
72, 90,
b'Q/\x180\x180\x180\x180\x180\x180\x180'
b'\x180\x180\x18\x0e:\x0e:\x0e:\x0e:\x0e:\x0e'
b':\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e:\x0e'
b':\x0e:\x0e:\x0e:\x0e:\x0e\x03\r*\x0e\x01\x11'
b"(%#'!)\x1f*\x1e,\x1c-\x1b.\x1a/"
b'\x190\x18\x0c\x0e\x16\x18\x06\x18\x13\x17\x05\x1b\x12\x17\x02'
b'\x1f\x118\x109\x0f:\x0f:\x0f9\x0f9\x0f:\x0e'
b':\x0e:\x0f:\x0e:\x0e;\r;\r;\r;\r'
b';\r;\r;\r;\r;\r;\r:\x0e:\x0e'
b"9\x0f9\x0e:\x0e9\x0f9\x0e:\x0e\x10\x02'\x0e"
b'\x11\x03%\x0f\x11\x04#\x0f\x12\x07\x1f\x10\x12\n\x1a\x11'
b'\x13\x0c\x16\x13\x13\x11\r\x16\x143\x152\x161\x170'
b'\x18/\x19.\x1b* \'$"-\x15"'
)
# 1-bit RLE, generated from clock_dual_6.png, 287 bytes
clock_dual_6 = (
72, 90,
b'\x1c\x122\x1b+\x1f\'"$%"&!\' ('
b'\x1f)\x1e*\x1d\x14\x0b\x0c\x1c\x11\x15\x06\x1b\x10\x18\x05'
b'\x1b\x0e\x1c\x02\x1b\x0e9\x0e9\x0e:\r;\x0c<\x0c'
b';\x0c<\x0c;\x0c<\x0c<\x0c;\r;\x0c<\x0c'
b'<\x0c<\x0c\x0c\x0c$\x0c\n\x0f#\x0b\x07\x17\x1e\x0b'
b'\x07\x1a\x1c\x0b\x06\x1d\x19\x0c\x04 \x18\x0c\x03#\x16\x0c'
b"\x02%\x15\x0c\x01'\x145\x135\x13\x19\n\x13\x12\x17"
b'\x0f\x11\x11\x16\x11\x10\x11\x15\x13\x10\x10\x14\x15\x0f\x10\x13'
b'\x17\x0e\x10\x12\x19\x0e\x0f\x12\x1a\r\x0f\x11\x1b\r\x0f\x11'
b'\x1b\r\x0f\x11\x1b\x0e\x0e\x11\x1b\x0e\x0e\x10\x1c\x0f\r\x0f'
b'\x1e\x0e\r\x0f\x1e\x0e\r\x0f\x1e\x0e\r\x0f\x1e\x0e\r\x0f'
b'\x1e\x0e\x0e\x0e\x1e\x0e\x0f\r\x1e\x0e\x0f\r\x1e\x0e\x0f\r'
b'\x1e\x0e\x0f\r\x1e\x0e\x0f\r\x1e\x0e\x0f\r\x1e\x0e\x0f\r'
b'\x1e\x0e\x0f\r\x1e\x0e\x0f\x0e\x1c\x0f\x10\x0e\x1b\x0e\x11\x0e'
b'\x1b\x0e\x11\x0e\x1b\r\x13\r\x1b\r\x13\x0e\x1a\r\x14\r'
b'\x19\x0e\x14\x0e\x17\x0e\x15\x0f\x15\x0f\x15\x10\x13\x0f\x17\x10'
b'\x11\x0f\x19\x10\x0f\x10\x1a\x11\n\x13\x1a-\x1c+\x1e)'
b' \'"%$#\' *\x1c.\x184\x10\x1f'
)
# 1-bit RLE, generated from clock_dual_7.png, 177 bytes
clock_dual_7 = (
72, 90,
b'K9\x0e;\r;\r;\r;\r;\r;\r:'
b'\x0e:\x0f8:\x0e:\r:\x0e:\x0e:\x0e9\x0e'
b':\r;\r:\x0e9\x0e:\x0e:\x0e:\r:\x0e'
b':\r:\x0e:\r:\x0e:\x0e9\x0f9\x0e:\r'
b';\r:\x0e9\x0e:\x0e9\x0f9\x0e:\x0e:\r'
b':\x0e:\x0e9\x0f9\x0e9\x0f9\x0e:\r;\r'
b':\x0e9\x0f9\x0e9\x0f9\x0e:\x0e:\r:\x0e'
b':\x0e9\x0f9\x0e9\x0f9\x0e:\r;\r:\x0e'
b'9\x0f9\x0e9\x0f9\x0e:\x0e:\r:\x0e:\x0e'
b'9\x0f9\x0e9\x0f9\x0e:\r;\r:\x0e9\x0f'
b'9\x0e9\x0f9\x0e:\x0e:\r:\x0e:\x0e:\x0e'
b's'
)
# 1-bit RLE, generated from clock_dual_8.png, 301 bytes
clock_dual_8 = (
72, 90,
b"\x17\x112\x1b+\x1f'##&!)\x1e+\x1c-"
b'\x1a/\x180\x18\x13\x0b\x13\x16\x11\x11\x11\x15\x10\x13\x10'
b'\x14\x10\x15\x10\x13\x0f\x17\x0f\x13\x0e\x19\x0e\x12\x0f\x19\x0f'
b'\x11\x0e\x1b\x0e\x11\x0e\x1b\x0e\x11\r\x1d\r\x11\r\x1d\r'
b'\x11\r\x1d\r\x11\r\x1d\r\x11\r\x1d\r\x11\r\x1d\r'
b'\x11\r\x1d\r\x11\r\x1d\r\x11\r\x1d\r\x11\x0e\x1b\x0e'
b'\x12\x0e\x19\x0e\x13\x0e\x19\x0e\x14\x0e\x17\x0e\x16\r\x17\r'
b'\x17\r\x17\r\x17\x10\x11\x10\x18\x11\r\x11\x1a\x11\x0b\x11'
b'\x1c+\x1e\'#$&!*\x1b,\x1d\'%"\''
b' )\x1d,\x1b\x12\x0b\x11\x1a\x11\r\x11\x18\x10\x11\x10'
b'\x16\x0e\x17\x0e\x15\r\x19\r\x14\x0e\x19\x0e\x13\r\x1b\r'
b'\x12\x0e\x1b\x0e\x11\r\x1d\r\x11\r\x1d\r\x11\x0c\x1e\r'
b'\x10\r\x1e\x0e\x0e\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e'
b'\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e'
b'\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e\r\x0e\x1f\x0e'
b'\r\x0f\x1d\x0f\x0e\x0e\x1d\x0e\x0f\x0e\x1d\x0e\x10\x0e\x1b\x0e'
b'\x11\x0f\x19\x0f\x11\x0f\x19\x0f\x11\x10\x17\x10\x12\x11\x13\x11'
b'\x13\x12\x11\x12\x14\x14\x0b\x14\x161\x18/\x1a-\x1c+'
b"\x1e) '##'\x1f+\x1b2\x11 "
)
# 1-bit RLE, generated from clock_dual_9.png, 287 bytes
clock_dual_9 = (
72, 90,
b"\x16\x104\x18.\x1c* '##&!(\x1f*"
b'\x1d,\x1c-\x1a\x13\n\x11\x19\x11\x0f\x10\x18\x10\x11\x0f'
b'\x17\x10\x13\x0f\x16\x0f\x15\x0e\x16\x0e\x17\x0e\x14\x0e\x19\r'
b'\x14\r\x1a\x0e\x13\r\x1b\r\x13\r\x1b\x0e\x11\x0e\x1b\x0e'
b'\x11\x0e\x1b\x0e\x10\x0f\x1c\x0e\x0f\x0e\x1e\r\x0f\x0e\x1e\r'
b'\x0f\x0e\x1e\r\x0f\x0e\x1e\r\x0f\x0e\x1e\r\x0f\x0e\x1e\r'
b'\x0f\x0e\x1e\r\x0f\x0e\x1e\r\x0f\x0e\x1e\x0e\x0e\x0e\x1e\x0f'
b'\r\x0e\x1e\x0f\r\x0e\x1e\x0f\r\x0e\x1e\x0f\r\x0e\x1e\x0f'
b'\r\x0e\x1d\x10\x0e\r\x1c\x11\x0e\x0e\x1b\x11\x0f\r\x1b\x11'
b'\x0f\r\x1b\x11\x0f\r\x1a\x12\x0f\x0e\x19\x12\x10\x0e\x17\x13'
b'\x10\x0f\x15\x14\x10\x0f\x14\x15\x11\x10\x11\x16\x11\x11\x0f\x17'
b"\x12\x13\n\x19\x135\x135\x14'\x01\x0c\x15%\x02\x0c"
b'\x16#\x03\x0c\x18 \x04\x0c\x19\x1d\x06\x0b\x1c\x1a\x07\x0b'
b'\x1e\x17\x07\x0b#\x0f\n\x0c$\x0c\x0c\x0c<\x0c<\x0c'
b'<\x0c;\r;\x0c<\x0c<\x0c;\x0c<\x0c;\x0c'
b'<\x0c;\r:\x0e9\x0e9\x0e\x1b\x02\x1c\x0e\x1b\x05'
b'\x18\x10\x1b\x06\x15\x11\x1c\n\x0f\x12\x1d*\x1e)\x1f('
b' \'!&"%$"& )\x1d2\x12%'
)

View File

@ -302,3 +302,4 @@ checkbox = (
b'F\x85O\xc6G\x83P\xc6H\x81Q\xc6Z\xc6Z\xc6'
b'Z\xc7X\xe4\x01\xde\x03\xdc\x02'
)