diff --git a/README.rst b/README.rst index 11c3ad4..b6dbc0e 100644 --- a/README.rst +++ b/README.rst @@ -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 diff --git a/docs/apps.rst b/docs/apps.rst index a326006..01e1e16 100644 --- a/docs/apps.rst +++ b/docs/apps.rst @@ -13,6 +13,8 @@ Watch faces .. automodule:: apps.chrono +.. automodule:: apps.dual_clock + .. automodule:: apps.fibonacci_clock .. automodule:: apps.word_clock diff --git a/res/DualApp.png b/res/DualApp.png new file mode 100644 index 0000000..395bb26 Binary files /dev/null and b/res/DualApp.png differ diff --git a/res/clock_dual.png b/res/clock_dual.png new file mode 100644 index 0000000..898731a Binary files /dev/null and b/res/clock_dual.png differ diff --git a/res/clock_dual_0.png b/res/clock_dual_0.png new file mode 100644 index 0000000..a5b4b28 Binary files /dev/null and b/res/clock_dual_0.png differ diff --git a/res/clock_dual_1.png b/res/clock_dual_1.png new file mode 100644 index 0000000..452204f Binary files /dev/null and b/res/clock_dual_1.png differ diff --git a/res/clock_dual_2.png b/res/clock_dual_2.png new file mode 100644 index 0000000..099e232 Binary files /dev/null and b/res/clock_dual_2.png differ diff --git a/res/clock_dual_3.png b/res/clock_dual_3.png new file mode 100644 index 0000000..b69b2e2 Binary files /dev/null and b/res/clock_dual_3.png differ diff --git a/res/clock_dual_4.png b/res/clock_dual_4.png new file mode 100644 index 0000000..e22d079 Binary files /dev/null and b/res/clock_dual_4.png differ diff --git a/res/clock_dual_5.png b/res/clock_dual_5.png new file mode 100644 index 0000000..ba14b81 Binary files /dev/null and b/res/clock_dual_5.png differ diff --git a/res/clock_dual_6.png b/res/clock_dual_6.png new file mode 100644 index 0000000..ec17c80 Binary files /dev/null and b/res/clock_dual_6.png differ diff --git a/res/clock_dual_7.png b/res/clock_dual_7.png new file mode 100644 index 0000000..ccb5eb6 Binary files /dev/null and b/res/clock_dual_7.png differ diff --git a/res/clock_dual_8.png b/res/clock_dual_8.png new file mode 100644 index 0000000..269af3e Binary files /dev/null and b/res/clock_dual_8.png differ diff --git a/res/clock_dual_9.png b/res/clock_dual_9.png new file mode 100644 index 0000000..e80d061 Binary files /dev/null and b/res/clock_dual_9.png differ diff --git a/res/clock_dual_icon.png b/res/clock_dual_icon.png new file mode 100644 index 0000000..7f5c485 Binary files /dev/null and b/res/clock_dual_icon.png differ diff --git a/res/encode.sh b/res/encode.sh index 0ee2bae..3957347 100644 --- a/res/encode.sh +++ b/res/encode.sh @@ -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 diff --git a/wasp/apps/dual_clock.py b/wasp/apps/dual_clock.py new file mode 100644 index 0000000..39bb8e0 --- /dev/null +++ b/wasp/apps/dual_clock.py @@ -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] diff --git a/wasp/apps/software.py b/wasp/apps/software.py index c86cf3d..bc345b5 100644 --- a/wasp/apps/software.py +++ b/wasp/apps/software.py @@ -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'))) diff --git a/wasp/boards/manifest_240x240.py b/wasp/boards/manifest_240x240.py index 5f88630..048837c 100644 --- a/wasp/boards/manifest_240x240.py +++ b/wasp/boards/manifest_240x240.py @@ -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', diff --git a/wasp/fonts/clock_dual.py b/wasp/fonts/clock_dual.py new file mode 100644 index 0000000..5c1ab9e --- /dev/null +++ b/wasp/fonts/clock_dual.py @@ -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)!'#\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%' +) diff --git a/wasp/icons.py b/wasp/icons.py index 4c2d672..30c5774 100644 --- a/wasp/icons.py +++ b/wasp/icons.py @@ -302,3 +302,4 @@ checkbox = ( b'F\x85O\xc6G\x83P\xc6H\x81Q\xc6Z\xc6Z\xc6' b'Z\xc7X\xe4\x01\xde\x03\xdc\x02' ) +