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_tab_layout_hotplug_ext_rtc_temp_sensor_test.py b/examples/hotplug_sensor_examples/displayio_layout_tab_layout_hotplug_ext_rtc_temp_sensor_test.py new file mode 100644 index 0000000..f56413f --- /dev/null +++ b/examples/hotplug_sensor_examples/displayio_layout_tab_layout_hotplug_ext_rtc_temp_sensor_test.py @@ -0,0 +1,656 @@ +# SPDX-FileCopyrightText: 2022 PaulskPt +# +# SPDX-License-Identifier: MIT +""" +Make a PageLayout and illustrate all of it's features +""" + +import time +import displayio +import board +import terminalio +import adafruit_tmp117 +from adafruit_ds3231 import DS3231 +from adafruit_display_text.bitmap_label import Label +from adafruit_display_shapes.rect import Rect +from adafruit_display_shapes.circle import Circle +from adafruit_display_shapes.triangle import Triangle +from adafruit_bitmap_font import bitmap_font +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( + "myVars.write(): param s expected str, {} received".format(type(s)) + ) + + 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.show(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("showing page index:{}".format(test_page_layout.showing_page_index)) +time.sleep(1) + +# change page with function by index +test_page_layout.show_page(page_index=0) +print("showing page name: {}".format(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("showing page index: {}".format(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("showing page name: {}".format(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 = "{:5.2f} ".format(temp) + 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 = "{: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 = "" + pge4_lbl3.text = "" + + return RetVal + + +""" + Function called by get_dt() + Created to repair pylint error R0912: Too many branches (13/12) +""" + +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 + "{} {}".format(sDT, sDT2) + print(sDT3) + + pge3_lbl3.text = sDT2 + if myVars.read("my_debug"): + print("pge3_lbl.text = {}".format(pge3_lbl.text)) + print("pge3_lbl2.text = {}".format(pge3_lbl2.text)) + print("pge3_lbl3.text = {}".format(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("Loop nr: {:03d}".format(cnt)) + # 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_tablayout_hotplug_temp_sensor_datetime_fm_NTP_touch_and_gVars_test.py b/examples/hotplug_sensor_examples/displayio_layout_tablayout_hotplug_temp_sensor_datetime_fm_NTP_touch_and_gVars_test.py new file mode 100644 index 0000000..a4a3301 --- /dev/null +++ b/examples/hotplug_sensor_examples/displayio_layout_tablayout_hotplug_temp_sensor_datetime_fm_NTP_touch_and_gVars_test.py @@ -0,0 +1,996 @@ +# 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 +import board +import busio +import displayio +import terminalio +import adafruit_tmp117 +from adafruit_ds3231 import DS3231 +from digitalio import DigitalInOut +import neopixel +import adafruit_touchscreen +from adafruit_esp32spi import adafruit_esp32spi +from adafruit_ntp import NTP +from adafruit_pyportal import PyPortal +from adafruit_display_text.bitmap_label import Label +from adafruit_display_shapes.rect import Rect +from adafruit_display_shapes.circle import Circle +from adafruit_display_shapes.triangle import Triangle +from adafruit_bitmap_font import bitmap_font +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( + "myVars.write(): param s expected str, {} received".format(type(s)) + ) + + 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: secrets.h\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) +#### + +# you'll need to pass in an io username and key +# Get wifi details and more from a secrets.py file +try: + from secrets import secrets +except ImportError: + print("WiFi secrets are kept in secrets.py, please add them there!") + raise + +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 username, key and desired timezone +location = secrets.get("timezone", None) + +print("\nConnecting to AP...") +while not esp.is_connected: + try: + esp.connect_AP(secrets["ssid"], secrets["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 secrets.h) + ntp_current_time = time.time() + if myVars.read("my_debug"): + print("Seconds since Jan 1, 1970: {} seconds".format(ntp_current_time)) + + # 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 = secrets.get("timezone", location) + if myVars.read("my_debug"): + print("location (from secrets.h) = ", 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.show(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 + + +# Moved these six definitions outside handle_dt() +# to correct pylint error 'too many variables' +dt_ridxs = {"yy": 0, "mo": 1, "dd": 2, "hh": 3, "mm": 4, "ss": 5} + +# print("dict dt_ridxs =", dt_ridxs.keys()) + + +""" Function called by get_dt() + Created to repair pylint error R0912: Too many branches (13/12)""" + + +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]) + # print("dt_ridxs["mo"] = ", dt_ridxs["mo"]) + # modified mo because plynt error R0914 'Too many local variables' + # mo = dt_ridxs["mo"] + 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 + "{} {}".format(sDT, sDT2) + print(sDT3) + + pge3_lbl3.text = sDT2 + if my_debug: + print("pge3_lbl.text = {}".format(pge3_lbl.text)) + print("pge3_lbl2.text = {}".format(pge3_lbl2.text)) + print("pge3_lbl3.text = {}".format(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 + + +""" Created this function to correct pylint errors: + 'Too many branches' R0912 and + 'Too many statements' R0915""" + + +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 + "five_min = {}, s_cnt = {}, c_cnt = {}".format(five_min, s_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 = "{:02d}:{:02d}".format(mm2, ss2) + 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("Loop nr: {:03d}".format(cnt)) + 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/examples/secrets.py b/examples/secrets.py new file mode 100644 index 0000000..e05bd25 --- /dev/null +++ b/examples/secrets.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2022 PaulskPt +# +# SPDX-License-Identifier: MIT +# +# This file is where you keep secret settings, passwords, and tokens! +# If you put them in the code you risk committing that info or sharing it + +secrets = { + "ssid": "here your WiFi SSID", + "password": "here your WiFi password", + "aio_username": "here your aio username", + "aio_key": "here your aio key", + "timezone": "Europe/Lisbon", # http://worldtimeapi.org/timezones +}