diff --git a/docs/requirements.txt b/docs/requirements.txt
index 88e6733..979f568 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -2,4 +2,6 @@
#
# SPDX-License-Identifier: Unlicense
-sphinx>=4.0.0
+sphinx
+sphinxcontrib-jquery
+sphinx-rtd-theme
diff --git a/examples/bmps/active_tab_sprite.bmp b/examples/bmps/active_tab_sprite.bmp
new file mode 100644
index 0000000..d97d1db
Binary files /dev/null and b/examples/bmps/active_tab_sprite.bmp differ
diff --git a/examples/bmps/active_tab_sprite.bmp.license b/examples/bmps/active_tab_sprite.bmp.license
new file mode 100644
index 0000000..8f7990c
--- /dev/null
+++ b/examples/bmps/active_tab_sprite.bmp.license
@@ -0,0 +1,2 @@
+# SPDX-FileCopyrightText: 2022 Tim Cocks for Adafruit Industries
+# SPDX-License-Identifier: MIT
diff --git a/examples/bmps/inactive_tab_sprite.bmp b/examples/bmps/inactive_tab_sprite.bmp
new file mode 100644
index 0000000..ab41509
Binary files /dev/null and b/examples/bmps/inactive_tab_sprite.bmp differ
diff --git a/examples/bmps/inactive_tab_sprite.bmp.license b/examples/bmps/inactive_tab_sprite.bmp.license
new file mode 100644
index 0000000..8f7990c
--- /dev/null
+++ b/examples/bmps/inactive_tab_sprite.bmp.license
@@ -0,0 +1,2 @@
+# SPDX-FileCopyrightText: 2022 Tim Cocks for Adafruit Industries
+# SPDX-License-Identifier: MIT
diff --git a/examples/displayio_layout_cartesian_advanced_test.py b/examples/displayio_layout_cartesian_advanced_test.py
index 9d3ccbc..3acda2e 100644
--- a/examples/displayio_layout_cartesian_advanced_test.py
+++ b/examples/displayio_layout_cartesian_advanced_test.py
@@ -10,6 +10,7 @@
import board
import displayio
import terminalio
+
from adafruit_displayio_layout.widgets.cartesian import Cartesian
# Fonts used for the Dial tick labels
@@ -69,7 +70,7 @@
)
my_group.append(car5)
-display.show(my_group)
+display.root_group = my_group
while True:
pass
diff --git a/examples/displayio_layout_cartesian_lineplot.py b/examples/displayio_layout_cartesian_lineplot.py
new file mode 100644
index 0000000..54ac442
--- /dev/null
+++ b/examples/displayio_layout_cartesian_lineplot.py
@@ -0,0 +1,65 @@
+# SPDX-FileCopyrightText: 2021 Stefan Krüger
+#
+# SPDX-License-Identifier: MIT
+#############################
+"""
+This is a basic demonstration of a Cartesian widget for line-ploting
+"""
+
+import time
+
+import board
+import displayio
+
+from adafruit_displayio_layout.widgets.cartesian import Cartesian
+
+# create the display on the PyPortal or Clue or PyBadge(for example)
+display = board.DISPLAY
+# otherwise change this to setup the display
+# for display chip driver and pinout you have (e.g. ILI9341)
+
+# pybadge display: 160x128
+# Create a Cartesian widget
+# https://circuitpython.readthedocs.io/projects/displayio-layout/en/latest/api.html#module-adafruit_displayio_layout.widgets.cartesian
+my_plane = Cartesian(
+ x=15, # x position for the plane
+ y=2, # y plane position
+ width=140, # display width
+ height=105, # display height
+ xrange=(0, 10), # x range
+ yrange=(0, 10), # y range
+)
+
+my_group = displayio.Group()
+my_group.append(my_plane)
+display.root_group = my_group # add high level Group to the display
+
+data = [
+ # (0, 0), # we do this point manually - so we have no wait...
+ (1, 1),
+ (2, 1),
+ (2, 2),
+ (3, 3),
+ (4, 3),
+ (4, 4),
+ (5, 5),
+ (6, 5),
+ (6, 6),
+ (7, 7),
+ (8, 7),
+ (8, 8),
+ (9, 9),
+ (10, 9),
+ (10, 10),
+]
+
+print("examples/displayio_layout_cartesian_lineplot.py")
+
+# first point without a wait.
+my_plane.add_plot_line(0, 0)
+for x, y in data:
+ my_plane.add_plot_line(x, y)
+ time.sleep(0.5)
+
+while True:
+ pass
diff --git a/examples/displayio_layout_cartesian_simpletest.py b/examples/displayio_layout_cartesian_simpletest.py
index 3eb604a..ba1353c 100644
--- a/examples/displayio_layout_cartesian_simpletest.py
+++ b/examples/displayio_layout_cartesian_simpletest.py
@@ -7,9 +7,11 @@
"""
import time
+
import board
import displayio
import terminalio
+
from adafruit_displayio_layout.widgets.cartesian import Cartesian
# Fonts used for the Dial tick labels
@@ -37,7 +39,7 @@
my_group = displayio.Group()
my_group.append(my_plane)
-display.show(my_group) # add high level Group to the display
+display.root_group = my_group # add high level Group to the display
posx = 0
posy = 0
diff --git a/examples/displayio_layout_flip_input_simpletest.py b/examples/displayio_layout_flip_input_simpletest.py
index 2a64645..c6c3ce0 100755
--- a/examples/displayio_layout_flip_input_simpletest.py
+++ b/examples/displayio_layout_flip_input_simpletest.py
@@ -6,13 +6,13 @@
This is a basic demonstration of a FlipInput widget.
"""
-# pylint: disable=invalid-name
-
import time
+
+import adafruit_touchscreen
import board
import displayio
-import adafruit_touchscreen
from adafruit_bitmap_font import bitmap_font
+
from adafruit_displayio_layout.widgets.flip_input import FlipInput
display = board.DISPLAY # create the display on the PyPortal,
@@ -62,7 +62,7 @@
anchor_point=[0.0, 0.0],
anchored_position=[220, 40],
color=0xFF2222, # reddish orange color
- value_list=["{0:02d}".format(x) for x in range(1, 31 + 1)],
+ value_list=[f"{x:02d}" for x in range(1, 31 + 1)],
# use a list of strings from 01 through 31
# use the {0:02d} format string to always use two digits (e.g. '03')
font_scale=5,
@@ -75,7 +75,7 @@
anchor_point=[0.5, 1.0],
anchored_position=[320 // 2, 240 - 10],
color=0xFF2222, # reddish orange color
- value_list=["{}".format(x) for x in range(1985, 2022, 1)],
+ value_list=[f"{x}" for x in range(1985, 2022, 1)],
# use a list with values of stringsfrom 1985 to 2022
font=my_font,
horizontal=True, # use horizontal arrows
@@ -97,11 +97,10 @@
my_group.append(my_flip2)
my_group.append(my_flip3)
-display.show(my_group) # add high level Group to the display
+display.root_group = my_group # add high level Group to the display
display.auto_refresh = True
while True:
-
p = ts.touch_point
# print("touch_point p: {}".format(p)) # print the touch point
diff --git a/examples/displayio_layout_grid_layout_get_cell_test.py b/examples/displayio_layout_grid_layout_get_cell_test.py
index a9b812d..06ccfd0 100644
--- a/examples/displayio_layout_grid_layout_get_cell_test.py
+++ b/examples/displayio_layout_grid_layout_get_cell_test.py
@@ -5,10 +5,12 @@
Make green and purple rectangles and then update the color
and text values of the labels using the get_cell() function.
"""
+
import board
import displayio
import terminalio
from adafruit_display_text import label
+
from adafruit_displayio_layout.layouts.grid_layout import GridLayout
# use built in display (PyPortal, PyGamer, PyBadge, CLUE, etc.)
@@ -18,7 +20,7 @@
# Make the display context
main_group = displayio.Group()
-display.show(main_group)
+display.root_group = main_group
layout = GridLayout(
x=10,
@@ -31,15 +33,11 @@
_labels = []
_labels.append(
- label.Label(
- terminalio.FONT, scale=2, x=0, y=0, text="Hello", background_color=0x770077
- )
+ label.Label(terminalio.FONT, scale=2, x=0, y=0, text="Hello", background_color=0x770077)
)
layout.add_content(_labels[0], grid_position=(0, 0), cell_size=(1, 1))
_labels.append(
- label.Label(
- terminalio.FONT, scale=2, x=0, y=0, text="World", background_color=0x007700
- )
+ label.Label(terminalio.FONT, scale=2, x=0, y=0, text="World", background_color=0x007700)
)
layout.add_content(_labels[1], grid_position=(1, 0), cell_size=(1, 1))
_labels.append(label.Label(terminalio.FONT, scale=2, x=0, y=0, text="Hello"))
diff --git a/examples/displayio_layout_gridlayout_dividers.py b/examples/displayio_layout_gridlayout_dividers.py
index f649562..34e47b9 100644
--- a/examples/displayio_layout_gridlayout_dividers.py
+++ b/examples/displayio_layout_gridlayout_dividers.py
@@ -4,10 +4,12 @@
"""
Illustrate how to use divider lines with GridLayout
"""
+
import board
import displayio
import terminalio
from adafruit_display_text import label
+
from adafruit_displayio_layout.layouts.grid_layout import GridLayout
# use built in display (PyPortal, PyGamer, PyBadge, CLUE, etc.)
@@ -17,7 +19,7 @@
# Make the display context
main_group = displayio.Group()
-display.show(main_group)
+display.root_group = main_group
layout = GridLayout(
x=10,
@@ -31,15 +33,11 @@
_labels = []
_labels.append(
- label.Label(
- terminalio.FONT, scale=2, x=0, y=0, text="Hello", background_color=0x770077
- )
+ label.Label(terminalio.FONT, scale=2, x=0, y=0, text="Hello", background_color=0x770077)
)
layout.add_content(_labels[0], grid_position=(0, 0), cell_size=(1, 1))
_labels.append(
- label.Label(
- terminalio.FONT, scale=2, x=0, y=0, text="World", background_color=0x007700
- )
+ label.Label(terminalio.FONT, scale=2, x=0, y=0, text="World", background_color=0x007700)
)
layout.add_content(_labels[1], grid_position=(1, 0), cell_size=(1, 1))
_labels.append(label.Label(terminalio.FONT, scale=2, x=0, y=0, text="Hello"))
diff --git a/examples/displayio_layout_gridlayout_pygame_display_simpletest.py b/examples/displayio_layout_gridlayout_pygame_display_simpletest.py
index 447d75a..f0a5623 100644
--- a/examples/displayio_layout_gridlayout_pygame_display_simpletest.py
+++ b/examples/displayio_layout_gridlayout_pygame_display_simpletest.py
@@ -2,21 +2,23 @@
#
# SPDX-License-Identifier: MIT
"""
-Make green and purple rectangles and a
-"Hello World" label. Displayed with Blinka_Displayio_PyGameDisplay
+Make a GridLayout with some Labels in it's cells.
+Displayed with Blinka_Displayio_PyGameDisplay
+
+Requires: https://github.com/FoamyGuy/Blinka_Displayio_PyGameDisplay
"""
+
import displayio
import terminalio
from adafruit_display_text import label
from blinka_displayio_pygamedisplay import PyGameDisplay
-
# Make the display context. Change size if you want
from adafruit_displayio_layout.layouts.grid_layout import GridLayout
display = PyGameDisplay(width=320, height=240)
main_group = displayio.Group()
-display.show(main_group)
+display.root_group = main_group
layout = GridLayout(
x=10,
@@ -29,15 +31,11 @@
_labels = []
_labels.append(
- label.Label(
- terminalio.FONT, scale=2, x=0, y=0, text="Hello", background_color=0x770077
- )
+ label.Label(terminalio.FONT, scale=2, x=0, y=0, text="Hello", background_color=0x770077)
)
layout.add_content(_labels[0], grid_position=(0, 0), cell_size=(1, 1))
_labels.append(
- label.Label(
- terminalio.FONT, scale=2, x=0, y=0, text="World", background_color=0x007700
- )
+ label.Label(terminalio.FONT, scale=2, x=0, y=0, text="World", background_color=0x007700)
)
layout.add_content(_labels[1], grid_position=(1, 0), cell_size=(1, 1))
_labels.append(label.Label(terminalio.FONT, scale=2, x=0, y=0, text="Hello"))
diff --git a/examples/displayio_layout_gridlayout_simpletest.py b/examples/displayio_layout_gridlayout_simpletest.py
index 98e9578..2d0b3ad 100644
--- a/examples/displayio_layout_gridlayout_simpletest.py
+++ b/examples/displayio_layout_gridlayout_simpletest.py
@@ -5,10 +5,12 @@
Make green and purple rectangles and a
"Hello World" label.
"""
+
import board
import displayio
import terminalio
from adafruit_display_text import label
+
from adafruit_displayio_layout.layouts.grid_layout import GridLayout
# use built in display (PyPortal, PyGamer, PyBadge, CLUE, etc.)
@@ -18,7 +20,7 @@
# Make the display context
main_group = displayio.Group()
-display.show(main_group)
+display.root_group = main_group
layout = GridLayout(
x=10,
@@ -31,15 +33,11 @@
_labels = []
_labels.append(
- label.Label(
- terminalio.FONT, scale=2, x=0, y=0, text="Hello", background_color=0x770077
- )
+ label.Label(terminalio.FONT, scale=2, x=0, y=0, text="Hello", background_color=0x770077)
)
layout.add_content(_labels[0], grid_position=(0, 0), cell_size=(1, 1))
_labels.append(
- label.Label(
- terminalio.FONT, scale=2, x=0, y=0, text="World", background_color=0x007700
- )
+ label.Label(terminalio.FONT, scale=2, x=0, y=0, text="World", background_color=0x007700)
)
layout.add_content(_labels[1], grid_position=(1, 0), cell_size=(1, 1))
_labels.append(label.Label(terminalio.FONT, scale=2, x=0, y=0, text="Hello"))
diff --git a/examples/displayio_layout_icon_animated_simpletest.py b/examples/displayio_layout_icon_animated_simpletest.py
index 32b6aaa..3ec9851 100644
--- a/examples/displayio_layout_icon_animated_simpletest.py
+++ b/examples/displayio_layout_icon_animated_simpletest.py
@@ -4,10 +4,13 @@
"""
Creates two animated icons with touch response: zoom and shrink animations.
"""
+
import time
+
+import adafruit_touchscreen
import board
import displayio
-import adafruit_touchscreen
+
from adafruit_displayio_layout.widgets.icon_animated import IconAnimated
display = board.DISPLAY
@@ -22,9 +25,7 @@
)
-IconAnimated.init_class(
- display, max_scale=1.5, max_icon_size=(48, 48), max_color_depth=255
-)
+IconAnimated.init_class(display, max_scale=1.5, max_icon_size=(48, 48), max_color_depth=255)
icon_zoom = IconAnimated(
"Zoom",
@@ -52,7 +53,7 @@
main_group.append(icon_zoom)
main_group.append(icon_shrink)
-display.show(main_group)
+display.root_group = main_group
COOLDOWN_TIME = 0.25
diff --git a/examples/displayio_layout_linearlayout_simpletest.py b/examples/displayio_layout_linearlayout_simpletest.py
new file mode 100644
index 0000000..1925330
--- /dev/null
+++ b/examples/displayio_layout_linearlayout_simpletest.py
@@ -0,0 +1,37 @@
+# SPDX-FileCopyrightText: 2024 Tim C, written for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+"""
+Illustrates usage of LinearLayout to display a text label to the right of
+an icon.
+"""
+
+import adafruit_imageload
+import board
+import displayio
+import terminalio
+from adafruit_display_text import label
+
+from adafruit_displayio_layout.layouts.linear_layout import LinearLayout
+
+# use built in display (PyPortal, PyGamer, PyBadge, CLUE, etc.)
+# see guide for setting up external displays (TFT / OLED breakouts, RGB matrices, etc.)
+# https://learn.adafruit.com/circuitpython-display-support-using-displayio/display-and-display-bus
+display = board.DISPLAY
+
+# Make the display context
+main_group = displayio.Group()
+display.root_group = main_group
+
+layout = LinearLayout(x=10, y=10, padding=4, orientation=LinearLayout.HORIZONTAL_ORIENTATION)
+
+lbl = label.Label(terminalio.FONT, scale=4, x=0, y=0, text="Hello")
+
+icon, icon_palette = adafruit_imageload.load("icons/Play_48x48_small.bmp")
+icon_tile_grid = displayio.TileGrid(icon, pixel_shader=icon_palette)
+layout.add_content(icon_tile_grid)
+layout.add_content(lbl)
+
+main_group.append(layout)
+while True:
+ pass
diff --git a/examples/displayio_layout_page_layout_advancedtest.py b/examples/displayio_layout_page_layout_advancedtest.py
new file mode 100644
index 0000000..7dbdca7
--- /dev/null
+++ b/examples/displayio_layout_page_layout_advancedtest.py
@@ -0,0 +1,115 @@
+# SPDX-FileCopyrightText: 2022 Tim C
+#
+# SPDX-License-Identifier: MIT
+"""
+Make a PageLayout and illustrate all of it's features
+"""
+
+import time
+
+import board
+import displayio
+import terminalio
+from adafruit_display_shapes.circle import Circle
+from adafruit_display_shapes.rect import Rect
+from adafruit_display_shapes.triangle import Triangle
+from adafruit_display_text.bitmap_label import Label
+
+from adafruit_displayio_layout.layouts.page_layout import PageLayout
+
+# built-in display
+display = board.DISPLAY
+
+# create and show main_group
+main_group = displayio.Group()
+display.root_group = main_group
+
+# create the page layout
+test_page_layout = PageLayout(x=0, y=0)
+
+# make 3 pages of content
+page_1_group = displayio.Group()
+page_2_group = displayio.Group()
+page_3_group = displayio.Group()
+
+# labels
+page_1_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="This is the first page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+page_2_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="This page is the second page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+page_3_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="The third page is fun!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+
+# shapes
+square = Rect(x=20, y=70, width=40, height=40, fill=0x00DD00)
+circle = Circle(50, 100, r=30, fill=0xDD00DD)
+triangle = Triangle(50, 0, 100, 50, 0, 50, fill=0xDDDD00)
+triangle.x = 80
+triangle.y = 70
+
+# add everything to their page groups
+page_1_group.append(square)
+page_1_group.append(page_1_lbl)
+page_2_group.append(page_2_lbl)
+page_2_group.append(circle)
+page_3_group.append(page_3_lbl)
+page_3_group.append(triangle)
+
+# add the pages to the layout, supply your own page names
+test_page_layout.add_content(page_1_group, "page_1")
+test_page_layout.add_content(page_2_group, "page_2")
+test_page_layout.add_content(page_3_group, "page_3")
+
+# add it to the group that is showing on the display
+main_group.append(test_page_layout)
+
+# change page with function by name
+test_page_layout.show_page(page_name="page_3")
+print(f"showing page index:{test_page_layout.showing_page_index}")
+time.sleep(1)
+
+# change page with function by index
+test_page_layout.show_page(page_index=0)
+print(f"showing page name: {test_page_layout.showing_page_name}")
+time.sleep(1)
+
+# change page by updating the page name property
+test_page_layout.showing_page_name = "page_3"
+print(f"showing page index: {test_page_layout.showing_page_index}")
+time.sleep(1)
+
+# change page by updating the page index property
+test_page_layout.showing_page_index = 1
+print(f"showing page name: {test_page_layout.showing_page_name}")
+time.sleep(5)
+
+another_text = Label(
+ terminalio.FONT,
+ text="And another thing!",
+ scale=2,
+ color=0x00FF00,
+ anchor_point=(0, 0),
+ anchored_position=(100, 100),
+)
+test_page_layout.showing_page_content.append(another_text)
+
+print("starting loop")
+while True:
+ time.sleep(1)
+ # change page by next page function. It will loop by default
+ test_page_layout.next_page()
diff --git a/examples/displayio_layout_page_layout_simpletest.py b/examples/displayio_layout_page_layout_simpletest.py
new file mode 100644
index 0000000..74e3120
--- /dev/null
+++ b/examples/displayio_layout_page_layout_simpletest.py
@@ -0,0 +1,62 @@
+# SPDX-FileCopyrightText: 2022 Tim C
+#
+# SPDX-License-Identifier: MIT
+"""
+Make a PageLayout with two pages and change between them.
+"""
+
+import time
+
+import board
+import displayio
+import terminalio
+from adafruit_display_shapes.circle import Circle
+from adafruit_display_shapes.rect import Rect
+from adafruit_display_text.bitmap_label import Label
+
+from adafruit_displayio_layout.layouts.page_layout import PageLayout
+
+# built-in display
+display = board.DISPLAY
+
+# create and show main_group
+main_group = displayio.Group()
+display.root_group = main_group
+
+# create the page layout
+test_page_layout = PageLayout(x=0, y=0)
+
+page_1_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="This is the first page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+page_2_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="This page is the second page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+
+page_1_group = displayio.Group()
+page_2_group = displayio.Group()
+
+square = Rect(x=20, y=70, width=40, height=40, fill=0x00DD00)
+circle = Circle(50, 100, r=30, fill=0xDD00DD)
+
+page_1_group.append(square)
+page_1_group.append(page_1_lbl)
+
+page_2_group.append(page_2_lbl)
+page_2_group.append(circle)
+
+test_page_layout.add_content(page_1_group, "page_1")
+test_page_layout.add_content(page_2_group, "page_2")
+
+main_group.append(test_page_layout)
+while True:
+ time.sleep(1)
+ test_page_layout.next_page()
diff --git a/examples/displayio_layout_pygame_display_switch_round.py b/examples/displayio_layout_pygame_display_switch_round.py
new file mode 100644
index 0000000..c85f241
--- /dev/null
+++ b/examples/displayio_layout_pygame_display_switch_round.py
@@ -0,0 +1,83 @@
+# SPDX-FileCopyrightText: 2021 Tim C
+#
+# SPDX-License-Identifier: MIT
+"""
+Make a GridLayout with some Labels in it's cells.
+Displayed with Blinka_Displayio_PyGameDisplay
+
+Requires: https://github.com/FoamyGuy/Blinka_Displayio_PyGameDisplay
+"""
+
+import displayio
+import pygame
+from blinka_displayio_pygamedisplay import PyGameDisplay
+
+from adafruit_displayio_layout.widgets.switch_round import SwitchRound as Switch
+
+# Make the display context. Change size if you want
+display = PyGameDisplay(width=320, height=240)
+
+# Make the display context
+main_group = displayio.Group()
+display.root_group = main_group
+
+switch_x = 30
+switch_y = 30
+switch_radius = 20
+
+switch_fill_color_off = (200, 44, 200)
+switch_fill_color_on = (0, 100, 0)
+
+switch_outline_color_off = (30, 30, 30)
+switch_outline_color_on = (0, 60, 0)
+
+background_color_off = (255, 255, 255)
+background_color_on = (90, 255, 90)
+
+background_outline_color_off = background_color_off
+background_outline_color_on = background_color_on
+
+switch_width = 4 * switch_radius # This is a good aspect ratio to start with
+
+switch_stroke = 2 # Width of the outlines (in pixels)
+text_stroke = switch_stroke # width of text lines
+touch_padding = 0 # Additional boundary around widget that will accept touch input
+
+animation_time = 0.2 # time for switch to display change (in seconds).
+# animation_time=0.15 is a good starting point
+display_text = True # show the text (0/1)
+
+# initialize state variables
+switch_value = False
+switch_value = True
+
+my_switch = Switch(
+ x=switch_x,
+ y=switch_y,
+ height=switch_radius * 2,
+ fill_color_off=switch_fill_color_off,
+ fill_color_on=switch_fill_color_on,
+ outline_color_off=switch_outline_color_off,
+ outline_color_on=switch_outline_color_on,
+ background_color_off=background_color_off,
+ background_color_on=background_color_on,
+ background_outline_color_off=background_outline_color_off,
+ background_outline_color_on=background_outline_color_on,
+ switch_stroke=switch_stroke,
+ display_button_text=display_text,
+ touch_padding=10,
+ animation_time=animation_time,
+ value=False,
+)
+
+
+main_group.append(my_switch)
+while display.running:
+ # get mouse up events
+ ev = pygame.event.get(eventtype=pygame.MOUSEBUTTONUP)
+ # proceed events
+ for event in ev:
+ pos = pygame.mouse.get_pos()
+ print(pos)
+ if my_switch.contains(pos):
+ my_switch.selected(pos)
diff --git a/examples/displayio_layout_simpletest.py b/examples/displayio_layout_simpletest.py
index 818bcb8..2b79736 100644
--- a/examples/displayio_layout_simpletest.py
+++ b/examples/displayio_layout_simpletest.py
@@ -7,10 +7,12 @@
Make green and purple rectangles and a
"Hello World" label.
"""
+
import board
import displayio
import terminalio
from adafruit_display_text import label
+
from adafruit_displayio_layout.layouts.grid_layout import GridLayout
# use built in display (PyPortal, PyGamer, PyBadge, CLUE, etc.)
@@ -20,7 +22,7 @@
# Make the display context
main_group = displayio.Group()
-display.show(main_group)
+display.root_group = main_group
layout = GridLayout(
x=10,
@@ -33,15 +35,11 @@
_labels = []
_labels.append(
- label.Label(
- terminalio.FONT, scale=2, x=0, y=0, text="Hello", background_color=0x770077
- )
+ label.Label(terminalio.FONT, scale=2, x=0, y=0, text="Hello", background_color=0x770077)
)
layout.add_content(_labels[0], grid_position=(0, 0), cell_size=(1, 1))
_labels.append(
- label.Label(
- terminalio.FONT, scale=2, x=0, y=0, text="World", background_color=0x007700
- )
+ label.Label(terminalio.FONT, scale=2, x=0, y=0, text="World", background_color=0x007700)
)
layout.add_content(_labels[1], grid_position=(1, 0), cell_size=(1, 1))
_labels.append(label.Label(terminalio.FONT, scale=2, x=0, y=0, text="Hello"))
diff --git a/examples/displayio_layout_switch_multiple.py b/examples/displayio_layout_switch_multiple.py
index 95faff8..5f8a2ce 100755
--- a/examples/displayio_layout_switch_multiple.py
+++ b/examples/displayio_layout_switch_multiple.py
@@ -6,9 +6,11 @@
"""
import time
+
+import adafruit_touchscreen
import board
import displayio
-import adafruit_touchscreen
+
from adafruit_displayio_layout.widgets.switch_round import SwitchRound as Switch
display = board.DISPLAY
@@ -102,12 +104,11 @@
my_group.append(my_switch8)
# Add my_group to the display
-display.show(my_group)
+display.root_group = my_group
# Start the main loop
while True:
-
p = ts.touch_point # get any touches on the screen
if p: # Check each switch if the touch point is within the switch touch area
diff --git a/examples/displayio_layout_switch_simpletest.py b/examples/displayio_layout_switch_simpletest.py
index b890d84..432c1e0 100644
--- a/examples/displayio_layout_switch_simpletest.py
+++ b/examples/displayio_layout_switch_simpletest.py
@@ -6,9 +6,11 @@
"""
import time
+
+import adafruit_touchscreen
import board
import displayio
-import adafruit_touchscreen
+
from adafruit_displayio_layout.widgets.switch_round import SwitchRound as Switch
display = board.DISPLAY
@@ -30,11 +32,10 @@
my_group.append(my_switch)
# Add my_group to the display
-display.show(my_group)
+display.root_group = my_group
# Start the main loop
while True:
-
p = ts.touch_point # get any touches on the screen
if p: # Check each switch if the touch point is within the switch touch area
diff --git a/examples/displayio_layout_tab_layout_simpletest.py b/examples/displayio_layout_tab_layout_simpletest.py
new file mode 100644
index 0000000..c8c73b4
--- /dev/null
+++ b/examples/displayio_layout_tab_layout_simpletest.py
@@ -0,0 +1,151 @@
+# SPDX-FileCopyrightText: 2022 Tim C
+#
+# SPDX-License-Identifier: MIT
+"""
+Make a TabLayout and illustrate the most basic features and usage.
+"""
+
+import time
+
+import board
+import displayio
+import terminalio
+from adafruit_display_shapes.circle import Circle
+from adafruit_display_shapes.rect import Rect
+from adafruit_display_shapes.triangle import Triangle
+from adafruit_display_text.bitmap_label import Label
+
+from adafruit_displayio_layout.layouts.tab_layout import TabLayout
+
+CHANGE_DELAY = 1.0 # Seconds to wait before auto-advancing to the next tab
+
+# built-in display
+display = board.DISPLAY
+
+# create and show main_group
+main_group = displayio.Group()
+display.root_group = main_group
+
+font = terminalio.FONT
+
+# create the page layout
+test_page_layout = TabLayout(
+ x=0,
+ y=0,
+ display=board.DISPLAY,
+ tab_text_scale=2,
+ custom_font=font,
+ inactive_tab_spritesheet="bmps/inactive_tab_sprite.bmp",
+ showing_tab_spritesheet="bmps/active_tab_sprite.bmp",
+ showing_tab_text_color=0x00AA59,
+ inactive_tab_text_color=0xEEEEEE,
+ inactive_tab_transparent_indexes=(0, 1),
+ showing_tab_transparent_indexes=(0, 1),
+ tab_count=4,
+)
+
+# make page content Groups
+page_1_group = displayio.Group()
+page_2_group = displayio.Group()
+page_3_group = displayio.Group()
+page_4_group = displayio.Group()
+
+# labels
+page_1_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="This is the first page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+page_2_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="This page is the\nsecond page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+page_3_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="The third page is fun!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+
+page_4_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="The fourth page\nis where it's at",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+
+# shapes
+square = Rect(x=20, y=70, width=40, height=40, fill=0x00DD00)
+circle = Circle(50, 120, r=30, fill=0xDD00DD)
+triangle = Triangle(50, 0, 100, 50, 0, 50, fill=0xDDDD00)
+rectangle = Rect(x=80, y=80, width=100, height=50, fill=0x0000DD)
+
+triangle.x = 80
+triangle.y = 70
+
+# add everything to their page groups
+page_1_group.append(square)
+page_1_group.append(page_1_lbl)
+page_2_group.append(page_2_lbl)
+page_2_group.append(circle)
+page_3_group.append(page_3_lbl)
+page_3_group.append(triangle)
+page_4_group.append(page_4_lbl)
+page_4_group.append(rectangle)
+
+# add the pages to the layout, supply your own page names
+test_page_layout.add_content(page_1_group, "One")
+test_page_layout.add_content(page_2_group, "Two")
+test_page_layout.add_content(page_3_group, "Thr")
+test_page_layout.add_content(page_4_group, "For")
+
+# add it to the group that is showing on the display
+main_group.append(test_page_layout)
+
+# change page with function by name
+test_page_layout.show_page(page_name="Thr")
+print(f"showing page index:{test_page_layout.showing_page_index}")
+time.sleep(1)
+
+# change page with function by index
+test_page_layout.show_page(page_index=0)
+print(f"showing page name: {test_page_layout.showing_page_name}")
+time.sleep(1)
+
+# change page by updating the page name property
+test_page_layout.showing_page_name = "Thr"
+print(f"showing page index: {test_page_layout.showing_page_index}")
+time.sleep(1)
+
+# change page by updating the page index property
+test_page_layout.showing_page_index = 1
+print(f"showing page name: {test_page_layout.showing_page_name}")
+time.sleep(5)
+
+another_text = Label(
+ terminalio.FONT,
+ text="And another thing!",
+ scale=2,
+ color=0x00FF00,
+ anchor_point=(0, 0),
+ anchored_position=(100, 100),
+)
+test_page_layout.showing_page_content.append(another_text)
+
+print("starting loop")
+
+prev_change_time = time.monotonic()
+
+while True:
+ now = time.monotonic()
+ if prev_change_time + CHANGE_DELAY <= now:
+ prev_change_time = now
+ # change page by next page function. It will loop by default
+ test_page_layout.next_page()
diff --git a/examples/displayio_layout_tab_layout_touchtest.py b/examples/displayio_layout_tab_layout_touchtest.py
new file mode 100644
index 0000000..a58db70
--- /dev/null
+++ b/examples/displayio_layout_tab_layout_touchtest.py
@@ -0,0 +1,139 @@
+# SPDX-FileCopyrightText: 2022 Tim C
+#
+# SPDX-License-Identifier: MIT
+"""
+Make a TabLayout change tabs with the touchscreen
+"""
+
+import adafruit_touchscreen
+import board
+import displayio
+import terminalio
+from adafruit_display_shapes.circle import Circle
+from adafruit_display_shapes.rect import Rect
+from adafruit_display_shapes.triangle import Triangle
+from adafruit_display_text.bitmap_label import Label
+
+from adafruit_displayio_layout.layouts.tab_layout import TabLayout
+
+# built-in display
+display = board.DISPLAY
+
+# ------------ Touchscreen setup --------------- #
+# See: https://learn.adafruit.com/making-a-pyportal-user-interface-displayio/display
+display = board.DISPLAY # create the display object
+
+screen_width = display.width
+screen_height = display.height
+ts = adafruit_touchscreen.Touchscreen(
+ board.TOUCH_XL,
+ board.TOUCH_XR,
+ board.TOUCH_YD,
+ board.TOUCH_YU,
+ calibration=((5200, 59000), (5800, 57000)),
+ size=(screen_width, screen_height),
+)
+
+# create and show main_group
+main_group = displayio.Group()
+display.root_group = main_group
+
+font = terminalio.FONT
+
+# create the page layout
+test_page_layout = TabLayout(
+ x=0,
+ y=0,
+ display=board.DISPLAY,
+ tab_text_scale=2,
+ custom_font=font,
+ inactive_tab_spritesheet="bmps/inactive_tab_sprite.bmp",
+ showing_tab_spritesheet="bmps/active_tab_sprite.bmp",
+ showing_tab_text_color=0x00AA59,
+ inactive_tab_text_color=0xEEEEEE,
+ inactive_tab_transparent_indexes=(0, 1),
+ showing_tab_transparent_indexes=(0, 1),
+ tab_count=4,
+)
+
+# make page content Groups
+page_1_group = displayio.Group()
+page_2_group = displayio.Group()
+page_3_group = displayio.Group()
+page_4_group = displayio.Group()
+
+# labels
+page_1_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="This is the first page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+page_2_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="This page is the\nsecond page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+page_3_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="The third page is fun!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+
+page_4_lbl = Label(
+ font=terminalio.FONT,
+ scale=2,
+ text="The fourth page\nis where it's at",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+
+# shapes
+square = Rect(x=20, y=70, width=40, height=40, fill=0x00DD00)
+circle = Circle(50, 120, r=30, fill=0xDD00DD)
+triangle = Triangle(50, 0, 100, 50, 0, 50, fill=0xDDDD00)
+rectangle = Rect(x=80, y=80, width=100, height=50, fill=0x0000DD)
+
+triangle.x = 80
+triangle.y = 70
+
+# add everything to their page groups
+page_1_group.append(square)
+page_1_group.append(page_1_lbl)
+page_2_group.append(page_2_lbl)
+page_2_group.append(circle)
+page_3_group.append(page_3_lbl)
+page_3_group.append(triangle)
+page_4_group.append(page_4_lbl)
+page_4_group.append(rectangle)
+
+# add the pages to the layout, supply your own page names
+test_page_layout.add_content(page_1_group, "One")
+test_page_layout.add_content(page_2_group, "Two")
+test_page_layout.add_content(page_3_group, "Thr")
+test_page_layout.add_content(page_4_group, "For")
+
+# add it to the group that is showing on the display
+main_group.append(test_page_layout)
+
+
+# add something new after the TabLayout was already created
+another_text = Label(
+ terminalio.FONT,
+ text="And another thing!",
+ scale=2,
+ color=0x00FF00,
+ anchor_point=(0, 0),
+ anchored_position=(100, 100),
+)
+test_page_layout.showing_page_content.append(another_text)
+
+while True:
+ touch = ts.touch_point
+ if touch:
+ test_page_layout.handle_touch_events(touch)
diff --git a/examples/fonts/Arial-16.bdf b/examples/fonts/Arial-16.bdf
new file mode 100644
index 0000000..087da7d
--- /dev/null
+++ b/examples/fonts/Arial-16.bdf
@@ -0,0 +1,7366 @@
+STARTFONT 2.1
+COMMENT
+COMMENT Converted from OpenType font "arial.ttf" by "otf2bdf 3.0".
+COMMENT
+FONT -FreeType-Arial-Medium-R-Normal--22-160-100-100-P-109-ISO10646-1
+SIZE 16 100 100
+FONTBOUNDINGBOX 43 29 -11 -7
+STARTPROPERTIES 19
+FOUNDRY "FreeType"
+FAMILY_NAME "Arial"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 22
+POINT_SIZE 160
+RESOLUTION_X 100
+RESOLUTION_Y 100
+SPACING "P"
+AVERAGE_WIDTH 109
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+FONT_ASCENT 19
+FONT_DESCENT 4
+COPYRIGHT " 2017 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details."
+_OTF_FONTFILE "arial.ttf"
+_OTF_PSNAME "ArialMT"
+ENDPROPERTIES
+CHARS 3361
+STARTCHAR 0020
+ENCODING 32
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 0 0 0 0
+BITMAP
+ENDCHAR
+STARTCHAR 0021
+ENCODING 33
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 2 16 2 0
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+00
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0022
+ENCODING 34
+SWIDTH 360 0
+DWIDTH 8 0
+BBX 6 6 1 10
+BITMAP
+CC
+CC
+CC
+CC
+CC
+CC
+ENDCHAR
+STARTCHAR 0023
+ENCODING 35
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 12 16 0 0
+BITMAP
+0C60
+0C60
+0C60
+18C0
+FFF0
+FFF0
+18C0
+18C0
+3180
+3180
+FFF0
+FFF0
+3180
+6300
+6300
+6300
+ENDCHAR
+STARTCHAR 0024
+ENCODING 36
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 19 1 -2
+BITMAP
+0800
+3E00
+7F80
+E9C0
+C8C0
+C800
+E800
+7800
+3F00
+0F80
+09C0
+08C0
+C8C0
+C8C0
+6980
+7F80
+3E00
+0800
+0800
+ENDCHAR
+STARTCHAR 0025
+ENCODING 37
+SWIDTH 900 0
+DWIDTH 20 0
+BBX 18 16 1 0
+BITMAP
+380600
+6C0C00
+C60C00
+C61800
+C63000
+C63000
+C66000
+6C6700
+38CD80
+0198C0
+0198C0
+0318C0
+0318C0
+0618C0
+0C0D80
+0C0700
+ENDCHAR
+STARTCHAR 0026
+ENCODING 38
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 13 16 1 0
+BITMAP
+0E00
+1F00
+3180
+3180
+3180
+1B00
+1F00
+1C00
+7600
+6330
+C1B0
+C1E0
+C0E0
+61A0
+7F98
+1E10
+ENDCHAR
+STARTCHAR 0027
+ENCODING 39
+SWIDTH 180 0
+DWIDTH 4 0
+BBX 2 6 1 10
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0028
+ENCODING 40
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 5 20 1 -4
+BITMAP
+08
+10
+30
+20
+60
+60
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+60
+60
+20
+30
+10
+08
+ENDCHAR
+STARTCHAR 0029
+ENCODING 41
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 5 20 1 -4
+BITMAP
+80
+40
+60
+20
+30
+30
+18
+18
+18
+18
+18
+18
+18
+18
+30
+30
+20
+60
+40
+80
+ENDCHAR
+STARTCHAR 002A
+ENCODING 42
+SWIDTH 405 0
+DWIDTH 9 0
+BBX 8 7 1 9
+BITMAP
+18
+18
+FF
+3C
+3C
+66
+24
+ENDCHAR
+STARTCHAR 002B
+ENCODING 43
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 10 10 1 3
+BITMAP
+0C00
+0C00
+0C00
+0C00
+FFC0
+FFC0
+0C00
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 002C
+ENCODING 44
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 2 5 2 -3
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 002D
+ENCODING 45
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 6 2 0 5
+BITMAP
+FC
+FC
+ENDCHAR
+STARTCHAR 002E
+ENCODING 46
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 2 2 2 0
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 002F
+ENCODING 47
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 7 16 0 0
+BITMAP
+06
+06
+0C
+0C
+0C
+18
+18
+18
+30
+30
+30
+60
+60
+60
+E0
+C0
+ENDCHAR
+STARTCHAR 0030
+ENCODING 48
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+1E00
+3F80
+6180
+6180
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+6180
+6180
+3F00
+1E00
+ENDCHAR
+STARTCHAR 0031
+ENCODING 49
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 6 16 2 0
+BITMAP
+0C
+0C
+1C
+7C
+EC
+8C
+0C
+0C
+0C
+0C
+0C
+0C
+0C
+0C
+0C
+0C
+ENDCHAR
+STARTCHAR 0032
+ENCODING 50
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+3F00
+7F80
+E1C0
+C0C0
+00C0
+00C0
+00C0
+0180
+0300
+0600
+0C00
+1800
+3000
+6000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR 0033
+ENCODING 51
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+3E00
+7F00
+E380
+C180
+0180
+0300
+0E00
+0F00
+0180
+00C0
+00C0
+00C0
+C0C0
+E180
+7F80
+3E00
+ENDCHAR
+STARTCHAR 0034
+ENCODING 52
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+0300
+0700
+0F00
+0F00
+1B00
+1B00
+3300
+7300
+6300
+C300
+FFC0
+FFC0
+0300
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 0035
+ENCODING 53
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+3F80
+3F80
+6000
+6000
+6000
+7E00
+FF80
+C180
+00C0
+00C0
+00C0
+00C0
+C0C0
+E180
+7F80
+3E00
+ENDCHAR
+STARTCHAR 0036
+ENCODING 54
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+1F00
+3F80
+61C0
+60C0
+C000
+C000
+CF00
+FF80
+E1C0
+C0C0
+C0C0
+C0C0
+C0C0
+6180
+7F80
+1E00
+ENDCHAR
+STARTCHAR 0037
+ENCODING 55
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+FFC0
+FFC0
+0080
+0180
+0300
+0600
+0600
+0C00
+0C00
+1800
+1800
+1800
+1000
+3000
+3000
+3000
+ENDCHAR
+STARTCHAR 0038
+ENCODING 56
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+1E00
+3F00
+6180
+6180
+6180
+6180
+3F00
+3F00
+6180
+C0C0
+C0C0
+C0C0
+C0C0
+6180
+7F80
+1E00
+ENDCHAR
+STARTCHAR 0039
+ENCODING 57
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+1E00
+7F00
+6180
+C080
+C0C0
+C0C0
+C0C0
+E1C0
+7FC0
+3CC0
+00C0
+00C0
+C180
+E380
+7F00
+3E00
+ENDCHAR
+STARTCHAR 003A
+ENCODING 58
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 2 12 2 0
+BITMAP
+C0
+C0
+00
+00
+00
+00
+00
+00
+00
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 003B
+ENCODING 59
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 2 15 2 -3
+BITMAP
+C0
+C0
+00
+00
+00
+00
+00
+00
+00
+00
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 003C
+ENCODING 60
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 11 1 2
+BITMAP
+0020
+00E0
+07C0
+1E00
+7800
+C000
+7800
+1E00
+07C0
+00E0
+0020
+ENDCHAR
+STARTCHAR 003D
+ENCODING 61
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 7 1 4
+BITMAP
+FFE0
+FFE0
+0000
+0000
+0000
+FFE0
+FFE0
+ENDCHAR
+STARTCHAR 003E
+ENCODING 62
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 11 1 2
+BITMAP
+8000
+E000
+7C00
+0F00
+03C0
+0060
+03C0
+0F00
+7C00
+E000
+8000
+ENDCHAR
+STARTCHAR 003F
+ENCODING 63
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+3F00
+7F80
+E1C0
+C0C0
+00C0
+01C0
+0380
+0700
+0600
+0C00
+0C00
+0C00
+0000
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0040
+ENCODING 64
+SWIDTH 990 0
+DWIDTH 22 0
+BBX 20 21 1 -5
+BITMAP
+01F800
+07FE00
+1E0780
+180180
+31CCC0
+77ECE0
+6E3860
+6C1860
+DC1860
+D81860
+D81860
+D830C0
+D831C0
+DC7380
+EFFF00
+671C00
+700030
+3800E0
+1E03C0
+0FFF80
+01FC00
+ENDCHAR
+STARTCHAR 0041
+ENCODING 65
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 16 0 0
+BITMAP
+0380
+0380
+06C0
+06C0
+0EE0
+0C60
+0C60
+1830
+1830
+3FF8
+3FF8
+3018
+600C
+600C
+C006
+C006
+ENDCHAR
+STARTCHAR 0042
+ENCODING 66
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 16 2 0
+BITMAP
+FF80
+FFC0
+C0E0
+C060
+C060
+C060
+C0C0
+FFC0
+FFC0
+C060
+C030
+C030
+C030
+C070
+FFE0
+FF80
+ENDCHAR
+STARTCHAR 0043
+ENCODING 67
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 14 16 1 0
+BITMAP
+07C0
+1FF0
+3838
+6018
+600C
+C000
+C000
+C000
+C000
+C000
+C000
+600C
+6018
+3838
+1FF0
+0FC0
+ENDCHAR
+STARTCHAR 0044
+ENCODING 68
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 13 16 2 0
+BITMAP
+FF80
+FFE0
+C070
+C030
+C038
+C018
+C018
+C018
+C018
+C018
+C018
+C030
+C030
+C0E0
+FFE0
+FF80
+ENDCHAR
+STARTCHAR 0045
+ENCODING 69
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 16 2 0
+BITMAP
+FFF0
+FFF0
+C000
+C000
+C000
+C000
+C000
+FFE0
+FFE0
+C000
+C000
+C000
+C000
+C000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 0046
+ENCODING 70
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 10 16 2 0
+BITMAP
+FFC0
+FFC0
+C000
+C000
+C000
+C000
+C000
+FF80
+FF80
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+ENDCHAR
+STARTCHAR 0047
+ENCODING 71
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 16 1 0
+BITMAP
+07E0
+1FF8
+381C
+700C
+6006
+C000
+C000
+C000
+C0FE
+C0FE
+C006
+6006
+7006
+381E
+1FFC
+07E0
+ENDCHAR
+STARTCHAR 0048
+ENCODING 72
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 16 2 0
+BITMAP
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+FFF0
+FFF0
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+ENDCHAR
+STARTCHAR 0049
+ENCODING 73
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 2 16 2 0
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 004A
+ENCODING 74
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 8 16 1 0
+BITMAP
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+C3
+C3
+E7
+7E
+3C
+ENDCHAR
+STARTCHAR 004B
+ENCODING 75
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 13 16 2 0
+BITMAP
+C070
+C0E0
+C1C0
+C380
+C700
+CE00
+DC00
+FC00
+FE00
+E700
+C380
+C1C0
+C0C0
+C0E0
+C070
+C038
+ENDCHAR
+STARTCHAR 004C
+ENCODING 76
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 9 16 2 0
+BITMAP
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+FF80
+FF80
+ENDCHAR
+STARTCHAR 004D
+ENCODING 77
+SWIDTH 855 0
+DWIDTH 19 0
+BBX 15 16 2 0
+BITMAP
+E00E
+F01E
+F01E
+F01E
+D836
+D836
+D836
+CC66
+CC66
+CC66
+C6C6
+C6C6
+C6C6
+C386
+C386
+C386
+ENDCHAR
+STARTCHAR 004E
+ENCODING 78
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 16 2 0
+BITMAP
+C030
+E030
+F030
+F030
+D830
+D830
+CC30
+C630
+C630
+C330
+C1B0
+C1B0
+C0F0
+C0F0
+C070
+C030
+ENDCHAR
+STARTCHAR 004F
+ENCODING 79
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 16 1 0
+BITMAP
+07C0
+1FF0
+3838
+701C
+600C
+C006
+C006
+C006
+C006
+C006
+C006
+600C
+701C
+3838
+1FF0
+07C0
+ENDCHAR
+STARTCHAR 0050
+ENCODING 80
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 16 2 0
+BITMAP
+FF80
+FFE0
+C060
+C030
+C030
+C030
+C030
+C060
+FFE0
+FF80
+C000
+C000
+C000
+C000
+C000
+C000
+ENDCHAR
+STARTCHAR 0051
+ENCODING 81
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 17 1 -1
+BITMAP
+07C0
+1FF0
+3838
+701C
+600C
+C006
+C006
+C006
+C006
+C006
+C006
+600C
+70EC
+3838
+1FF8
+07EE
+0002
+ENDCHAR
+STARTCHAR 0052
+ENCODING 82
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 16 2 0
+BITMAP
+FFC0
+FFE0
+C070
+C030
+C030
+C030
+C070
+FFE0
+FFC0
+C300
+C180
+C1C0
+C0E0
+C060
+C070
+C030
+ENDCHAR
+STARTCHAR 0053
+ENCODING 83
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 13 16 1 0
+BITMAP
+0FC0
+3FE0
+7070
+6018
+6018
+7000
+3C00
+1FC0
+03F0
+0038
+C018
+C018
+6018
+7070
+3FF0
+0FC0
+ENDCHAR
+STARTCHAR 0054
+ENCODING 84
+SWIDTH 630 0
+DWIDTH 14 0
+BBX 12 16 1 0
+BITMAP
+FFF0
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0055
+ENCODING 85
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 16 2 0
+BITMAP
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+E070
+70E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR 0056
+ENCODING 86
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 16 0 0
+BITMAP
+C006
+E00E
+600C
+600C
+3018
+3018
+3838
+1830
+1830
+0C60
+0C60
+0C60
+06C0
+06C0
+07C0
+0380
+ENDCHAR
+STARTCHAR 0057
+ENCODING 87
+SWIDTH 945 0
+DWIDTH 21 0
+BBX 21 16 0 0
+BITMAP
+C07018
+C07018
+60D830
+60D830
+60D830
+60D830
+318C60
+318C60
+318C60
+318C60
+1B06C0
+1B06C0
+1B06C0
+1B06C0
+0E0380
+0E0380
+ENDCHAR
+STARTCHAR 0058
+ENCODING 88
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 16 0 0
+BITMAP
+701C
+3838
+1830
+0C60
+0EE0
+06C0
+0380
+0380
+0380
+06C0
+0C60
+1C70
+1830
+3018
+701C
+E00E
+ENDCHAR
+STARTCHAR 0059
+ENCODING 89
+SWIDTH 630 0
+DWIDTH 14 0
+BBX 14 16 0 0
+BITMAP
+E01C
+6018
+3030
+3870
+1860
+0CC0
+0FC0
+0780
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 005A
+ENCODING 90
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 12 16 0 0
+BITMAP
+7FF0
+7FF0
+0060
+00C0
+00C0
+0180
+0300
+0600
+0600
+0C00
+1800
+3000
+3000
+6000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 005B
+ENCODING 91
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 4 20 1 -4
+BITMAP
+F0
+F0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+F0
+F0
+ENDCHAR
+STARTCHAR 005C
+ENCODING 92
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 7 16 0 0
+BITMAP
+C0
+C0
+60
+60
+60
+30
+30
+30
+18
+18
+18
+0C
+0C
+0C
+0E
+06
+ENDCHAR
+STARTCHAR 005D
+ENCODING 93
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 4 20 1 -4
+BITMAP
+F0
+F0
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+F0
+F0
+ENDCHAR
+STARTCHAR 005E
+ENCODING 94
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 10 9 0 7
+BITMAP
+0C00
+1E00
+1E00
+3300
+3300
+3300
+6180
+6180
+C0C0
+ENDCHAR
+STARTCHAR 005F
+ENCODING 95
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 12 2 0 -4
+BITMAP
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 0060
+ENCODING 96
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 3 3 1 13
+BITMAP
+C0
+60
+20
+ENDCHAR
+STARTCHAR 0061
+ENCODING 97
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 12 1 0
+BITMAP
+3E00
+7F00
+C180
+C180
+0780
+7F80
+7980
+C180
+C180
+C380
+7F80
+7CC0
+ENDCHAR
+STARTCHAR 0062
+ENCODING 98
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+C000
+C000
+C000
+C000
+DE00
+FF80
+E180
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+E180
+FF80
+DE00
+ENDCHAR
+STARTCHAR 0063
+ENCODING 99
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 12 1 0
+BITMAP
+1E00
+7F00
+6380
+C180
+C000
+C000
+C000
+C000
+C180
+6380
+7F00
+1E00
+ENDCHAR
+STARTCHAR 0064
+ENCODING 100
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+00C0
+00C0
+00C0
+00C0
+1EC0
+7FC0
+61C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+E1C0
+7FC0
+1EC0
+ENDCHAR
+STARTCHAR 0065
+ENCODING 101
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 12 1 0
+BITMAP
+1E00
+7F80
+6180
+C0C0
+FFC0
+FFC0
+C000
+C000
+E0C0
+7180
+3F80
+1E00
+ENDCHAR
+STARTCHAR 0066
+ENCODING 102
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 7 16 0 0
+BITMAP
+1E
+3E
+30
+30
+FC
+FC
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 0067
+ENCODING 103
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 -4
+BITMAP
+1EC0
+7FC0
+61C0
+E0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C1C0
+61C0
+7FC0
+1EC0
+00C0
+C180
+FF80
+3E00
+ENDCHAR
+STARTCHAR 0068
+ENCODING 104
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+C000
+C000
+C000
+C000
+DE00
+FF00
+E380
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+ENDCHAR
+STARTCHAR 0069
+ENCODING 105
+SWIDTH 225 0
+DWIDTH 5 0
+BBX 2 16 1 0
+BITMAP
+C0
+C0
+00
+00
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 006A
+ENCODING 106
+SWIDTH 180 0
+DWIDTH 4 0
+BBX 4 20 -1 -4
+BITMAP
+30
+30
+00
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+F0
+E0
+ENDCHAR
+STARTCHAR 006B
+ENCODING 107
+SWIDTH 450 0
+DWIDTH 10 0
+BBX 9 16 1 0
+BITMAP
+C000
+C000
+C000
+C000
+C380
+C700
+CE00
+DC00
+F800
+FC00
+EC00
+CE00
+C600
+C700
+C300
+C380
+ENDCHAR
+STARTCHAR 006C
+ENCODING 108
+SWIDTH 180 0
+DWIDTH 4 0
+BBX 2 16 1 0
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 006D
+ENCODING 109
+SWIDTH 810 0
+DWIDTH 18 0
+BBX 16 12 1 0
+BITMAP
+DE3C
+FF7E
+E3C7
+C183
+C183
+C183
+C183
+C183
+C183
+C183
+C183
+C183
+ENDCHAR
+STARTCHAR 006E
+ENCODING 110
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 12 1 0
+BITMAP
+DE00
+FF00
+E380
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+ENDCHAR
+STARTCHAR 006F
+ENCODING 111
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 12 1 0
+BITMAP
+1F00
+3F80
+71C0
+E0E0
+C060
+C060
+C060
+C060
+E0E0
+71C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 0070
+ENCODING 112
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 -4
+BITMAP
+DE00
+FF80
+E180
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+E180
+FF00
+DE00
+C000
+C000
+C000
+C000
+ENDCHAR
+STARTCHAR 0071
+ENCODING 113
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 -4
+BITMAP
+1EC0
+7FC0
+61C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+61C0
+7FC0
+1EC0
+00C0
+00C0
+00C0
+00C0
+ENDCHAR
+STARTCHAR 0072
+ENCODING 114
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+DC
+FC
+E0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0073
+ENCODING 115
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 12 1 0
+BITMAP
+3E00
+7F00
+C180
+C000
+F000
+7E00
+1F80
+0380
+0180
+C380
+7F00
+3E00
+ENDCHAR
+STARTCHAR 0074
+ENCODING 116
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 5 16 0 0
+BITMAP
+20
+60
+60
+60
+F8
+F8
+60
+60
+60
+60
+60
+60
+60
+60
+78
+38
+ENDCHAR
+STARTCHAR 0075
+ENCODING 117
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 12 1 0
+BITMAP
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+E380
+7F80
+3D80
+ENDCHAR
+STARTCHAR 0076
+ENCODING 118
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 11 12 0 0
+BITMAP
+C060
+C060
+60C0
+60C0
+3180
+3180
+3180
+1B00
+1B00
+0E00
+0E00
+0400
+ENDCHAR
+STARTCHAR 0077
+ENCODING 119
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 12 0 0
+BITMAP
+C106
+C386
+C386
+628C
+66CC
+26C8
+36D8
+36D8
+1450
+1C70
+1C70
+0C60
+ENDCHAR
+STARTCHAR 0078
+ENCODING 120
+SWIDTH 450 0
+DWIDTH 10 0
+BBX 10 12 0 0
+BITMAP
+E1C0
+6180
+3300
+3300
+1E00
+0C00
+0C00
+1E00
+3300
+3300
+6180
+E1C0
+ENDCHAR
+STARTCHAR 0079
+ENCODING 121
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 11 16 0 -4
+BITMAP
+C060
+C060
+60C0
+60C0
+30C0
+3180
+1980
+1980
+0F00
+0F00
+0700
+0600
+0E00
+0C00
+7C00
+7800
+ENDCHAR
+STARTCHAR 007A
+ENCODING 122
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 10 12 0 0
+BITMAP
+7FC0
+7FC0
+01C0
+0380
+0700
+0E00
+1C00
+3800
+7000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR 007B
+ENCODING 123
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 6 20 0 -4
+BITMAP
+1C
+3C
+30
+30
+30
+30
+30
+30
+60
+E0
+E0
+60
+30
+30
+30
+30
+30
+30
+3C
+1C
+ENDCHAR
+STARTCHAR 007C
+ENCODING 124
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 2 21 2 -5
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 007D
+ENCODING 125
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 6 20 1 -4
+BITMAP
+E0
+F0
+30
+30
+30
+30
+30
+30
+38
+1C
+1C
+38
+30
+30
+30
+30
+30
+30
+F0
+E0
+ENDCHAR
+STARTCHAR 007E
+ENCODING 126
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 4 1 6
+BITMAP
+7800
+FE20
+8FE0
+03C0
+ENDCHAR
+STARTCHAR 00A0
+ENCODING 160
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 0 0 0 0
+BITMAP
+ENDCHAR
+STARTCHAR 00A1
+ENCODING 161
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 2 16 2 -4
+BITMAP
+C0
+C0
+00
+00
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 00A2
+ENCODING 162
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 20 1 -4
+BITMAP
+0100
+0100
+0100
+0100
+1E00
+3F80
+6380
+E4C0
+C400
+C400
+C800
+C800
+E8C0
+7980
+3F80
+1E00
+1000
+2000
+2000
+2000
+ENDCHAR
+STARTCHAR 00A3
+ENCODING 163
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 11 16 0 0
+BITMAP
+1F00
+3F80
+71C0
+60C0
+6000
+6000
+6000
+FE00
+FE00
+3000
+3000
+3000
+6000
+7C40
+FFE0
+83C0
+ENDCHAR
+STARTCHAR 00A4
+ENCODING 164
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 11 11 1 2
+BITMAP
+4040
+EEE0
+7FC0
+3180
+60C0
+60C0
+60C0
+3180
+7FC0
+EEE0
+4040
+ENDCHAR
+STARTCHAR 00A5
+ENCODING 165
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 12 16 0 0
+BITMAP
+C030
+6060
+6060
+30C0
+30C0
+1980
+1F80
+0F00
+7FE0
+7FE0
+0600
+0600
+7FE0
+7FE0
+0600
+0600
+ENDCHAR
+STARTCHAR 00A6
+ENCODING 166
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 2 21 2 -5
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+00
+00
+00
+00
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 00A7
+ENCODING 167
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 20 1 -4
+BITMAP
+1E00
+3F00
+7380
+6180
+6000
+3800
+7C00
+CE00
+C380
+C1C0
+E0C0
+70C0
+1D80
+0F00
+0700
+0180
+6180
+7180
+3F00
+1E00
+ENDCHAR
+STARTCHAR 00A8
+ENCODING 168
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 6 2 1 14
+BITMAP
+CC
+CC
+ENDCHAR
+STARTCHAR 00A9
+ENCODING 169
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 16 16 0 0
+BITMAP
+07E0
+1818
+2004
+43C2
+4422
+8811
+8801
+8801
+8801
+8801
+8811
+4422
+43C2
+2004
+1818
+07E0
+ENDCHAR
+STARTCHAR 00AA
+ENCODING 170
+SWIDTH 360 0
+DWIDTH 8 0
+BBX 7 8 0 8
+BITMAP
+7C
+C6
+06
+3E
+F6
+C6
+CE
+76
+ENDCHAR
+STARTCHAR 00AB
+ENCODING 171
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 9 10 1 1
+BITMAP
+1980
+3300
+7700
+6600
+CC00
+CC00
+6600
+7700
+3300
+1980
+ENDCHAR
+STARTCHAR 00AC
+ENCODING 172
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 6 1 5
+BITMAP
+FFE0
+FFE0
+0060
+0060
+0060
+0060
+ENDCHAR
+STARTCHAR 00AD
+ENCODING 173
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 6 2 0 5
+BITMAP
+FC
+FC
+ENDCHAR
+STARTCHAR 00AE
+ENCODING 174
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 16 16 0 0
+BITMAP
+07E0
+1818
+2004
+47C2
+4422
+8421
+8421
+87C1
+8481
+8441
+8421
+4422
+4412
+2004
+1818
+07E0
+ENDCHAR
+STARTCHAR 00AF
+ENCODING 175
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 13 2 -1 17
+BITMAP
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR 00B0
+ENCODING 176
+SWIDTH 405 0
+DWIDTH 9 0
+BBX 6 6 1 10
+BITMAP
+78
+CC
+84
+84
+CC
+78
+ENDCHAR
+STARTCHAR 00B1
+ENCODING 177
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 13 1 0
+BITMAP
+0C00
+0C00
+0C00
+0C00
+FFC0
+FFC0
+0C00
+0C00
+0C00
+0C00
+0000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR 00B2
+ENCODING 178
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 7 8 0 8
+BITMAP
+7C
+C6
+06
+0E
+1C
+38
+60
+FE
+ENDCHAR
+STARTCHAR 00B3
+ENCODING 179
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 7 8 0 8
+BITMAP
+7C
+C6
+06
+18
+06
+06
+C6
+7C
+ENDCHAR
+STARTCHAR 00B4
+ENCODING 180
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 3 3 2 13
+BITMAP
+60
+C0
+80
+ENDCHAR
+STARTCHAR 00B5
+ENCODING 181
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 -4
+BITMAP
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+E1C0
+FFC0
+DEC0
+C000
+C000
+C000
+C000
+ENDCHAR
+STARTCHAR 00B6
+ENCODING 182
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 12 20 0 -4
+BITMAP
+3FF0
+7FF0
+FC60
+FC60
+FC60
+FC60
+FC60
+7C60
+3C60
+0C60
+0C60
+0C60
+0C60
+0C60
+0C60
+0C60
+0C60
+0C60
+0C60
+0C60
+ENDCHAR
+STARTCHAR 00B7
+ENCODING 183
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 2 2 3 7
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 00B8
+ENCODING 184
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 5 4 1 -4
+BITMAP
+20
+30
+18
+F0
+ENDCHAR
+STARTCHAR 00B9
+ENCODING 185
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 4 8 1 8
+BITMAP
+30
+70
+F0
+B0
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 00BA
+ENCODING 186
+SWIDTH 360 0
+DWIDTH 8 0
+BBX 8 8 0 8
+BITMAP
+3C
+66
+C3
+C3
+C3
+C3
+66
+3C
+ENDCHAR
+STARTCHAR 00BB
+ENCODING 187
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 9 10 2 1
+BITMAP
+CC00
+6600
+7700
+3300
+1980
+1980
+3300
+7700
+6600
+CC00
+ENDCHAR
+STARTCHAR 00BC
+ENCODING 188
+SWIDTH 810 0
+DWIDTH 18 0
+BBX 16 16 2 0
+BITMAP
+300C
+7018
+F030
+B060
+3060
+30C0
+3180
+3300
+0306
+060E
+0C1E
+0C36
+1866
+307F
+6006
+6006
+ENDCHAR
+STARTCHAR 00BD
+ENCODING 189
+SWIDTH 810 0
+DWIDTH 18 0
+BBX 16 16 2 0
+BITMAP
+300C
+7018
+F030
+B060
+3060
+30C0
+3180
+3180
+031E
+0633
+0C03
+0C07
+1806
+300C
+7018
+603F
+ENDCHAR
+STARTCHAR 00BE
+ENCODING 190
+SWIDTH 810 0
+DWIDTH 18 0
+BBX 17 16 0 0
+BITMAP
+7C0300
+C60600
+060C00
+180C00
+061800
+063000
+C63000
+7C6000
+00C300
+018700
+018F00
+031B00
+063300
+0C3F80
+0C0300
+180300
+ENDCHAR
+STARTCHAR 00BF
+ENCODING 191
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 9 16 2 -4
+BITMAP
+0C00
+0C00
+0000
+0000
+0C00
+0C00
+0C00
+1800
+3800
+7000
+E000
+C000
+C180
+E380
+7F00
+3E00
+ENDCHAR
+STARTCHAR 00C0
+ENCODING 192
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 20 0 0
+BITMAP
+0300
+0180
+0080
+0000
+0380
+0380
+06C0
+06C0
+0EE0
+0C60
+0C60
+1830
+1830
+3FF8
+3FF8
+3018
+600C
+600C
+C006
+C006
+ENDCHAR
+STARTCHAR 00C1
+ENCODING 193
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 20 0 0
+BITMAP
+0180
+0300
+0200
+0000
+0380
+0380
+06C0
+06C0
+0EE0
+0C60
+0C60
+1830
+1830
+3FF8
+3FF8
+3018
+600C
+600C
+C006
+C006
+ENDCHAR
+STARTCHAR 00C2
+ENCODING 194
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 20 0 0
+BITMAP
+0180
+03C0
+0660
+0000
+0380
+0380
+06C0
+06C0
+0EE0
+0C60
+0C60
+1830
+1830
+3FF8
+3FF8
+3018
+600C
+600C
+C006
+C006
+ENDCHAR
+STARTCHAR 00C3
+ENCODING 195
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 20 0 0
+BITMAP
+0760
+0FE0
+0DC0
+0000
+0380
+0380
+06C0
+06C0
+0EE0
+0C60
+0C60
+1830
+1830
+3FF8
+3FF8
+3018
+600C
+600C
+C006
+C006
+ENDCHAR
+STARTCHAR 00C4
+ENCODING 196
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 19 0 0
+BITMAP
+0660
+0660
+0000
+0380
+0380
+06C0
+06C0
+0EE0
+0C60
+0C60
+1830
+1830
+3FF8
+3FF8
+3018
+600C
+600C
+C006
+C006
+ENDCHAR
+STARTCHAR 00C5
+ENCODING 197
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 20 0 0
+BITMAP
+0380
+0440
+0440
+0440
+0380
+0380
+06C0
+06C0
+0EE0
+0C60
+0C60
+1830
+1830
+3FF8
+3FF8
+3018
+600C
+600C
+C006
+C006
+ENDCHAR
+STARTCHAR 00C6
+ENCODING 198
+SWIDTH 990 0
+DWIDTH 22 0
+BBX 21 16 0 0
+BITMAP
+00FFF8
+01FFF8
+019800
+031800
+061800
+061800
+0C1800
+0C1FF0
+181FF0
+1FF800
+3FF800
+301800
+601800
+601800
+C01FF8
+C01FF8
+ENDCHAR
+STARTCHAR 00C7
+ENCODING 199
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 14 20 1 -4
+BITMAP
+07C0
+1FF0
+3838
+6018
+600C
+C000
+C000
+C000
+C000
+C000
+C000
+600C
+6018
+3838
+1FF0
+0FC0
+0200
+0300
+0180
+0F00
+ENDCHAR
+STARTCHAR 00C8
+ENCODING 200
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 20 2 0
+BITMAP
+0C00
+0600
+0200
+0000
+FFF0
+FFF0
+C000
+C000
+C000
+C000
+C000
+FFE0
+FFE0
+C000
+C000
+C000
+C000
+C000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 00C9
+ENCODING 201
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 20 2 0
+BITMAP
+0300
+0600
+0400
+0000
+FFF0
+FFF0
+C000
+C000
+C000
+C000
+C000
+FFE0
+FFE0
+C000
+C000
+C000
+C000
+C000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 00CA
+ENCODING 202
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 20 2 0
+BITMAP
+0600
+0F00
+1980
+0000
+FFF0
+FFF0
+C000
+C000
+C000
+C000
+C000
+FFE0
+FFE0
+C000
+C000
+C000
+C000
+C000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 00CB
+ENCODING 203
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 19 2 0
+BITMAP
+1980
+1980
+0000
+FFF0
+FFF0
+C000
+C000
+C000
+C000
+C000
+FFE0
+FFE0
+C000
+C000
+C000
+C000
+C000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 00CC
+ENCODING 204
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 3 20 1 0
+BITMAP
+C0
+60
+20
+00
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR 00CD
+ENCODING 205
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 3 20 2 0
+BITMAP
+60
+C0
+80
+00
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 00CE
+ENCODING 206
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 6 20 0 0
+BITMAP
+30
+78
+CC
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 00CF
+ENCODING 207
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 6 19 0 0
+BITMAP
+CC
+CC
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 00D0
+ENCODING 208
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 15 16 0 0
+BITMAP
+3FE0
+3FF8
+301C
+300C
+300E
+3006
+3006
+FF06
+FF06
+3006
+3006
+300C
+300C
+303C
+3FF8
+3FE0
+ENDCHAR
+STARTCHAR 00D1
+ENCODING 209
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+0EC0
+1FC0
+1B80
+0000
+C030
+E030
+F030
+F030
+D830
+D830
+CC30
+C630
+C630
+C330
+C1B0
+C1B0
+C0F0
+C0F0
+C070
+C030
+ENDCHAR
+STARTCHAR 00D2
+ENCODING 210
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 20 1 0
+BITMAP
+0300
+0180
+0080
+0000
+07C0
+1FF0
+3838
+701C
+600C
+C006
+C006
+C006
+C006
+C006
+C006
+600C
+701C
+3838
+1FF0
+07C0
+ENDCHAR
+STARTCHAR 00D3
+ENCODING 211
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 20 1 0
+BITMAP
+0180
+0300
+0200
+0000
+07C0
+1FF0
+3838
+701C
+600C
+C006
+C006
+C006
+C006
+C006
+C006
+600C
+701C
+3838
+1FF0
+07C0
+ENDCHAR
+STARTCHAR 00D4
+ENCODING 212
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 20 1 0
+BITMAP
+0180
+03C0
+0660
+0000
+07C0
+1FF0
+3838
+701C
+600C
+C006
+C006
+C006
+C006
+C006
+C006
+600C
+701C
+3838
+1FF0
+07C0
+ENDCHAR
+STARTCHAR 00D5
+ENCODING 213
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 20 1 0
+BITMAP
+0760
+0FE0
+0DC0
+0000
+07C0
+1FF0
+3838
+701C
+600C
+C006
+C006
+C006
+C006
+C006
+C006
+600C
+701C
+3838
+1FF0
+07C0
+ENDCHAR
+STARTCHAR 00D6
+ENCODING 214
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 19 1 0
+BITMAP
+0660
+0660
+0000
+07C0
+1FF0
+3838
+701C
+600C
+C006
+C006
+C006
+C006
+C006
+C006
+600C
+701C
+3838
+1FF0
+07C0
+ENDCHAR
+STARTCHAR 00D7
+ENCODING 215
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 9 9 2 3
+BITMAP
+8100
+E380
+7700
+3E00
+1C00
+3E00
+7700
+E380
+8100
+ENDCHAR
+STARTCHAR 00D8
+ENCODING 216
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 16 1 -1
+BITMAP
+07C6
+1FFC
+383C
+701C
+603C
+C066
+C0C6
+C186
+C306
+C606
+C606
+6C0C
+781C
+3838
+7FF0
+CFC0
+ENDCHAR
+STARTCHAR 00D9
+ENCODING 217
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+0C00
+0600
+0200
+0000
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+E070
+70E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR 00DA
+ENCODING 218
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+0300
+0600
+0400
+0000
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+E070
+70E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR 00DB
+ENCODING 219
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+0600
+0F00
+1980
+0000
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+E070
+70E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR 00DC
+ENCODING 220
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 19 2 0
+BITMAP
+1980
+1980
+0000
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+E070
+70E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR 00DD
+ENCODING 221
+SWIDTH 630 0
+DWIDTH 14 0
+BBX 14 20 0 0
+BITMAP
+0180
+0300
+0200
+0000
+E01C
+6018
+3030
+3870
+1860
+0CC0
+0FC0
+0780
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 00DE
+ENCODING 222
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 16 2 0
+BITMAP
+C000
+C000
+C000
+FF80
+FFE0
+C060
+C030
+C030
+C030
+C030
+C060
+FFE0
+FF80
+C000
+C000
+C000
+ENDCHAR
+STARTCHAR 00DF
+ENCODING 223
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 16 2 0
+BITMAP
+3E00
+7F00
+E380
+C180
+C180
+C300
+C700
+C600
+C700
+C380
+C0C0
+C060
+C060
+DCE0
+CFC0
+C780
+ENDCHAR
+STARTCHAR 00E0
+ENCODING 224
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+1800
+0C00
+0400
+0000
+3E00
+7F00
+C180
+C180
+0780
+7F80
+7980
+C180
+C180
+C380
+7F80
+7CC0
+ENDCHAR
+STARTCHAR 00E1
+ENCODING 225
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+0600
+0C00
+0800
+0000
+3E00
+7F00
+C180
+C180
+0780
+7F80
+7980
+C180
+C180
+C380
+7F80
+7CC0
+ENDCHAR
+STARTCHAR 00E2
+ENCODING 226
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+0C00
+1E00
+3300
+0000
+3E00
+7F00
+C180
+C180
+0780
+7F80
+7980
+C180
+C180
+C380
+7F80
+7CC0
+ENDCHAR
+STARTCHAR 00E3
+ENCODING 227
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+3E00
+7F00
+C180
+C180
+0780
+7F80
+7980
+C180
+C180
+C380
+7F80
+7CC0
+ENDCHAR
+STARTCHAR 00E4
+ENCODING 228
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 15 1 0
+BITMAP
+3300
+3300
+0000
+3E00
+7F00
+C180
+C180
+0780
+7F80
+7980
+C180
+C180
+C380
+7F80
+7CC0
+ENDCHAR
+STARTCHAR 00E5
+ENCODING 229
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 18 1 0
+BITMAP
+1C00
+2200
+2200
+2200
+1C00
+0000
+3E00
+7F00
+C180
+C180
+0780
+7F80
+7980
+C180
+C180
+C380
+7F80
+7CC0
+ENDCHAR
+STARTCHAR 00E6
+ENCODING 230
+SWIDTH 900 0
+DWIDTH 20 0
+BBX 18 12 1 0
+BITMAP
+3F3E00
+7FFF80
+E0E180
+C0C0C0
+03FFC0
+3FFFC0
+7CC000
+C0C000
+C0C0C0
+E1E180
+7F7F80
+3C1E00
+ENDCHAR
+STARTCHAR 00E7
+ENCODING 231
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 -4
+BITMAP
+1E00
+7F00
+6380
+C180
+C000
+C000
+C000
+C000
+C180
+6380
+7F00
+1E00
+0800
+0C00
+0600
+3C00
+ENDCHAR
+STARTCHAR 00E8
+ENCODING 232
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+1800
+0C00
+0400
+0000
+1E00
+7F80
+6180
+C0C0
+FFC0
+FFC0
+C000
+C000
+E0C0
+7180
+3F80
+1E00
+ENDCHAR
+STARTCHAR 00E9
+ENCODING 233
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+0600
+0C00
+0800
+0000
+1E00
+7F80
+6180
+C0C0
+FFC0
+FFC0
+C000
+C000
+E0C0
+7180
+3F80
+1E00
+ENDCHAR
+STARTCHAR 00EA
+ENCODING 234
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+0C00
+1E00
+3300
+0000
+1E00
+7F80
+6180
+C0C0
+FFC0
+FFC0
+C000
+C000
+E0C0
+7180
+3F80
+1E00
+ENDCHAR
+STARTCHAR 00EB
+ENCODING 235
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 15 1 0
+BITMAP
+3300
+3300
+0000
+1E00
+7F80
+6180
+C0C0
+FFC0
+FFC0
+C000
+C000
+E0C0
+7180
+3F80
+1E00
+ENDCHAR
+STARTCHAR 00EC
+ENCODING 236
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 3 16 1 0
+BITMAP
+C0
+60
+20
+00
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR 00ED
+ENCODING 237
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 3 16 2 0
+BITMAP
+60
+C0
+80
+00
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 00EE
+ENCODING 238
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 6 16 0 0
+BITMAP
+30
+78
+CC
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 00EF
+ENCODING 239
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 6 15 0 0
+BITMAP
+CC
+CC
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 00F0
+ENCODING 240
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+1900
+0F00
+1E00
+3300
+1D00
+7F80
+6180
+E1C0
+C0C0
+C0C0
+C0C0
+C0C0
+C1C0
+6180
+7F80
+1E00
+ENDCHAR
+STARTCHAR 00F1
+ENCODING 241
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+DE00
+FF00
+E380
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+ENDCHAR
+STARTCHAR 00F2
+ENCODING 242
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 16 1 0
+BITMAP
+0C00
+0600
+0200
+0000
+1F00
+3F80
+71C0
+E0E0
+C060
+C060
+C060
+C060
+E0E0
+71C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 00F3
+ENCODING 243
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 16 1 0
+BITMAP
+0300
+0600
+0400
+0000
+1F00
+3F80
+71C0
+E0E0
+C060
+C060
+C060
+C060
+E0E0
+71C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 00F4
+ENCODING 244
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 16 1 0
+BITMAP
+0600
+0F00
+1980
+0000
+1F00
+3F80
+71C0
+E0E0
+C060
+C060
+C060
+C060
+E0E0
+71C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 00F5
+ENCODING 245
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 16 1 0
+BITMAP
+1D80
+3F80
+3700
+0000
+1F00
+3F80
+71C0
+E0E0
+C060
+C060
+C060
+C060
+E0E0
+71C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 00F6
+ENCODING 246
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 15 1 0
+BITMAP
+1980
+1980
+0000
+1F00
+3F80
+71C0
+E0E0
+C060
+C060
+C060
+C060
+E0E0
+71C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 00F7
+ENCODING 247
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 8 1 4
+BITMAP
+0C00
+0C00
+0000
+FFC0
+FFC0
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 00F8
+ENCODING 248
+SWIDTH 630 0
+DWIDTH 14 0
+BBX 11 14 1 -1
+BITMAP
+0060
+1F60
+7FC0
+71C0
+E3E0
+C660
+C660
+CC60
+D860
+F8E0
+71C0
+7F80
+DF00
+4000
+ENDCHAR
+STARTCHAR 00F9
+ENCODING 249
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+3000
+1800
+0800
+0000
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+E380
+7F80
+3D80
+ENDCHAR
+STARTCHAR 00FA
+ENCODING 250
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+0600
+0C00
+0800
+0000
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+E380
+7F80
+3D80
+ENDCHAR
+STARTCHAR 00FB
+ENCODING 251
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+0C00
+1E00
+3300
+0000
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+E380
+7F80
+3D80
+ENDCHAR
+STARTCHAR 00FC
+ENCODING 252
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 15 1 0
+BITMAP
+6600
+6600
+0000
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+E380
+7F80
+3D80
+ENDCHAR
+STARTCHAR 00FD
+ENCODING 253
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 11 20 0 -4
+BITMAP
+0300
+0600
+0400
+0000
+C060
+C060
+60C0
+60C0
+30C0
+3180
+1980
+1980
+0F00
+0F00
+0700
+0600
+0E00
+0C00
+7C00
+7800
+ENDCHAR
+STARTCHAR 00FE
+ENCODING 254
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 20 1 -4
+BITMAP
+C000
+C000
+C000
+C000
+DE00
+FF80
+E180
+C1C0
+C0C0
+C0C0
+C0C0
+C0C0
+C1C0
+E180
+FF00
+DE00
+C000
+C000
+C000
+C000
+ENDCHAR
+STARTCHAR 00FF
+ENCODING 255
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 11 19 0 -4
+BITMAP
+1980
+1980
+0000
+C060
+C060
+60C0
+60C0
+30C0
+3180
+1980
+1980
+0F00
+0F00
+0700
+0600
+0E00
+0C00
+7C00
+7800
+ENDCHAR
+STARTCHAR 0100
+ENCODING 256
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 19 0 0
+BITMAP
+07E0
+07E0
+0000
+0380
+0380
+06C0
+06C0
+0EE0
+0C60
+0C60
+1830
+1830
+3FF8
+3FF8
+3018
+600C
+600C
+C006
+C006
+ENDCHAR
+STARTCHAR 0101
+ENCODING 257
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 15 1 0
+BITMAP
+3F00
+3F00
+0000
+3E00
+7F00
+C180
+C180
+0780
+7F80
+7980
+C180
+C180
+C380
+7F80
+7CC0
+ENDCHAR
+STARTCHAR 0102
+ENCODING 258
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 20 0 0
+BITMAP
+0820
+0C60
+07C0
+0000
+0380
+0380
+06C0
+06C0
+0EE0
+0C60
+0C60
+1830
+1830
+3FF8
+3FF8
+3018
+600C
+600C
+C006
+C006
+ENDCHAR
+STARTCHAR 0103
+ENCODING 259
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+4100
+6300
+3E00
+0000
+3E00
+7F00
+C180
+C180
+0780
+7F80
+7980
+C180
+C180
+C380
+7F80
+7CC0
+ENDCHAR
+STARTCHAR 0104
+ENCODING 260
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 20 0 -4
+BITMAP
+0380
+0380
+06C0
+06C0
+0EE0
+0C60
+0C60
+1830
+1830
+3FF8
+3FF8
+3018
+600C
+600C
+C006
+C006
+0004
+0008
+0008
+000E
+ENDCHAR
+STARTCHAR 0105
+ENCODING 261
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 -4
+BITMAP
+3E00
+7F00
+C180
+C180
+0780
+7F80
+7980
+C180
+C180
+C380
+7F80
+7CC0
+0080
+0100
+0100
+01C0
+ENDCHAR
+STARTCHAR 0106
+ENCODING 262
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 14 20 1 0
+BITMAP
+0180
+0300
+0200
+0000
+07C0
+1FF0
+3838
+6018
+600C
+C000
+C000
+C000
+C000
+C000
+C000
+600C
+6018
+3838
+1FF0
+0FC0
+ENDCHAR
+STARTCHAR 0107
+ENCODING 263
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+0600
+0C00
+0800
+0000
+1E00
+7F00
+6380
+C180
+C000
+C000
+C000
+C000
+C180
+6380
+7F00
+1E00
+ENDCHAR
+STARTCHAR 0108
+ENCODING 264
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 14 20 1 0
+BITMAP
+0300
+0780
+0CC0
+0000
+07C0
+1FF0
+3838
+6018
+600C
+C000
+C000
+C000
+C000
+C000
+C000
+600C
+6018
+3838
+1FF0
+0FC0
+ENDCHAR
+STARTCHAR 0109
+ENCODING 265
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+0C00
+1E00
+3300
+0000
+1E00
+7F00
+6380
+C180
+C000
+C000
+C000
+C000
+C180
+6380
+7F00
+1E00
+ENDCHAR
+STARTCHAR 010A
+ENCODING 266
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 14 19 1 0
+BITMAP
+0180
+0180
+0000
+07C0
+1FF0
+3838
+6018
+600C
+C000
+C000
+C000
+C000
+C000
+C000
+600C
+6018
+3838
+1FF0
+0FC0
+ENDCHAR
+STARTCHAR 010B
+ENCODING 267
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 15 1 0
+BITMAP
+0C00
+0C00
+0000
+1E00
+7F00
+6380
+C180
+C000
+C000
+C000
+C000
+C180
+6380
+7F00
+1E00
+ENDCHAR
+STARTCHAR 010C
+ENCODING 268
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 14 20 1 0
+BITMAP
+0CC0
+0780
+0300
+0000
+07C0
+1FF0
+3838
+6018
+600C
+C000
+C000
+C000
+C000
+C000
+C000
+600C
+6018
+3838
+1FF0
+0FC0
+ENDCHAR
+STARTCHAR 010D
+ENCODING 269
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+3300
+1E00
+0C00
+0000
+1E00
+7F00
+6380
+C180
+C000
+C000
+C000
+C000
+C180
+6380
+7F00
+1E00
+ENDCHAR
+STARTCHAR 010E
+ENCODING 270
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 13 20 2 0
+BITMAP
+3300
+1E00
+0C00
+0000
+FF80
+FFE0
+C070
+C030
+C038
+C018
+C018
+C018
+C018
+C018
+C018
+C030
+C030
+C0E0
+FFE0
+FF80
+ENDCHAR
+STARTCHAR 010F
+ENCODING 271
+SWIDTH 630 0
+DWIDTH 14 0
+BBX 13 16 1 0
+BITMAP
+00D8
+00D8
+00C8
+00C8
+1ED0
+7FC0
+61C0
+C1C0
+C0C0
+C0C0
+C0C0
+C0C0
+E0C0
+61C0
+3FC0
+1EC0
+ENDCHAR
+STARTCHAR 0110
+ENCODING 272
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 15 16 0 0
+BITMAP
+3FE0
+3FF8
+301C
+300C
+300E
+3006
+3006
+FF06
+FF06
+3006
+3006
+300C
+300C
+303C
+3FF8
+3FE0
+ENDCHAR
+STARTCHAR 0111
+ENCODING 273
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 11 16 1 0
+BITMAP
+00C0
+0FE0
+0FE0
+00C0
+1EC0
+7FC0
+61C0
+C1C0
+C0C0
+C0C0
+C0C0
+C0C0
+E0C0
+61C0
+3FC0
+1EC0
+ENDCHAR
+STARTCHAR 0112
+ENCODING 274
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 19 2 0
+BITMAP
+1F80
+1F80
+0000
+FFF0
+FFF0
+C000
+C000
+C000
+C000
+C000
+FFE0
+FFE0
+C000
+C000
+C000
+C000
+C000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 0113
+ENCODING 275
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 15 1 0
+BITMAP
+3F00
+3F00
+0000
+1E00
+7F80
+6180
+C0C0
+FFC0
+FFC0
+C000
+C000
+E0C0
+7180
+3F80
+1E00
+ENDCHAR
+STARTCHAR 0114
+ENCODING 276
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 20 2 0
+BITMAP
+1040
+18C0
+0F80
+0000
+FFF0
+FFF0
+C000
+C000
+C000
+C000
+C000
+FFE0
+FFE0
+C000
+C000
+C000
+C000
+C000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 0115
+ENCODING 277
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+2080
+3180
+1F00
+0000
+1E00
+7F80
+6180
+C0C0
+FFC0
+FFC0
+C000
+C000
+E0C0
+7180
+3F80
+1E00
+ENDCHAR
+STARTCHAR 0116
+ENCODING 278
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 19 2 0
+BITMAP
+0600
+0600
+0000
+FFF0
+FFF0
+C000
+C000
+C000
+C000
+C000
+FFE0
+FFE0
+C000
+C000
+C000
+C000
+C000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 0117
+ENCODING 279
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 15 1 0
+BITMAP
+0C00
+0C00
+0000
+1E00
+7F80
+6180
+C0C0
+FFC0
+FFC0
+C000
+C000
+E0C0
+7180
+3F80
+1E00
+ENDCHAR
+STARTCHAR 0118
+ENCODING 280
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 20 2 -4
+BITMAP
+FFF0
+FFF0
+C000
+C000
+C000
+C000
+C000
+FFE0
+FFE0
+C000
+C000
+C000
+C000
+C000
+FFF0
+FFF0
+0020
+0040
+0040
+0070
+ENDCHAR
+STARTCHAR 0119
+ENCODING 281
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 -4
+BITMAP
+1E00
+7F80
+6180
+C0C0
+FFC0
+FFC0
+C000
+C000
+E0C0
+7180
+3F80
+1E00
+0200
+0400
+0400
+0700
+ENDCHAR
+STARTCHAR 011A
+ENCODING 282
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 12 20 2 0
+BITMAP
+1980
+0F00
+0600
+0000
+FFF0
+FFF0
+C000
+C000
+C000
+C000
+C000
+FFE0
+FFE0
+C000
+C000
+C000
+C000
+C000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 011B
+ENCODING 283
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+3300
+1E00
+0C00
+0000
+1E00
+7F80
+6180
+C0C0
+FFC0
+FFC0
+C000
+C000
+E0C0
+7180
+3F80
+1E00
+ENDCHAR
+STARTCHAR 011C
+ENCODING 284
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 20 1 0
+BITMAP
+0180
+03C0
+0660
+0000
+07E0
+1FF8
+381C
+700C
+6006
+C000
+C000
+C000
+C0FE
+C0FE
+C006
+6006
+7006
+381E
+1FFC
+07E0
+ENDCHAR
+STARTCHAR 011D
+ENCODING 285
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 20 1 -4
+BITMAP
+0C00
+1E00
+3300
+0000
+1EC0
+7FC0
+61C0
+E0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C1C0
+61C0
+7FC0
+1EC0
+00C0
+C180
+FF80
+3E00
+ENDCHAR
+STARTCHAR 011E
+ENCODING 286
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 20 1 0
+BITMAP
+0410
+0630
+03E0
+0000
+07E0
+1FF8
+381C
+700C
+6006
+C000
+C000
+C000
+C0FE
+C0FE
+C006
+6006
+7006
+381E
+1FFC
+07E0
+ENDCHAR
+STARTCHAR 011F
+ENCODING 287
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 20 1 -4
+BITMAP
+2080
+3180
+1F00
+0000
+1EC0
+7FC0
+61C0
+E0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C1C0
+61C0
+7FC0
+1EC0
+00C0
+C180
+FF80
+3E00
+ENDCHAR
+STARTCHAR 0120
+ENCODING 288
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 19 1 0
+BITMAP
+0180
+0180
+0000
+07E0
+1FF8
+381C
+700C
+6006
+C000
+C000
+C000
+C0FE
+C0FE
+C006
+6006
+7006
+381E
+1FFC
+07E0
+ENDCHAR
+STARTCHAR 0121
+ENCODING 289
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 19 1 -4
+BITMAP
+0C00
+0C00
+0000
+1EC0
+7FC0
+61C0
+E0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C1C0
+61C0
+7FC0
+1EC0
+00C0
+C180
+FF80
+3E00
+ENDCHAR
+STARTCHAR 0122
+ENCODING 290
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 23 1 -7
+BITMAP
+07E0
+1FF8
+381C
+700C
+6006
+C000
+C000
+C000
+C0FE
+C0FE
+C006
+6006
+7006
+381E
+1FFC
+07E0
+0000
+0000
+00C0
+00C0
+0040
+00C0
+0080
+ENDCHAR
+STARTCHAR 0123
+ENCODING 291
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 22 1 -4
+BITMAP
+0400
+0800
+0800
+0C00
+0C00
+0000
+1EC0
+7FC0
+61C0
+E1C0
+C0C0
+C0C0
+C0C0
+C0C0
+C1C0
+61C0
+7FC0
+1EC0
+00C0
+C180
+FF80
+3E00
+ENDCHAR
+STARTCHAR 0124
+ENCODING 292
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+0600
+0F00
+1980
+0000
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+FFF0
+FFF0
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+ENDCHAR
+STARTCHAR 0125
+ENCODING 293
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 20 1 0
+BITMAP
+0C00
+1E00
+3300
+0000
+C000
+C000
+C000
+C000
+DE00
+FF00
+E380
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+ENDCHAR
+STARTCHAR 0126
+ENCODING 294
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 14 16 1 0
+BITMAP
+6018
+6018
+FFFC
+FFFC
+6018
+6018
+7FF8
+7FF8
+6018
+6018
+6018
+6018
+6018
+6018
+6018
+6018
+ENDCHAR
+STARTCHAR 0127
+ENCODING 295
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 10 16 0 0
+BITMAP
+6000
+FE00
+FE00
+6000
+6F00
+7F80
+70C0
+60C0
+60C0
+60C0
+60C0
+60C0
+60C0
+60C0
+60C0
+60C0
+ENDCHAR
+STARTCHAR 0128
+ENCODING 296
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 7 20 0 0
+BITMAP
+76
+FE
+DC
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 0129
+ENCODING 297
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 7 16 0 0
+BITMAP
+76
+FE
+DC
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 012A
+ENCODING 298
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 6 19 0 0
+BITMAP
+FC
+FC
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 012B
+ENCODING 299
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 6 15 0 0
+BITMAP
+FC
+FC
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 012C
+ENCODING 300
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 7 20 0 0
+BITMAP
+82
+C6
+7C
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 012D
+ENCODING 301
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 7 16 0 0
+BITMAP
+82
+C6
+7C
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 012E
+ENCODING 302
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 3 20 1 -4
+BITMAP
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+40
+80
+80
+E0
+ENDCHAR
+STARTCHAR 012F
+ENCODING 303
+SWIDTH 225 0
+DWIDTH 5 0
+BBX 3 20 0 -4
+BITMAP
+60
+60
+00
+00
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+60
+40
+80
+80
+E0
+ENDCHAR
+STARTCHAR 0130
+ENCODING 304
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 2 19 2 0
+BITMAP
+C0
+C0
+00
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0131
+ENCODING 305
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 2 12 2 0
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0132
+ENCODING 306
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 16 2 0
+BITMAP
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+CC30
+CC30
+CE70
+C7E0
+C3C0
+ENDCHAR
+STARTCHAR 0133
+ENCODING 307
+SWIDTH 450 0
+DWIDTH 10 0
+BBX 7 20 1 -4
+BITMAP
+C6
+C6
+00
+00
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+06
+06
+1E
+1C
+ENDCHAR
+STARTCHAR 0134
+ENCODING 308
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 10 20 1 0
+BITMAP
+0300
+0780
+0CC0
+0000
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+C300
+C300
+E700
+7E00
+3C00
+ENDCHAR
+STARTCHAR 0135
+ENCODING 309
+SWIDTH 180 0
+DWIDTH 4 0
+BBX 6 20 -1 -4
+BITMAP
+30
+78
+CC
+00
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+30
+F0
+E0
+ENDCHAR
+STARTCHAR 0136
+ENCODING 310
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 13 23 2 -7
+BITMAP
+C070
+C0E0
+C1C0
+C380
+C700
+CE00
+DC00
+FC00
+FE00
+E700
+C380
+C1C0
+C0C0
+C0E0
+C070
+C038
+0000
+0000
+0600
+0600
+0200
+0600
+0400
+ENDCHAR
+STARTCHAR 0137
+ENCODING 311
+SWIDTH 450 0
+DWIDTH 10 0
+BBX 9 23 1 -7
+BITMAP
+C000
+C000
+C000
+C000
+C380
+C700
+CE00
+DC00
+F800
+FC00
+EC00
+CE00
+C600
+C700
+C300
+C380
+0000
+0000
+0C00
+0C00
+0400
+0C00
+0800
+ENDCHAR
+STARTCHAR 0138
+ENCODING 312
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 12 1 0
+BITMAP
+C180
+C300
+C600
+CC00
+D800
+F800
+CC00
+C600
+C600
+C300
+C180
+C180
+ENDCHAR
+STARTCHAR 0139
+ENCODING 313
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 9 20 2 0
+BITMAP
+1800
+3000
+2000
+0000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+FF80
+FF80
+ENDCHAR
+STARTCHAR 013A
+ENCODING 314
+SWIDTH 180 0
+DWIDTH 4 0
+BBX 3 20 1 0
+BITMAP
+60
+C0
+80
+00
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 013B
+ENCODING 315
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 9 23 2 -7
+BITMAP
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+FF80
+FF80
+0000
+0000
+0C00
+0C00
+0400
+0C00
+0800
+ENDCHAR
+STARTCHAR 013C
+ENCODING 316
+SWIDTH 180 0
+DWIDTH 4 0
+BBX 2 23 1 -7
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+00
+00
+C0
+C0
+40
+C0
+80
+ENDCHAR
+STARTCHAR 013D
+ENCODING 317
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 9 16 2 0
+BITMAP
+C300
+C300
+C100
+C100
+C200
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+FF80
+FF80
+ENDCHAR
+STARTCHAR 013E
+ENCODING 318
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 5 16 2 0
+BITMAP
+D8
+D8
+C8
+C8
+D0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 013F
+ENCODING 319
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 9 16 2 0
+BITMAP
+C000
+C000
+C000
+C000
+C000
+C000
+C000
+C600
+C600
+C000
+C000
+C000
+C000
+C000
+FF80
+FF80
+ENDCHAR
+STARTCHAR 0140
+ENCODING 320
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 6 16 1 0
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+CC
+CC
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0141
+ENCODING 321
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 11 16 0 0
+BITMAP
+3000
+3000
+3000
+3100
+3300
+3600
+3C00
+3800
+7000
+F000
+B000
+3000
+3000
+3000
+3FE0
+3FE0
+ENDCHAR
+STARTCHAR 0142
+ENCODING 322
+SWIDTH 180 0
+DWIDTH 4 0
+BBX 4 16 0 0
+BITMAP
+60
+60
+60
+60
+60
+70
+70
+60
+E0
+E0
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR 0143
+ENCODING 323
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+0300
+0600
+0400
+0000
+C030
+E030
+F030
+F030
+D830
+D830
+CC30
+C630
+C630
+C330
+C1B0
+C1B0
+C0F0
+C0F0
+C070
+C030
+ENDCHAR
+STARTCHAR 0144
+ENCODING 324
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+0600
+0C00
+0800
+0000
+DE00
+FF00
+E380
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+ENDCHAR
+STARTCHAR 0145
+ENCODING 325
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 23 2 -7
+BITMAP
+C030
+E030
+F030
+F030
+D830
+D830
+CC30
+C630
+C630
+C330
+C1B0
+C1B0
+C0F0
+C0F0
+C070
+C030
+0000
+0000
+0600
+0600
+0200
+0600
+0400
+ENDCHAR
+STARTCHAR 0146
+ENCODING 326
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 19 1 -7
+BITMAP
+DE00
+FF00
+E380
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+0000
+0000
+0C00
+0C00
+0400
+0C00
+0800
+ENDCHAR
+STARTCHAR 0147
+ENCODING 327
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+1980
+0F00
+0600
+0000
+C030
+E030
+F030
+F030
+D830
+D830
+CC30
+C630
+C630
+C330
+C1B0
+C1B0
+C0F0
+C0F0
+C070
+C030
+ENDCHAR
+STARTCHAR 0148
+ENCODING 328
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+3300
+1E00
+0C00
+0000
+DE00
+FF00
+E380
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+ENDCHAR
+STARTCHAR 0149
+ENCODING 329
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 12 16 0 0
+BITMAP
+C000
+C000
+4000
+4000
+9BC0
+1FE0
+1C70
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+ENDCHAR
+STARTCHAR 014A
+ENCODING 330
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 13 16 2 0
+BITMAP
+CFC0
+DFE0
+F070
+E030
+C038
+C018
+C018
+C018
+C018
+C018
+C018
+C018
+C030
+C070
+C7E0
+C3C0
+ENDCHAR
+STARTCHAR 014B
+ENCODING 331
+SWIDTH 540 0
+DWIDTH 12 0
+BBX 10 16 1 -4
+BITMAP
+DF00
+FF80
+E1C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+C0C0
+00C0
+00C0
+03C0
+0380
+ENDCHAR
+STARTCHAR 014C
+ENCODING 332
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 19 1 0
+BITMAP
+07E0
+07E0
+0000
+07C0
+1FF0
+3838
+701C
+600C
+C006
+C006
+C006
+C006
+C006
+C006
+600C
+701C
+3838
+1FF0
+07C0
+ENDCHAR
+STARTCHAR 014D
+ENCODING 333
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 15 1 0
+BITMAP
+3F00
+3F00
+0000
+1F00
+3F80
+71C0
+E0E0
+C060
+C060
+C060
+C060
+E0E0
+71C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 014E
+ENCODING 334
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 20 1 0
+BITMAP
+0820
+0C60
+07C0
+0000
+07C0
+1FF0
+3838
+701C
+600C
+C006
+C006
+C006
+C006
+C006
+C006
+600C
+701C
+3838
+1FF0
+07C0
+ENDCHAR
+STARTCHAR 014F
+ENCODING 335
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 16 1 0
+BITMAP
+2080
+3180
+1F00
+0000
+1F00
+3F80
+71C0
+E0E0
+C060
+C060
+C060
+C060
+E0E0
+71C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 0150
+ENCODING 336
+SWIDTH 765 0
+DWIDTH 17 0
+BBX 15 20 1 0
+BITMAP
+0660
+0CC0
+0CC0
+0000
+07C0
+1FF0
+3838
+701C
+600C
+C006
+C006
+C006
+C006
+C006
+C006
+600C
+701C
+3838
+1FF0
+07C0
+ENDCHAR
+STARTCHAR 0151
+ENCODING 337
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 11 16 1 0
+BITMAP
+1980
+3300
+3300
+0000
+1F00
+3F80
+71C0
+E0E0
+C060
+C060
+C060
+C060
+E0E0
+71C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 0152
+ENCODING 338
+SWIDTH 990 0
+DWIDTH 22 0
+BBX 20 16 1 0
+BITMAP
+0F9FF0
+3FDFF0
+787800
+603800
+603800
+C01800
+C01800
+C01FE0
+C01FE0
+C01800
+C01800
+603800
+603800
+707800
+3FDFF0
+0F9FF0
+ENDCHAR
+STARTCHAR 0153
+ENCODING 339
+SWIDTH 945 0
+DWIDTH 21 0
+BBX 19 12 1 0
+BITMAP
+1F0F00
+3F9F80
+71F0C0
+E0E060
+C06060
+C07FE0
+C07FE0
+C06000
+E0E060
+71F0C0
+3F9FC0
+1F0F80
+ENDCHAR
+STARTCHAR 0154
+ENCODING 340
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+0600
+0C00
+0800
+0000
+FFC0
+FFE0
+C070
+C030
+C030
+C030
+C070
+FFE0
+FFC0
+C300
+C180
+C1C0
+C0E0
+C060
+C070
+C030
+ENDCHAR
+STARTCHAR 0155
+ENCODING 341
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 6 16 1 0
+BITMAP
+0C
+18
+10
+00
+DC
+FC
+E0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0156
+ENCODING 342
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 23 2 -7
+BITMAP
+FFC0
+FFE0
+C070
+C030
+C030
+C030
+C070
+FFE0
+FFC0
+C300
+C180
+C1C0
+C0E0
+C060
+C070
+C030
+0000
+0000
+0600
+0600
+0200
+0600
+0400
+ENDCHAR
+STARTCHAR 0157
+ENCODING 343
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 6 19 1 -7
+BITMAP
+DC
+FC
+E0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+00
+00
+C0
+C0
+40
+C0
+80
+ENDCHAR
+STARTCHAR 0158
+ENCODING 344
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+3300
+1E00
+0C00
+0000
+FFC0
+FFE0
+C070
+C030
+C030
+C030
+C070
+FFE0
+FFC0
+C300
+C180
+C1C0
+C0E0
+C060
+C070
+C030
+ENDCHAR
+STARTCHAR 0159
+ENCODING 345
+SWIDTH 315 0
+DWIDTH 7 0
+BBX 6 16 1 0
+BITMAP
+CC
+78
+30
+00
+DC
+FC
+E0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 015A
+ENCODING 346
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 13 20 1 0
+BITMAP
+0180
+0300
+0200
+0000
+0FC0
+3FE0
+7070
+6018
+6018
+7000
+3C00
+1FC0
+03F0
+0038
+C018
+C018
+6018
+7070
+3FF0
+0FC0
+ENDCHAR
+STARTCHAR 015B
+ENCODING 347
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+0600
+0C00
+0800
+0000
+3E00
+7F00
+C180
+C000
+F000
+7E00
+1F80
+0380
+0180
+C380
+7F00
+3E00
+ENDCHAR
+STARTCHAR 015C
+ENCODING 348
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 13 20 1 0
+BITMAP
+0300
+0780
+0CC0
+0000
+0FC0
+3FE0
+7070
+6018
+6018
+7000
+3C00
+1FC0
+03F0
+0038
+C018
+C018
+6018
+7070
+3FF0
+0FC0
+ENDCHAR
+STARTCHAR 015D
+ENCODING 349
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+0C00
+1E00
+3300
+0000
+3E00
+7F00
+C180
+C000
+F000
+7E00
+1F80
+0380
+0180
+C380
+7F00
+3E00
+ENDCHAR
+STARTCHAR 015E
+ENCODING 350
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 13 20 1 -4
+BITMAP
+0FC0
+3FE0
+7070
+6018
+6018
+7000
+3C00
+1FC0
+03F0
+0038
+C018
+C018
+6018
+7070
+3FF0
+0FC0
+0200
+0300
+0180
+0F00
+ENDCHAR
+STARTCHAR 015F
+ENCODING 351
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 -4
+BITMAP
+3E00
+7F00
+C180
+C000
+F000
+7E00
+1F80
+0380
+0180
+C380
+7F00
+3E00
+0800
+0C00
+0600
+3C00
+ENDCHAR
+STARTCHAR 0160
+ENCODING 352
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 13 20 1 0
+BITMAP
+0CC0
+0780
+0300
+0000
+0FC0
+3FE0
+7070
+6018
+6018
+7000
+3C00
+1FC0
+03F0
+0038
+C018
+C018
+6018
+7070
+3FF0
+0FC0
+ENDCHAR
+STARTCHAR 0161
+ENCODING 353
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+3300
+1E00
+0C00
+0000
+3E00
+7F00
+C180
+C000
+F000
+7E00
+1F80
+0380
+0180
+C380
+7F00
+3E00
+ENDCHAR
+STARTCHAR 0162
+ENCODING 354
+SWIDTH 630 0
+DWIDTH 14 0
+BBX 12 20 1 -4
+BITMAP
+FFF0
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0200
+0300
+0180
+0F00
+ENDCHAR
+STARTCHAR 0163
+ENCODING 355
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 6 20 0 -4
+BITMAP
+20
+60
+60
+60
+F8
+F8
+60
+60
+60
+60
+60
+60
+60
+60
+78
+38
+10
+18
+0C
+78
+ENDCHAR
+STARTCHAR 0164
+ENCODING 356
+SWIDTH 630 0
+DWIDTH 14 0
+BBX 12 20 1 0
+BITMAP
+1980
+0F00
+0600
+0000
+FFF0
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0165
+ENCODING 357
+SWIDTH 360 0
+DWIDTH 8 0
+BBX 7 16 1 0
+BITMAP
+26
+66
+62
+62
+FC
+F8
+60
+60
+60
+60
+60
+60
+60
+60
+78
+38
+ENDCHAR
+STARTCHAR 0166
+ENCODING 358
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 12 16 1 0
+BITMAP
+FFF0
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+3FC0
+3FC0
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0167
+ENCODING 359
+SWIDTH 270 0
+DWIDTH 6 0
+BBX 5 15 0 0
+BITMAP
+60
+60
+60
+F8
+F8
+60
+60
+60
+F8
+F8
+60
+60
+60
+78
+38
+ENDCHAR
+STARTCHAR 0168
+ENCODING 360
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+0EC0
+1FC0
+1B80
+0000
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+E070
+70E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR 0169
+ENCODING 361
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+E380
+7F80
+3D80
+ENDCHAR
+STARTCHAR 016A
+ENCODING 362
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 19 2 0
+BITMAP
+1F80
+1F80
+0000
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+E070
+70E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR 016B
+ENCODING 363
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 15 1 0
+BITMAP
+3F00
+3F00
+0000
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+E380
+7F80
+3D80
+ENDCHAR
+STARTCHAR 016C
+ENCODING 364
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+1040
+18C0
+0F80
+0000
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+E070
+70E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR 016D
+ENCODING 365
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+2080
+3180
+1F00
+0000
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+E380
+7F80
+3D80
+ENDCHAR
+STARTCHAR 016E
+ENCODING 366
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+0700
+0880
+0880
+0880
+C730
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+E070
+70E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR 016F
+ENCODING 367
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 18 1 0
+BITMAP
+1C00
+2200
+2200
+2200
+1C00
+0000
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+E380
+7F80
+3D80
+ENDCHAR
+STARTCHAR 0170
+ENCODING 368
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 0
+BITMAP
+0CC0
+1980
+1980
+0000
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+E070
+70E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR 0171
+ENCODING 369
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+3300
+6600
+6600
+0000
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+E380
+7F80
+3D80
+ENDCHAR
+STARTCHAR 0172
+ENCODING 370
+SWIDTH 720 0
+DWIDTH 16 0
+BBX 12 20 2 -4
+BITMAP
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+C030
+E070
+70E0
+3FC0
+1F80
+0100
+0200
+0200
+0380
+ENDCHAR
+STARTCHAR 0173
+ENCODING 371
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 9 16 1 -4
+BITMAP
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+E380
+7F80
+3D80
+0100
+0200
+0200
+0380
+ENDCHAR
+STARTCHAR 0174
+ENCODING 372
+SWIDTH 945 0
+DWIDTH 21 0
+BBX 21 20 0 0
+BITMAP
+003000
+007800
+00CC00
+000000
+C07018
+C07018
+60D830
+60D830
+60D830
+60D830
+318C60
+318C60
+318C60
+318C60
+1B06C0
+1B06C0
+1B06C0
+1B06C0
+0E0380
+0E0380
+ENDCHAR
+STARTCHAR 0175
+ENCODING 373
+SWIDTH 675 0
+DWIDTH 15 0
+BBX 15 16 0 0
+BITMAP
+0180
+03C0
+0660
+0000
+C106
+C386
+C386
+628C
+66CC
+26C8
+36D8
+36D8
+1450
+1C70
+1C70
+0C60
+ENDCHAR
+STARTCHAR 0176
+ENCODING 374
+SWIDTH 630 0
+DWIDTH 14 0
+BBX 14 20 0 0
+BITMAP
+0300
+0780
+0CC0
+0000
+E01C
+6018
+3030
+3870
+1860
+0CC0
+0FC0
+0780
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 0177
+ENCODING 375
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 11 20 0 -4
+BITMAP
+0600
+0F00
+1980
+0000
+C060
+C060
+60C0
+60C0
+30C0
+3180
+1980
+1980
+0F00
+0F00
+0700
+0600
+0E00
+0C00
+7C00
+7800
+ENDCHAR
+STARTCHAR 0178
+ENCODING 376
+SWIDTH 630 0
+DWIDTH 14 0
+BBX 14 19 0 0
+BITMAP
+0CC0
+0CC0
+0000
+E01C
+6018
+3030
+3870
+1860
+0CC0
+0FC0
+0780
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 0179
+ENCODING 377
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 12 20 0 0
+BITMAP
+0180
+0300
+0200
+0000
+7FF0
+7FF0
+0060
+00C0
+00C0
+0180
+0300
+0600
+0600
+0C00
+1800
+3000
+3000
+6000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 017A
+ENCODING 378
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 10 16 0 0
+BITMAP
+0300
+0600
+0400
+0000
+7FC0
+7FC0
+01C0
+0380
+0700
+0E00
+1C00
+3800
+7000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR 017B
+ENCODING 379
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 12 19 0 0
+BITMAP
+0300
+0300
+0000
+7FF0
+7FF0
+0060
+00C0
+00C0
+0180
+0300
+0600
+0600
+0C00
+1800
+3000
+3000
+6000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 017C
+ENCODING 380
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 10 15 0 0
+BITMAP
+0600
+0600
+0000
+7FC0
+7FC0
+01C0
+0380
+0700
+0E00
+1C00
+3800
+7000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR 017D
+ENCODING 381
+SWIDTH 585 0
+DWIDTH 13 0
+BBX 12 20 0 0
+BITMAP
+0CC0
+0780
+0300
+0000
+7FF0
+7FF0
+0060
+00C0
+00C0
+0180
+0300
+0600
+0600
+0C00
+1800
+3000
+3000
+6000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR 017E
+ENCODING 382
+SWIDTH 495 0
+DWIDTH 11 0
+BBX 10 16 0 0
+BITMAP
+1980
+0F00
+0600
+0000
+7FC0
+7FC0
+01C0
+0380
+0700
+0E00
+1C00
+3800
+7000
+E000
+FFC0
+FFC0
+ENDCHAR
+ENDFONT
diff --git a/examples/fonts/Arial-16.bdf.license b/examples/fonts/Arial-16.bdf.license
new file mode 100644
index 0000000..db3e0e3
--- /dev/null
+++ b/examples/fonts/Arial-16.bdf.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2017 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright © 2003 & 2007, Ralph Hancock & John Hudson.
+
+# SPDX-License-Identifier: MIT
diff --git a/examples/hotplug_sensor_examples/displayio_layout_hotplug_rtc.py b/examples/hotplug_sensor_examples/displayio_layout_hotplug_rtc.py
new file mode 100644
index 0000000..1268b53
--- /dev/null
+++ b/examples/hotplug_sensor_examples/displayio_layout_hotplug_rtc.py
@@ -0,0 +1,639 @@
+# SPDX-FileCopyrightText: 2022 PaulskPt
+#
+# SPDX-License-Identifier: MIT
+"""
+Make a PageLayout and illustrate all of it's features
+"""
+
+import time
+
+import adafruit_tmp117
+import board
+import displayio
+import terminalio
+from adafruit_bitmap_font import bitmap_font
+from adafruit_display_shapes.circle import Circle
+from adafruit_display_shapes.rect import Rect
+from adafruit_display_shapes.triangle import Triangle
+from adafruit_display_text.bitmap_label import Label
+from adafruit_ds3231 import DS3231
+
+from adafruit_displayio_layout.layouts.tab_layout import TabLayout
+
+# +-------------------------------------------------------+
+# | Definition for variables in the past defined as global|
+# +-------------------------------------------------------+
+# The gVars class is created
+# to elminate the need for global variables.
+
+
+class gVars:
+ def __init__(self):
+ self.gVarsDict = {
+ 0: "my_debug",
+ 1: "rtc",
+ 2: "temp_sensor",
+ 3: "lStart",
+ 4: "o_secs",
+ 5: "c_secs",
+ 6: "dt_refresh",
+ 7: "sDT_old",
+ 8: "t0",
+ 9: "t1",
+ 10: "t2",
+ 11: "default_dt",
+ 12: "pge3_lbl_dflt",
+ 13: "pge4_lbl_dflt",
+ 14: "online_time_present",
+ 15: "temp_in_REPL",
+ 16: "old_temp",
+ 17: "use_ntp",
+ 18: "use_txt_in_month",
+ 19: "use_usa_notation",
+ 20: "content_sensor_idx",
+ 21: "temp_in_fahrenheit",
+ }
+
+ self.gVars_rDict = {
+ "my_debug": 0,
+ "rtc": 1,
+ "temp_sensor": 2,
+ "lStart": 3,
+ "o_secs": 4,
+ "c_secs": 5,
+ "dt_refresh": 6,
+ "sDT_old": 7,
+ "t0": 8,
+ "t1": 9,
+ "t2": 10,
+ "default_dt": 11,
+ "pge3_lbl_dflt": 12,
+ "pge4_lbl_dflt": 13,
+ "online_time_present": 14,
+ "temp_in_REPL": 15,
+ "old_temp": 16,
+ "use_ntp": 17,
+ "use_txt_in_month": 18,
+ "use_usa_notation": 19,
+ "content_sensor_idx": 20,
+ "temp_in_fahrenheit": 21,
+ }
+
+ self.g_vars = {}
+
+ # self.clean()
+
+ def write(self, s, value):
+ if isinstance(s, str):
+ if s in self.gVars_rDict:
+ n = self.gVars_rDict[s]
+ # print("myVars.write() \'{:" ">20s}\'found in self.gVars_rDict,
+ # key: {}".format(s, n))
+ self.g_vars[n] = value
+ else:
+ raise KeyError("variable '{:" ">20s}' not found in self.gVars_rDict".format(s))
+ else:
+ raise TypeError(f"myVars.write(): param s expected str, {type(s)} received")
+
+ def read(self, s):
+ RetVal = None
+ if isinstance(s, str):
+ if s in self.gVars_rDict:
+ n = self.gVars_rDict[s]
+ if n in self.g_vars:
+ RetVal = self.g_vars[n]
+ return RetVal
+
+ def clean(self):
+ self.g_vars = {
+ 0: None,
+ 1: None,
+ 2: None,
+ 3: None,
+ 4: None,
+ 5: None,
+ 6: None,
+ 7: None,
+ 8: None,
+ 9: None,
+ 10: None,
+ 11: None,
+ 12: None,
+ 13: None,
+ 14: None,
+ 15: None,
+ 16: None,
+ 17: None,
+ 18: None,
+ 19: None,
+ 20: None,
+ 21: None,
+ }
+
+ def list(self):
+ for i in range(0, len(self.g_vars) - 1):
+ print(
+ "self.g_vars['{:" ">20s}'] = {}".format(
+ self.gVarsDict[i], self.g_vars[i] if i in self.g_vars else "None"
+ )
+ )
+
+
+# ---------- End of class gVars ------------------------
+
+myVars = gVars() # create an instance of the gVars class
+
+myVars.write("my_debug", False)
+
+# Adjust here the date and time that you want the RTC to be set at start:
+myVars.write("default_dt", time.struct_time((2022, 5, 14, 19, 42, 0, 5, -1, -1)))
+
+months = {
+ 0: "Dum",
+ 1: "Jan",
+ 2: "Feb",
+ 3: "Mar",
+ 4: "Apr",
+ 5: "May",
+ 6: "Jun",
+ 7: "Jul",
+ 8: "Aug",
+ 9: "Sep",
+ 10: "Oct",
+ 11: "Nov",
+ 12: "Dec",
+}
+
+i2c = board.I2C()
+
+if myVars.read("my_debug"):
+ while not i2c.try_lock():
+ pass
+ try:
+ while True:
+ print(
+ "I2C addresses found:",
+ [hex(device_address) for device_address in i2c.scan()],
+ )
+ time.sleep(2)
+ break
+ finally: # unlock the i2c bus when ctrl-c'ing out of the loop
+ i2c.unlock()
+
+# -------------- Setting myVars elements ----------------------------------
+myVars.write("rtc", None)
+myVars.write("temp_sensor", None)
+myVars.write("lStart", True)
+myVars.write("o_secs", 0) # old seconds
+myVars.write("c_secs", 0) # current seconds
+# dt_refresh is used to flag when more or less static elements
+# in datetime stamp have to be refreshed
+myVars.write("dt_refresh", True)
+myVars.write("sDT_old", "")
+myVars.write("t0", None)
+myVars.write("t1", None)
+myVars.write("t2", None)
+# default_dt already set above
+myVars.write("pge3_lbl_dflt", "The third page is fun!")
+myVars.write("pge4_lbl_dflt", "The fourth page is where it's at")
+myVars.write("online_time_present", False)
+myVars.write("temp_in_REPL", False)
+myVars.write("old_temp", 0.00)
+myVars.write("use_txt_in_month", True)
+myVars.write("use_usa_notation", True)
+myVars.write("use_ntp", False)
+myVars.write("content_sensor_idx", None)
+myVars.write("temp_in_fahrenheit", False)
+# -------------------------------------------------------------------------
+if myVars.read("my_debug"):
+ # print list of all variables in myVars
+ myVars.list()
+
+# degs_sign = chr(186) # I preferred the real degrees sign which is: chr(176)
+# -----------------------------------
+
+# built-in display
+display = board.DISPLAY
+# display.rotation = 90
+display.rotation = 0
+
+# create and show main_group
+main_group = displayio.Group()
+display.root_group = main_group
+
+# fon.gvars bitmap_font.load_font("fonts/Helvetica-Bold-16.bdf")
+font_arial = bitmap_font.load_font("/fonts/Arial-16.bdf")
+font_term = terminalio.FONT
+
+# create the page layout
+test_page_layout = TabLayout(
+ x=0,
+ y=0,
+ display=board.DISPLAY,
+ tab_text_scale=2,
+ custom_font=font_term,
+ inactive_tab_spritesheet="bmps/inactive_tab_sprite.bmp",
+ showing_tab_spritesheet="bmps/active_tab_sprite.bmp",
+ showing_tab_text_color=0x00AA59,
+ inactive_tab_text_color=0xEEEEEE,
+ inactive_tab_transparent_indexes=(0, 1),
+ showing_tab_transparent_indexes=(0, 1),
+ tab_count=4,
+)
+
+# make 3 pages of content
+pge1_group = displayio.Group()
+pge2_group = displayio.Group()
+pge3_group = displayio.Group()
+pge4_group = displayio.Group()
+
+# labels
+pge1_lbl = Label(
+ font=font_term,
+ scale=2,
+ text="This is the first page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+pge1_lbl2 = Label(
+ font=font_term,
+ scale=2,
+ text="Please wait...",
+ anchor_point=(0, 0),
+ anchored_position=(10, 150),
+)
+pge2_lbl = Label(
+ font=font_term,
+ scale=2,
+ text="This page is the second page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+pge3_lbl = Label(
+ font=font_term,
+ scale=2,
+ text=myVars.read("pge3_lbl_dflt"), # Will be "Date/time:"
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+pge3_lbl2 = Label(
+ font=font_term,
+ scale=2,
+ text="", # pge3_lbl2_dflt, # Will be DD-MO-YYYY or Month-DD-YYYY
+ anchor_point=(0, 0),
+ anchored_position=(10, 40),
+)
+pge3_lbl3 = Label(
+ font=font_term,
+ scale=2,
+ text="", # pge3_lbl3_dflt, # Will be HH:MM:SS
+ anchor_point=(0, 0),
+ anchored_position=(10, 70),
+)
+pge4_lbl = Label(
+ font=font_term,
+ scale=2,
+ text=myVars.read("pge4_lbl_dflt"),
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+pge4_lbl2 = Label(
+ font=font_term,
+ scale=2,
+ text="", # Will be "Temperature"
+ anchor_point=(0, 0),
+ anchored_position=(10, 130),
+)
+pge4_lbl3 = Label(
+ font=font_arial,
+ scale=2,
+ text="", # Will be "xx.yy C"
+ anchor_point=(0, 0),
+ anchored_position=(10, 160),
+)
+
+# shapes
+square = Rect(x=20, y=70, width=40, height=40, fill=0x00DD00)
+circle = Circle(50, 100, r=30, fill=0xDD00DD)
+triangle = Triangle(50, 0, 100, 50, 0, 50, fill=0xDDDD00)
+rectangle = Rect(x=80, y=60, width=100, height=50, fill=0x0000DD)
+
+triangle.x = 80
+triangle.y = 70
+
+# add everything to their page groups
+pge1_group.append(square)
+pge1_group.append(pge1_lbl)
+pge2_group.append(pge2_lbl)
+pge2_group.append(circle)
+pge3_group.append(pge3_lbl)
+pge3_group.append(pge3_lbl2)
+pge3_group.append(pge3_lbl3)
+pge3_group.append(triangle)
+pge4_group.append(pge4_lbl)
+pge4_group.append(pge4_lbl2)
+pge4_group.append(pge4_lbl3)
+pge4_group.append(rectangle)
+
+if board.board_id == "pyportal_titano":
+ pages = {0: "Dum", 1: "One", 2: "Two", 3: "Three", 4: "Four"}
+else:
+ pages = {0: "Dum", 1: "One", 2: "Two", 3: "Thr", 4: "For"}
+
+# add the pages to the layout, supply your own page names
+test_page_layout.add_content(pge1_group, pages[1])
+test_page_layout.add_content(pge2_group, pages[2])
+test_page_layout.add_content(pge3_group, pages[3])
+test_page_layout.add_content(pge4_group, pages[4])
+
+# test_page_layout.add_content(displayio.Group(), "page_5")
+
+# add it to the group that is showing on the display
+main_group.append(test_page_layout)
+
+# test_page_layout.tab_tilegrids_group[3].x += 50
+
+# change page with function by name
+test_page_layout.show_page(page_name=pages[2])
+print(f"showing page index:{test_page_layout.showing_page_index}")
+time.sleep(1)
+
+# change page with function by index
+test_page_layout.show_page(page_index=0)
+print(f"showing page name: {test_page_layout.showing_page_name}")
+time.sleep(1)
+
+# change page by updating the page name property
+test_page_layout.showing_page_name = pages[2]
+print(f"showing page index: {test_page_layout.showing_page_index}")
+time.sleep(1)
+
+# change page by updating the page index property
+test_page_layout.showing_page_index = 1
+print(f"showing page name: {test_page_layout.showing_page_name}")
+time.sleep(5)
+
+"""
+another_text = Label(terminalio.FONT, text="And another thing!", \
+ scale=2, color=0x00ff00, anchor_point=(0, 0), \
+ anchored_position=(100, 100))
+test_page_layout.showing_page_content.append(another_text)
+"""
+
+
+"""
+ If the temperature sensor has been disconnected,
+ this function will try to reconnect (test if the sensor is present by now)
+ If reconnected this function sets the global variable t_sensor_present
+ If failed to reconnect the function clears t_sensor_present
+"""
+
+
+def connect_temp_sensor():
+ t = "temperature sensor found"
+
+ # myVars.write("temp_sensor",None)
+
+ try:
+ myVars.write("temp_sensor", adafruit_tmp117.TMP117(i2c))
+ except ValueError: # ValueError occurs if the temperature sensor is not connected
+ pass
+
+ print(
+ "connect_temp_sensor(): type(temp_sensor) object = ",
+ type(myVars.read("temp_sensor")),
+ )
+ if myVars.read("temp_sensor") is not None:
+ print(t)
+ print("temperature sensor connected")
+ myVars.write("t0", "Temperature")
+ if myVars.read("temp_in_fahrenheit"):
+ myVars.write("t1", chr(186) + "F")
+ else:
+ myVars.write("t1", chr(186) + "C")
+
+ myVars.write("t2", 27 * "_")
+ else:
+ print("no " + t)
+ print("failed to connect temperature sensor")
+ myVars.write("t0", None)
+ myVars.write("t1", None)
+ myVars.write("t2", None)
+
+
+"""
+ If the external rtc has been disconnected,
+ this function will try to reconnect (test if the external rtc is present by now)
+"""
+
+
+def connect_rtc():
+ t = "RTC found"
+
+ # myVars.write("rtc",None)
+
+ try:
+ myVars.write("rtc", DS3231(i2c)) # i2c addres 0x68
+ # myVars.write("rtc",rtc)
+ except ValueError:
+ pass
+
+ print("connect_rtc() type rtc object = ", type(myVars.read("rtc")))
+ if myVars.read("rtc") is not None:
+ print(t)
+ print("RTC connected")
+ if myVars.read("lStart"):
+ myVars.write("lStart", False)
+ myVars.read("rtc").datetime = myVars.read("default_dt")
+ else:
+ print("no " + t)
+ print("Failed to connect RTC")
+
+
+"""
+ Function gets a value from the external temperature sensor
+ It only updates if the value has changed compared to the previous value
+ A fixed text is set in pge4_lbl2.text. The variable temperature value is set in pge4_lbl3.text
+ If no value obtained (for instance if the sensor is disconnected),
+ the function sets the pge4_lbl to a default text and makes empty
+ pge4_lbl2.text and pge4_lbl3.text
+"""
+
+
+def get_temp():
+ showing_page_idx = test_page_layout.showing_page_index
+ RetVal = False
+ if myVars.read("temp_sensor") is not None:
+ try:
+ temp = myVars.read("temp_sensor").temperature
+ if myVars.read("temp_in_fahrenheit"):
+ temp = (temp * 1.8) + 32
+ t = f"{temp:5.2f} " + myVars.read("t1")
+ if myVars.read("my_debug") and temp is not None and not myVars.read("temp_in_REPL"):
+ myVars.write("temp_in_REPL", True)
+ print("get_temp(): {} {}".format(myVars.read("t0"), t))
+ if showing_page_idx == 3: # show temperature on most right Tab page
+ if temp is not None:
+ if temp != myVars.read(
+ "old_temp"
+ ): # Only update if there is a change in temperature
+ myVars.write("old_temp", temp)
+ t = f"{temp:5.2f} " + myVars.read("t1")
+ pge4_lbl.text = ""
+ pge4_lbl2.text = myVars.read("t0")
+ pge4_lbl3.text = t
+ # if not my_debug:
+ # print("pge4_lbl.tex.gvars {}".format(pge4_lbl.text))
+ # time.sleep(2)
+ RetVal = True
+ else:
+ t = ""
+ pge4_lbl.text = myVars.read("pge4_lbl_dflt")
+ except OSError:
+ print("Temperature sensor has disconnected")
+ t = ""
+ myVars.write("temp_sensor", None)
+ pge4_lbl.text = myVars.read("pge4_lbl_dflt") # clean the line (eventually: t2)
+ pge4_lbl2.text = ""
+ pge4_lbl3.text = ""
+
+ return RetVal
+
+
+yy = 0
+mo = 1
+dd = 2
+hh = 3
+mm = 4
+ss = 5
+
+
+def handle_dt(dt):
+ RetVal = False
+ s = "Date/time: "
+ sYY = str(dt[yy])
+ sMO = (
+ months[dt[mo]]
+ if myVars.read("use_txt_in_month")
+ else "0" + str(dt[mo])
+ if dt[mo] < 10
+ else str(dt[mo])
+ )
+
+ dt_dict = {}
+
+ for _ in range(dd, ss + 1):
+ dt_dict[_] = "0" + str(dt[_]) if dt[_] < 10 else str(dt[_])
+
+ if myVars.read("my_debug"):
+ print("dt_dict = ", dt_dict)
+
+ myVars.write("c_secs", dt_dict[ss])
+ sDT = (
+ sMO + "-" + dt_dict[dd] + "-" + sYY
+ if myVars.read("use_usa_notation")
+ else sYY + "-" + sMO + "-" + dt_dict[dd]
+ )
+ if myVars.read("my_debug"):
+ print("handle_dt(): sDT_old = {}, sDT = {}".format(myVars.read("sDT_old"), sDT))
+ if myVars.read("sDT_old") != sDT:
+ myVars.write("sDT_old", sDT)
+ myVars.write("dt_refresh", True) # The date has changed, set the refresh flag
+ sDT2 = dt_dict[hh] + ":" + dt_dict[mm] + ":" + dt_dict[ss]
+
+ if myVars.read("dt_refresh"): # only refresh when needed
+ myVars.write("dt_refresh", False)
+ pge3_lbl.text = s
+ pge3_lbl2.text = sDT
+
+ if myVars.read("c_secs") != myVars.read("o_secs"):
+ myVars.write("o_secs", myVars.read("c_secs"))
+ sDT3 = s + f"{sDT} {sDT2}"
+ print(sDT3)
+
+ pge3_lbl3.text = sDT2
+ if myVars.read("my_debug"):
+ print(f"pge3_lbl.text = {pge3_lbl.text}")
+ print(f"pge3_lbl2.text = {pge3_lbl2.text}")
+ print(f"pge3_lbl3.text = {pge3_lbl3.text}")
+ RetVal = True
+
+ # Return from here with a False but don't set the pge3_lbl to default.
+ # It is only to say to the loop() that we did't update the datetime
+ return RetVal
+
+
+"""
+ Function gets the date and time:
+ a) if an rtc is present from the rtc;
+ b) if using online NTP pool server then get the date and time from the function time.localtime
+ This time.localtime has before been set with data from the NTP server.
+ In both cases the date and time will be set to the pge3_lbl, pge3_lbl12 and pge3_lbl3
+ If no (valid) date and time has been received then a default text will be shown on the pge3_lbl
+"""
+
+
+def get_dt():
+ dt = None
+ RetVal = False
+
+ if myVars.read("rtc") is not None:
+ try:
+ dt = myVars.read("rtc").datetime
+ except OSError as exc:
+ if myVars.read("my_debug"):
+ print("Error number: ", exc.args[0])
+ if exc.args[0] == 5: # Input/output error
+ print("get_dt(): OSError occurred. RTC probably is disconnected")
+ pge3_lbl.text = myVars.read("pge3_lbl_dflt")
+ myVars.write("sDT_old", "")
+ pge3_lbl2.text = ""
+ pge3_lbl3.text = ""
+ return RetVal
+ raise # Handle other errors
+
+ elif myVars.read("online_time_present") or myVars.read("use_ntp"):
+ dt = time.localtime()
+
+ if myVars.read("my_debug"):
+ print("get_dt(): dt = ", dt)
+ if dt is not None:
+ RetVal = handle_dt(dt)
+ else:
+ pge3_lbl.text = myVars.read("pge3_lbl_dflt")
+ pge3_lbl2.text = ""
+ pge3_lbl3.text = ""
+ return RetVal
+
+
+print("starting loop")
+
+
+def main():
+ cnt = 0
+ while True:
+ try:
+ print(f"Loop nr: {cnt:03d}")
+ # print("main(): type(rtc) object = ", type(myVars.read("rtc")))
+ if myVars.read("rtc") is not None:
+ get_dt()
+ else:
+ connect_rtc()
+ # print("main(): type(temp_sensor) object = ", type(myVars.read("temp_sensor")))
+ if myVars.read("temp_sensor") is not None:
+ get_temp()
+ else:
+ connect_temp_sensor()
+ cnt += 1
+ if cnt > 999:
+ cnt = 0
+ # change page by next page function. It will loop by default
+ time.sleep(2)
+ test_page_layout.next_page()
+ except KeyboardInterrupt as exc:
+ raise KeyboardInterrupt("Keyboard interrupt...exiting...") from exc
+ # raise SystemExit
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/hotplug_sensor_examples/displayio_layout_hotplug_temp_sensor.py b/examples/hotplug_sensor_examples/displayio_layout_hotplug_temp_sensor.py
new file mode 100644
index 0000000..7c2a0dd
--- /dev/null
+++ b/examples/hotplug_sensor_examples/displayio_layout_hotplug_temp_sensor.py
@@ -0,0 +1,969 @@
+# SPDX-FileCopyrightText: 2022 PaulskPt
+#
+# SPDX-License-Identifier: MIT
+"""
+Notes by @PaulskPt
+Script tested on an Adafruit PyPortal Titano
+(Product ID 4444. See: https://www.adafruit.com/product/4444)
+This script can make use of an I2C Realtime Clock type DS3231
+However, when the flag 'use_ntp' is set, the DS3231 will not be used
+instead the NTP class from adafruit_ntp.py will be used.
+"""
+
+import time
+from os import getenv
+
+import adafruit_tmp117
+import adafruit_touchscreen
+import board
+import busio
+import displayio
+import neopixel
+import terminalio
+from adafruit_bitmap_font import bitmap_font
+from adafruit_display_shapes.circle import Circle
+from adafruit_display_shapes.rect import Rect
+from adafruit_display_shapes.triangle import Triangle
+from adafruit_display_text.bitmap_label import Label
+from adafruit_ds3231 import DS3231
+from adafruit_esp32spi import adafruit_esp32spi
+from adafruit_ntp import NTP
+from adafruit_pyportal import PyPortal
+from digitalio import DigitalInOut
+
+from adafruit_displayio_layout.layouts.tab_layout import TabLayout
+
+# +-------------------------------------------------------+
+# | Definition for variables in the past defined as global|
+# +-------------------------------------------------------+
+# The gVars class is created
+# to elminate the need for global variables.
+
+
+class gVars:
+ def __init__(self):
+ self.gVarsDict = {
+ 0: "my_debug",
+ 1: "rtc",
+ 2: "temp_sensor",
+ 3: "lStart",
+ 4: "o_secs",
+ 5: "c_secs",
+ 6: "dt_refresh",
+ 7: "sDT_old",
+ 8: "t0",
+ 9: "t1",
+ 10: "t2",
+ 11: "default_dt",
+ 12: "pge3_lbl_dflt",
+ 13: "pge4_lbl_dflt",
+ 14: "online_time_present",
+ 15: "temp_in_REPL",
+ 16: "old_temp",
+ 17: "use_ntp",
+ 18: "use_txt_in_month",
+ 19: "use_usa_notation",
+ 20: "content_sensor_idx",
+ 21: "ntp_refresh",
+ 22: "nHH_old",
+ 23: "next_NTP_sync",
+ 24: "s_cnt",
+ 25: "five_min_cnt",
+ 26: "next_NTP_sync_t1",
+ 27: "next_NTP_sync_t3",
+ 28: "temp_in_fahrenheit",
+ }
+
+ self.gVars_rDict = {
+ "my_debug": 0,
+ "rtc": 1,
+ "temp_sensor": 2,
+ "lStart": 3,
+ "o_secs": 4,
+ "c_secs": 5,
+ "dt_refresh": 6,
+ "sDT_old": 7,
+ "t0": 8,
+ "t1": 9,
+ "t2": 10,
+ "default_dt": 11,
+ "pge3_lbl_dflt": 12,
+ "pge4_lbl_dflt": 13,
+ "online_time_present": 14,
+ "temp_in_REPL": 15,
+ "old_temp": 16,
+ "use_ntp": 17,
+ "use_txt_in_month": 18,
+ "use_usa_notation": 19,
+ "content_sensor_idx": 20,
+ "ntp_refresh": 21,
+ "nHH_old": 22,
+ "next_NTP_sync": 23,
+ "s_cnt": 24,
+ "five_min_cnt": 25,
+ "next_NTP_sync_t1": 26,
+ "next_NTP_sync_t3": 27,
+ "temp_in_fahrenheit": 28,
+ }
+
+ self.g_vars = {}
+
+ # self.clean()
+
+ def write(self, s, value):
+ if isinstance(s, str):
+ if s in self.gVars_rDict:
+ n = self.gVars_rDict[s]
+ # print("myVars.write() \'{:" ">20s}\'found in self.gVars_rDict,
+ # key: {}".format(s, n))
+ self.g_vars[n] = value
+ else:
+ raise KeyError("variable '{:" ">20s}' not found in self.gVars_rDict".format(s))
+ else:
+ raise TypeError(f"myVars.write(): param s expected str, {type(s)} received")
+
+ def read(self, s):
+ RetVal = None
+ if isinstance(s, str):
+ if s in self.gVars_rDict:
+ n = self.gVars_rDict[s]
+ if n in self.g_vars:
+ RetVal = self.g_vars[n]
+ return RetVal
+
+ def clean(self):
+ self.g_vars = {
+ 0: None,
+ 1: None,
+ 2: None,
+ 3: None,
+ 4: None,
+ 5: None,
+ 6: None,
+ 7: None,
+ 8: None,
+ 9: None,
+ 10: None,
+ 11: None,
+ 12: None,
+ 13: None,
+ 14: None,
+ 15: None,
+ 16: None,
+ 17: None,
+ 18: None,
+ 19: None,
+ 20: None,
+ 21: None,
+ 22: None,
+ 23: None,
+ 24: None,
+ 25: None,
+ 26: None,
+ 27: None,
+ 28: None,
+ }
+
+ def list(self):
+ for i in range(0, len(self.g_vars) - 1):
+ print(
+ "self.g_vars['{:" ">20s}'] = {}".format(
+ self.gVarsDict[i], self.g_vars[i] if i in self.g_vars else "None"
+ )
+ )
+
+
+# ---------- End of class gVars ------------------------
+
+myVars = gVars() # create an instance of the gVars class
+
+myVars.write("my_debug", False)
+
+# Adjust here the date and time that you want the RTC to be set at start:
+myVars.write("default_dt", time.struct_time((2022, 5, 14, 11, 42, 0, 5, -1, -1)))
+
+# start_time = time.monotonic()
+
+# -------------- Setting myVars elements ----------------------------------
+myVars.write("rtc", None)
+myVars.write("temp_sensor", None)
+myVars.write("lStart", True)
+myVars.write("o_secs", 0) # old seconds
+myVars.write("c_secs", 0) # current seconds
+# dt_refresh is used to flag when more or less static elements
+# in datetime stamp have to be refreshed
+myVars.write("dt_refresh", True)
+myVars.write("sDT_old", "")
+myVars.write("t0", None)
+myVars.write("t1", None)
+myVars.write("t2", None)
+# default_dt already set above
+myVars.write("pge3_lbl_dflt", "The third page is fun!")
+myVars.write("pge4_lbl_dflt", "The fourth page is where it's at")
+myVars.write("online_time_present", False)
+myVars.write("temp_in_REPL", False)
+myVars.write("old_temp", 0.00)
+myVars.write("use_txt_in_month", True)
+myVars.write("use_usa_notation", True)
+myVars.write("use_ntp", True)
+myVars.write("content_sensor_idx", None)
+myVars.write("ntp_refresh", True)
+myVars.write("next_NTP_sync", 0)
+myVars.write("s_cnt", 0)
+myVars.write("five_min_cnt", 0)
+myVars.write("next_NTP_sync_t1", "Next NTP sync in ")
+myVars.write("next_NTP_sync_t3", " (mm:ss)")
+myVars.write("temp_in_fahrenheit", True)
+# nHH_old is used to check if the hour has changed.
+# If so we have to re-sync from NTP server
+# (if not using an external RTC)
+myVars.write("nHH_old", -1)
+
+if myVars.read("my_debug"):
+ # print list of all variables in myVars
+ myVars.list()
+# -------------------------------------------------------------------------
+# degs_sign = chr(186) # I preferred the real degrees sign which is: chr(176)
+
+# If you are using a board with pre-defined ESP32 Pins:
+esp32_cs = DigitalInOut(board.ESP_CS)
+esp32_ready = DigitalInOut(board.ESP_BUSY)
+esp32_reset = DigitalInOut(board.ESP_RESET)
+
+spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
+esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)
+
+# ------------- Screen Setup ------------- #
+pyportal = None
+timeout_cnt = 0
+while pyportal is None:
+ try:
+ pyportal = PyPortal(
+ esp=esp, external_spi=spi, debug=True
+ ) # esp=esp, external_spi=spi) # create a PyPortal object
+ if pyportal is not None:
+ break
+ except ValueError: # Occurred the error: "SCK in use".
+ # Also occurred the error "SPEAKER_ENABLE in use"
+ time.sleep(0.5)
+ timeout_cnt += 1
+ if timeout_cnt > 10:
+ print("Timeout occurred while trying to create a PyPortal object")
+ raise
+
+months = {
+ 0: "Dum",
+ 1: "Jan",
+ 2: "Feb",
+ 3: "Mar",
+ 4: "Apr",
+ 5: "May",
+ 6: "Jun",
+ 7: "Jul",
+ 8: "Aug",
+ 9: "Sep",
+ 10: "Oct",
+ 11: "Nov",
+ 12: "Dec",
+}
+
+i2c = board.I2C()
+
+if myVars.read("use_ntp"):
+ print(
+ "\ntest_page_layout.showing_page_index test with I2C Temperature sensor and NTP \
+synchronized local time"
+ )
+else:
+ print("\nTabLayout test with I2C Temperature sensor and I2C Realtime clock")
+print("Add your WiFi SSID, WiFi password and Timezone in file: settings.toml\n")
+
+if myVars.read("my_debug"):
+ while not i2c.try_lock():
+ pass
+
+ try:
+ while True:
+ print(
+ "I2C addresses found:",
+ [hex(device_address) for device_address in i2c.scan()],
+ )
+ time.sleep(2)
+ break
+
+ finally: # unlock the i2c bus when ctrl-c'ing out of the loop
+ i2c.unlock()
+
+# -------- Setting up SDCard ---------------------
+# Is not needed to be done here: the SPI module is taking care of initializing the SD Card.
+# See: https://andyfelong.com/2019/07/pyportal-access-the-micro-sd-card/#:~:text= \
+# It%20also%20has%20support%20for%20a%20micro%2DSD%20Card.&text=Software%20support%20 \
+# for%20PyPortal%20is, \
+# %2Din%20serial%2Dport%20terminal.77
+#
+# NOTE: there is also the board.SD_CARD_DETECT pin (33)(but I don't know yet how to interface it)
+####
+
+# Get WiFi details, ensure these are setup in settings.toml
+ssid = getenv("CIRCUITPY_WIFI_SSID")
+password = getenv("CIRCUITPY_WIFI_PASSWORD")
+
+if myVars.read("my_debug"):
+ if esp.status == adafruit_esp32spi.WL_IDLE_STATUS:
+ print("ESP32 found and in idle mode")
+ print("Firmware vers.", esp.firmware_version)
+ print("MAC addr:", [hex(i) for i in esp.MAC_address])
+
+ for ap in esp.scan_networks():
+ print("\t%s\t\tRSSI: %d" % (str(ap["ssid"], "utf-8"), ap["rssi"]))
+
+# Get our desired timezone
+location = getenv("timezone", None)
+
+print("\nConnecting to AP...")
+while not esp.is_connected:
+ try:
+ esp.connect_AP(ssid, password)
+ except RuntimeError as e:
+ print("could not connect to AP, retrying: ", e)
+ continue
+print("Connected to", str(esp.ssid, "utf-8"), "\tRSSI:", esp.rssi)
+print("Please wait...")
+if myVars.read("my_debug"):
+ print("My IP address is", esp.pretty_ip(esp.ip_address))
+ print("IP lookup adafruit.com: %s" % esp.pretty_ip(esp.get_host_by_name("adafruit.com")))
+ print("Ping google.com: %d ms" % esp.ping("google.com"))
+
+
+def refresh_from_NTP():
+ # Fetch and set the microcontroller's current UTC time
+ # keep retrying until a valid time is returned
+ timeout_cnt2 = 0
+ while not ntp.valid_time:
+ ntp.set_time(tz_offset)
+ if myVars.read("my_debug"):
+ print("Failed to obtain time, retrying in 5 seconds...")
+ timeout_cnt2 += 1
+ time.sleep(5)
+ if timeout_cnt2 > 10:
+ print("Timeout while trying to get ntp datetime to set the internal rtc")
+ break
+
+ if myVars.read("my_debug"):
+ print("Value ntp.valid_time = ", ntp.valid_time)
+
+ if ntp.valid_time:
+ myVars.write("online_time_present", True)
+ myVars.write("ntp_refresh", False)
+ # Get the current time in seconds since Jan 1, 1970 and correct it for local timezone
+ # (defined in settings.toml)
+ ntp_current_time = time.time()
+ if myVars.read("my_debug"):
+ print(f"Seconds since Jan 1, 1970: {ntp_current_time} seconds")
+
+ # Convert the current time in seconds since Jan 1, 1970 to a struct_time
+ myVars.write("default_dt", time.localtime(ntp_current_time))
+ if not myVars.read("my_debug"):
+ print(
+ "Internal clock synchronized from NTP pool, now =",
+ myVars.read("default_dt"),
+ )
+
+
+if myVars.read("use_ntp"):
+ # Initialize the NTP object
+ ntp = NTP(esp)
+
+ location = getenv("timezone", location)
+ if myVars.read("my_debug"):
+ print(f"location (from settings.toml) = {location}")
+ if location == "Europe/Lisbon":
+ if myVars.read("my_debug"):
+ print("Using timezone Europe/Lisbon")
+ tz_offset = 3600
+ else:
+ tz_offset = 0
+
+ refresh_from_NTP()
+
+pixel = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=1)
+WHITE = 0xFFFFFF
+RED = 0xFF0000
+YELLOW = 0xFFFF00
+GREEN = 0x00FF00
+BLUE = 0x0000FF
+PURPLE = 0xFF00FF
+BLACK = 0x000000
+
+# ---------- Sound Effects ------------- #
+soundDemo = "/sounds/sound.wav"
+soundBeep = "/sounds/beep.wav"
+soundTab = "/sounds/tab.wav"
+
+# ------------ Touchscreen setup --------------- #
+# See: https://learn.adafruit.com/making-a-pyportal-user-interface-displayio/display
+display = board.DISPLAY # create the display object
+display.rotation = 0
+# screen_width = 320
+# screen_height = 240
+screen_width = display.width
+screen_height = display.height
+# -------Rotate 0:
+# Note @PaulskPt dd 2022-05-13
+# After using a touchscreen calibration script, the values are as follows:
+# (XL, YU, XR, YD) are: (6935, 10496, 60127, 57631)
+ts = adafruit_touchscreen.Touchscreen(
+ board.TOUCH_XL,
+ board.TOUCH_XR,
+ board.TOUCH_YD,
+ board.TOUCH_YU, # #calibration=((5200, 59000), (5800, 57000)),
+ calibration=((6815, 60095), (10520, 58007)),
+ size=(screen_width, screen_height),
+) # was: screen_width, screen_height
+"""
+# If Rotate is 90:
+# -------Rotate 90:
+ts = adafruit_touchscreen.Touchscreen(board.TOUCH_YU, board.TOUCH_YD,
+ board.TOUCH_XL, board.TOUCH_XR,
+ calibration=((5200, 59000), (5800, 57000)),
+ size=(screen_height, screen_width))
+# If Rotate 180:
+ts = adafruit_touchscreen.Touchscreen(board.TOUCH_XR, board.TOUCH_XL,
+ board.TOUCH_YU, board.TOUCH_YD,
+ calibration=((5200, 59000), (5800, 57000)),
+ size=(screen_width, screen_height))
+
+# If Rotate 270:
+ts = adafruit_touchscreen.Touchscreen(board.TOUCH_XL, board.TOUCH_XR,
+ board.TOUCH_YD, board.TOUCH_YU,
+ calibration=((5200, 59000), (5800, 57000)),
+ size=(screen_height, screen_width))
+"""
+# -----------------------------------
+
+# create and show main_group
+main_group = displayio.Group() # The Main Display Group
+
+display.root_group = main_group
+
+# font = bitmap_font.load_font("fonts/Helvetica-Bold-16.bdf")
+font_arial = bitmap_font.load_font("/fonts/Arial-16.bdf")
+font_term = terminalio.FONT
+
+# create the page layout
+test_page_layout = TabLayout(
+ x=0,
+ y=0,
+ display=board.DISPLAY,
+ tab_text_scale=2,
+ custom_font=font_term,
+ inactive_tab_spritesheet="lib/adafruit_displayio_layout/examples/bmps/inactive_tab_sprite.bmp",
+ showing_tab_spritesheet="lib/adafruit_displayio_layout/examples/bmps/active_tab_sprite.bmp",
+ showing_tab_text_color=0x00AA59,
+ inactive_tab_text_color=0xEEEEEE,
+ inactive_tab_transparent_indexes=(0, 1),
+ showing_tab_transparent_indexes=(0, 1),
+ tab_count=4,
+)
+# make 4 pages of content
+pge1_group = displayio.Group()
+pge2_group = displayio.Group()
+pge3_group = displayio.Group()
+pge4_group = displayio.Group()
+# make 1 background group
+bg_group = displayio.Group()
+
+"""
+ From: https://learn.adafruit.com/making-a-pyportal-user-interface-displayio/the-full-code
+"""
+
+
+# This will handle switching Images and Icons
+def set_image(group, filename):
+ """Set the image file for a given goup for display.
+ This is most useful for Icons or image slideshows.
+ :param group: The chosen group
+ :param filename: The filename of the chosen image
+ """
+ print("Set image to ", filename)
+ image = None
+ image_sprite = None
+ if group:
+ group.pop()
+ if not filename:
+ return # we're done, no icon desired
+ # CircuitPython 6 & 7 compatible
+ try:
+ image = displayio.OnDiskBitmap(filename)
+ except OSError as exc:
+ if exc.args[0] == 2: # No such file/directory
+ return
+ if image is not None:
+ image_sprite = displayio.TileGrid(
+ image,
+ pixel_shader=getattr(image, "pixel_shader", displayio.ColorConverter()),
+ )
+ if image_sprite is not None:
+ main_group.append(image_sprite)
+
+
+# ------------- Setup for Images ------------- #
+
+bg_group = displayio.Group()
+set_image(bg_group, "/images/BGimage4.bmp")
+print(
+ "Please wait...building-up things..."
+) # 2022-05-08 13h19 (utc+1) It takes 24 seconds from here to start of main() loop
+main_group.append(bg_group)
+
+icon_group = displayio.Group()
+icon_group.x = 180
+icon_group.y = 120
+icon_group.scale = 1
+pge2_group.append(icon_group)
+
+# labels
+pge1_lbl = Label(
+ font=font_term,
+ scale=2,
+ text="This is the first page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+pge1_lbl2 = Label(
+ font=font_term,
+ scale=2,
+ text="Please wait...",
+ anchor_point=(0, 0),
+ anchored_position=(10, 150),
+)
+pge2_lbl = Label(
+ font=font_term,
+ scale=2,
+ text="This page is the second page!",
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+pge3_lbl = Label(
+ font=font_term,
+ scale=2,
+ text=myVars.read("pge3_lbl_dflt"), # Will be "Date/time:"
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+pge3_lbl2 = Label(
+ font=font_term,
+ scale=2,
+ text="", # pge3_lbl2_dflt, # Will be DD-MO-YYYY or Month-DD-YYYY
+ anchor_point=(0, 0),
+ anchored_position=(10, 40),
+)
+pge3_lbl3 = Label(
+ font=font_term,
+ scale=2,
+ text="", # pge3_lbl3_dflt, # Will be HH:MM:SS
+ anchor_point=(0, 0),
+ anchored_position=(10, 70),
+)
+pge3_lbl4 = Label(
+ font=font_term,
+ scale=2,
+ text="", # pge3_lbl3_dflt, # Will be time until next NTP sync in MM:SS
+ anchor_point=(0, 0),
+ anchored_position=(10, 200),
+)
+pge4_lbl = Label(
+ font=font_term,
+ scale=2,
+ text=myVars.read("pge4_lbl_dflt"),
+ anchor_point=(0, 0),
+ anchored_position=(10, 10),
+)
+pge4_lbl2 = Label(
+ font=font_term,
+ scale=2,
+ text="", # Will be "Temperature"
+ anchor_point=(0, 0),
+ anchored_position=(10, 130),
+)
+pge4_lbl3 = Label(
+ font=font_arial, # bitmap_font.load_font("/fonts/Arial-16.bdf"),
+ scale=2,
+ text="", # Will be "xx.yy ºC"
+ anchor_point=(0, 0),
+ anchored_position=(10, 160),
+)
+
+# shapes
+square = Rect(x=20, y=70, width=40, height=40, fill=0x00DD00)
+circle = Circle(50, 100, r=30, fill=0xDD00DD)
+triangle = Triangle(50, 0, 100, 50, 0, 50, fill=0xDDDD00)
+rectangle = Rect(x=80, y=60, width=100, height=50, fill=0x0000DD)
+
+triangle.x = 80
+triangle.y = 70
+
+# add everything to their page groups
+pge1_group.append(square)
+pge1_group.append(pge1_lbl)
+pge1_group.append(pge1_lbl2)
+pge2_group.append(pge2_lbl)
+pge2_group.append(circle)
+pge3_group.append(pge3_lbl)
+pge3_group.append(pge3_lbl2)
+pge3_group.append(pge3_lbl3)
+pge3_group.append(pge3_lbl4)
+pge3_group.append(triangle)
+pge4_group.append(pge4_lbl)
+pge4_group.append(pge4_lbl2)
+pge4_group.append(pge4_lbl3)
+pge4_group.append(rectangle)
+
+if board.board_id == "pyportal_titano":
+ pages = {0: "Dum", 1: "One", 2: "Two", 3: "Three", 4: "Four"}
+else:
+ pages = {0: "Dum", 1: "One", 2: "Two", 3: "Thr", 4: "For"}
+
+# add the pages to the layout, supply your own page names
+test_page_layout.add_content(pge1_group, pages[1])
+test_page_layout.add_content(pge2_group, pages[2])
+test_page_layout.add_content(pge3_group, pages[3])
+test_page_layout.add_content(pge4_group, pages[4])
+# test_page_layout.add_content(displayio.Group(), "page_5")
+# add it to the group that is showing on the display
+main_group.append(test_page_layout)
+# test_page_layout.tab_tilegrids_group[3].x += 50
+# ---------- Text Boxes ------------- #
+# Set the font and preload letters
+# font = bitmap_font.load_font("/fonts/Arial-16.bdf") # was: Helvetica-Bold-16.bdf")
+# font.load_glyphs(b"abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890- ()")
+glyphs = b' "(),-.0123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
+font_arial.load_glyphs(glyphs)
+font_arial.load_glyphs(("°",)) # a non-ascii character we need
+# font=font_term.collect() # ADDED by @PaulskPt --
+# to prevent MemoryError - memory allocation failed,
+# allocating 6444 bytes
+
+pge2_group = 1
+
+
+"""If the temperature sensor has been disconnected,
+ this function will try to reconnect (test if the sensor is present by now)
+ If reconnected this function creates the temp_sensor object"""
+
+
+def connect_temp_sensor():
+ t = "temperature sensor found"
+
+ # myVars.write("temp_sensor",None)
+
+ try:
+ myVars.write("temp_sensor", adafruit_tmp117.TMP117(i2c))
+ except ValueError: # ValueError occurs if the temperature sensor is not connected
+ pass
+
+ print(
+ "connect_temp_sensor(): type(temp_sensor) object = ",
+ type(myVars.read("temp_sensor")),
+ )
+ if myVars.read("temp_sensor") is not None:
+ print(t)
+ print("temperature sensor connected")
+ myVars.write("t0", "Temperature")
+ if myVars.read("temp_in_fahrenheit"):
+ myVars.write("t1", chr(186) + "F")
+ else:
+ myVars.write("t1", chr(186) + "C")
+ myVars.write("t2", 27 * "_")
+ else:
+ print("no " + t)
+ print("failed to connect temperature sensor")
+ myVars.write("t0", None)
+ myVars.write("t1", None)
+ myVars.write("t2", None)
+
+
+""" If the external rtc has been disconnected,
+ this function will try to reconnect (test if the external rtc is present by now)"""
+
+
+def connect_rtc():
+ t = "RTC found"
+
+ # myVars.write("rtc",None)
+
+ try:
+ myVars.write("rtc", DS3231(i2c)) # i2c addres 0x68
+ # myVars.write("rtc",rtc)
+ except ValueError:
+ pass
+
+ print("connect_rtc() type rtc object = ", type(myVars.read("rtc")))
+ if myVars.read("rtc") is not None:
+ print(t)
+ print("RTC connected")
+ if myVars.read("lStart"):
+ myVars.write("lStart", False)
+ myVars.read("rtc").datetime = myVars.read("default_dt")
+ else:
+ print("no " + t)
+ print("Failed to connect RTC")
+
+
+"""Function gets a value from the external temperature sensor
+ It only updates if the value has changed compared to the previous value
+ A fixed text is set in pge4_lbl2.text. The variable temperature value is set in pge4_lbl3.text
+ If no value obtained (for instance if the sensor is disconnected),
+ the function sets the pge4_lbl to a default text and makes empty
+ pge4_lbl2.text and pge4_lbl3.text"""
+
+
+def get_temp():
+ my_debug = myVars.read("my_debug")
+ showing_page_idx = test_page_layout.showing_page_index
+ RetVal = False
+ if myVars.read("temp_sensor") is not None:
+ try:
+ temp = myVars.read("temp_sensor").temperature
+ if myVars.read("temp_in_fahrenheit"):
+ temp = (temp * 1.8) + 32
+ t = "{:5.2f}{} ".format(temp, myVars.read("t1"))
+ if my_debug and temp is not None and not myVars.read("temp_in_REPL"):
+ myVars.write("temp_in_REPL", True)
+ print("get_temp(): {} {}".format(myVars.read("t0"), t))
+ if showing_page_idx == 3: # show temperature on most right Tab page
+ if temp is not None:
+ if temp != myVars.read(
+ "old_temp"
+ ): # Only update if there is a change in temperature
+ myVars.write("old_temp", temp)
+ t = "{:5.2f}{} ".format(temp, myVars.read("t1"))
+ pge4_lbl.text = ""
+ pge4_lbl2.text = myVars.read("t0")
+ pge4_lbl3.text = t
+ # if not my_debug:
+ # print("pge4_lbl.tex.gvars {}".format(pge4_lbl.text))
+ # time.sleep(2)
+ RetVal = True
+ else:
+ t = ""
+ pge4_lbl.text = myVars.read("pge4_lbl_dflt")
+ except OSError:
+ print("Temperature sensor has disconnected")
+ t = ""
+ myVars.write("temp_sensor", None)
+ pge4_lbl.text = myVars.read("pge4_lbl_dflt") # clean the line (eventually: t2)
+ pge4_lbl2.text = "Sensor disconnected."
+ pge4_lbl3.text = "Check wiring."
+ return RetVal
+
+
+dt_ridxs = {"yy": 0, "mo": 1, "dd": 2, "hh": 3, "mm": 4, "ss": 5}
+
+# print("dict dt_ridxs =", dt_ridxs.keys())
+
+
+def handle_dt(dt):
+ my_debug = myVars.read("my_debug")
+ RetVal = False
+ s = "Date/time: "
+ sYY = str(dt[dt_ridxs["yy"]]) # was: str(dt[yy])
+ dd = dt_ridxs["dd"]
+ hh = dt_ridxs["hh"]
+ mm = dt_ridxs["mm"]
+ ss = dt_ridxs["ss"]
+ if "mo" in dt_ridxs:
+ sMO = (
+ months[dt[dt_ridxs["mo"]]] # was: months[dt[mo]]
+ if myVars.read("use_txt_in_month")
+ else "0" + str(dt[dt_ridxs["mo"]])
+ if dt[dt_ridxs["mo"]] < 10
+ else str(dt[dt_ridxs["mo"]])
+ )
+ else:
+ raise KeyError("key {} not in dt_ridxs dict".format("mo"))
+
+ dt_dict = {}
+
+ for _ in range(dd, ss + 1):
+ dt_dict[_] = "0" + str(dt[_]) if dt[_] < 10 else str(dt[_])
+
+ if my_debug:
+ print("dt_dict = ", dt_dict)
+
+ myVars.write("c_secs", dt_dict[ss])
+ sDT = (
+ sMO + "-" + dt_dict[dd] + "-" + sYY
+ if myVars.read("use_usa_notation")
+ else sYY + "-" + sMO + "-" + dt_dict[dd]
+ )
+ if my_debug:
+ print("handle_dt(): sDT_old = {}, sDT = {}".format(myVars.read("sDT_old"), sDT))
+ if myVars.read("sDT_old") != sDT:
+ myVars.write("sDT_old", sDT)
+ myVars.write("dt_refresh", True) # The date has changed, set the refresh flag
+ sDT2 = dt_dict[hh] + ":" + dt_dict[mm] + ":" + dt_dict[ss]
+
+ if myVars.read("dt_refresh"): # only refresh when needed
+ myVars.write("dt_refresh", False)
+ pge3_lbl.text = s
+ pge3_lbl2.text = sDT
+
+ if myVars.read("c_secs") != myVars.read("o_secs"):
+ myVars.write("o_secs", myVars.read("c_secs"))
+ sDT3 = s + f"{sDT} {sDT2}"
+ print(sDT3)
+
+ pge3_lbl3.text = sDT2
+ if my_debug:
+ print(f"pge3_lbl.text = {pge3_lbl.text}")
+ print(f"pge3_lbl2.text = {pge3_lbl2.text}")
+ print(f"pge3_lbl3.text = {pge3_lbl3.text}")
+ RetVal = True
+
+ # Return from here with a False but don't set the pge3_lbl to default.
+ # It is only to say to the loop() that we did't update the datetime
+ return RetVal
+
+
+"""Function gets the date and time:
+ a) if an rtc is present from the rtc;
+ b) if using online NTP pool server then get the date and time from the function time.localtime
+ This time.localtime has before been set with data from the NTP server.
+ In both cases the date and time will be set to the pge3_lbl, pge3_lbl12 and pge3_lbl3
+ If no (valid) date and time received then a default text will be shown on the pge3_lbl"""
+
+
+def get_dt():
+ dt = None
+ RetVal = False
+
+ if myVars.read("rtc") is not None:
+ try:
+ dt = myVars.read("rtc").datetime
+ except OSError as exc:
+ if myVars.read("my_debug"):
+ print("Error number: ", exc.args[0])
+ if exc.args[0] == 5: # Input/output error
+ print("get_dt(): OSError occurred. RTC probably is disconnected")
+ pge3_lbl.text = myVars.read("pge3_lbl_dflt")
+ myVars.write("sDT_old", "")
+ pge3_lbl2.text = ""
+ pge3_lbl3.text = ""
+ return RetVal
+ raise # Handle other errors
+
+ elif myVars.read("online_time_present") or myVars.read("use_ntp"):
+ dt = time.localtime()
+
+ if myVars.read("my_debug"):
+ print("get_dt(): dt = ", dt)
+ if dt is not None:
+ RetVal = handle_dt(dt)
+ else:
+ pge3_lbl.text = myVars.read("pge3_lbl_dflt")
+ pge3_lbl2.text = ""
+ pge3_lbl3.text = ""
+ return RetVal
+
+
+""" hms_to_cnt()
+ function returns a integer value representing
+ the conversion from the current hours, minutes and seconds
+ into seconds"""
+
+
+def hms_to_cnt():
+ dt = time.localtime() # get the local time as a time_struct
+ return (dt.tm_hour * 3600) + (dt.tm_min * 60) + dt.tm_sec
+
+
+def ck_next_NTP_sync():
+ s_cnt = myVars.read("s_cnt")
+ c_cnt = hms_to_cnt() # set current count (seconds)
+ c_elapsed = c_cnt - s_cnt
+ if c_elapsed < 10: # continue only when c_elapsed >= 10
+ return
+ TAG = "ck_next_NTP_sync(): "
+ my_debug = myVars.read("my_debug")
+ t1 = myVars.read("next_NTP_sync_t1")
+ t3 = myVars.read("next_NTP_sync_t3")
+ five_min = myVars.read("five_min_cnt")
+ myVars.write("s_cnt", hms_to_cnt())
+ # --- five minutes count down calculations #1 ---
+ if my_debug:
+ print(TAG + f"five_min = {five_min}, s_cnt = {s_cnt}, c_cnt = {c_cnt}")
+ print(TAG + "c_elapsed = ", c_elapsed)
+
+ # --- five minutes count down calculations #2 ---
+ myVars.write("s_cnt", c_cnt) # remember c_cnt
+ five_min -= 10
+ myVars.write("five_min_cnt", five_min) # remember count
+ mm2 = five_min // 60
+ ss2 = five_min - (mm2 * 60)
+ t2 = f"{mm2:02d}:{ss2:02d}"
+ t0 = t1 + t2 + t3
+ print(t0)
+ pge3_lbl4.text = t0
+ if five_min == 0: # five minutes passed
+ pge3_lbl4.text = ""
+ myVars.write("five_min_cnt", 300) # reset count
+ myVars.write("ntp_refresh", True)
+
+
+def inc_cnt(cnt):
+ cnt += 1
+ if cnt > 999:
+ cnt = 0
+ return cnt
+
+
+def main():
+ cnt = 1
+ wipe_pge1_lbl2_text = False
+ print("Starting loop")
+ pge1_lbl2.text = "Ready..."
+ myVars.write("five_min_cnt", 300) # 5 minutes
+ myVars.write("s_cnt", hms_to_cnt()) # set start count (seconds)
+ use_ntp = myVars.read("use_ntp")
+ rtc = myVars.read("rtc")
+ otp = myVars.read("online_time_present")
+ # print("Starting loop")
+ while True:
+ touch = ts.touch_point
+ try:
+ if use_ntp:
+ ck_next_NTP_sync()
+ ntp_refresh = myVars.read("ntp_refresh")
+ # ------------- Handle Tab touch ------------- #
+ # print("main() value touch: ", touch)
+ if touch: # Only do this if the screen is touched
+ if not wipe_pge1_lbl2_text:
+ pge1_lbl2.text = "" # Clear the label
+ wipe_pge1_lbl2_text = True
+ test_page_layout.handle_touch_events(touch)
+ if rtc is not None or otp:
+ if otp and ntp_refresh:
+ refresh_from_NTP() # first re-synchronize internal clock from NTP server
+ if get_dt():
+ print(f"Loop nr: {cnt:03d}")
+ else:
+ connect_rtc()
+ if myVars.read("temp_sensor") is not None:
+ get_temp()
+ else:
+ connect_temp_sensor()
+ touch = (
+ ts.touch_point
+ ) # Just to try - it looks like after re-connecting the sensor,
+ # the touch data has lost
+ if myVars.read("temp_in_REPL"):
+ myVars.write("temp_in_REPL", False)
+ cnt = inc_cnt(cnt)
+ except KeyboardInterrupt as exc:
+ print("Keyboard interrupt...exiting...")
+ raise KeyboardInterrupt from exc
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/hotplug_sensor_examples/images/BGimage4.bmp b/examples/hotplug_sensor_examples/images/BGimage4.bmp
new file mode 100644
index 0000000..02d4c25
Binary files /dev/null and b/examples/hotplug_sensor_examples/images/BGimage4.bmp differ
diff --git a/examples/hotplug_sensor_examples/images/BGimage4.bmp.license b/examples/hotplug_sensor_examples/images/BGimage4.bmp.license
new file mode 100644
index 0000000..82d4370
--- /dev/null
+++ b/examples/hotplug_sensor_examples/images/BGimage4.bmp.license
@@ -0,0 +1,2 @@
+# SPDX-FileCopyrightText: 2022 PaulskPt
+# SPDX-License-Identifier: MIT
diff --git a/optional_requirements.txt b/optional_requirements.txt
new file mode 100644
index 0000000..d4e27c4
--- /dev/null
+++ b/optional_requirements.txt
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
diff --git a/pyproject.toml b/pyproject.toml
index f3c35ae..c036644 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,48 @@
-# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò
+# SPDX-FileCopyrightText: 2022 Alec Delaney for Adafruit Industries
#
-# SPDX-License-Identifier: Unlicense
+# SPDX-License-Identifier: MIT
-[tool.black]
-target-version = ['py35']
+[build-system]
+requires = [
+ "setuptools",
+ "wheel",
+ "setuptools-scm",
+]
+
+[project]
+name = "adafruit-circuitpython-displayio-layout"
+description = "CircuitPython helper library for displayio layouts and widgets."
+version = "0.0.0+auto.0"
+readme = "README.rst"
+authors = [
+ {name = "Adafruit Industries", email = "circuitpython@adafruit.com"}
+]
+urls = {Homepage = "https://github.com/adafruit/Adafruit_CircuitPython_DisplayIO_Layout"}
+keywords = [
+ "adafruit",
+ "blinka",
+ "circuitpython",
+ "micropython",
+ "displayio_layout",
+ "displayio",
+ "gui",
+ "layout",
+ "widget",
+]
+license = {text = "MIT"}
+classifiers = [
+ "Intended Audience :: Developers",
+ "Topic :: Software Development :: Libraries",
+ "Topic :: Software Development :: Embedded Systems",
+ "Topic :: System :: Hardware",
+ "License :: OSI Approved :: MIT License",
+ "Programming Language :: Python :: 3",
+]
+dynamic = ["dependencies", "optional-dependencies"]
+
+[tool.setuptools]
+packages = ["adafruit_displayio_layout"]
+
+[tool.setuptools.dynamic]
+dependencies = {file = ["requirements.txt"]}
+optional-dependencies = {optional = {file = ["optional_requirements.txt"]}}
diff --git a/requirements.txt b/requirements.txt
index bdd5ac6..433415f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,10 +1,11 @@
-# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
-# SPDX-FileCopyrightText: Copyright (c) 2021 Tim Cocks for Adafruit Industries
+# SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
#
-# SPDX-License-Identifier: MIT
+# SPDX-License-Identifier: Unlicense
+Adafruit-Blinka-displayio
Adafruit-Blinka
-adafruit-blinka-displayio
-adafruit-circuitpython-display-shapes
-adafruit-circuitpython-imageload
+adafruit-circuitpython-bitmap-font
adafruit-circuitpython-display-text
+adafruit-circuitpython-imageload
+adafruit-circuitpython-display-shapes
+adafruit-circuitpython-typing
diff --git a/ruff.toml b/ruff.toml
new file mode 100644
index 0000000..5a5dbf0
--- /dev/null
+++ b/ruff.toml
@@ -0,0 +1,101 @@
+# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+target-version = "py38"
+line-length = 100
+
+[lint]
+preview = true
+select = ["I", "PL", "UP"]
+
+extend-select = [
+ "D419", # empty-docstring
+ "E501", # line-too-long
+ "W291", # trailing-whitespace
+ "PLC0414", # useless-import-alias
+ "PLC2401", # non-ascii-name
+ "PLC2801", # unnecessary-dunder-call
+ "PLC3002", # unnecessary-direct-lambda-call
+ "E999", # syntax-error
+ "PLE0101", # return-in-init
+ "F706", # return-outside-function
+ "F704", # yield-outside-function
+ "PLE0116", # continue-in-finally
+ "PLE0117", # nonlocal-without-binding
+ "PLE0241", # duplicate-bases
+ "PLE0302", # unexpected-special-method-signature
+ "PLE0604", # invalid-all-object
+ "PLE0605", # invalid-all-format
+ "PLE0643", # potential-index-error
+ "PLE0704", # misplaced-bare-raise
+ "PLE1141", # dict-iter-missing-items
+ "PLE1142", # await-outside-async
+ "PLE1205", # logging-too-many-args
+ "PLE1206", # logging-too-few-args
+ "PLE1307", # bad-string-format-type
+ "PLE1310", # bad-str-strip-call
+ "PLE1507", # invalid-envvar-value
+ "PLE2502", # bidirectional-unicode
+ "PLE2510", # invalid-character-backspace
+ "PLE2512", # invalid-character-sub
+ "PLE2513", # invalid-character-esc
+ "PLE2514", # invalid-character-nul
+ "PLE2515", # invalid-character-zero-width-space
+ "PLR0124", # comparison-with-itself
+ "PLR0202", # no-classmethod-decorator
+ "PLR0203", # no-staticmethod-decorator
+ "UP004", # useless-object-inheritance
+ "PLR0206", # property-with-parameters
+ "PLR0904", # too-many-public-methods
+ "PLR0911", # too-many-return-statements
+ "PLR0916", # too-many-boolean-expressions
+ "PLR1702", # too-many-nested-blocks
+ "PLR1704", # redefined-argument-from-local
+ "PLR1711", # useless-return
+ "C416", # unnecessary-comprehension
+ "PLR1733", # unnecessary-dict-index-lookup
+ "PLR1736", # unnecessary-list-index-lookup
+
+ # ruff reports this rule is unstable
+ #"PLR6301", # no-self-use
+
+ "PLW0108", # unnecessary-lambda
+ "PLW0120", # useless-else-on-loop
+ "PLW0127", # self-assigning-variable
+ "PLW0129", # assert-on-string-literal
+ "B033", # duplicate-value
+ "PLW0131", # named-expr-without-context
+ "PLW0245", # super-without-brackets
+ "PLW0406", # import-self
+ "PLW0602", # global-variable-not-assigned
+ "PLW0603", # global-statement
+ "PLW0604", # global-at-module-level
+
+ # fails on the try: import typing used by libraries
+ #"F401", # unused-import
+
+ "F841", # unused-variable
+ "E722", # bare-except
+ "PLW0711", # binary-op-exception
+ "PLW1501", # bad-open-mode
+ "PLW1508", # invalid-envvar-default
+ "PLW1509", # subprocess-popen-preexec-fn
+ "PLW2101", # useless-with-lock
+ "PLW3301", # nested-min-max
+]
+
+ignore = [
+ "PLR2004", # magic-value-comparison
+ "UP030", # format literals
+ "PLW1514", # unspecified-encoding
+ "PLR0912", # too-many-branches
+ "PLR0913", # too-many-arguments
+ "PLR0914", # too-many-locals
+ "PLR0915", # too-many-statements
+ "PLR0917", # too-many-positional-arguments
+
+]
+
+[format]
+line-ending = "lf"
diff --git a/setup.py b/setup.py
deleted file mode 100644
index f17d31d..0000000
--- a/setup.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
-# SPDX-FileCopyrightText: Copyright (c) 2021 Tim Cocks for Adafruit Industries
-#
-# SPDX-License-Identifier: MIT
-
-"""A setuptools based setup module.
-
-See:
-https://packaging.python.org/en/latest/distributing.html
-https://github.com/pypa/sampleproject
-"""
-
-from setuptools import setup, find_packages
-
-# To use a consistent encoding
-from codecs import open
-from os import path
-
-here = path.abspath(path.dirname(__file__))
-
-# Get the long description from the README file
-with open(path.join(here, "README.rst"), encoding="utf-8") as f:
- long_description = f.read()
-
-setup(
- name="adafruit-circuitpython-displayio-layout",
- use_scm_version=True,
- setup_requires=["setuptools_scm"],
- description="CircuitPython helper library for displayio layouts and widgets.",
- long_description=long_description,
- long_description_content_type="text/x-rst",
- # The project's main homepage.
- url="https://github.com/adafruit/Adafruit_CircuitPython_DisplayIO_Layout",
- # Author details
- author="Adafruit Industries",
- author_email="circuitpython@adafruit.com",
- install_requires=[
- "Adafruit-Blinka",
- "adafruit-blinka-displayio",
- "adafruit-circuitpython-display-shapes",
- "adafruit-circuitpython-imageload",
- "adafruit-circuitpython-display-text",
- ],
- # Choose your license
- license="MIT",
- # See https://pypi.python.org/pypi?%3Aaction=list_classifiers
- classifiers=[
- "Development Status :: 3 - Alpha",
- "Intended Audience :: Developers",
- "Topic :: Software Development :: Libraries",
- "Topic :: System :: Hardware",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- ],
- # What does your project relate to?
- keywords="adafruit blinka circuitpython micropython displayio_layout displayio gui layout "
- "widget",
- # You can just specify the packages manually here if your project is
- # simple. Or you can use find_packages().
- # TODO: IF LIBRARY FILES ARE A PACKAGE FOLDER,
- # CHANGE `py_modules=['...']` TO `packages=['...']`
- packages=[
- "adafruit_displayio_layout",
- "adafruit_displayio_layout.layouts",
- "adafruit_displayio_layout.widgets",
- ],
-)
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy