Advanced alarm app
Features: * Multiple alarms (up to 4) * Day of the week support * One time alarms * Snooze Changes to wasp-os for app support: * Added + and - to the 28pt and 36pt fonts * Checkboxes now require a click on the body of the checkbox if there is no label * Added a Toggle Button class that extends Button and stores a state like checkbox Signed-off-by: Adam Blair <adampblair@protonmail.com>
This commit is contained in:
parent
0831f79a10
commit
e09b951017
5 changed files with 513 additions and 216 deletions
BIN
res/AlarmApp.png
BIN
res/AlarmApp.png
Binary file not shown.
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.7 KiB |
|
@ -1,6 +1,7 @@
|
||||||
# SPDX-License-Identifier: LGPL-3.0-or-later
|
# SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
# Copyright (C) 2020 Daniel Thompson
|
# Copyright (C) 2020 Daniel Thompson
|
||||||
# Copyright (C) 2020 Joris Warmbier
|
# Copyright (C) 2020 Joris Warmbier
|
||||||
|
# Copyright (C) 2021 Adam Blair
|
||||||
"""Alarm Application
|
"""Alarm Application
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
@ -12,11 +13,12 @@ An application to set a vibration alarm. All settings can be accessed from the W
|
||||||
Screenshot of the Alarm Application
|
Screenshot of the Alarm Application
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import wasp
|
import wasp
|
||||||
import fonts
|
import fonts
|
||||||
import time
|
import time
|
||||||
import widgets
|
import widgets
|
||||||
|
import array
|
||||||
|
from micropython import const
|
||||||
|
|
||||||
# 2-bit RLE, generated from res/alarm_icon.png, 390 bytes
|
# 2-bit RLE, generated from res/alarm_icon.png, 390 bytes
|
||||||
icon = (
|
icon = (
|
||||||
|
@ -49,7 +51,29 @@ icon = (
|
||||||
b'\x11\x83\x17'
|
b'\x11\x83\x17'
|
||||||
)
|
)
|
||||||
|
|
||||||
class AlarmApp():
|
# Enabled masks
|
||||||
|
_MONDAY = const(0x01)
|
||||||
|
_TUESDAY = const(0x02)
|
||||||
|
_WEDNESDAY = const(0x04)
|
||||||
|
_THURSDAY = const(0x08)
|
||||||
|
_FRIDAY = const(0x10)
|
||||||
|
_SATURDAY = const(0x20)
|
||||||
|
_SUNDAY = const(0x40)
|
||||||
|
_WEEKDAYS = const(0x1F)
|
||||||
|
_WEEKENDS = const(0x60)
|
||||||
|
_EVERY_DAY = const(0x7F)
|
||||||
|
_IS_ACTIVE = const(0x80)
|
||||||
|
|
||||||
|
# Alarm data indices
|
||||||
|
_HOUR_IDX = const(0)
|
||||||
|
_MIN_IDX = const(1)
|
||||||
|
_ENABLED_IDX = const(2)
|
||||||
|
|
||||||
|
# Pages
|
||||||
|
_HOME_PAGE = const(-1)
|
||||||
|
_RINGING_PAGE = const(-2)
|
||||||
|
|
||||||
|
class AlarmApp:
|
||||||
"""Allows the user to set a vibration alarm.
|
"""Allows the user to set a vibration alarm.
|
||||||
"""
|
"""
|
||||||
NAME = 'Alarm'
|
NAME = 'Alarm'
|
||||||
|
@ -57,83 +81,296 @@ class AlarmApp():
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""Initialize the application."""
|
"""Initialize the application."""
|
||||||
self.active = widgets.Checkbox(104, 200)
|
|
||||||
self.hours = widgets.Spinner(50, 60, 0, 23, 2)
|
|
||||||
self.minutes = widgets.Spinner(130, 60, 0, 59, 2)
|
|
||||||
|
|
||||||
self.hours.value = 7
|
self.page = _HOME_PAGE
|
||||||
self.ringing = False
|
self.alarms = (bytearray(3), bytearray(3), bytearray(3), bytearray(3))
|
||||||
|
self.pending_alarms = array.array('d', [0.0, 0.0, 0.0, 0.0])
|
||||||
|
|
||||||
|
# Set a nice default
|
||||||
|
self.num_alarms = 1
|
||||||
|
for alarm in self.alarms:
|
||||||
|
alarm[_HOUR_IDX] = 8
|
||||||
|
alarm[_MIN_IDX] = 0
|
||||||
|
alarm[_ENABLED_IDX] = 0
|
||||||
|
self.alarms[0][_ENABLED_IDX] = _WEEKDAYS
|
||||||
|
|
||||||
|
|
||||||
def foreground(self):
|
def foreground(self):
|
||||||
"""Activate the application."""
|
"""Activate the application."""
|
||||||
|
|
||||||
|
self.del_alarm_btn = widgets.Button(170, 204, 70, 35, 'DEL')
|
||||||
|
self.hours_wid = widgets.Spinner(50, 30, 0, 23, 2)
|
||||||
|
self.min_wid = widgets.Spinner(130, 30, 0, 59, 2)
|
||||||
|
self.day_btns = (widgets.ToggleButton(10, 145, 40, 35, 'Mo'),
|
||||||
|
widgets.ToggleButton(55, 145, 40, 35, 'Tu'),
|
||||||
|
widgets.ToggleButton(100, 145, 40, 35, 'We'),
|
||||||
|
widgets.ToggleButton(145, 145, 40, 35, 'Th'),
|
||||||
|
widgets.ToggleButton(190, 145, 40, 35, 'Fr'),
|
||||||
|
widgets.ToggleButton(10, 185, 40, 35, 'Sa'),
|
||||||
|
widgets.ToggleButton(55, 185, 40, 35, 'Su'))
|
||||||
|
self.alarm_checks = (widgets.Checkbox(200, 57), widgets.Checkbox(200, 102),
|
||||||
|
widgets.Checkbox(200, 147), widgets.Checkbox(200, 192))
|
||||||
|
|
||||||
|
self._deactivate_pending_alarms()
|
||||||
self._draw()
|
self._draw()
|
||||||
wasp.system.request_event(wasp.EventMask.TOUCH)
|
|
||||||
|
wasp.system.request_event(wasp.EventMask.TOUCH | wasp.EventMask.SWIPE_LEFTRIGHT | wasp.EventMask.BUTTON)
|
||||||
wasp.system.request_tick(1000)
|
wasp.system.request_tick(1000)
|
||||||
if self.active.state:
|
|
||||||
wasp.system.cancel_alarm(self.current_alarm, self._alert)
|
|
||||||
|
|
||||||
def background(self):
|
def background(self):
|
||||||
"""De-activate the application."""
|
"""De-activate the application."""
|
||||||
if self.active.state:
|
if self.page > _HOME_PAGE:
|
||||||
self._set_current_alarm()
|
self._save_alarm()
|
||||||
wasp.system.set_alarm(self.current_alarm, self._alert)
|
|
||||||
if self.ringing:
|
self.page = _HOME_PAGE
|
||||||
self.ringing = False
|
|
||||||
|
del self.del_alarm_btn
|
||||||
|
del self.hours_wid
|
||||||
|
del self.min_wid
|
||||||
|
del self.alarm_checks
|
||||||
|
del self.day_btns
|
||||||
|
|
||||||
|
self._set_pending_alarms()
|
||||||
|
|
||||||
def tick(self, ticks):
|
def tick(self, ticks):
|
||||||
"""Notify the application that its periodic tick is due."""
|
"""Notify the application that its periodic tick is due."""
|
||||||
if self.ringing:
|
if self.page == _RINGING_PAGE:
|
||||||
wasp.watch.vibrator.pulse(duty=50, ms=500)
|
wasp.watch.vibrator.pulse(duty=50, ms=500)
|
||||||
wasp.system.keep_awake()
|
wasp.system.keep_awake()
|
||||||
else:
|
else:
|
||||||
wasp.system.bar.update()
|
wasp.system.bar.update()
|
||||||
|
|
||||||
|
def press(self, button, state):
|
||||||
|
""""Notify the application of a button press event."""
|
||||||
|
if self.page == _RINGING_PAGE:
|
||||||
|
self._snooze()
|
||||||
|
wasp.system.navigate(wasp.EventType.HOME)
|
||||||
|
|
||||||
|
def swipe(self, event):
|
||||||
|
""""Notify the application of a swipe event."""
|
||||||
|
if self.page == _RINGING_PAGE:
|
||||||
|
self._silence_alarm()
|
||||||
|
elif self.page > _HOME_PAGE:
|
||||||
|
self._save_alarm()
|
||||||
|
self._draw()
|
||||||
|
else:
|
||||||
|
wasp.system.navigate(event[0])
|
||||||
|
|
||||||
def touch(self, event):
|
def touch(self, event):
|
||||||
"""Notify the application of a touchscreen touch event."""
|
"""Notify the application of a touchscreen touch event."""
|
||||||
if self.ringing:
|
if self.page == _RINGING_PAGE:
|
||||||
mute = wasp.watch.display.mute
|
self._silence_alarm()
|
||||||
self.ringing = False
|
elif self.page > _HOME_PAGE:
|
||||||
mute(True)
|
if self.hours_wid.touch(event) or self.min_wid.touch(event):
|
||||||
self._draw()
|
return
|
||||||
mute(False)
|
for day_btn in self.day_btns:
|
||||||
elif self.hours.touch(event) or self.minutes.touch(event) or \
|
if day_btn.touch(event):
|
||||||
self.active.touch(event):
|
return
|
||||||
pass
|
if self.del_alarm_btn.touch(event):
|
||||||
|
self._remove_alarm(self.page)
|
||||||
def _draw(self):
|
elif self.page == _HOME_PAGE:
|
||||||
"""Draw the display from scratch."""
|
for index, checkbox in enumerate(self.alarm_checks):
|
||||||
draw = wasp.watch.drawable
|
if checkbox.touch(event):
|
||||||
if not self.ringing:
|
if checkbox.state:
|
||||||
draw.fill()
|
self.alarms[index][_ENABLED_IDX] |= _IS_ACTIVE
|
||||||
|
|
||||||
sbar = wasp.system.bar
|
|
||||||
sbar.clock = True
|
|
||||||
sbar.draw()
|
|
||||||
|
|
||||||
draw.set_font(fonts.sans28)
|
|
||||||
draw.string(':', 110, 120-14, width=20)
|
|
||||||
|
|
||||||
self.active.draw()
|
|
||||||
self.hours.draw()
|
|
||||||
self.minutes.draw()
|
|
||||||
else:
|
else:
|
||||||
|
self.alarms[index][_ENABLED_IDX] &= ~_IS_ACTIVE
|
||||||
|
self._draw(index)
|
||||||
|
return
|
||||||
|
for index, alarm in enumerate(self.alarms):
|
||||||
|
# Open edit page for clicked alarms
|
||||||
|
if index < self.num_alarms and event[1] < 190 \
|
||||||
|
and 60 + (index * 45) < event[2] < 60 + ((index + 1) * 45):
|
||||||
|
self.page = index
|
||||||
|
self._draw()
|
||||||
|
return
|
||||||
|
# Add new alarm if plus clicked
|
||||||
|
elif index == self.num_alarms and 60 + (index * 45) < event[2]:
|
||||||
|
self.num_alarms += 1
|
||||||
|
self._draw(index)
|
||||||
|
return
|
||||||
|
|
||||||
|
def _remove_alarm(self, alarm_index):
|
||||||
|
# Shift alarm indices
|
||||||
|
for index in range(alarm_index, 3):
|
||||||
|
self.alarms[index][_HOUR_IDX] = self.alarms[index + 1][_HOUR_IDX]
|
||||||
|
self.alarms[index][_MIN_IDX] = self.alarms[index + 1][_MIN_IDX]
|
||||||
|
self.alarms[index][_ENABLED_IDX] = self.alarms[index + 1][_ENABLED_IDX]
|
||||||
|
self.pending_alarms[index] = self.pending_alarms[index + 1]
|
||||||
|
|
||||||
|
# Set last alarm to default
|
||||||
|
self.alarms[3][_HOUR_IDX] = 8
|
||||||
|
self.alarms[3][_MIN_IDX] = 0
|
||||||
|
self.alarms[3][_ENABLED_IDX] = 0
|
||||||
|
|
||||||
|
self.page = _HOME_PAGE
|
||||||
|
self.num_alarms -= 1
|
||||||
|
self._draw()
|
||||||
|
|
||||||
|
def _save_alarm(self):
|
||||||
|
alarm = self.alarms[self.page]
|
||||||
|
alarm[_HOUR_IDX] = self.hours_wid.value
|
||||||
|
alarm[_MIN_IDX] = self.min_wid.value
|
||||||
|
for day_idx, day_btn in enumerate(self.day_btns):
|
||||||
|
if day_btn.state:
|
||||||
|
alarm[_ENABLED_IDX] |= 1 << day_idx
|
||||||
|
else:
|
||||||
|
alarm[_ENABLED_IDX] &= ~(1 << day_idx)
|
||||||
|
|
||||||
|
self.page = _HOME_PAGE
|
||||||
|
|
||||||
|
def _draw(self, update_alarm_row=-1):
|
||||||
|
if self.page == _RINGING_PAGE:
|
||||||
|
self._draw_ringing_page()
|
||||||
|
elif self.page > _HOME_PAGE:
|
||||||
|
self._draw_edit_page()
|
||||||
|
else:
|
||||||
|
self._draw_home_page(update_alarm_row)
|
||||||
|
|
||||||
|
def _draw_ringing_page(self):
|
||||||
|
draw = wasp.watch.drawable
|
||||||
|
|
||||||
|
draw.set_color(wasp.system.theme('bright'))
|
||||||
draw.fill()
|
draw.fill()
|
||||||
draw.set_font(fonts.sans24)
|
draw.set_font(fonts.sans24)
|
||||||
draw.string("Alarm", 0, 150, width=240)
|
draw.string("Alarm", 0, 150, width=240)
|
||||||
draw.blit(icon, 73, 50)
|
draw.blit(icon, 73, 50)
|
||||||
|
draw.line(35, 1, 35, 239)
|
||||||
|
draw.string('Z', 10, 80)
|
||||||
|
draw.string('z', 10, 110)
|
||||||
|
draw.string('z', 10, 140)
|
||||||
|
|
||||||
|
def _draw_edit_page(self):
|
||||||
|
draw = wasp.watch.drawable
|
||||||
|
alarm = self.alarms[self.page]
|
||||||
|
|
||||||
|
draw.fill()
|
||||||
|
self._draw_system_bar()
|
||||||
|
|
||||||
|
self.hours_wid.value = alarm[_HOUR_IDX]
|
||||||
|
self.min_wid.value = alarm[_MIN_IDX]
|
||||||
|
draw.set_font(fonts.sans28)
|
||||||
|
draw.string(':', 110, 90-14, width=20)
|
||||||
|
|
||||||
|
self.del_alarm_btn.draw()
|
||||||
|
self.hours_wid.draw()
|
||||||
|
self.min_wid.draw()
|
||||||
|
for day_idx, day_btn in enumerate(self.day_btns):
|
||||||
|
day_btn.state = alarm[_ENABLED_IDX] & (1 << day_idx)
|
||||||
|
day_btn.draw()
|
||||||
|
|
||||||
|
def _draw_home_page(self, update_alarm_row=_HOME_PAGE):
|
||||||
|
draw = wasp.watch.drawable
|
||||||
|
if update_alarm_row == _HOME_PAGE:
|
||||||
|
draw.set_color(wasp.system.theme('bright'))
|
||||||
|
draw.fill()
|
||||||
|
self._draw_system_bar()
|
||||||
|
draw.line(0, 50, 240, 50, width=1, color=wasp.system.theme('bright'))
|
||||||
|
|
||||||
|
for index in range(len(self.alarms)):
|
||||||
|
if index < self.num_alarms and (update_alarm_row == _HOME_PAGE or update_alarm_row == index):
|
||||||
|
self._draw_alarm_row(index)
|
||||||
|
elif index == self.num_alarms:
|
||||||
|
# Draw the add button
|
||||||
|
draw.set_color(wasp.system.theme('bright'))
|
||||||
|
draw.set_font(fonts.sans28)
|
||||||
|
draw.string('+', 100, 60 + (index * 45))
|
||||||
|
|
||||||
|
def _draw_alarm_row(self, index):
|
||||||
|
draw = wasp.watch.drawable
|
||||||
|
alarm = self.alarms[index]
|
||||||
|
|
||||||
|
self.alarm_checks[index].state = alarm[_ENABLED_IDX] & _IS_ACTIVE
|
||||||
|
self.alarm_checks[index].draw()
|
||||||
|
|
||||||
|
if self.alarm_checks[index].state:
|
||||||
|
draw.set_color(wasp.system.theme('bright'))
|
||||||
|
else:
|
||||||
|
draw.set_color(wasp.system.theme('mid'))
|
||||||
|
|
||||||
|
draw.set_font(fonts.sans28)
|
||||||
|
draw.string("{:02d}:{:02d}".format(alarm[_HOUR_IDX], alarm[_MIN_IDX]), 10, 60 + (index * 45), width=120)
|
||||||
|
|
||||||
|
draw.set_font(fonts.sans18)
|
||||||
|
draw.string(self._get_repeat_code(alarm[_ENABLED_IDX]), 130, 70 + (index * 45), width=60)
|
||||||
|
|
||||||
|
draw.line(0, 95 + (index * 45), 240, 95 + (index * 45), width=1, color=wasp.system.theme('bright'))
|
||||||
|
|
||||||
|
def _draw_system_bar(self):
|
||||||
|
sbar = wasp.system.bar
|
||||||
|
sbar.clock = True
|
||||||
|
sbar.draw()
|
||||||
|
|
||||||
def _alert(self):
|
def _alert(self):
|
||||||
self.ringing = True
|
self.page = _RINGING_PAGE
|
||||||
wasp.system.wake()
|
wasp.system.wake()
|
||||||
wasp.system.switch(self)
|
wasp.system.switch(self)
|
||||||
|
|
||||||
def _set_current_alarm(self):
|
def _snooze(self):
|
||||||
now = wasp.watch.rtc.get_localtime()
|
now = wasp.watch.rtc.get_localtime()
|
||||||
|
alarm = (now[0], now[1], now[2], now[3], now[4] + 10, now[5], 0, 0, 0)
|
||||||
|
wasp.system.set_alarm(time.mktime(alarm), self._alert)
|
||||||
|
|
||||||
|
def _silence_alarm(self):
|
||||||
|
mute = wasp.watch.display.mute
|
||||||
|
mute(True)
|
||||||
|
self._draw()
|
||||||
|
mute(False)
|
||||||
|
wasp.system.navigate(wasp.EventType.HOME)
|
||||||
|
|
||||||
|
def _set_pending_alarms(self):
|
||||||
|
now = wasp.watch.rtc.get_localtime()
|
||||||
|
for index, alarm in enumerate(self.alarms):
|
||||||
|
if index < self.num_alarms and alarm[_ENABLED_IDX] & _IS_ACTIVE:
|
||||||
yyyy = now[0]
|
yyyy = now[0]
|
||||||
mm = now[1]
|
mm = now[1]
|
||||||
dd = now[2]
|
dd = now[2]
|
||||||
HH = self.hours.value
|
HH = alarm[_HOUR_IDX]
|
||||||
MM = self.minutes.value
|
MM = alarm[_MIN_IDX]
|
||||||
|
|
||||||
|
# If next alarm is tomorrow increment the day
|
||||||
if HH < now[3] or (HH == now[3] and MM <= now[4]):
|
if HH < now[3] or (HH == now[3] and MM <= now[4]):
|
||||||
dd += 1
|
dd += 1
|
||||||
self.current_alarm = (time.mktime((yyyy, mm, dd, HH, MM, 0, 0, 0, 0)))
|
|
||||||
|
pending_time = time.mktime((yyyy, mm, dd, HH, MM, 0, 0, 0, 0))
|
||||||
|
|
||||||
|
# If this is not a one time alarm find the next day of the week that is enabled
|
||||||
|
if alarm[_ENABLED_IDX] & ~_IS_ACTIVE != 0:
|
||||||
|
for _i in range(7):
|
||||||
|
if (1 << time.localtime(pending_time)[6]) & alarm[_ENABLED_IDX] == 0:
|
||||||
|
dd += 1
|
||||||
|
pending_time = time.mktime((yyyy, mm, dd, HH, MM, 0, 0, 0, 0))
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
self.pending_alarms[index] = pending_time
|
||||||
|
wasp.system.set_alarm(pending_time, self._alert)
|
||||||
|
else:
|
||||||
|
self.pending_alarms[index] = 0.0
|
||||||
|
|
||||||
|
def _deactivate_pending_alarms(self):
|
||||||
|
now = wasp.watch.rtc.get_localtime()
|
||||||
|
now = time.mktime((now[0], now[1], now[2], now[3], now[4], now[5], 0, 0, 0))
|
||||||
|
for index, alarm in enumerate(self.alarms):
|
||||||
|
pending_alarm = self.pending_alarms[index]
|
||||||
|
if not pending_alarm == 0.0:
|
||||||
|
wasp.system.cancel_alarm(pending_alarm, self._alert)
|
||||||
|
# If this is a one time alarm and in the past disable it
|
||||||
|
if alarm[_ENABLED_IDX] & ~_IS_ACTIVE == 0 and pending_alarm <= now:
|
||||||
|
alarm[_ENABLED_IDX] = 0
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_repeat_code(days):
|
||||||
|
# Ignore the is_active bit
|
||||||
|
days = days & ~_IS_ACTIVE
|
||||||
|
|
||||||
|
if days == _WEEKDAYS:
|
||||||
|
return "wkds"
|
||||||
|
elif days == _WEEKENDS:
|
||||||
|
return "wkns"
|
||||||
|
elif days == _EVERY_DAY:
|
||||||
|
return "evry"
|
||||||
|
elif days == 0:
|
||||||
|
return "once"
|
||||||
|
else:
|
||||||
|
return "cust"
|
|
@ -1,6 +1,6 @@
|
||||||
# Code generated by font_to_py.py.
|
# Code generated by font_to_py.py.
|
||||||
# Font: DejaVuSans.ttf
|
# Font: DejaVuSans.ttf Char set: +-0123456789:
|
||||||
# Cmd: ./tools/micropython-font-to-py/font_to_py.py /usr/share/fonts/dejavu/DejaVuSans.ttf --xmap 28 -e 58 -s 48 -l 58 wasp/fonts/sans28.py
|
# Cmd: tools/micropython-font-to-py/font_to_py.py /usr/share/fonts/dejavu/DejaVuSans.ttf --xmap 28 -e 58 -c 0123456789:+- wasp/fonts/sans28.py
|
||||||
version = '0.33'
|
version = '0.33'
|
||||||
|
|
||||||
def height():
|
def height():
|
||||||
|
@ -10,7 +10,7 @@ def baseline():
|
||||||
return 27
|
return 27
|
||||||
|
|
||||||
def max_width():
|
def max_width():
|
||||||
return 24
|
return 31
|
||||||
|
|
||||||
def hmap():
|
def hmap():
|
||||||
return True
|
return True
|
||||||
|
@ -22,7 +22,7 @@ def monospaced():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def min_ch():
|
def min_ch():
|
||||||
return 48
|
return 43
|
||||||
|
|
||||||
def max_ch():
|
def max_ch():
|
||||||
return 58
|
return 58
|
||||||
|
@ -31,66 +31,78 @@ _font =\
|
||||||
b'\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
b'\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
b'\x00\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x00\x00\x00\x00'\
|
b'\x00\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x00\x00\x00\x00'\
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00'\
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00'\
|
||||||
b'\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x18\x00\x00\xfe\x00\x03\xff\x80'\
|
b'\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x1f\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
b'\x07\xff\xc0\x0f\x83\xe0\x0f\x01\xe0\x1e\x00\xf0\x1e\x00\xf0\x1e'\
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x00\x00\x03'\
|
||||||
b'\x00\xf0\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78\x3c\x00'\
|
b'\x80\x00\x00\x03\x80\x00\x00\x03\x80\x00\x00\x03\x80\x00\x00\x03'\
|
||||||
|
b'\x80\x00\x00\x03\x80\x00\x00\x03\x80\x00\x00\x03\x80\x00\x00\x03'\
|
||||||
|
b'\x80\x00\x0f\xff\xff\xe0\x0f\xff\xff\xe0\x0f\xff\xff\xe0\x00\x03'\
|
||||||
|
b'\x80\x00\x00\x03\x80\x00\x00\x03\x80\x00\x00\x03\x80\x00\x00\x03'\
|
||||||
|
b'\x80\x00\x00\x03\x80\x00\x00\x03\x80\x00\x00\x03\x80\x00\x00\x03'\
|
||||||
|
b'\x80\x00\x00\x03\x80\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x3f\xf0\x3f\xf0\x3f\xf0\x00\x00\x00\x00'\
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00'\
|
||||||
|
b'\x00\xfe\x00\x03\xff\x80\x07\xff\xc0\x0f\x83\xe0\x0f\x01\xe0\x1e'\
|
||||||
|
b'\x00\xf0\x1e\x00\xf0\x1e\x00\xf0\x3c\x00\x78\x3c\x00\x78\x3c\x00'\
|
||||||
b'\x78\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78'\
|
b'\x78\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78'\
|
||||||
b'\x3c\x00\x78\x1e\x00\xf0\x1e\x00\xf0\x1e\x00\xf0\x0f\x01\xe0\x0f'\
|
b'\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78\x1e\x00\xf0\x1e\x00\xf0\x1e'\
|
||||||
b'\x83\xe0\x07\xff\xc0\x03\xff\x80\x00\xfe\x00\x18\x00\x00\xfe\x00'\
|
b'\x00\xf0\x0f\x01\xe0\x0f\x83\xe0\x07\xff\xc0\x03\xff\x80\x00\xfe'\
|
||||||
b'\x07\xfe\x00\x07\xfe\x00\x07\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00'\
|
b'\x00\x18\x00\x00\xfe\x00\x07\xfe\x00\x07\xfe\x00\x07\x1e\x00\x00'\
|
||||||
b'\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e'\
|
b'\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e'\
|
||||||
b'\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00'\
|
b'\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00'\
|
||||||
b'\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00'\
|
b'\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00'\
|
||||||
b'\x1e\x00\x00\x1e\x00\x07\xff\xf8\x07\xff\xf8\x07\xff\xf8\x18\x00'\
|
b'\x1e\x00\x00\x1e\x00\x00\x1e\x00\x00\x1e\x00\x07\xff\xf8\x07\xff'\
|
||||||
b'\x01\xfc\x00\x0f\xff\x80\x1f\xff\xc0\x1f\x07\xe0\x18\x01\xe0\x10'\
|
b'\xf8\x07\xff\xf8\x18\x00\x01\xfc\x00\x0f\xff\x80\x1f\xff\xc0\x1f'\
|
||||||
b'\x01\xf0\x00\x00\xf0\x00\x00\xf0\x00\x00\xf0\x00\x00\xf0\x00\x01'\
|
b'\x07\xe0\x18\x01\xe0\x10\x01\xf0\x00\x00\xf0\x00\x00\xf0\x00\x00'\
|
||||||
b'\xf0\x00\x01\xe0\x00\x03\xe0\x00\x07\xc0\x00\x0f\x80\x00\x1f\x00'\
|
b'\xf0\x00\x00\xf0\x00\x01\xf0\x00\x01\xe0\x00\x03\xe0\x00\x07\xc0'\
|
||||||
b'\x00\x3e\x00\x00\x7e\x00\x00\xfc\x00\x01\xf8\x00\x03\xf0\x00\x07'\
|
b'\x00\x0f\x80\x00\x1f\x00\x00\x3e\x00\x00\x7e\x00\x00\xfc\x00\x01'\
|
||||||
b'\xe0\x00\x0f\xc0\x00\x1f\x80\x00\x1f\xff\xf0\x1f\xff\xf0\x1f\xff'\
|
b'\xf8\x00\x03\xf0\x00\x07\xe0\x00\x0f\xc0\x00\x1f\x80\x00\x1f\xff'\
|
||||||
b'\xf0\x18\x00\x03\xfe\x00\x0f\xff\x80\x0f\xff\xc0\x0c\x03\xe0\x00'\
|
b'\xf0\x1f\xff\xf0\x1f\xff\xf0\x18\x00\x03\xfe\x00\x0f\xff\x80\x0f'\
|
||||||
b'\x01\xf0\x00\x00\xf0\x00\x00\xf0\x00\x00\xf0\x00\x00\xf0\x00\x01'\
|
b'\xff\xc0\x0c\x03\xe0\x00\x01\xf0\x00\x00\xf0\x00\x00\xf0\x00\x00'\
|
||||||
b'\xe0\x00\x03\xc0\x00\xff\x80\x00\xfe\x00\x00\xff\xc0\x00\x03\xe0'\
|
b'\xf0\x00\x00\xf0\x00\x01\xe0\x00\x03\xc0\x00\xff\x80\x00\xfe\x00'\
|
||||||
b'\x00\x00\xf0\x00\x00\xf8\x00\x00\x78\x00\x00\x78\x00\x00\x78\x00'\
|
b'\x00\xff\xc0\x00\x03\xe0\x00\x00\xf0\x00\x00\xf8\x00\x00\x78\x00'\
|
||||||
b'\x00\x78\x00\x00\xf8\x00\x01\xf0\x18\x03\xf0\x1f\xff\xe0\x1f\xff'\
|
b'\x00\x78\x00\x00\x78\x00\x00\x78\x00\x00\xf8\x00\x01\xf0\x18\x03'\
|
||||||
b'\x80\x07\xfe\x00\x18\x00\x00\x07\xc0\x00\x0f\xc0\x00\x0f\xc0\x00'\
|
b'\xf0\x1f\xff\xe0\x1f\xff\x80\x07\xfe\x00\x18\x00\x00\x07\xc0\x00'\
|
||||||
b'\x1f\xc0\x00\x3b\xc0\x00\x3b\xc0\x00\x73\xc0\x00\xf3\xc0\x00\xe3'\
|
b'\x0f\xc0\x00\x0f\xc0\x00\x1f\xc0\x00\x3b\xc0\x00\x3b\xc0\x00\x73'\
|
||||||
b'\xc0\x01\xc3\xc0\x03\xc3\xc0\x03\x83\xc0\x07\x03\xc0\x07\x03\xc0'\
|
b'\xc0\x00\xf3\xc0\x00\xe3\xc0\x01\xc3\xc0\x03\xc3\xc0\x03\x83\xc0'\
|
||||||
b'\x0e\x03\xc0\x1e\x03\xc0\x1c\x03\xc0\x38\x03\xc0\x3f\xff\xfc\x3f'\
|
b'\x07\x03\xc0\x07\x03\xc0\x0e\x03\xc0\x1e\x03\xc0\x1c\x03\xc0\x38'\
|
||||||
b'\xff\xfc\x3f\xff\xfc\x00\x03\xc0\x00\x03\xc0\x00\x03\xc0\x00\x03'\
|
b'\x03\xc0\x3f\xff\xfc\x3f\xff\xfc\x3f\xff\xfc\x00\x03\xc0\x00\x03'\
|
||||||
b'\xc0\x00\x03\xc0\x00\x03\xc0\x18\x00\x0f\xff\xc0\x0f\xff\xc0\x0f'\
|
b'\xc0\x00\x03\xc0\x00\x03\xc0\x00\x03\xc0\x00\x03\xc0\x18\x00\x0f'\
|
||||||
b'\xff\xc0\x0f\x00\x00\x0f\x00\x00\x0f\x00\x00\x0f\x00\x00\x0f\x00'\
|
b'\xff\xc0\x0f\xff\xc0\x0f\xff\xc0\x0f\x00\x00\x0f\x00\x00\x0f\x00'\
|
||||||
b'\x00\x0f\x00\x00\x0f\xfc\x00\x0f\xff\x00\x0f\xff\xc0\x0c\x0f\xc0'\
|
b'\x00\x0f\x00\x00\x0f\x00\x00\x0f\x00\x00\x0f\xfc\x00\x0f\xff\x00'\
|
||||||
b'\x00\x03\xe0\x00\x01\xe0\x00\x00\xf0\x00\x00\xf0\x00\x00\xf0\x00'\
|
b'\x0f\xff\xc0\x0c\x0f\xc0\x00\x03\xe0\x00\x01\xe0\x00\x00\xf0\x00'\
|
||||||
b'\x00\xf0\x00\x00\xf0\x00\x00\xf0\x00\x01\xe0\x00\x03\xe0\x18\x07'\
|
b'\x00\xf0\x00\x00\xf0\x00\x00\xf0\x00\x00\xf0\x00\x00\xf0\x00\x01'\
|
||||||
b'\xc0\x1f\xff\xc0\x1f\xff\x00\x07\xfc\x00\x18\x00\x00\x3f\x80\x00'\
|
b'\xe0\x00\x03\xe0\x18\x07\xc0\x1f\xff\xc0\x1f\xff\x00\x07\xfc\x00'\
|
||||||
b'\xff\xe0\x03\xff\xe0\x07\xe0\x60\x0f\x80\x00\x0f\x00\x00\x1f\x00'\
|
b'\x18\x00\x00\x3f\x80\x00\xff\xe0\x03\xff\xe0\x07\xe0\x60\x0f\x80'\
|
||||||
b'\x00\x1e\x00\x00\x1e\x00\x00\x3c\x00\x00\x3c\x7f\x00\x3c\xff\xc0'\
|
b'\x00\x0f\x00\x00\x1f\x00\x00\x1e\x00\x00\x1e\x00\x00\x3c\x00\x00'\
|
||||||
b'\x3d\xff\xe0\x3f\x83\xf0\x3e\x00\xf0\x3e\x00\xf8\x3c\x00\x78\x3c'\
|
b'\x3c\x7f\x00\x3c\xff\xc0\x3d\xff\xe0\x3f\x83\xf0\x3e\x00\xf0\x3e'\
|
||||||
b'\x00\x78\x3c\x00\x78\x1c\x00\x78\x1c\x00\x78\x1e\x00\xf8\x0e\x00'\
|
b'\x00\xf8\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78\x1c\x00\x78\x1c\x00'\
|
||||||
b'\xf0\x0f\x83\xf0\x07\xff\xe0\x03\xff\x80\x00\xfe\x00\x18\x00\x1f'\
|
b'\x78\x1e\x00\xf8\x0e\x00\xf0\x0f\x83\xf0\x07\xff\xe0\x03\xff\x80'\
|
||||||
b'\xff\xf0\x1f\xff\xf0\x1f\xff\xf0\x00\x01\xe0\x00\x01\xe0\x00\x03'\
|
b'\x00\xfe\x00\x18\x00\x1f\xff\xf0\x1f\xff\xf0\x1f\xff\xf0\x00\x01'\
|
||||||
b'\xe0\x00\x03\xc0\x00\x03\xc0\x00\x07\xc0\x00\x07\x80\x00\x07\x80'\
|
b'\xe0\x00\x01\xe0\x00\x03\xe0\x00\x03\xc0\x00\x03\xc0\x00\x07\xc0'\
|
||||||
b'\x00\x0f\x80\x00\x0f\x00\x00\x0f\x00\x00\x1f\x00\x00\x1e\x00\x00'\
|
b'\x00\x07\x80\x00\x07\x80\x00\x0f\x80\x00\x0f\x00\x00\x0f\x00\x00'\
|
||||||
b'\x1e\x00\x00\x3e\x00\x00\x3c\x00\x00\x3c\x00\x00\x78\x00\x00\x78'\
|
b'\x1f\x00\x00\x1e\x00\x00\x1e\x00\x00\x3e\x00\x00\x3c\x00\x00\x3c'\
|
||||||
b'\x00\x00\x78\x00\x00\xf0\x00\x00\xf0\x00\x00\xf0\x00\x01\xe0\x00'\
|
b'\x00\x00\x78\x00\x00\x78\x00\x00\x78\x00\x00\xf0\x00\x00\xf0\x00'\
|
||||||
b'\x18\x00\x00\xfe\x00\x03\xff\x80\x0f\xff\xe0\x0f\x83\xe0\x1f\x01'\
|
b'\x00\xf0\x00\x01\xe0\x00\x18\x00\x00\xfe\x00\x03\xff\x80\x0f\xff'\
|
||||||
b'\xf0\x1e\x00\xf0\x1e\x00\xf0\x1e\x00\xf0\x1e\x00\xf0\x0f\x01\xe0'\
|
b'\xe0\x0f\x83\xe0\x1f\x01\xf0\x1e\x00\xf0\x1e\x00\xf0\x1e\x00\xf0'\
|
||||||
b'\x07\x83\xc0\x03\xff\x80\x00\xfe\x00\x07\xff\xc0\x0f\x83\xe0\x1e'\
|
b'\x1e\x00\xf0\x0f\x01\xe0\x07\x83\xc0\x03\xff\x80\x00\xfe\x00\x07'\
|
||||||
b'\x00\xf0\x3e\x00\xf0\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78\x3c\x00'\
|
b'\xff\xc0\x0f\x83\xe0\x1e\x00\xf0\x3e\x00\xf0\x3c\x00\x78\x3c\x00'\
|
||||||
b'\x78\x3e\x00\xf8\x1e\x00\xf0\x1f\x83\xf0\x0f\xff\xe0\x07\xff\xc0'\
|
b'\x78\x3c\x00\x78\x3c\x00\x78\x3e\x00\xf8\x1e\x00\xf0\x1f\x83\xf0'\
|
||||||
b'\x00\xfe\x00\x18\x00\x00\xfe\x00\x03\xff\x00\x0f\xff\xc0\x1f\x83'\
|
b'\x0f\xff\xe0\x07\xff\xc0\x00\xfe\x00\x18\x00\x00\xfe\x00\x03\xff'\
|
||||||
b'\xe0\x1e\x00\xe0\x3e\x00\xf0\x3c\x00\x70\x3c\x00\x70\x3c\x00\x78'\
|
b'\x00\x0f\xff\xc0\x1f\x83\xe0\x1e\x00\xe0\x3e\x00\xf0\x3c\x00\x70'\
|
||||||
b'\x3c\x00\x78\x3c\x00\x78\x3e\x00\xf8\x1e\x00\xf8\x1f\x83\xf8\x0f'\
|
b'\x3c\x00\x70\x3c\x00\x78\x3c\x00\x78\x3c\x00\x78\x3e\x00\xf8\x1e'\
|
||||||
b'\xff\x78\x07\xfe\x78\x01\xfc\x78\x00\x00\xf8\x00\x00\xf0\x00\x00'\
|
b'\x00\xf8\x1f\x83\xf8\x0f\xff\x78\x07\xfe\x78\x01\xfc\x78\x00\x00'\
|
||||||
b'\xf0\x00\x01\xf0\x00\x01\xe0\x00\x03\xe0\x0c\x0f\xc0\x0f\xff\x80'\
|
b'\xf8\x00\x00\xf0\x00\x00\xf0\x00\x01\xf0\x00\x01\xe0\x00\x03\xe0'\
|
||||||
b'\x0f\xfe\x00\x03\xf8\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
b'\x0c\x0f\xc0\x0f\xff\x80\x0f\xfe\x00\x03\xf8\x00\x0c\x00\x00\x00'\
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00'\
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00'\
|
||||||
b'\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
b'\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
b'\x00\x00\x00\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00'
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x0f\x00\x0f\x00'\
|
||||||
|
b'\x0f\x00\x0f\x00'
|
||||||
|
|
||||||
_index =\
|
_index =\
|
||||||
b'\x00\x00\x38\x00\x8b\x00\xde\x00\x31\x01\x84\x01\xd7\x01\x2a\x02'\
|
b'\x00\x00\x38\x00\x00\x00\xa6\x00\x00\x00\x00\x00\xde\x00\x31\x01'\
|
||||||
b'\x7d\x02\xd0\x02\x23\x03\x76\x03\xae\x03'
|
b'\x84\x01\xd7\x01\x2a\x02\x7d\x02\xd0\x02\x23\x03\x76\x03\xc9\x03'\
|
||||||
|
b'\x1c\x04\x54\x04'
|
||||||
|
|
||||||
_mvfont = memoryview(_font)
|
_mvfont = memoryview(_font)
|
||||||
_mvi = memoryview(_index)
|
_mvi = memoryview(_index)
|
||||||
|
@ -98,7 +110,7 @@ ifb = lambda l : l[0] | (l[1] << 8)
|
||||||
|
|
||||||
def get_ch(ch):
|
def get_ch(ch):
|
||||||
oc = ord(ch)
|
oc = ord(ch)
|
||||||
ioff = 2 * (oc - 48 + 1) if oc >= 48 and oc <= 58 else 0
|
ioff = 2 * (oc - 43 + 1) if oc >= 43 and oc <= 58 else 0
|
||||||
doff = ifb(_mvi[ioff : ])
|
doff = ifb(_mvi[ioff : ])
|
||||||
width = ifb(_mvfont[doff : ])
|
width = ifb(_mvfont[doff : ])
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Code generated by font_to_py.py.
|
# Code generated by font_to_py.py.
|
||||||
# Font: DejaVuSans.ttf
|
# Font: DejaVuSans.ttf Char set: +-0123456789:
|
||||||
# Cmd: tools/micropython-font-to-py/font_to_py.py /usr/share/fonts/dejavu/DejaVuSans.ttf --xmap 36 -e 58 -s 48 -l 58 wasp/fonts/sans36.py
|
# Cmd: tools/micropython-font-to-py/font_to_py.py /usr/share/fonts/dejavu/DejaVuSans.ttf --xmap 36 -e 58 -c 0123456789:+- wasp/fonts/sans36.py
|
||||||
version = '0.33'
|
version = '0.33'
|
||||||
|
|
||||||
def height():
|
def height():
|
||||||
|
@ -10,7 +10,7 @@ def baseline():
|
||||||
return 35
|
return 35
|
||||||
|
|
||||||
def max_width():
|
def max_width():
|
||||||
return 30
|
return 39
|
||||||
|
|
||||||
def hmap():
|
def hmap():
|
||||||
return True
|
return True
|
||||||
|
@ -22,7 +22,7 @@ def monospaced():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def min_ch():
|
def min_ch():
|
||||||
return 48
|
return 43
|
||||||
|
|
||||||
def max_ch():
|
def max_ch():
|
||||||
return 58
|
return 58
|
||||||
|
@ -32,107 +32,126 @@ b'\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xe0\x03\xe0\x03\xe0\x03\xe0'\
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xe0\x03\xe0\x03\xe0\x03\xe0'\
|
||||||
b'\x03\xe0\x03\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
b'\x03\xe0\x03\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xe0\x03\xe0'\
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xe0\x03\xe0'\
|
||||||
b'\x03\xe0\x03\xe0\x03\xe0\x03\xe0\x00\x00\x1e\x00\x00\x0f\xc0\x00'\
|
b'\x03\xe0\x03\xe0\x03\xe0\x03\xe0\x00\x00\x27\x00\x00\x00\x00\x00'\
|
||||||
b'\x00\x7f\xf8\x00\x00\xff\xfc\x00\x01\xff\xfe\x00\x03\xf0\x3f\x00'\
|
|
||||||
b'\x03\xe0\x1f\x00\x07\xc0\x0f\x80\x07\x80\x07\x80\x0f\x80\x07\xc0'\
|
|
||||||
b'\x0f\x00\x03\xc0\x0f\x00\x03\xc0\x0f\x00\x03\xc0\x1e\x00\x01\xe0'\
|
|
||||||
b'\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0'\
|
|
||||||
b'\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0'\
|
|
||||||
b'\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x0f\x00\x03\xc0'\
|
|
||||||
b'\x0f\x00\x03\xc0\x0f\x00\x03\xc0\x0f\x00\x07\xc0\x07\x80\x07\x80'\
|
|
||||||
b'\x07\xc0\x0f\x80\x07\xe0\x1f\x00\x03\xf0\x3f\x00\x01\xff\xfe\x00'\
|
|
||||||
b'\x00\xff\xfc\x00\x00\x7f\xf8\x00\x00\x1f\xe0\x00\x1e\x00\x00\x00'\
|
|
||||||
b'\x00\x00\x00\x1f\x80\x00\x01\xff\x80\x00\x07\xff\x80\x00\x07\xff'\
|
|
||||||
b'\x80\x00\x07\xe7\x80\x00\x06\x07\x80\x00\x00\x07\x80\x00\x00\x07'\
|
|
||||||
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07'\
|
|
||||||
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07'\
|
|
||||||
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07'\
|
|
||||||
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07'\
|
|
||||||
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07'\
|
|
||||||
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x07\xff\xff\x80\x07\xff'\
|
|
||||||
b'\xff\x80\x07\xff\xff\x80\x07\xff\xff\x80\x00\x00\x00\x00\x1e\x00'\
|
|
||||||
b'\x00\x7f\xc0\x00\x03\xff\xf8\x00\x0f\xff\xfc\x00\x0f\xff\xff\x00'\
|
|
||||||
b'\x0f\xe0\x3f\x00\x0e\x00\x0f\x80\x08\x00\x07\x80\x00\x00\x07\xc0'\
|
|
||||||
b'\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0'\
|
|
||||||
b'\x00\x00\x03\xc0\x00\x00\x07\x80\x00\x00\x0f\x80\x00\x00\x0f\x00'\
|
|
||||||
b'\x00\x00\x1f\x00\x00\x00\x3e\x00\x00\x00\x7c\x00\x00\x00\xf8\x00'\
|
|
||||||
b'\x00\x01\xf0\x00\x00\x03\xe0\x00\x00\x07\xc0\x00\x00\x0f\x80\x00'\
|
|
||||||
b'\x00\x1f\x00\x00\x00\x3e\x00\x00\x00\x7c\x00\x00\x00\xf8\x00\x00'\
|
|
||||||
b'\x01\xf0\x00\x00\x03\xe0\x00\x00\x07\xc0\x00\x00\x0f\xff\xff\xc0'\
|
|
||||||
b'\x0f\xff\xff\xc0\x0f\xff\xff\xc0\x0f\xff\xff\xc0\x00\x00\x00\x00'\
|
|
||||||
b'\x1e\x00\x00\xff\xe0\x00\x07\xff\xf8\x00\x07\xff\xfe\x00\x07\xff'\
|
|
||||||
b'\xff\x00\x07\x00\x3f\x80\x00\x00\x0f\x80\x00\x00\x07\xc0\x00\x00'\
|
|
||||||
b'\x03\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00'\
|
|
||||||
b'\x03\xc0\x00\x00\x07\x80\x00\x00\x0f\x80\x00\x00\x3f\x00\x00\x3f'\
|
|
||||||
b'\xfe\x00\x00\x3f\xf8\x00\x00\x3f\xfc\x00\x00\x3f\xff\x00\x00\x00'\
|
|
||||||
b'\x3f\x80\x00\x00\x0f\xc0\x00\x00\x03\xc0\x00\x00\x03\xe0\x00\x00'\
|
|
||||||
b'\x01\xe0\x00\x00\x01\xe0\x00\x00\x01\xe0\x00\x00\x01\xe0\x00\x00'\
|
|
||||||
b'\x01\xe0\x00\x00\x03\xe0\x00\x00\x07\xc0\x08\x00\x0f\xc0\x0f\x00'\
|
|
||||||
b'\x3f\x80\x0f\xff\xff\x00\x0f\xff\xfe\x00\x07\xff\xf8\x00\x00\x7f'\
|
|
||||||
b'\xc0\x00\x1e\x00\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x01\xfc\x00'\
|
|
||||||
b'\x00\x01\xfc\x00\x00\x03\xfc\x00\x00\x07\xbc\x00\x00\x07\x3c\x00'\
|
|
||||||
b'\x00\x0f\x3c\x00\x00\x1e\x3c\x00\x00\x1e\x3c\x00\x00\x3c\x3c\x00'\
|
|
||||||
b'\x00\x78\x3c\x00\x00\x78\x3c\x00\x00\xf0\x3c\x00\x01\xe0\x3c\x00'\
|
|
||||||
b'\x01\xe0\x3c\x00\x03\xc0\x3c\x00\x07\x80\x3c\x00\x07\x80\x3c\x00'\
|
|
||||||
b'\x0f\x00\x3c\x00\x1f\x00\x3c\x00\x1e\x00\x3c\x00\x3c\x00\x3c\x00'\
|
|
||||||
b'\x3f\xff\xff\xe0\x3f\xff\xff\xe0\x3f\xff\xff\xe0\x3f\xff\xff\xe0'\
|
|
||||||
b'\x00\x00\x3c\x00\x00\x00\x3c\x00\x00\x00\x3c\x00\x00\x00\x3c\x00'\
|
|
||||||
b'\x00\x00\x3c\x00\x00\x00\x3c\x00\x00\x00\x3c\x00\x00\x00\x3c\x00'\
|
|
||||||
b'\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x07\xff\xfe\x00\x07\xff'\
|
|
||||||
b'\xfe\x00\x07\xff\xfe\x00\x07\xff\xfe\x00\x07\x80\x00\x00\x07\x80'\
|
|
||||||
b'\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80'\
|
|
||||||
b'\x00\x00\x07\x80\x00\x00\x07\xbf\x80\x00\x07\xff\xf0\x00\x07\xff'\
|
|
||||||
b'\xfc\x00\x07\xff\xfe\x00\x07\x80\xff\x00\x04\x00\x1f\x00\x00\x00'\
|
|
||||||
b'\x0f\x80\x00\x00\x07\x80\x00\x00\x07\xc0\x00\x00\x03\xc0\x00\x00'\
|
|
||||||
b'\x03\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00'\
|
|
||||||
b'\x03\xc0\x00\x00\x07\xc0\x00\x00\x07\x80\x00\x00\x0f\x80\x08\x00'\
|
|
||||||
b'\x1f\x00\x0f\x00\x7f\x00\x0f\xff\xfe\x00\x0f\xff\xfc\x00\x0f\xff'\
|
|
||||||
b'\xf0\x00\x01\xff\x80\x00\x1e\x00\x00\x03\xfe\x00\x00\x1f\xff\x80'\
|
|
||||||
b'\x00\x7f\xff\x80\x00\xff\xff\x80\x01\xfc\x01\x80\x03\xf0\x00\x00'\
|
|
||||||
b'\x03\xe0\x00\x00\x07\xc0\x00\x00\x07\x80\x00\x00\x0f\x00\x00\x00'\
|
|
||||||
b'\x0f\x00\x00\x00\x0f\x00\x00\x00\x0f\x0f\xe0\x00\x1e\x3f\xfc\x00'\
|
|
||||||
b'\x1e\x7f\xfe\x00\x1e\xff\xff\x00\x1f\xf8\x3f\x80\x1f\xe0\x0f\x80'\
|
|
||||||
b'\x1f\xc0\x07\xc0\x1f\x80\x03\xc0\x1f\x80\x03\xe0\x1f\x00\x01\xe0'\
|
|
||||||
b'\x1f\x00\x01\xe0\x1f\x00\x01\xe0\x0f\x00\x01\xe0\x0f\x00\x01\xe0'\
|
|
||||||
b'\x0f\x00\x01\xe0\x0f\x80\x03\xe0\x07\x80\x03\xc0\x07\xc0\x07\xc0'\
|
|
||||||
b'\x03\xe0\x0f\x80\x03\xf8\x3f\x80\x01\xff\xff\x00\x00\xff\xfe\x00'\
|
|
||||||
b'\x00\x7f\xfc\x00\x00\x0f\xe0\x00\x1e\x00\x00\x00\x00\x00\x0f\xff'\
|
|
||||||
b'\xff\xc0\x0f\xff\xff\xc0\x0f\xff\xff\xc0\x0f\xff\xff\x80\x00\x00'\
|
|
||||||
b'\x07\x80\x00\x00\x0f\x80\x00\x00\x0f\x00\x00\x00\x1f\x00\x00\x00'\
|
|
||||||
b'\x1e\x00\x00\x00\x1e\x00\x00\x00\x3e\x00\x00\x00\x3c\x00\x00\x00'\
|
|
||||||
b'\x3c\x00\x00\x00\x78\x00\x00\x00\x78\x00\x00\x00\xf8\x00\x00\x00'\
|
|
||||||
b'\xf0\x00\x00\x00\xf0\x00\x00\x01\xe0\x00\x00\x01\xe0\x00\x00\x03'\
|
|
||||||
b'\xe0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x07\x80\x00\x00\x07'\
|
|
||||||
b'\x80\x00\x00\x0f\x80\x00\x00\x0f\x00\x00\x00\x0f\x00\x00\x00\x1e'\
|
|
||||||
b'\x00\x00\x00\x1e\x00\x00\x00\x3e\x00\x00\x00\x3c\x00\x00\x00\x3c'\
|
|
||||||
b'\x00\x00\x00\x78\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x1f\xe0\x00'\
|
|
||||||
b'\x00\xff\xfc\x00\x01\xff\xfe\x00\x03\xff\xff\x00\x07\xf0\x3f\x80'\
|
|
||||||
b'\x07\xc0\x0f\x80\x0f\x80\x07\xc0\x0f\x00\x03\xc0\x0f\x00\x03\xc0'\
|
|
||||||
b'\x0f\x00\x03\xc0\x0f\x00\x03\xc0\x0f\x00\x03\xc0\x07\x80\x07\x80'\
|
|
||||||
b'\x07\xc0\x0f\x80\x03\xf0\x3f\x00\x01\xff\xfe\x00\x00\x7f\xf8\x00'\
|
|
||||||
b'\x00\xff\xfc\x00\x03\xff\xff\x00\x07\xe0\x1f\x80\x0f\x80\x07\xc0'\
|
|
||||||
b'\x0f\x00\x03\xc0\x1f\x00\x03\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0'\
|
|
||||||
b'\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1f\x00\x03\xe0'\
|
|
||||||
b'\x0f\x00\x03\xc0\x0f\x80\x07\xc0\x0f\xe0\x1f\x80\x07\xff\xff\x80'\
|
|
||||||
b'\x03\xff\xff\x00\x00\xff\xfc\x00\x00\x1f\xe0\x00\x1e\x00\x00\x1f'\
|
|
||||||
b'\xc0\x00\x00\xff\xf0\x00\x01\xff\xfc\x00\x03\xff\xfe\x00\x07\xf0'\
|
|
||||||
b'\x7f\x00\x0f\xc0\x1f\x00\x0f\x80\x0f\x80\x0f\x00\x07\x80\x1f\x00'\
|
|
||||||
b'\x07\xc0\x1e\x00\x03\xc0\x1e\x00\x03\xc0\x1e\x00\x03\xc0\x1e\x00'\
|
|
||||||
b'\x03\xe0\x1e\x00\x03\xe0\x1e\x00\x03\xe0\x1f\x00\x07\xe0\x0f\x00'\
|
|
||||||
b'\x07\xe0\x0f\x80\x0f\xe0\x0f\xc0\x1f\xe0\x07\xf0\x7f\xe0\x03\xff'\
|
|
||||||
b'\xfd\xe0\x01\xff\xf9\xe0\x00\xff\xf1\xe0\x00\x1f\xc3\xc0\x00\x00'\
|
|
||||||
b'\x03\xc0\x00\x00\x03\xc0\x00\x00\x07\xc0\x00\x00\x07\x80\x00\x00'\
|
|
||||||
b'\x0f\x80\x00\x00\x1f\x00\x00\x00\x3f\x00\x06\x00\xfe\x00\x07\xff'\
|
|
||||||
b'\xfc\x00\x07\xff\xf8\x00\x07\xff\xe0\x00\x01\xff\x00\x00\x10\x00'\
|
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
b'\x00\x00\x00\x00\x00\x00\x03\xe0\x03\xe0\x03\xe0\x03\xe0\x03\xe0'\
|
b'\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x3c\x00\x00\x00'\
|
||||||
b'\x03\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
b'\x00\x3c\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x3c\x00\x00\x00\x00'\
|
||||||
|
b'\x3c\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x3c'\
|
||||||
|
b'\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x3c\x00'\
|
||||||
|
b'\x00\x00\x00\x3c\x00\x00\x07\xff\xff\xff\xe0\x07\xff\xff\xff\xe0'\
|
||||||
|
b'\x07\xff\xff\xff\xe0\x07\xff\xff\xff\xe0\x00\x00\x3c\x00\x00\x00'\
|
||||||
|
b'\x00\x3c\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x3c\x00\x00\x00\x00'\
|
||||||
|
b'\x3c\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x3c'\
|
||||||
|
b'\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x3c\x00'\
|
||||||
|
b'\x00\x00\x00\x3c\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
|
b'\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc'\
|
||||||
|
b'\x00\x3f\xfc\x00\x3f\xfc\x00\x3f\xfc\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00'\
|
||||||
|
b'\x00\x0f\xc0\x00\x00\x7f\xf8\x00\x00\xff\xfc\x00\x01\xff\xfe\x00'\
|
||||||
|
b'\x03\xf0\x3f\x00\x03\xe0\x1f\x00\x07\xc0\x0f\x80\x07\x80\x07\x80'\
|
||||||
|
b'\x0f\x80\x07\xc0\x0f\x00\x03\xc0\x0f\x00\x03\xc0\x1f\x00\x03\xc0'\
|
||||||
|
b'\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0'\
|
||||||
|
b'\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0'\
|
||||||
|
b'\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0'\
|
||||||
|
b'\x1f\x00\x03\xc0\x0f\x00\x03\xc0\x0f\x00\x03\xc0\x0f\x80\x07\xc0'\
|
||||||
|
b'\x07\x80\x07\x80\x07\xc0\x0f\x80\x03\xe0\x1f\x00\x03\xf0\x3f\x00'\
|
||||||
|
b'\x01\xff\xfe\x00\x00\xff\xfc\x00\x00\x7f\xf8\x00\x00\x1f\xc0\x00'\
|
||||||
|
b'\x1e\x00\x00\x00\x00\x00\x00\x1f\x80\x00\x01\xff\x80\x00\x07\xff'\
|
||||||
|
b'\x80\x00\x07\xff\x80\x00\x07\xe7\x80\x00\x06\x07\x80\x00\x00\x07'\
|
||||||
|
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07'\
|
||||||
|
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07'\
|
||||||
|
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07'\
|
||||||
|
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07'\
|
||||||
|
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07'\
|
||||||
|
b'\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x07\xff'\
|
||||||
|
b'\xff\x80\x07\xff\xff\x80\x07\xff\xff\x80\x07\xff\xff\x80\x00\x00'\
|
||||||
|
b'\x00\x00\x1e\x00\x00\x7f\xc0\x00\x03\xff\xf8\x00\x0f\xff\xfe\x00'\
|
||||||
|
b'\x0f\xff\xff\x00\x0f\xe0\x3f\x00\x0e\x00\x0f\x80\x08\x00\x07\x80'\
|
||||||
|
b'\x00\x00\x07\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0'\
|
||||||
|
b'\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x07\x80\x00\x00\x0f\x80'\
|
||||||
|
b'\x00\x00\x0f\x00\x00\x00\x1f\x00\x00\x00\x3e\x00\x00\x00\x7c\x00'\
|
||||||
|
b'\x00\x00\xf8\x00\x00\x01\xf0\x00\x00\x03\xe0\x00\x00\x07\xc0\x00'\
|
||||||
|
b'\x00\x0f\x80\x00\x00\x1f\x00\x00\x00\x3e\x00\x00\x00\x7c\x00\x00'\
|
||||||
|
b'\x00\xf8\x00\x00\x01\xf0\x00\x00\x03\xe0\x00\x00\x07\xc0\x00\x00'\
|
||||||
|
b'\x0f\xff\xff\xc0\x0f\xff\xff\xc0\x0f\xff\xff\xc0\x0f\xff\xff\xc0'\
|
||||||
|
b'\x00\x00\x00\x00\x1e\x00\x00\xff\xe0\x00\x07\xff\xf8\x00\x07\xff'\
|
||||||
|
b'\xfe\x00\x07\xff\xff\x00\x07\x00\x3f\x80\x00\x00\x0f\x80\x00\x00'\
|
||||||
|
b'\x07\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00'\
|
||||||
|
b'\x03\xc0\x00\x00\x03\xc0\x00\x00\x07\x80\x00\x00\x0f\x80\x00\x00'\
|
||||||
|
b'\x3f\x00\x00\x3f\xfe\x00\x00\x3f\xf8\x00\x00\x3f\xfc\x00\x00\x3f'\
|
||||||
|
b'\xff\x00\x00\x00\x3f\x80\x00\x00\x0f\xc0\x00\x00\x03\xc0\x00\x00'\
|
||||||
|
b'\x03\xe0\x00\x00\x01\xe0\x00\x00\x01\xe0\x00\x00\x01\xe0\x00\x00'\
|
||||||
|
b'\x01\xe0\x00\x00\x01\xe0\x00\x00\x03\xe0\x00\x00\x07\xc0\x08\x00'\
|
||||||
|
b'\x0f\xc0\x0f\x00\x3f\x80\x0f\xff\xff\x00\x0f\xff\xfe\x00\x07\xff'\
|
||||||
|
b'\xf8\x00\x00\x7f\xc0\x00\x1e\x00\x00\x00\x00\x00\x00\x00\xfc\x00'\
|
||||||
|
b'\x00\x01\xfc\x00\x00\x01\xfc\x00\x00\x03\xfc\x00\x00\x07\xbc\x00'\
|
||||||
|
b'\x00\x07\x3c\x00\x00\x0f\x3c\x00\x00\x1e\x3c\x00\x00\x1e\x3c\x00'\
|
||||||
|
b'\x00\x3c\x3c\x00\x00\x78\x3c\x00\x00\x78\x3c\x00\x00\xf0\x3c\x00'\
|
||||||
|
b'\x01\xe0\x3c\x00\x01\xe0\x3c\x00\x03\xc0\x3c\x00\x07\x80\x3c\x00'\
|
||||||
|
b'\x07\x80\x3c\x00\x0f\x00\x3c\x00\x1f\x00\x3c\x00\x1e\x00\x3c\x00'\
|
||||||
|
b'\x3c\x00\x3c\x00\x3f\xff\xff\xe0\x3f\xff\xff\xe0\x3f\xff\xff\xe0'\
|
||||||
|
b'\x3f\xff\xff\xe0\x00\x00\x3c\x00\x00\x00\x3c\x00\x00\x00\x3c\x00'\
|
||||||
|
b'\x00\x00\x3c\x00\x00\x00\x3c\x00\x00\x00\x3c\x00\x00\x00\x3c\x00'\
|
||||||
|
b'\x00\x00\x3c\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x07\xff'\
|
||||||
|
b'\xfe\x00\x07\xff\xfe\x00\x07\xff\xfe\x00\x07\xff\xfe\x00\x07\x80'\
|
||||||
|
b'\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\x80'\
|
||||||
|
b'\x00\x00\x07\x80\x00\x00\x07\x80\x00\x00\x07\xbf\x80\x00\x07\xff'\
|
||||||
|
b'\xf0\x00\x07\xff\xfc\x00\x07\xff\xfe\x00\x07\x80\xff\x00\x04\x00'\
|
||||||
|
b'\x1f\x00\x00\x00\x0f\x80\x00\x00\x07\x80\x00\x00\x07\xc0\x00\x00'\
|
||||||
|
b'\x03\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00'\
|
||||||
|
b'\x03\xc0\x00\x00\x03\xc0\x00\x00\x07\xc0\x00\x00\x07\x80\x00\x00'\
|
||||||
|
b'\x0f\x80\x08\x00\x1f\x00\x0f\x00\x7f\x00\x0f\xff\xfe\x00\x0f\xff'\
|
||||||
|
b'\xfc\x00\x0f\xff\xf0\x00\x01\xff\x80\x00\x1e\x00\x00\x03\xfe\x00'\
|
||||||
|
b'\x00\x1f\xff\x80\x00\x7f\xff\x80\x00\xff\xff\x80\x01\xfc\x01\x80'\
|
||||||
|
b'\x03\xf0\x00\x00\x03\xc0\x00\x00\x07\xc0\x00\x00\x07\x80\x00\x00'\
|
||||||
|
b'\x0f\x00\x00\x00\x0f\x00\x00\x00\x0f\x00\x00\x00\x1f\x0f\xe0\x00'\
|
||||||
|
b'\x1e\x3f\xfc\x00\x1e\x7f\xfe\x00\x1e\xff\xff\x00\x1f\xf8\x3f\x80'\
|
||||||
|
b'\x1f\xe0\x0f\xc0\x1f\xc0\x07\xc0\x1f\x80\x03\xc0\x1f\x80\x03\xe0'\
|
||||||
|
b'\x1f\x00\x01\xe0\x1f\x00\x01\xe0\x1f\x00\x01\xe0\x0f\x00\x01\xe0'\
|
||||||
|
b'\x0f\x00\x01\xe0\x0f\x00\x01\xe0\x0f\x80\x03\xe0\x07\x80\x03\xc0'\
|
||||||
|
b'\x07\xc0\x07\xc0\x03\xe0\x0f\x80\x03\xf8\x3f\x80\x01\xff\xff\x00'\
|
||||||
|
b'\x00\xff\xfe\x00\x00\x7f\xfc\x00\x00\x0f\xe0\x00\x1e\x00\x00\x00'\
|
||||||
|
b'\x00\x00\x0f\xff\xff\xc0\x0f\xff\xff\xc0\x0f\xff\xff\xc0\x0f\xff'\
|
||||||
|
b'\xff\x80\x00\x00\x07\x80\x00\x00\x0f\x80\x00\x00\x0f\x00\x00\x00'\
|
||||||
|
b'\x1f\x00\x00\x00\x1e\x00\x00\x00\x1e\x00\x00\x00\x3e\x00\x00\x00'\
|
||||||
|
b'\x3c\x00\x00\x00\x3c\x00\x00\x00\x78\x00\x00\x00\x78\x00\x00\x00'\
|
||||||
|
b'\xf8\x00\x00\x00\xf0\x00\x00\x00\xf0\x00\x00\x01\xe0\x00\x00\x01'\
|
||||||
|
b'\xe0\x00\x00\x03\xe0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x07'\
|
||||||
|
b'\x80\x00\x00\x07\x80\x00\x00\x0f\x80\x00\x00\x0f\x00\x00\x00\x0f'\
|
||||||
|
b'\x00\x00\x00\x1e\x00\x00\x00\x1e\x00\x00\x00\x3e\x00\x00\x00\x3c'\
|
||||||
|
b'\x00\x00\x00\x3c\x00\x00\x00\x78\x00\x00\x00\x00\x00\x00\x1e\x00'\
|
||||||
|
b'\x00\x1f\xe0\x00\x00\xff\xfc\x00\x01\xff\xfe\x00\x03\xff\xff\x00'\
|
||||||
|
b'\x07\xf0\x3f\x80\x07\xc0\x0f\x80\x0f\x80\x07\xc0\x0f\x00\x03\xc0'\
|
||||||
|
b'\x0f\x00\x03\xc0\x0f\x00\x03\xc0\x0f\x00\x03\xc0\x0f\x00\x03\xc0'\
|
||||||
|
b'\x07\x80\x07\x80\x07\xc0\x0f\x80\x03\xf0\x3f\x00\x01\xff\xfe\x00'\
|
||||||
|
b'\x00\x7f\xf8\x00\x00\xff\xfc\x00\x03\xff\xff\x00\x07\xe0\x1f\x80'\
|
||||||
|
b'\x0f\x80\x07\xc0\x0f\x00\x03\xc0\x1f\x00\x03\xe0\x1e\x00\x01\xe0'\
|
||||||
|
b'\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0\x1e\x00\x01\xe0'\
|
||||||
|
b'\x1f\x00\x03\xe0\x0f\x00\x03\xc0\x0f\x80\x07\xc0\x07\xe0\x1f\x80'\
|
||||||
|
b'\x07\xff\xff\x80\x03\xff\xff\x00\x00\xff\xfc\x00\x00\x1f\xe0\x00'\
|
||||||
|
b'\x1e\x00\x00\x1f\xc0\x00\x00\xff\xf8\x00\x01\xff\xfc\x00\x03\xff'\
|
||||||
|
b'\xfe\x00\x07\xf0\x7f\x00\x0f\xc0\x1f\x00\x0f\x80\x0f\x80\x0f\x00'\
|
||||||
|
b'\x07\x80\x1f\x00\x07\xc0\x1e\x00\x03\xc0\x1e\x00\x03\xc0\x1e\x00'\
|
||||||
|
b'\x03\xc0\x1e\x00\x03\xe0\x1e\x00\x03\xe0\x1e\x00\x03\xe0\x1f\x00'\
|
||||||
|
b'\x07\xe0\x0f\x00\x07\xe0\x0f\x80\x0f\xe0\x0f\xc0\x1f\xe0\x07\xf0'\
|
||||||
|
b'\x7f\xe0\x03\xff\xfd\xe0\x01\xff\xf9\xe0\x00\xff\xf1\xe0\x00\x1f'\
|
||||||
|
b'\xc3\xc0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x07\xc0\x00\x00'\
|
||||||
|
b'\x07\x80\x00\x00\x0f\x80\x00\x00\x1f\x00\x00\x00\x3f\x00\x06\x00'\
|
||||||
|
b'\xfe\x00\x07\xff\xfc\x00\x07\xff\xf8\x00\x07\xff\xe0\x00\x01\xff'\
|
||||||
|
b'\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xe0\x03\xe0\x03\xe0'\
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xe0\x03\xe0\x03\xe0'\
|
||||||
b'\x03\xe0\x03\xe0\x03\xe0\x00\x00'
|
b'\x03\xe0\x03\xe0\x03\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xe0'\
|
||||||
|
b'\x03\xe0\x03\xe0\x03\xe0\x03\xe0\x03\xe0\x00\x00'
|
||||||
|
|
||||||
_index =\
|
_index =\
|
||||||
b'\x00\x00\x4a\x00\xdc\x00\x6e\x01\x00\x02\x92\x02\x24\x03\xb6\x03'\
|
b'\x00\x00\x4a\x00\x00\x00\x00\x01\x00\x00\x00\x00\x6e\x01\x00\x02'\
|
||||||
b'\x48\x04\xda\x04\x6c\x05\xfe\x05\x48\x06'
|
b'\x92\x02\x24\x03\xb6\x03\x48\x04\xda\x04\x6c\x05\xfe\x05\x90\x06'\
|
||||||
|
b'\x22\x07\x6c\x07'
|
||||||
|
|
||||||
_mvfont = memoryview(_font)
|
_mvfont = memoryview(_font)
|
||||||
_mvi = memoryview(_index)
|
_mvi = memoryview(_index)
|
||||||
|
@ -140,7 +159,7 @@ ifb = lambda l : l[0] | (l[1] << 8)
|
||||||
|
|
||||||
def get_ch(ch):
|
def get_ch(ch):
|
||||||
oc = ord(ch)
|
oc = ord(ch)
|
||||||
ioff = 2 * (oc - 48 + 1) if oc >= 48 and oc <= 58 else 0
|
ioff = 2 * (oc - 43 + 1) if oc >= 43 and oc <= 58 else 0
|
||||||
doff = ifb(_mvi[ioff : ])
|
doff = ifb(_mvi[ioff : ])
|
||||||
width = ifb(_mvfont[doff : ])
|
width = ifb(_mvfont[doff : ])
|
||||||
|
|
||||||
|
|
|
@ -222,11 +222,14 @@ class Button():
|
||||||
|
|
||||||
def draw(self):
|
def draw(self):
|
||||||
"""Draw the button."""
|
"""Draw the button."""
|
||||||
draw = wasp.watch.drawable
|
bg = wasp.watch.drawable.darken(wasp.system.theme('ui'))
|
||||||
im = self._im
|
|
||||||
bg = draw.darken(wasp.system.theme('ui'))
|
|
||||||
frame = wasp.system.theme('mid')
|
frame = wasp.system.theme('mid')
|
||||||
txt = wasp.system.theme('bright')
|
txt = wasp.system.theme('bright')
|
||||||
|
self.update(bg, frame, txt)
|
||||||
|
|
||||||
|
def update(self, bg, frame, txt):
|
||||||
|
draw = wasp.watch.drawable
|
||||||
|
im = self._im
|
||||||
|
|
||||||
draw.fill(bg, im[0], im[1], im[2], im[3])
|
draw.fill(bg, im[0], im[1], im[2], im[3])
|
||||||
draw.set_color(txt, bg)
|
draw.set_color(txt, bg)
|
||||||
|
@ -255,6 +258,31 @@ class Button():
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
class ToggleButton(Button):
|
||||||
|
"""A button with a text label that can be toggled on and off."""
|
||||||
|
def __init__(self, x, y, w, h, label):
|
||||||
|
super().__init__(x, y, w, h, label)
|
||||||
|
self.state = False
|
||||||
|
|
||||||
|
def draw(self):
|
||||||
|
"""Draw the button."""
|
||||||
|
draw = wasp.watch.drawable
|
||||||
|
|
||||||
|
if self.state:
|
||||||
|
bg = draw.darken(wasp.system.theme('ui'))
|
||||||
|
else:
|
||||||
|
bg = draw.darken(wasp.system.theme('mid'))
|
||||||
|
frame = wasp.system.theme('mid')
|
||||||
|
txt = wasp.system.theme('bright')
|
||||||
|
|
||||||
|
self.update(bg, frame, txt)
|
||||||
|
|
||||||
|
def touch(self, event):
|
||||||
|
"""Handle touch events."""
|
||||||
|
if super().touch(event):
|
||||||
|
self.state = not self.state
|
||||||
|
self.draw()
|
||||||
|
|
||||||
class Checkbox():
|
class Checkbox():
|
||||||
"""A simple (labelled) checkbox."""
|
"""A simple (labelled) checkbox."""
|
||||||
def __init__(self, x, y, label=None):
|
def __init__(self, x, y, label=None):
|
||||||
|
@ -294,9 +322,10 @@ class Checkbox():
|
||||||
|
|
||||||
def touch(self, event):
|
def touch(self, event):
|
||||||
"""Handle touch events."""
|
"""Handle touch events."""
|
||||||
|
x = event[1]
|
||||||
y = event[2]
|
y = event[2]
|
||||||
im = self._im
|
im = self._im
|
||||||
if y >= im[1] and y < im[1]+40:
|
if (self.label or im[0] <= x < im[0]+40) and im[1] <= y < im[1]+40:
|
||||||
self.state = not self.state
|
self.state = not self.state
|
||||||
self.update()
|
self.update()
|
||||||
return True
|
return True
|
||||||
|
|
Loading…
Reference in a new issue