From 4104896e5497d3617f681a5f73af4cff1a052468 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20R=C3=B6mer?= Date: Sun, 6 Jul 2025 22:00:21 +0200 Subject: [PATCH 1/3] Initial attempt to use libtft --- Makefile | 22 +- avrrfm.c | 39 +- bitmaps.c | 19 - bitmaps.h | 34 -- colorspace.c | 89 ----- colorspace.h | 36 -- dejavu.h | 1 - display.c | 53 --- display.h | 76 ---- font.c | 32 -- font.h | 25 ++ hack.h | 28 ++ libtft.a | Bin 0 -> 162126 bytes libtft.h | 219 ++++++++++++ tft.c | 262 +------------- tft.h | 163 --------- unifont.c | 982 --------------------------------------------------- unifont.h | 1 - 18 files changed, 331 insertions(+), 1750 deletions(-) delete mode 100644 bitmaps.c delete mode 100644 bitmaps.h delete mode 100644 colorspace.c delete mode 100644 colorspace.h delete mode 100644 display.c delete mode 100644 display.h delete mode 100644 font.c create mode 100644 hack.h create mode 100644 libtft.a create mode 100644 libtft.h delete mode 100644 tft.h delete mode 100644 unifont.c diff --git a/Makefile b/Makefile index 7098cfb..2427271 100644 --- a/Makefile +++ b/Makefile @@ -12,18 +12,18 @@ PROGRAMMER_ARGS = -B 125kHz # Supported RFM radio module variants: 69 and 95 RFM = 95 # LoRa available only with RFM95 -LORA = 1 +LORA = 0 # Display dimensions DISPLAY_WIDTH = 320 DISPLAY_HEIGHT = 240 -# 1 = BGR, 0 = RGB -BGR = 0 +# true = BGR, false = RGB +BGR = true # Invert color -INVERT = 1 +INVERT = true # Flip image -HFLIP = 1 -VFLIP = 0 +HFLIP = true +VFLIP = false ifndef RFM override RFM = 0 @@ -34,8 +34,7 @@ override LORA = 1 endif MAIN = avrrfm.c -SRC = bitmaps.c colorspace.c dejavu.c display.c font.c i2c.c mcp9808.c \ - spi.c tft.c unifont.c usart.c rfm.c sdc.c +SRC = dejavu.c i2c.c mcp9808.c spi.c usart.c rfm.c tft.c sdc.c CC = avr-gcc OBJCOPY = avr-objcopy @@ -58,14 +57,13 @@ CFLAGS += -std=gnu99 TARGET = $(strip $(basename $(MAIN))) SRC += $(TARGET).c -SRC += librfm$(RFM).a libsdc.a +SRC += librfm$(RFM).a libtft.a libsdc.a OBJ = $(SRC:.c=.o) OBJ = $(SRC:.S=.o) -$(TARGET).elf: bitmaps.h colorspace.h dejavu.h display.h font.h i2c.h \ - mcp9808.h pins.h spi.h tft.h types.h unifont.h usart.h utils.h \ - librfm$(RFM).h libsdc.h Makefile +$(TARGET).elf: dejavu.h i2c.h mcp9808.h pins.h spi.h types.h unifont.h usart.h \ + utils.h librfm$(RFM).h libtft.h libsdc.h Makefile all: $(TARGET).hex diff --git a/avrrfm.c b/avrrfm.c index 8e409aa..03419c6 100644 --- a/avrrfm.c +++ b/avrrfm.c @@ -28,10 +28,9 @@ #include "spi.h" #include "utils.h" #include "librfm95.h" +#include "libtft.h" #include "libsdc.h" #include "mcp9808.h" -#include "tft.h" -#include "display.h" #include "dejavu.h" #include "unifont.h" @@ -73,6 +72,30 @@ #define RECEIVER 1 #endif +#ifndef DISPLAY_WIDTH + #define DISPLAY_WIDTH 320 +#endif + +#ifndef DISPLAY_HEIGHT + #define DISPLAY_HEIGHT 240 +#endif + +#ifndef BGR + #define BGR false +#endif + +#ifndef INVERT + #define INVERT false +#endif + +#ifndef HFLIP + #define HFLIP false +#endif + +#ifndef VFLIP + #define VFLIP false +#endif + static volatile uint16_t watchdogInts = 0; /* Temp. label coordinates */ @@ -227,17 +250,17 @@ static void displayTemp(uint8_t rssi, bool crc, Temperature *temp) { snprintf(buf, sizeof (buf), "RSSI: %4d dBm, CRC: %d, PA: %s dBm", -rssi, crc, crc ? paf : "---"); const __flash Font *unifont = &unifontFont; - writeString(0, 0, unifont, buf, BLACK, WHITE); + tftWriteString(0, 0, unifont, buf, BLACK, WHITE); // display temperature (floating, red if CRC failed) snprintf(buf, sizeof (buf), "%c%d.%d°", tempx10 < 0 ? '-' : ' ', abs(tdiv.quot), abs(tdiv.rem)); const __flash Font *dejaVu = &dejaVuFont; - if (width > 0) fillArea(xo, yo, width, dejaVu->height, WHITE); + if (width > 0) tftFillArea(xo, yo, width, dejaVu->height, WHITE); if (yl == 0) yl = unifont->height; // FIXME required space should be calculated before writing the text // i.e. 9.9° -> 10.0° can go wrong - width = writeString(xl, yl, dejaVu, buf, WHITE, crc ? BLACK : RED); + width = tftWriteString(xl, yl, dejaVu, buf, WHITE, crc ? BLACK : RED); xo = xl; yo = yl; xl += LABEL_OFFSET; @@ -360,9 +383,9 @@ int main(void) { } if (RECEIVER) { - initDisplay(); - setFrame(WHITE); - fillArea(0, 0, DISPLAY_WIDTH, 16, BLACK); + tftInit(DISPLAY_WIDTH, DISPLAY_HEIGHT, HFLIP, VFLIP, BGR, INVERT); + tftSetFrame(WHITE); + tftFillArea(0, 0, DISPLAY_WIDTH, 16, BLACK); // initial rx mode if (radio) { if (LORA) { diff --git a/bitmaps.c b/bitmaps.c deleted file mode 100644 index 1d209f6..0000000 --- a/bitmaps.c +++ /dev/null @@ -1,19 +0,0 @@ -/* - * File: bitmaps.c - * Author: torsten.roemer@luniks.net - * - * Created on 6. November 2023, 18:45 - */ - -#include "bitmaps.h" - -const __flash uint8_t SOME_DATA[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -const __flash Bitmap bitmaps[] = { - {16, 16, SPACE_MONO1, SOME_DATA} -}; diff --git a/bitmaps.h b/bitmaps.h deleted file mode 100644 index 326521e..0000000 --- a/bitmaps.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * File: bitmaps.h - * Author: torsten.roemer@luniks.net - * - * Created on 16. April 2023, 18:19 - */ - -#ifndef BITMAPS_H -#define BITMAPS_H - -#include "types.h" -#include "colorspace.h" - -/** - * A bitmap with its width and height, and data. - */ -typedef struct { - /** Width of the bitmap. */ - const width_t width; - /** Height of the bitmap. */ - const height_t height; - /** Color space of the bitmap. */ - const space_t space; - /** The actual bitmap. */ - const __flash uint8_t *bitmap; -} Bitmap; - -/** - * Available bitmaps. - */ -extern const __flash Bitmap bitmaps[]; - -#endif /* BITMAPS_H */ - diff --git a/colorspace.c b/colorspace.c deleted file mode 100644 index 2f53d53..0000000 --- a/colorspace.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * File: colorspace.c - * Author: torsten.roemer@luniks.net - * - * Created on 3. Juli 2024, 19:03 - */ - -#include "colorspace.h" - -/** - * Converts the given 8 pixel in 1-Bit monochrome to 16-Bit RGB (5/6/5) color - * stored in the given array of 16 bytes, with the given background and - * foreground color. - * - * @param mono 8 pixel in 1-Bit monochrome - * @param rgb 8 pixel in 16-Bit RGB (5/6/5) color - * @param bg background color - * @param fg foreground color - */ -static void mono1ToRGB16(uint8_t mono, uint8_t *rgb, - uint16_t bg, uint16_t fg) { - for (uint8_t i = 0; i < 16; i++) { - uint8_t _bg = i % 2 == 0 ? bg >> 8 : bg; - uint8_t _fg = i % 2 == 0 ? fg >> 8 : fg; - rgb[i] = (mono & (1 << ((15 - i) >> 1))) ? _fg : _bg; - } -} - -/* - * Converts the given two pixel in 4-Bit greyscale to 16-Bit RGB (5/6/5) color - * stored in the given array of four bytes. - * - * @param grey two pixel in 4-Bit greyscale - * @param rgb two pixel in 16-Bit RGB (5/6/5) color - */ -static void grey4ToRGB16(uint8_t grey, uint8_t *rgb) { - uint8_t grey4 = ((grey >> 4) & 1); - uint8_t grey0 = ((grey >> 0) & 1); - - rgb[0] = (grey & 0xf0); - rgb[0] |= (grey4 << 3); - rgb[0] |= (grey >> 5); - - rgb[1] = ((grey & 0xf0) << 3); - rgb[1] |= ((grey & 0xf0) >> 3); - rgb[1] |= (grey4 << 6) | (grey4 << 5) | (grey4 << 0); - - rgb[2] = (grey << 4); - rgb[2] |= (grey0 << 3); - rgb[2] |= ((grey & 0x0f) >> 1); - - rgb[3] = (grey << 7); - rgb[3] |= ((grey & 0x0f) << 1); - rgb[3] |= (grey0 << 6) | (grey0 << 5) | (grey0 << 0); -} - -void writeSpace(const __flash uint8_t *bitmap, - width_t width, height_t height, - space_t space, uint16_t bg, uint16_t fg) { - switch (space) { - case SPACE_MONO1: { - bytes_t bytes = width * height / 8; - for (uint16_t i = 0; i < bytes; i++) { - uint8_t rgb[16]; - mono1ToRGB16(bitmap[i], rgb, bg, fg); - for (uint8_t j = 0; j < 16; j++) { - transmit(rgb[j]); - } - } - }; break; - case SPACE_GREY4: { - bytes_t bytes = width * height / 2; - for (uint16_t i = 0; i < bytes; i++) { - uint8_t rgb[4]; - grey4ToRGB16(bitmap[i], rgb); - for (uint8_t j = 0; j < 4; j++) { - transmit(rgb[j]); - } - } - }; break; - default: { - // SPACE_RGB16 - bytes_t bytes = width * height * 2; - for (uint16_t i = 0; i < bytes; i++) { - transmit(bitmap[i]); - } - } - } -} \ No newline at end of file diff --git a/colorspace.h b/colorspace.h deleted file mode 100644 index a590bdf..0000000 --- a/colorspace.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * File: colorspace.h - * Author: torsten.roemer@luniks.net - * - * Created on 3. Juli 2024, 19:02 - */ - -#ifndef COLORSPACE_H -#define COLORSPACE_H - -// TODO use enum? typedef? -#define SPACE_MONO1 1 -#define SPACE_GREY4 4 -#define SPACE_RGB16 16 - -#include -#include "types.h" -#include "spi.h" - -/** - * Helper to write image data to the display, converting from the given - * color space to that of the display. - * - * @param bitmap pointer to bitmap data in program memory - * @param width width of the bitmap in pixels - * @param height height of the bitmap in pixels - * @param space color space of the bitmap - * @param bg background color (used only with SPACE_MONO1) - * @param fg foreground color (used only with SPACE_MONO1) - */ -void writeSpace(const __flash uint8_t *bitmap, - width_t width, height_t height, - space_t space, uint16_t bg, uint16_t fg); - -#endif /* COLORSPACE_H */ - diff --git a/dejavu.h b/dejavu.h index 68d9272..a4b45c4 100644 --- a/dejavu.h +++ b/dejavu.h @@ -10,7 +10,6 @@ #define DEJAVU_H #include "font.h" -#include "colorspace.h" /** * DejaVu font. diff --git a/display.c b/display.c deleted file mode 100644 index a33ed0f..0000000 --- a/display.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * File: display.c - * Author: torsten.roemer@luniks.net - * - * Created on 18. April 2023, 21:56 - */ - -#include "display.h" - -void setFrame(uint16_t color) { - fillArea(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, color); -} - -width_t writeBitmap(x_t x, y_t y, uint16_t index, - uint16_t bg, uint16_t fg) { - const __flash Bitmap *bitmap = &bitmaps[index]; - setArea(x, y, bitmap->width, bitmap->height, false, false); - writeData(bitmap->bitmap, bitmap->width, bitmap->height, - bitmap->space, bg, fg); - - return bitmap->width; -} - -width_t writeGlyph(x_t x, y_t y, const __flash Font *font, code_t code, - uint16_t bg, uint16_t fg) { - const __flash Glyph *glyph = getGlyphAddress(font, code); - setArea(x, y, glyph->width, font->height, false, false); - writeData(glyph->bitmap, glyph->width, font->height, - font->space, bg, fg); - - return glyph->width; -} - -width_t writeString(x_t x, y_t y, const __flash Font *font, const char *string, - uint16_t bg, uint16_t fg) { - width_t xorig = x; - uint8_t offset = 0; - for (; *string != '\0'; string++) { - uint8_t c = (uint8_t) *string; - if (c == 194) { - // multibyte - } else if (c == 195) { - // multibyte, add 64 to get code point - offset = 64; - } else { - code_t code = c + offset; - x += writeGlyph(x, y, font, code, bg, fg); - offset = 0; - } - } - - return x - xorig; -} diff --git a/display.h b/display.h deleted file mode 100644 index 2f1bb29..0000000 --- a/display.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * File: display.h - * Author: torsten.roemer@luniks.net - * - * Created on 18. April 2023, 21:56 - */ - -#ifndef DISPLAY_H -#define DISPLAY_H - -#include -#include -#include -#include -#include -#include "types.h" -#include "bitmaps.h" -#include "font.h" -#include "bitmaps.h" -#include "spi.h" -#include "tft.h" -#include "usart.h" -#include "utils.h" - -/** - * Sets the whole display to the given 16-Bit (5/6/5) RGB color. - * - * @param color - */ -void setFrame(uint16_t color); - -/** - * Writes the bitmap with the given index to the given row and column - * and returns the width of the bitmap. - * - * @param x - * @param y - * @param index - * @param bg background color (used only with SPACE_MONO1) - * @param fg foreground color (used only with SPACE_MONO1) - * @return bitmap width - */ -width_t writeBitmap(x_t x, y_t y, uint16_t index, - uint16_t bg, uint16_t fg); - -/** - * Writes the glyph with the given pseudo UTF-8 code point with the given - * font to the given row and column and returns the width of the glyph. - * - * @param x - * @param y - * @param font - * @param code - * @param bg background color (used only with SPACE_MONO1) - * @param fg foreground color (used only with SPACE_MONO1) - * @return glyph width - */ -width_t writeGlyph(x_t x, y_t y, const __flash Font *font, code_t code, - uint16_t bg, uint16_t fg); - -/** - * Writes the given string with the given font to the given row and column - * and returns the width of the string. - * - * @param x - * @param y - * @param font - * @param string - * @param bg background color (used only with SPACE_MONO1) - * @param fg foreground color (used only with SPACE_MONO1) - * @return glyph width - */ -width_t writeString(x_t x, y_t y, const __flash Font *font, const char *string, - uint16_t bg, uint16_t fg); - -#endif /* DISPLAY_H */ diff --git a/font.c b/font.c deleted file mode 100644 index 4739809..0000000 --- a/font.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * File: font.c - * Author: torsten.roemer@luniks.net - * - * Created on 25. April 2023, 21:00 - */ - -#include -#include "font.h" - -const __flash Glyph* getGlyphAddress(const __flash Font *font, code_t code) { - - // https://en.wikipedia.org/wiki/Binary_search_algorithm - code_t l = 0; - code_t r = font->length - 1; - - while (l <= r) { - code_t m = (l + r) / 2; - const __flash Glyph *pglyph = &font->glyphs[m]; - if (pglyph->code < code) { - l = m + 1; - } else if (pglyph->code > code) { - r = m - 1; - } else { - // found code point, return address of glyph - return pglyph; - } - } - - // return question mark if unknown code point - return getGlyphAddress(font, 0x003f); -} diff --git a/font.h b/font.h index c9e7f3e..6a10326 100644 --- a/font.h +++ b/font.h @@ -8,8 +8,33 @@ #ifndef FONT_H #define FONT_H +#include #include "types.h" +/* Colorspaces */ +#define SPACE_MONO1 1 +#define SPACE_GREY4 4 +#define SPACE_RGB16 16 + +/** + * A bitmap with its width and height, and data. + */ +typedef struct { + /** Width of the bitmap. */ + const width_t width; + /** Height of the bitmap. */ + const height_t height; + /** Color space of the bitmap. */ + const space_t space; + /** The actual bitmap. */ + const __flash uint8_t *bitmap; +} Bitmap; + +/** + * Available bitmaps. + */ +extern const __flash Bitmap bitmaps[]; + /** * A glyph with its pseudo UTF-8 code point, width and bitmap. */ diff --git a/hack.h b/hack.h new file mode 100644 index 0000000..80cb449 --- /dev/null +++ b/hack.h @@ -0,0 +1,28 @@ +/* + * File: hack.h + * Author: torsten.roemer@luniks.net + * + * The work in the Hack project is Copyright 2018 Source Foundry Authors and + * licensed under the MIT License. + * The work in the DejaVu project was committed to the public domain. + * Bitstream Vera Sans Mono Copyright 2003 Bitstream Inc. and licensed under + * the Bitstream Vera License with Reserved Font Names "Bitstream" and "Vera". + * + * A subset of glyphs in the Hack font as 8x16 bitmaps in 4-Bit greyscale + * with antialiasing. + * + * Created on 16. November 2023, 17:25 + */ + +#ifndef HACK_H +#define HACK_H + +#include "font.h" + +/** + * Hack font. + */ +extern const __flash Font hackFont; + +#endif /* HACK_H */ + diff --git a/libtft.a b/libtft.a new file mode 100644 index 0000000000000000000000000000000000000000..cf495f8447bf8c6e0432c95ab893dc684bb84b7e GIT binary patch literal 162126 zcmd3v2Y6Lgy8hSBISC;^fEXf8I7B*Wr-UX7L_pA}D2ioNYA70tv;jsbqKJwbK&)6t zv5pnHGoqsoIu>-SGZyTQGWM>c|My+r`p#b2pu@e-z5nNK+`0}8#QzKJcIoabEeO$8#8ahoRAK!o7;$M7R{^6CLKO=GWCe*_4PyN)J>osQ#a3( zBj!w)5hfoqd%~oUhE14fbJ#*_rq7!(VRqK=e)WrHPs`Gnd2^=EoNA`l&9mV{Cr_SJ zH+Qa?Heu2UBWBH!(jdEh=Vdull{2tg1p+W zLe17Q-{R*otC!o)v+XDIys_q)HJ#VA{Dqun?NZK9*0w~M4eN|qhJUm1Z#@1D!M_Cl z8U920{BQZTta?+`imY1p);TRS^i12Tv+XCt&Ol9`K|McdFq_G%S+mXZ-??iqUwg~i z2iHEc_Kmflto<3a>AY@L#YGhxEAFm%q~e8&w<^A<7{6^9%C0XzxqQOt6Pr$Jv1pG~ z zw=`Vda4uTWxYq2!H`Z;bc%_1)c521?imNK_sF+z!n?Y-{d0P1*ThICyC-1Sk{8H5O z%~odf@#Vjh(3U56UR`->2J{JAm%qMp?clWsuN}8`*4m|O z8@EixgROh&?$__0ctOj%zCG{t2V4H>sRubmD=ROkoLo7-vZ|s>h1tr!?NSwdX*PGQ z3O+TP?>g_=^R6sL|00Ba&Nc?;kE}SVVteJkE341{xZ>xE56ZtQ-`?Widu&<1to+m; z4(~DgyOEVcXZNg3EWNOD?fUcAUod-ZpHqJ*?Xl-~Yx`WZqGx5*wo`w&sK*809kTwA z1?&4vtejgpfBn?;`fuim=l8jI1#>nmT?T7ozFXg?dVP=eJz(V$gkP{8dDnNX?6SVg zg0+2CwLIs?dI5+&Fr1t>vO(b_HVO!JpOfAd+s>1`LgoyKd&oa zv+mq+%aXyD+spr5zI@Ho6>nf1pD6wZ#_Z=$X0=~hF#U|hXH04HTl9z7{F%*n`3~O7 z+3|AaPHS83`eN6vt(-IE>6Kj zVg=`P*b~xrU30jG%8IFNpWI@;Tbn*w{^Rm$+k0Ynv$eamOzdf2vPYKLerYJ*u;Q#0 z;g~mF-hO$n^4juaZQn?J&DQtIzd;=}N6QBJ??3gH_|mSdPh5}gs<^gdUPWES!4zg8_Sws8SDx;b=AX=(9ICcwk)9v`!-4@=8eViMkwgJsr zvyZ)i<}IpnG@xYw=@Pc^!fnn%FQ6xr#YdH}j`NUbPy4~XHyyr3SR1O0O_jU9ogM3$ zibE=K18s^5``Oce*4WR|u1s=xz*=+Lgnz+?+fn}}3lZG$IU6b;O%@?!&sV(=JG~DN z2C_D~xv*N=(5=bDsb*}@iIYdSCQ}&H#}8`FxFdoVS{I@XJ2GftTfzWrz4*~~k~unP z?FW}IxD)=_JQIRq+dT}#W?k}bR4K@twl0{yF335_hW8$go$Z4IvVD+3hXxxihu5JG z4hT9#`rv?|bca4TAQ-Si9~=;j@N2+6s15e;8_Yha4SM@Qw(bW8G8t_Rad~&Dzl`)o z=t02|aPFKnUU<&MKK$N?n|-*~hetffd&Y;q`|z$0pL)=OHQa=W#I+^}rUg|&FeRum zHauNyOp@W+A>g=m!8img(d;5v z9z%EV^`SfQ^`SwfKU+DcYj*VOn#O)T0Ogoq-=G7F+Ho=u3%X)0{XaCBU%>HmXOsCS zhU;Wr0O=<4f?b)+3w1L0*54m{isv~y-akQdMmI+6wiy?K^k^}wJ5j}lJzxmxvJL5Dk`%P=qPp`{Ef zY=1jr%MomLw;oqU&)Cor>zG~2b`Sc{u5LE0ZP3v_3c0W{mZO^uYZr86dAiXb+685e zTm&^}7Yy)&_G0pu&D?>iW6_b)?FHskdyqH8hy6XEU0a!+5ccq#+({$2w4xEI#*GN8gR@u; z3|mpfsn}9@kaEm0)a+&_B1;N3@Tiaf8Q5qV#2NM@VstISQP(X+IP{u*7#)0{7cfcD zLi2r_=MYe|$b8@NRfydf{X+?7x5)0C)K>nu8_!HdcBX8%a4y`kkaMuz!a9@Vh_+kS{PDi-ftX&ntl`ssWaOfg(R8%Gv5R4tgS$3exWh#r<>1<{MZ&uPuKbe ziU;}Sk%Rs+#OLa%gdI+vN_;XK#&)v)9*f}r{`xyu&m_dVzsWrp=J3BU_B6uQm8WOd zB5Y?zw5<%+BN~=qJ)-Hs${OJ5*>`?I?>ug?Sz=Go>_i`it6!61>3`>GxOssetXZ&O zBqoC$#1}fy4Rjkq;m($LqSDr#sMze!GE%a$J8iRgA|*vUVbh$;G_&z9*g$``MVxCV zHzT-7ke%cb;DQ?LWN#c~C%pz0Pny!l_3o<@pjC7L;bF0 z9=fy4w_Lw#nfHxm#yNo5^!_eo&RLR(=Ej+;xwjiu#$B1mIIicOYnM|QTYElz-z4U~ z$OW@&?R?_NvR&-5=hJ)dtn3G`+{LnS{Ique0J~OPt0H@TPPeg9|C1qh=30mB%(g8) z95dCfvWx98p@>KH#Yu*y8UH(ah*c+9U+K+HoAY?OqRn}HnDcm>vj}G%C+s-`DT{Ez zaY7YUrrUH=U&P#*ZsQO?!(J|T8;1ll^~$+BV$E27@Qf?iz>BtGESqC@f0co5D_&G* z#&-5YcAUCL_C(EgWeW7!*%UZx3UmMGDXcmHe&bZ80fZQ9DYZ1_Ct0YfRWd;BD-)dk2?rE zcHyY^cdZ%AP@^4l@81p8-i1!s`2ZX+Y1eY^d;n^%+_l`lHUQ`nIdcj&aCNc=jo$72 zgGm>n$S}go~;BMI^!1Pj;(pBIf8ekHD%GcZf|@f{L__S!yp(79U-B2 zxi;Dgq}!sT|2sFhK0;l2wzmwQQ+Si51$)%4mZ)g<9Ll?UrRPw#g4mK6DM33{wq;k-tl2)zV(5)l zJ5)Es@A5$3~t97=c2}4@_Muzgpnv|7O;bG7evdk zCUVfhZ4t6V=d^1Sh)W@5$tJ_mp`~foB`4h_V8?aTy4eQc`d><9XLPCvq(Ms}_Uw0pa>=+Q3GC17Zx0^{l@>#|$WteK2Um!?cn8lYH;J#+2Abqx#29nhs| zk9MOP09grtMsz;X$_My_yAwV^a3Ey})#Rb~3t{ zKxH~gUGC43xmMn&u8|I@(3+wdD2qc>*$lnGvZ}hEt(CBuL?SmSyR^to>68w=b~Jhu z3svK^I3sL^(CXGfx5C|;#X5KBeE9CIgI2KK*G*Jh67=f=FYIqKIu99a=g|Ncx583#8`-|Pr$ZV0`~xzf;Y?MA-`s1PyYRyYWG_c}K1bj#?MQYgYw%$E*vE zg}gb~6u4kngEU*MyEKm1-W(L*O0}f>b>-KY%O!){2aaZtJM@~N*v}wQQnegha_}EE z_$Ch%gYqV>3nrm9gNEhRuM1{C4Ld%zdgw92WvJl?8%FfCqI zL0K^pa?V0Xo6=dz2`0wzYodw1^_;v@%qmlQc|2!#M0h4^bUbTr&*8w}76J#xPcl%) zZlEM_W9KK?*L|N7-&c~j(Q1?gwQ{lYeM+M;MriMj5Cg7veFGQfxWioh!W>EDdekQ3 zhiiXFwbk+BAhry{esQoZh%JEF7JL}Q&RNQmdChKm=N-K+_{}=@v16IXAFc1CAcYLODoEE-_SMc2|c@s2Z@|DCuqqDweD(~P+Q8u zQQ4&VYw-Q-n&ZQ2CS1p9Rr6x`WsS-lqLX0AcI%xxnFP~x5=@gMJDCJ0=p;BnlI&y> zoS?4hl3*r8XWQ+84&Uv8*a_!?8>F%8f+ND#^^SDKj)NK*#72YWY-I<{eHryDgXT_5 zvy&*{mXK`!?=V!2%TENyhDjUGr~f!m;p%%+JnF64`M-}2)jlJ1Tt`T9f6!0|yE&&> ztb@1sdAknidi#9NTR9r_R?d%&;(pB86w|m(F)6|y^k@-S0i1QW0>o(@p=wxzX&Aw3 z(_b&5Hg&Q%!@4TlYP$tnt!vzmIU8e|ZKJDpILBB(wolv&?u_dS{(R0&adjy#dDkW@ zO~KDUx4%5zbwkjU-#A;c_h6mHu3WVdo0pw-(jFI`pS#d3Fs1SQlALo)yyT!@GFJCs zvTxy_yfN#7LvcvMVM0{nSXX1jx$z!o2JRXG2{xdj@s!p1tFzna-ETd)Mc$GEIN( zn(mg(KNBr>rn>H|3I(h}L030~w5x^_I^PpLqu!xKYl@zC{nAR;UEQa`ywft5ZhT8n=FB^4&KI z+0LwKE~}3_(D9VQ)v$=&SX9wm4td!V5?j&^M+jWI#{)egtlKWk}E?bJPI|3bI# zseLLbcG9JLVy;UhI&+5tuoy_BzZAH3)Cc3^^|oMiUo_{;;JElq8wuyNk*;s^a+29z z%*z?->3yla*5$>PBrcEVH9-$F$){FdK_?Bo9KNAFwznVCt5FZN)*fm-@E3Zhwf2yt z&>qs-#`61wMFr!tr3Mp1IU|(yegpmo3h({jE}SQ;-S=^g&W=uY>XZgk;-y{VE4dVO zwaL(OH%_?Gk(1-DKC&4KV)=dH{RNm21qCharOA0g->#>aE)3n>1*E%XW4cIG*N!`n zT4nlm?SZnp@9|6Voo#~dz4zRCg6!9BHd*h1LA^IW`g;B5hc`a`>Z!A%=f?lMC`l5X zAKp9-7bQvZtBaB(@fW3R4<8MGI{J8ynDeLj@f!n7IoX`k9Rt5Q#wK!pWfL9O*mL^o zW#N#~st!9z&(^pS>E?_!&#rIr=B@HhGAnt((yEPmMw|9w{E*S1KJr+X!j|q`Qnl5K zySBZwhesZxVdJOhc^hkzqpM;ZE9h!|CySDMX~`pNv!S-iuD;#WYPYe!;MLvKf~45V zsCCmriKOrcEjuFJFxk5u7915n%$Bp0H88wL6Ntg%}8v#-OWvhGrGS^qRmFP@9FmZ5fL}uw&k{6cK8K|h)s^U zdm8`rc7#2hLG|LrB?!Y7H+k`Uaz2PDjmMdhY7@^t$iu>Tt4zHA5Znd`6O^=7-6`I+ z!q}gF?_)m)dY`kcF0h~SvvdFRuE0iYlwD5?H_5Na$6DAfF}F*mO@Vm=U%9eHHE2Li z5d2Ws0*jsfvpF;$qO*1*Vms%wv}4G|%I3OA(d3qyT$>@*E69r(-XhM;&5PwU%`rhN zu$ZsmEn-WX#u1;72t?<$H97GBd8m=c21*{}hoM+p^Dnlzv}wLI%FjGnlDx5#Y+=?8 zvN&tGHh~n>B6hU3lF&qpf}6 zS6chWrN3hSVd7t5#tX}F+FxVasyqOVZV}QFPCQDUr95_#{EKjyXojQ z1dT^G5B1uu(Ribia*KBeY2GM=4zOcLftM!7&fFL$7^XQtbryfIvvo0&P+!&v(=jMqq=C+^I-{`0jvX- zRs`bEAj|42VG3urvqo)eG$C`Eb`^)@jIpNjVmh>JsWiMW4@;MNRC8vCHN`~Ex)-B% zOq0VjSfYR9vdZ%OU+9w9o@`rgiB9t#s3E-tXVG?1w@WcJy+aQLxdjMdeLA?~1a*;G z&_G&g%5}NGwt@z_BYiBk#2V9Nh@}s@0*i}ONEj#AfdfS5~duE>P`HtFe&5;5o zTsqrx>@$B!(gi3wFS7N?=GtQytz!CcQkQD~t;HWipavXJJKE?7a$7bHEu$Mqj=eR< zh1ncPH^|nX6Uyf1+}xAr9I%I28}5d`MP95qo10svebzmxvN^7P< zb@0hbwun8u#F}x(pyI8@Z?-{sOjU0EajES^Gg)A&PTg;H>4w+!7 z*w!Vkms!Ii^a|&lbu`ZBZf<(#_C|3W!xZ*xS8L1?=1`Y(#kbP=)S4}H&QJ=S!}XsQ zbz!7#irK?KmAYtNDFJ!nP)z3XpB&AvoyhvM$&1}7X0*rYeY-H~xwfWx>S(U4CBIY_ zdIwQlR0io1abI?ckY%AO3eLkTPF(L+_{$x#z!b6Wln^lG*>vVcW< zHygcOmRVHJ)(JoJ;h0xwxBfNTt!TqQ_P;LgrD3Y}S9goew(2@W3E+1?=6qgaw%|z-FdQcd3v7RDaV+|m>JeR1vu8+HALSUHz4$A3 zN8fBI_I^dSQNLOWe)VD-CsU8zCDWDXLQ>5WW#IE9A4znWxUGZ9aSnu`?jFsQ~)fZ_wA=HpQZ{Utv8;3#?C(?od)6ipwt(EN7#i%9P38*5o8SB;bCQJ(R-d6rk#CM8vZ;3o#rZV1ZO=eIJs_N zcG8GlRc>_%DUdpF4*sDkm(MQ#pO+r26^juB@f3 z!2Ch?R^Zudi)Po&#h(6+ol7vynEm$McVMC?CU7q|d-1DQ+;R9B8&=+>U7IIzuEsrH z{M0$S?E^KmFt&mBBNEwAxh;?IhMb{=@inobg}EEzLksgR&E1tW9X&g|oew+b&`yKc zY4q?F-sW%arDr|<6A$sy^J@UuUq$<8(EgdM=UKT!3!ALY8(Nruc9WrnP0z_6T3B#y z)1igU8VZIMHeZ9^I{G#??y`*r+SouFm%;{q{h8hP^+VWSctTh<20t=IqY!rr>$rk- zJe74kjdfhfI-brtu3{a}p#3vx|Ey+13tOyiKD4m#>=r`{Tb@%mw6N8=Er%AiZfG^M zuxL%|p@q9`C>mN=eCcjAEjkV@>^{sZk6(SDyfawdnJn)tmbaSaoz3#jVR`4WJlmc% zEN=tLyR^CS|7wC?oxskiv~wEmtfZaOX=fGfoIyKh(#~0|_iEZXn|97&z0YO68(8l( ztoH`i`_k5azwj%W|HXbOY>TdeS7bMS_4B`1UbdL5@V`!po6mmEMnJ@HF63{q>=#`U z8bb>D2K`gE&wj?wX$}6;&TXIlOg|f}2>ac#n&Pvc`FAj3Dbe!dS=%fl2VWWuXSVDX zH?>(!5jUeFd<2;ODqGy}7d}4MMOeq4bqY*(GZ%Z@336K;Pit_$&aokJvmAT<8j$6$ z0ynpD{D>R=k*Uw;NBFV`)6f0%H-ouJeY%=Epu@E>Ztl0S8sE)43=Y?}xOoDcaA{Z{ z{ux-Q$A5?J>hW99xWsW=+4#z*wTmcT(_&jr6gl~=TJrUjvZm-3o z{#(GEJl-1Nmm|C_!XJPWUj9$P;rz-o-$t0u=*QHCAj`I~2kfW!HiXGTVNbcBxt_xH-@c!%>XTq&4@KMx#_^xR~=9k-xc9Mfy4QdZyp1O^CjOr z9pM)v{Cb4n11F?2@R@Hu28Z(@-+Ue6pCXKF(MIVD!Qp(#H@GeAjeoxB6k*)wXcS)& z;lAK-zT}&Iz~Ow!HzOi^P=v>V!}%iP9nP2hY|ANlG(8UK!>u4PKMKs0Nc>E2IO__` zf(S2h>CtT_z)HRvT$nAOz^sq(WsTDJFn<7-cx}<5^&S0*A+=0@Ebkm|I1-9XRy=0{p(%KRy+hJ`v7=D4k&U=b zggb!`^V0VKAL(&bga<^pCc+1RkM{B(20qT?V0+1)k{f!U!*q@R{JrUix+5 zX&!Hg@HG*>8C>tBzZ*Q$V~)jakFydYhBM2}NFQ#^y|H6xbMts4{y8w$4%wQUe?<75 z2>%O=A5C)wip}Uq z{88YpS|Q}02=4Cj3E*)3EH?AN;rdu?PLA-(2%j6_3&G*}cd@w=9Iju*=7tF05#a|S z{3tkFUy9As;BY-DHZMhZTZI1!4%e4r^Ld1Sh%kSt7_L9XrUiJc*Iy+O?hFpsn_|Ns zJo=mjkN5KPhm@gz7n^;-q5on$!J)qvo5R6#y!^*Scxr_C<4iyOBJg4_|0&>8Jw6M( z%H#9Et3AFHe7?sU!B=>EON8%<@Iw)PBEo+IU+vj@6}-t~t_OE{oRttUoQb@P^x;+# z@rM%gaU}j5aOe*ub}{OnHBiEDPCb7pF-73eA4*Jz2=j51etda^`+_Sx`-8!KJst@T zkM||!5bzK${^$r#ig0~|=YxlN`Imsh`CnpA2ZzVY64L+<=WB_%2pk^&O3YQ@V?28| zg2#Kj2|Uf?KZ1|<_^}8-176_8zYGrNXNh?eyu^$DFv4GePx0b^1h4X#Kce!vFv7b> zH~|jldx_z%T7Bj(VK4OT^VgdjJmxPwuke_^s`Z)kccT}dl@KvpdGQyv;np@Xf7_aI zk@#s~G}&!!4c^k=T`#pY{GzW^qhX)r_w+a`A!0aFU(v{Z`$+li&FV<}dT_X&w>Ou8 z!}HDd=2~z#|Js{dBYZD-M79#`&BNgRJ!XBw^s9tQ>f{A_OuBD@=TrI)^Agu6w!0=(Kw-!H;Lzztsfs0be#;on4f zGWa|%{|xYT9xsUS(g?2t-{hrV6XA=&w|nuw2Z!r*dvg=`E-(I0@I4;?3H*e|e*r)3 z@zw~x65+QZ{1NzhFaMX|S3UkW_$`m~@Eyo|9`n(uKDUikBRUx5w45y%n1KB!pkCj2KWK5ytUvb zJia8tSA(DQ;{OogyTH$T@ehJ|Pglo(3-~>cp9O#DF`w=3^V<>L4*u9n{}q_`fYts_ z;Lkm7f@fiU>2a$Fw~KHonD>y?ULWxH9%sNmdb~IICyz&fb8^D`2S@lwaG@7JA;QOl zi@o@{;PxJ$1n%zfX<*)y*81X|SEjee7eu%g3H8sz{5xyRAHz30S0H`3b&MRpJDTew z@wbD+^WTo<{s=!3;itgevjucCFGl!{2!8+$&o?@n&%k9~{_i8qN9Q}+#|wO;1Qm^0pR^Tt^tSV6VhMd`9#NTN{SfnR33oz;npeAzn#osk$66XwV zlbI6XSrJ|c9^$264i3-9JDD@VQ@r?f5#9iv=EYwFuJ`!n2;Uvy%@KY)!q0&hdiMSS zUgGgP5&l<%zmD+F5zfccmCp3+wFZahKb=hb2=5u;GH`f4-pN#hH+uH=iST|A9v$JM zz~T8)Co?g^Cq#H2_y(`MlfgH8yfVV)f^YTWF9e6@Q=QC};77dp8zOv1gdYGu=B0l$ z!cRw->&bR6eO5xmOv1c`^x>9>%=d)Zwv+ho*$k3C^#6qUC(;k};y(w6{+%#CL^$5c zzh9j&Ex_URM8cGSM|k!+gGYMYGr~#mcrSh+c(TX)f){vP8{xyjCwcM5MR;n2XGeHZ zgiisl^6Z@jKF8zpB7A9tH%9oD2;T#~*t7Q#_zI7oi16Pc{3R6`9{KA1@7rF{gJ<6kS(FY?qj%;zY*!ftu*3~rDjtk z{*T~6*$k!Tu?RmC;g=))W`sWkhyGe>z5s{*SZaO*hyI7Zrz-Nl|0y+v5#Bw*eA4_5x4y;)g}}K=AQi{MZPOi}17vp9l_*pQVPcvzYDKTM^;a5nd0T z=cT_a!qe{X~zj__Y2{5&{ZpGwVZ;ANh@_rRxm{0TT*e@e}_;48d% zKL0R0ewCU6@ak*B}B|S(`0zebn~OZ;gLh)dqm=UMz~jm`$V`b!W9v& zif}5znFv=~e+%co{Jtzap2_cfLYD9I!}%iL*B4~1%J*y8(|z~-RmjorljQrNyR!M^ z`<{(imiygdFUkEr|9XMrGd7!E&Ud$GS?_`({sW8_2WYDCePlRuM{thXuO`D5BB}{5^%WnF*kxw$OcrIO^xDH=HW(MY90ss{<{@ioXuZmUI91v zn2)zVz~hg=!#(~I9Ii)Y=HK82UVI*m-|cZr@UCg0ZQyWz zmzjTp5A@Q14j$$458x9#j^laxQ$210KF8w{@R=TW2H)*5-yeC4$4PKFUlL|OgolE! z$aYY|i~_&y_$}}_k3Ry3{+KXd zfX~t98C-vXukbil()j$nS%h~3f9<930G{ua*A;xC$K~L&J?;xW%j3b|OFbS5zQp50 z!2HdbY-Q$X@Qof%0^j3tJ(#~q)AaMfPk6ip%-^JG{ORBq711AjV}s8ZfVX+^mxKN5 zm1`r+C*J$lBX@)O8#md?%x0$d_;JQ-G|GQAlK&N^_u}6KZ}a${;4eM?EW+P`zxLt- zJeS+&reHsRYjAjcPMCJ!aO-3e;O*IfPNoO=pI&<^!S8z958OPi8OqFHaK6X;fh#>e z7|h?`$yR2L03Yh{IPgIpPX*8Scoz6XkADlEqULZvZ)t>22RC@}=YlWv@?QWx-{Z@{ z*Li#`c%#R+fba469`IcrKLp<5@e|<3JpLQ_WshG4^EY;~m6>O_^x2Q7Qk&~rW{qH^J9={Lct~1`f|3JDKmmE4=b@@G=Jerckyr z(+qrrBF1Mou%EvJ*e`ESuwS1(;77dt=?L!y_Qz}A2pELrbJ`v2{G|E?;qa;`~C4x@S$G%&%g(H{2jQv7Kd*dg7%HC zKbnI5@1t6S{qL{Zf&J@~F5vJgxXSbbpXimB1W)&P0GPiKlda4Q1vhv+3VgfAhk$SP z_$csm9!~&2>G5>%P&JSCoe2KWi(dr(z~klMuRJ~j{DsGBz+%n|CuWV)JHt^Ak_&)kxu%G`SaB;pSC^L_PTY3B}c(Fz!|0_)ImH#IACole= zk@(NR{7so`W#&6@ACH3$jlchI3SOznQC{l^w*&j-bpa3X?DYco^Ee3}=J5b{_J3b+JviLjnp?p=vjJ_*-Qe52{11Zv;PGF;rC$1Hz~NSGUIgEj4JbCRf&b>^ ze;3T($jMe_{ssQpOfJ=m`g-|BpYm%k~vd6uh8Yp_2b+kty$p;4cyh^v%&j&ydFHl<4eKy9$y2V=J6lEXLx)k_%x6I z2;S)Nqu{GNehU0&k6!>k=<#ddo?d(2iSS3@3NQY1@ataw@4>HnoYTo4?*h{l?B{O< z4$lt?%%qPaK06o{Udw`xW>zWB=~F3{&+Bd z11MXWnFiiR5r0`S3+(4#03PARpB&*+!Qp%_FlT}J8$#L2%sQ~V;*lX`<`VEoiNt4t zxhj(XdT{8^1?JWW-wh7^x4`@f%-K8yNBBeVabEt< zz!jeT@4#gq2c7-%p#qZ+_Vc#{PxS1SM0gMIG%vm@crVX>8F+xl8SrE;{a%s$HQ=sZ z{3vjEeq3NigMEKF0$k;#KMw5A?>g{6FTNh^&&RpoVP5=Vus?s6gTwW>z^nrM<9#l8 zyqEucu-{*og8lXCYH+yan;XGl{qoK2;QhV+x(__UA=9LI< z1Gn|!-v_Vu@_zz8)8lWz#a{ZKBKdO@jqNp$@NQsCIk)AT_TY;=`=#IuJnjv~DY4t~ zO%m+q?;qj85gq{!=TE*l5PY>~|8VeC9v=(F|8C1SlL3DI6Cyk(!i&JYjc)m78Tb~@ z{wnYvJZ=Do^EuyK0QU1=7U63md=ogF@A>8qFn_ZvTba2Ze2>R}2A8>5UKl+A_VYgr z_UFsXV1GWo0S>o3^By>i&olo5|HUisOE7;kEL)lR0sK#obGqPuqQ_0aVflHcRfKm3 zhx0YhbOPg;Baeh?gtlS1DczM!8sm39^tLvd@ueb@KIj<-T)ur@%!Mom;U2O z{;$9}Ui^<>zdo@&vyl)*rT`qKFEXto+_q8r64M#HF>9j4bO%rK>Q@1t>~UZ4Ssw2L zKHcLH;F~=@2z-ObW5LgQd>oj+>6Wd`OaXuG@l5ci9xniQC=Amt0rNN6ntvsDh{xxE z2YP%yc(%uvfhT*s5zOBptG%1S_jr64_)Cxf1pe6L$H3wGRAQb64^eaY`_LD`$9w!b zc$LTRfy1q%`4>36KJRG01Shh;c`Y+Pf;)N~$6{LJadR+#b1Yk#DF#pWxFdMH$6djz zJT3#D;&BGd-vFza@$A^LOzuP*RVOh%@SJRdVsmDr_*Q03BQ7u(HsXA9c_Yp<8yj)l+yoBS*SNX8 zQGAKHuMu}N4>#goW-Is#uYNCshh@3F*#`Fe_k#$33Vy)r?{C5WeB|Wy=TFu&M9e!f zGCXGbnS7+ztrbM82zQ8ZX@n~x+}H7J*uv4s>=TJUAi{?`<}s}ZcLFClW*-;f_lR>F zaVxW|5f_=&j_*`6!b93&;G8RFO%Tpa(6<#{O;XcoTFH?#w45@%kjvNqA)On9<`#jvFVU zR>Yyh_p@T&jM?Mn)J?T|aowC*4ra)sTq|m4O{%CewN-(!GAX;1?9#H!=mTeMl4=R; zE4zNO>o2;1QyJ=w9YP`n=IkZa?+VjI@>8{JEc{1bxpa- zrkuT$vzK!AQqEq=*-JTlX=g9(?4`BsX(JDWwza{V<7Mxxrk&Navzm5R)6QzfS*mvQzo&R)jZt9JIPoxN&juiDwGcJ`{By=rH#+S#ji_Ntw|zRq4> zXRoib*VozWn=$enU)$=w&T3z0wXd_<*IDiBtoCzO`#G!qoYj8LYCl)Ye$HM$XRn{L z*U#DO=j`=&_WC<}{hhu3&R&0KufMa`-`VT$?Dco{`a63AoV@|g-T-HBfU`Hi*&E>O z4RH1bIC}$}y#WIvPbroeiwA@|k<7-s$0)mSS6;Hp6_~7YB_^v}k;y7oX0pl^nyhlA zCaYXClA(XOh9u!(QbbZMC)ILNEoVI|sg|?8rOuU9?@FqBB~xly9W1FHmQ)u@s*fer z$&%`2Np-WN`dLyPEvcTCOlzIh%aUoWv-(+59WAMzmQ+_us;?#0*^=sQNp-hmMtegY zE~y@uRF_Mt&n4CAlInFyb-SecT~Zw{sh*cq*GsDJCDr+o>U~LdzohzKQXMd<9+*@Y zOu`3cOx698>VHXfz@&O$Qe7~qKA2P|OsW?q)eV#Che>tBqsy8Op z9h2&hNp;AidSp^vGO0e9RHsa;S0>dhlj@gAbQ@YqtC zsO`Fxx@4-#c}l9v&F7T*U`l;3r9PNaA55tarql;h>Vqlu!BkQ$s}H8s2UF^UDfPjW z`d~_ZFr_}2QXfpI52n-yQ|f~$^}&?-U`l;3r9PNaA55tarql;h>Vqlu!Ib)7N_{Y; zKA2J;OsNm1)CW`QgDLgFl=@&weK4gym{K21sSl>q2UF^UDfPjW`d~_ZFr_}2QXfpI z52n-yQ|f~$^}&?-U`l;3r9PNaA55tarql;h>Vqlu!Ib)7N_{Y;KA2J;OsNm1)CW`Q zgDLgFl=@&weK4gym{K21sSl>q2UF^UDfPjW`d~_ZFr_}2QXfpI52n-yQ|f~$^}&?- zU`l;3r9PNaA55tarql;h>Vqlu!Ib)7N_{Y;KA2J;Osfy3)d$n+gK71_wEAFLeK4&) zm{uQ5s}H8t2h-|Vs+Z!L<5dT759BKA2V?Osfy3)d$n+gK71_wEAFLeK4&)m{uQ5s}H8t2h-|< zY4yRh`e0gpFs(kARv%2O52n=z)9Qn1^})3IU|M}Jtv;AmA55zcrqu`2>Vs+Z!L<5d zT759BKA2V?Osfy3)d$n+gK71_wEAFLeK4&)m{uQ5s}H8t2h-|Vs+Z!L<5dT759BKA2V?Osfy3 z)d$n+gK71_jQU_keK4awm{A|hs1Ih;2Q%t}8TG-8`d~(VFrz-0Q6J2x4`$Q{GwOpG z^}&q#U`Bl~qdu5XAIzu^X4D5W>Vp~e!HoJ~Mtv}&KA2G-%%~4$)CV)_gBkU~jQU_k zeK4awm{A|hs1Ih;2Q%t}8TG-8`d~(VFrz-0Q6J2x4`$Q{GwOpG^}&q#U`Bl~qdu5X zAIzu^X4D5W>Vp~e!HoJ~Mtv}&KA2G-%%~4$)CV)_gBkU~jQU_keK4awm{A|hs1Ih; z2Q%t}8TG-8`d~(VFrz-0Q6J2x4`$Q{GwOpG^}&q#U`Bl~qdu5XAIzu^X4D5W>Vp~e z!HoJ~Mtv}&KA2G-%%~4$)CV)_gBkU~jQU_keK4awm{A|BRv)ZZAFNg%tX3baRv)ZZ zAFNg%tX3baRv)ZZAFNg%tX3baRv)ZZAFNg%tX3baRv)ZZAFNg%tX3baRv)ZZAFNg% ztX3baRv)ZZAFNg%tX3baRv)ZZAFNg%tX3baRv)ZZAFNg%tX3baRv)ZZAFNg%tX3ba zwmxWEY1?cYW!qt^ZX052YMsPZ-Ws!ptdUd>PwA8P)7ID4)mFw<#5TsdhIJG>-L3D~ z`ELDcavfe~~wGE-LA-tTlArv-*SJ^g%!iMnXgAJizrR|Djqj(p> zMp4w%$c0qRaM{}wyy&titf-Ys8#IyD(L^o84h_>;!JKv`+7MeTLwJkAhEUivTD~1m z8=~de*~$<*%FJbj4biT$!(KB=t}ttA+hG@;Le~hh_Yud53a!JcQ6R<_BCR=3pXps)M z^(SjnCxvw^8q_ECsLv(bkR|T>XF`VCJ;HS~ zt+Uyh*kMI$Y(=oQ#beJJvXv~HC9unA$?jpvb|K<*FLvZM0p=XdVa{=f8rwcWaoRU_ z0Viv`Efvf?)4L|yJ=rx_+A&J*t)MpcxK=Y<_Dts{soj%p?O>OCFyA34^V$j9Vmk-3!}gL5aTS*PhBib;$@Z8Hag~-kiI_q5pvk>05_=YezO~0J;J%S7PL?7BF|RYF2UY*1ok!o_BJOhvFa?r?qSI`1%73R1nJ0_Ijk#Y4tFTW zo-Uzzc2Bmsz}$oF$rIx3p6nWL_hi>}yC=Jb+dURodt$|KTYK2C?XHpAu9#U`4|}@B za@acNbNymn8tKHfYvq0-##ClL(s2lB-__gh!S+xEdv;HD^|pJmtGC^wJe?EvbdC9( z=h$%~yL#I-g7vZWgdI06?H;`^D+c1-INI@Ker*ry%lvjy7r>12^rnoy_mX$DTUUzUv1Wb+C&UpMX7kl!krR4|WfG_Vk_QyZK(yCx%*uFZBuCbO?$#r84T z^|kF&vg=!2WbK~mX`b<}?RsXRCl+%^mBrWZJJ8B?p%pcZ^ZTv?m%&Bu#UDZJUoQGBR!< zSD)2W64}?lj&e>Z zyWw`nEY79fiIiOtkwwasIbJJMyVlJ(>$GEQ?L|0RZS&XK%WaVKyS=c66*+jws$VOM zw5-izYwgmBNh7YGJs7%$HG3#@)6X3Ut)-e8*$vmDh#ccE(>MTQYhB}QgK9=ef7Qrt zxExq8Ic+_WMd~XjgSB$F80C&KvKwx9=&0;zxJ-IkeroM%gHmMBWjEaJn8nTylw$X_ zvLe;WB0tJ@G1?-7u16kw{*FPHeXT4~wX!zVx|v{CBy=5n7yjnfX4fL_P_(Ti4v3ss zqwE;f)W~kQ-64sqoYc)#(H4sg;wiElZgl1v;~0&1Pdi?h_oZn&Oe*qOr)bLMR~)H-K&3zYTK z5jCvGh~fN1QMQD`$GFb3nPEiY+$7|#W|W=oH8rvuZgk)DL~b~oJa zkls#BEZT^}IxKaylN_tDgfR+(%KBqaZAXrhv$Go64Yxa%?ds=dt(SasVxF!x})G$Os-lU?WOypp8=@vJ7} zU0>-mvg;)Cv&D?JLk8xa?B=dpMC3bv9=vQl(0Ss3av6)(&^%hh9dgTwE>1z5H95M0 znTzpm+G}UZ@e}c`wQ?W@yVlAHFeWj33x`zk35*lV!{J@_2)84KaJxsiE8iYg(OTK# z6x8{fTWIB5YqU<*0oY+YPATnuHH5p-m2a-;MRxG9x4nuz%RxG|@6Ida+g@HGN_x3u zpgoxi@})G`9mC}Q3)n5>@~u4B9T()3ku2pV-TEg#MnJeb)XJ$fCbdj)xsM-($gJDx7xOrG$Gs2H0~Zk?nGaF|ex&<~e?8 zV&B_d@AmfX@b10w{u|w?ht{) zH`tFGH)DSN-05is>WjTaj+irHMqTz@-ec?w>TT+2lG@s~FB(_d?yc(j-gFI?*MLv0 zn`gz)$&=^Q&9zN)b)PeR=2ZL`Zt|>glj`dx%o#TkvG%v~arXx}{26u}e}B%c1pngr z+fr_2_!s*oZZ&_)8~avtiuyaz{F{atU;c)zKeY?zZ*yZmNH~ALr*>GR+F@Cmo`373 zb~<|DoxJc;FTAT4&fg@e9sY(~?btfI`q;YtAFWS5>KtDx@A_@-GSI@k&s;akPE)Z|Q&AS3im7&n$H;Y`?iNwPWr2%J!SYPpcv^j5nxRy&)v|J~oj*?x0>AY|Kq z1XIf2ENeY&+g-VbAx_J+ZFlXR#&Gu_s8gVGR8L5^l?Nb*@J^=QFq2_@{GwCA8*c9db^Wyyq~@Dfqy)7XNh4Ukx2w zC29COXH8S+rQv#_WpO>xvJ%j-SS~*0cjB>p(d^rtQGuaVJFm_V`a?jE$bnBgwX zS}*;p3_n-w@R^Z04Wju@=GYq1+o{)z{+xQ9Xf`y*>E_T{ZV|)JlQgB&>qU3PPV2zu zOR62ahB$xe&VF$7(5|?A7QF;o^WIKDTt<|9kmQ(r3KrPP;+ z?nRBf3xGT>P%~LSr-wlgce)wu)7O~hHH33bram6}Sf@|Kp6z1zZ3t(dQ`2QuIo&H} z%(+gpU(a*;BJ8hm`g)|f%W1f(`HRzsVE?|;tnar@{}KCENXN47hVJMzhk(y?XZSJD z8K=)enh{R#jqs^XPlTq=GW{0ll}^(p{g>g)d%4r6LGu~349B0JnLj%{4*O@EW*z?F zH0$s$rw>FMe{%YC=mNwAZjEh84V!#tb_eQHU>sY*h2MZZ|4t*|fMZL$@E@?}d()Yh ze=EfC<8x-X@maA9KLs`qr*`KRN4xMN5Wd*yE0KPg(`%vG2Il=4n$wP&bL1+gi&55f zP9KW>%}#R;ZgP4G()@|~a(rNW7`wz3qF-eAm7@PnO~cqep#Ht+?bKI`{)`%R7>qPO zQePwC_(L8OY!sbKjWnDKt*Eb+@M3CK78{=r8(c5C2Q@nuTVLuMMGvIDN%UZ9*krx- zr~ZS4^IhTr8;xy@OS31+J&xKvM0X|v-7ZV%o2Bs z=3HSNwgA^s-zDMaQ@aQF@;R-+Jrd4murfWv9;Uum!XJZ9+$WmPK@IK~{W|pnqWO;R z;E$p|rRD%)XY)X#`Mn|iD0HPp|FzL@$s(U(#GP4ueo6Gx z)Gv#Ej`|hR|DdL$VB>qegMWzrfcjO@+o`!wW8=HMgV#kj#o;G-Lv)IIo9JVx-xST~ zY6k3NY<19yw?)rm_&cKc{_Nmg(R|Kj@SfG5MizNI&YWFbjL#Vk(V>_C}5w?L;r6ZZCSd z7k-)-ehzg9Nwb!^qv%Vh_Yi$Kbtlo+QFj)76LmuLoz(8(;`dUQO8B3s-9yM!>S5Pp7UDJ%>6edI5Dx^it}y=oQo%(W|MeMX#ae0TbJL=tMu!S2Mi7=0_WbIQ8T}6$4;E?S_eYk`VrXDML z7&T8Ov5kaI94UG%!;cbuH1*M<$5H=A^c?DAMDu;PiDO0cxqZQLqA#ExCwc?*c+uBW zPZ0eF>WQN7r=BF5&+7{&i{3(AC;Cb1DWYGXb~gEZzF?|^^ZmBLG|_ywZ7^LlpJ^8y zFZx^R6GR8ipzB5FQqK_Gih8E#V(7#y(R(o5^=(h9C7jQA3*3YIlhku0yc#+&SMiME;sTYVI&Gf$&J&EB9MNefoPdu?LV)$awCsY4U^eNOQiEf}iS@e49C8GH( zu*6c)*D!pU=JYQ z=io*_aK6~ggHBu^n(t)|E)=~7^+lq4Q(r8)g8CBCX==2Qb>KT$gAEeSXB!2Visrjn znTB;6O?{b!A4Yw-Xg=$QY1j{wsIQRlsnl1Bo=<(1=tb1O7tQDB1XqjZGj@V&L|;U` zQS_zM*NVQ8`a03KP+u>46E*6<$DaI=`UVMqi26p+k5S(w`U&X7A4LCy;WvxsyHtZ) zM889QtLSg3Zxh|35c+n}MbvkQE`d&L65W;IcZ%*seV6ERrny`6UJSoS^kC|HMGvFC zPxOJ*_lrJ``T@~XssAW?KJ}kOFQ$G_^h)Z@q8q3m5`7)@!=j(1{(HMCPWQ%jZcFM%CCzToiN{2Da%p&2=}G+;3Fo^(gDs+y)Q^iE<J&5`V2|pA% z@mJBuGWgPmX>(bC4Z=?R3gx^X1yy*K}8v5xY)GtUlp8*uSD4Or|3|d!>q4W0O0^rH;_LiFR*Uy6R3`YX{dQGYFZJM}lBKcoIu z^jFY{??lJ&PQ~DR(M_m-5Z#>mN6~Gl|1G*V^-rQJsecxohEDLt3AUjO4@3{A&Jn#o zbxiaaYTjJIHjO%0^bG1e(I-MDnuuP?@O;rLsChF6+bZe;(QBxiiRQa61NSl*zSlBn zA>o^-3q|w&l|f6JcJBj8y9D~lH`ToWrA^J<|E~3AMPLzty!#mf4 zJw@~VjX_t@EvdVSZcE)=bU8I|l3`0x_Y~b1I?+os-@6y|7Cn;My`<+r>M{u*OIh>73xAN$B4cgI&qk2zGp5tT=e7A zV@30QbHNd!U!p!z^mgi_M1MwowCJy(6TF#bPLVc|0=G4cDZbLmzbZ_eM zqARHM?qK~6qA)4=Y3r-cy_qqkA zi9VTnrRbH^r;Bc&Mt}ChI()Iy0ouFK>6_3-zJD!PCFvi5PMjh7ZwxW9Na~A3PoTb7bRG32qGwWX5Iu+bQqjMozDzXVi56TgdKL8*qE}O2DSAEi zRiZDV{=Mj{sIL~ik@_0Zd=FZ%QS=?u*NT3C`a02@sjnCPIQ0#ppQ64|^mEiViQZ2A z2hnZXLfs&%`XcH-iN1{bLD5%1CpL?|jo}Z8zKi-{(f2XU zpG9wB_#>j9q<&QNv(%4?{yX(wM1MrRMf8`{kBjDe#DXV8H=+Kk=wj+8MR%fpO7w7Q z_!@5Cn^B&|a)R%+Bu%ZSPxkaZo-Ty1YWl&R=5JksXT*;EPTc8x7`|1)`5s=??@~W2 z;rTeks_x_IgFIdD>2p2JuQP+^#16lL3jQXV*GQ`4SW{FNd%CNqtEk;~VM9F4YgGMS zY@(+ZP(Lqa@%E5v-tth*+XSk4xvrX*tg3mbrr#Oy5-4~bc$$Xgj-y^&#;cYx^zoU6g!Ur<^b`@RHRKdrWEwJtRl zsoKrDx3<=W8dH=~yua6L-gEAqGv{7ZKA%6nkKZKceV*_4yw99D+njS|=Fa&*_N32J%xvp&HMFaa&NIu zC;we|rNx(%3&nl|d62NKqs|fDPWu?)r^u6pUnc)U_@5ScWWDPuvG*dMC_I3Cl5h?= zCOn?JM7WsziSS~Jw~_xT_WQ}E-_BEH(^uyO%l>=I{+?yuW7*@Dy%*~$O*+|RlYRmD zLRoJG**qW4C!1%aW#muAr_o|v*J|v)v+Q46+?Vx-#wVX_o*7QF_&Kt9e)zY={aLT| znXI?a;u?!DvG@UtU$gjgvbneNz8Lyk(nQq`?v=uL-AO##QRemH}$9`w43MBGTN_^ zbY{|itz6f$Xg78KCuzI*oTBZ*3urfO7K>@WN|s$p`xN0i+F3Dzuo{#1%(f2fJ+p13 zJwtpp(;gN+n|9N`=zQ8u|Dua&H~qdEX}=XWZ3LVqsNa*k;ZX(kd%}as{}LWe{!+Mr z+#<~F4SglNfZQs~{CmfA4Y^qCI?v|Vv0tTkyv`?^V{|Fm9G9(Rb1beUoBe+i+3fQ> zG)wyTlg+-}PB#1VN%D5_`32eRw-?A}U%g5;`)2_8vn2#_#4Rh-BsluH7 z%*i~??2kpR!Mw=uO3X_Q^B8iOP$mSz96p;dF@z#MNAbi#7=yzZV&_c+e&aXvtVXqx z%*-NOOnzPXe)8{ye@%W{_ypch*|8cy_azuF%<6n+e+V~V0~k%7lLih3f33o%7|Xw?1E`OSNV8!<)k ze#meerYPQL81BIo?X6KgMCM6~@C2qPJJljQjVan!qxu!OpYY3M9z=xSVv1&y(58&rwX4= zjtQSdULbq{xmx&g@$7p{fjKFus=w`8(lFt(6`(t#A@X6$}g%^|05nf3?PnhqO z(es5H$QKB+TSJru6#{Q3(TjxHR3E)q_zvgZ*{Y-Wx&3jdOPxiB9o zqCXa9Givk-VK!k#w+i!JHF~A+2jr`S*}NCMTA0mm(QAa+R2JPP{4M!f;WiQQb;5kl zjb1O@o%|Ew!^k%X4$OmPH>BzJdIpFstgK4+-B#epr~* zUePAupOd!>vzjToLzvY=(MN3`FCQ!iTsA}t>lg3!*A0^|0wpS$Y+Rs7x^8r zvu|+pUEvSN?+O2%{J!uPIA@32slKi#sb>we^Zzk^*zMK3XVfIyy?i2nw`M<)?llKenB!4T+zRJlpb3}My}!$q`}pPmc0|2;p#YTj3+g?SzMr+Y7UQaJjB>4#8XUY8WBEl==sPIm5w(wiz{=#pQ2MB*a=0hUF zC**;`E##ww_mKw)hueb(3wI#%M^^~l$b7&==tE{_A%ubCV}*|)4;3Ck&Ji9*9wvMO zdAM*1nGdQ6Cz3}Bv(7C#N;pOyExeS>AATX6Mjk7?o_wYp>&wU!#eNNWlJJe>$-;M# zj~Bj&yjhn01-U@%&y(5N0O1vKk?`-x#lmlsrwD&Qo+|tanGe?pE#&FK`^bFIMu>C( z&k)WemkakMR|xkfpD26`xl(upxk`8fd6sZKdA9I0GG7W2s>pMNPa&Tq%zn|)dBQ8m z^M%<*I(oA3Ch{r5{6>BBN5YqpPZhqB%pb}j+(2F+d%gVfLMlE)`}yXLOnH-^j~_zaaC)1z``lPWW5$O5wI0!K;MX zcRE@xd?i^5`1jq2#r~W60}-Cz96-7m!aEX5Z=P2H{HbMq&1yj`Bqc zVF`JY@GA0|!kfsOg)bzZC43cmi||j$4Z`d@9X&^Q2l-s#pOeoM=C{wI=L@sHbo2t@ zH^~OPKwcqjw93Gr{)=cO~B| z%sT4meZohO?-w3Ken6Ptj*UJjJdXU3F#9=29~Q14Hwn)tZx?1gc65jEYVsq(o5_y~ zUrc^XnBQHEJ}!Ja`3Yh6d5%6Q%zE$W{|LWG{+aM^$b4Z%c%S@Bv428-M!1Fitnh!x z&k3`_G5Rav4&>*B4AZdKzY6aq z|4lef{#dwu7x3SOv&jDtX5Z=PC&EXN|0z6({HgFT@@K-wkv|t^-|6TV!X@P0!ZXSL z5}rf;QaDC#5oSN?=vTrk$*scc$p04JOx`1W9{FqGOUd5|UrF98d;|GE!nc$63ExNl zuka4?e&L^!zZL!^xk1i{H_2h)Ka<-Ee?)F4{27^z?FcPoRzx9uL+&X2ExD6$yRP6& z;Vg1z;ojsf!tBc(?JCT^+|exI5oA_wA&et;6P`@&F3j(+MtcaCkPj6;k=#>w9+?$m z2>cFfw72jQ@?pYtmciPsrKAw~_k`-$x!G z%zoX`BZb+QJ33JKS7cVyA-qZ+B>V<>u<)PAM+<*Q9wN-X+|gr%|3zje2n6=!jt&)$ zlXHaIW`S7|h|rllT(}2$gzypMk-|rjM+pxlj}~UX?&ug{_T`R_6)q&RauK1Fe4OwM z^4Y?R$diTZ$j1w>A?FHjB%dIBJ~>aA{kNm}!Z(u(gzq623OAA2_<-;PxmfsV@)TkA z<&I7jevMor{06yH_&xG8;eU{)3$rhGv`qMG@(f{h2$&sD5ZHe^S|NNGnH8%DN0Cny z9!9Pd9z(7YKAt>FcnW#8a0Pje@Lcj-;UAGt5?(@{C%lF{Uzq*3qbCbrMm|OOYVwbS ze?mT0_%?D(_#W~C;YZ2U!cUVI3jdnCNca`a{c~a7 z_BFl`hHI~oyBdbF-)<2p5LarL@tHH-t+4O>%FS3Qi@Vcy4Dla@u* zYir=0G?=e-CJh)XPY?8G`FO+URjsRD<6GE^@W%N|v5X$_FNK|>|M|^{fdKtxZz#Zk zRYnE$n`In7JwRZJ2t7n#3cDFCFhz_E7?>iWYMmY{kUM;se4YDHL8wnqGy}3GN5#D--LPb@*$`iAC6NOYAcmgKcIb~uh#AK(p z2Kq!yUhvZ6I_&iFP=;=Wjp=b8cwRd6X`t&w$odfCcS&iGI^LY4gDydgs5U)MPj@f4wnz z+Z%P#W81NL+}25Y=^gH*_bk#Yf{p1NZlyQgNv|i`g68OyM0n|qcG8RNME?o6FulH* zy!_2{(yK#ypGi_$dg)Df(knxH=fi{P^~2<)x7qyT#9@$oU z=Q-(Jin{;D5bp&qy)9093tq>&9GsZH0hqk}T@OE&4_H4vdu-DuAFKic%9goLQOx}9=N^Ph2i?K>w?!_XHO=yeUj0>0f8->YBkFR=MhU;MXcZpJucqb!t#&P27nC*8@ z8QSn*_k!oQ-0>SYL#ghb6Xu@ZM&sv2jfY>IwO;0rf!%xT?dW}INaexC?ZBodwu9-y zoCtT$1fD4O>aURi)5yZq0h6^Fb?0qL4d=s(2~3B9yVUkOsaHs`KadwZza{mn)(xv4 zp6vyUO^)Hn@o}nA+1dD9$_Pu28#g99d)#s3#*6QQjt#|SQ$isxCGMLly??xQT#OsR zxlrU8>u7ZtO7f$JPZ)mg@T-SsT>FpVdxyWgZD!7iGd~>u73kKSk=MSwZF|nx;o0x2 zXZyc@bk|Y6)W1F){!!QX;CS@M!*3bBZQDiLxYQS2<55ok=(;!h&#wETFK^4snF8O% zy;SQ7yT^06*7}dsvs|YAHdgYr!EdgaEABmgo9EmYGI%lJ5M;=VKN)})(vJ~(3p2L# z5J*e55fIk)?Ea2wTz*EPLW9pSM=3$RnT9 z@G}Dy?lQ5{q)rn$mEsc47^pgR%Iy@!(_MIwq9xLq4*etI!B(g?T~(+48Ke7$7~OUZ z_S3}vA&JiD^<+UW?6mHoPMu_#{vAT_!jWbop-KHaay`ba!y%!gx^(Xpj`oSp?sZ5g z3rlu1>&M1-8WuX?FfVU|4=e3{NT^%eyxyA*V}hBTLbKuC8Ea4E-lVEt;Ks>O;&#eY zZbY?jyY%YNva3Up_G>!c5x%SUpnG%fRXlJBj{*42!T=rFbI`qG7@1*5x6K%FOQdc4 z(85T^nW2TI;LzuOM770Fc-!XT_q_!(LyPo6iB#L;m%F`7AWEinIajrhAATOifRTfI z>u%q6)zzVTCrpVcc#+U*BZ43N0=VR zBQhft+SjEsx)|%S2oV5NJ*;D+8C`WEOh|%tF1DGWcn`)&(Sc*_p@ayv=@E`}h+xPD zMcD?`BB*o^wHXR)M{Vr_txenTnRE_^w9L>8qBo+RXSNM*(dGudWaqZwb~>r9W(|^} zNw-Ve@MgVK2c*Rn_VV)47ao}~bZBd0#&|L4-q<0_j_K~jFtblVlQAjuv_Kx25POY?^wTT?XuccHH)(sEv;Uo>gre3W+zN69&78) zSiN+uT3WNLcIi4Zi>*_uwO!JH>V6wxYWeK!!U+?yM~)dbYS@VEoRzC`mef_RU3&aD z@Y)s2R_EY*r9jpnZNz+W{rZJR9Qf7NE?$_OQ-RpE>lPnhyJ|g> z&ROE+GlyBXb!_00Wi@q+*TRU6T!E$5tY5Sa+S;Y{Yu4q|tXjX4aY$j&x@GmNa@N-9 zIc=;EOXzA*{o)$MyQ}h6md%}_cT;d*tw-E=?2WpbRkiDu61Y3H;8IhVj^521bma{b zhZC0?ISwGTMhSP{anUI%y&OD;FRfo$Gkh_YAHKNe^x<{O7NSZ`=X2PiG?ByCuU$jO z;nkT-%o_HMOvCV)oHErbEmD<(0fF$cdB8nw1-_s>T)N;T8PeppCIXdfA?Dz&pztGY7ykPrZ3w| z!Wf<2%@6ft=%G$U{_W$-Co+3`mq54Arxnoc?XQP!pO0&yCqsM1dJNY2O6aUE^~HBp ztd~dzoWIcR{l_vVE8);V|Mn!)(jP(mC`SAdUt|YtZHVgBo@O*jR0i=mBmvvtXsJ{ zwx*_5^QM|L^+p+1R=;T22vs&Bgil8S`DH20_^~X^_+2T?#>k9c*n-B7OJT-uOJT;( zXko^$gkh$?{l>XTM}MV@x=BfYnvl9lOMkF-=pH<{C4^P+CDr@t5oU4IjibCaI_bR2b)Km9c?>L!2sQ-x&aM{gV#kr{Zu4;5(C z;d)k=k*A2A`z2%^gsw3@%=69U67ji>Tq^u9d73cGKyp??f> zZYP=d9_|{BWy~-SQTkm(cXF-qh!a}$ZllPn4Mlv@J;VMkt zZ*p%S^WsCe1C#fg-22GAX+@naChs@7Pmy_nB0PsF$_od9=e+m(+}Fw6IS7Bme3bAJWF7xxyHV?y7$;XO)26?D3pYOci>c+?{{19r%!-ZFpdB71)Bl935aF>NxI3V=Jm5_i38VDo~vUY;5eOnD}v2-hC3b6z^MbIQb2hRIt7sNco*S_ThU z)Y|DaB0YAWV|px`y!1{2d&>aTE%14RV1gI70=mbHT7wOL+4ykg#VrBb>-{6j3U50) zm^g07*_ga#fVzDwn_z+$cP4Z@z3lGtZp!UoaprBuHDGTUpqh^ebD2|3#9aZl)8n|C zyr!5Qi$pIymQQwin-OukW$^G$vrHc545uJHwwp7(u9&>^SaHo|%q6W_P%HT>FA)<* z^;yH7-(&5R;{C=8^x^cnnR|W%a57@miQxIYYy7;3@$ehyDVQ^V41dBz&cnp8@zCUc zX0h&V2h+voB?7-ou^rojT5B~Q6aBI<@mPD;22f>o!9B}bkm)e+erx;Pg!O)^V?=m< zOHm>BL)xmw;Dfs(vKhX+t*Y!oe_Pcvy2j%EEEUPd)~Ws!+`sBb3jXR%9YrySVlc(g z6hkQZJ2-VL#ZZbI3XV0UhEwpDacU&RD2mY(V<^T_@V9d6I0_ymHGzU-Q>jT5lPQj; zVEeSb3jS12&8Ik-f@gyI5yhz#{PCVzKv7MxkYW+VVu~7yB^0$3{B@sN zMzNe?1w|djN{Uq!^%Scq`13!thGH$nItu;_Q1P25Y6HbaiZduUZkIZfVl%~A6k8~6 zqqv>o4vIS|?xNtY0@Zek9TbmIJWlZp#j_O8QT&SHd5RY(eogTr#Y+?~Q@ld)8;Vyc znkinR_$|dwiq|Q2QT&eL4T?7@-lF(D#UCjCNbx6%KU2I-@fV7BDBh)bkK%ob4=6sQ z_=w`K6n~@mnBwmg|DgDU;-3_sQhY}7ImH(gyD9!f@g+qI#a9%q6#u5!L-94mHxzp* z{zI{k;=dI8DZZtMYr)E26ZZF;rfJ9Sy}7MTtvmO|-q^jr-*xf$w6b{os@!;dS3^AB zvNIlkba%WZ(_2dBtuQC1)$QV~v0Xb`oAxxc?!?47b=oaIe+t{;@qMv){H=KWVAk*D zooTl2Y}x5fdm6Uy+@CcIYflq)HO2S!tJRV2vedtG`S?-TKa%{xEWeNYv!&sGv3|X% zi0n4GtqnVN@7g_}Y1dz0Y}j=Qj%LHIolCMiT22Q*>W41hx;q|!Bo^P7E64ALuOH{$exBb*hv5gVe;*c& zbJeX45C}hTdA*Fa{rWnIajyl>W9^$l>}&Tp)*FlO{j?wEZBp$29S7Y1`}z${q`EhR z{m|k}txdQ-6-1h_eJA$+wD^8RAJp>kLKG^J{J|{0hsOY$$Z#;r$A?bU%W9#IU&~IO zyW26u)*DC`hxWaAp4ypovS<&?IRA86N%Id~KJJ}=Cix$@ygvU>O#9EjACP}*Q#39J z?cS5SZ+8o_<4t>V_wSD9@x)jKm%4a-JI=E-VS6O2A>Q&(E(+pdyU>MlIST!0Eluxk z?~u)-6bxHoF24x{jzsTKEGJraqi#T#_vohm*8Xn!_uix7z*`0>9;yGs*u9Y31&uQ54*N+=^Y{LB)Phc&09yk`|%J&Ix?B3I~C->^z z@ddaZx8k1CuSVxB-Ll^PmvRr!9Xnf_cA)I^ChB}1VSK8vPqh=XF86-;^6_0Ulpjx; za`zyX=ffAT;e%a2kKf*ggI?a-{#^}wns()4nvdx&On-f`Y1b#GH|_d-EY9f#n6~2z zOCNTrTpXuGyLX|yVn^_*B6=e!NZ-1-^H^S#uqqDgj)l`(ro64|;j- z|F>`m4tD+e`e{1&<%i01V=I~r5@i_6GNo|lO1UNFnrcY3`EisV@z|5}Ke*)++kcSD zFT%OIzv1B5?`_mp)r6uTc>liv5jbXUSb!7knB4fjiMjE; zXX5t%fQq$znj7B^b1iOCL-#2Z>L~*6`!U@A7c|Iw=JcWQ_^@es9o&X{(vICN*sm;0 zit&b)Vre{gO%pTk7kp1G9j0x2bHCs6-u0*NHwUpik3a7p2fe&G{s+DM8#qvVacB;5 z`}NLijp0CJV(?CS+yZ!O(`v&vyZ2|Aa$3C7$`+PD?$mVU?v|Oea_!fOWCGi8{^Gdt zg!{h;rjkLwzj_r8NH_65n{FKoa`kcChih5i`_lQPv*)#o?~U!pdk`G5cgFYZ9E^R} zvU~rb*sxY!FW62@=`I64|FE>)pSwK1ySvwc!>3$AZGdc}D;VQS%h*)ZpLmTyS8T*7z-2-9}8b6>wJ-rLh~1-AbR zT*Fty_hnx39_>0l;qSn%1}qyBBj2fb>{$5F?oAT=y<}_0{ke~~yxMTx{wySP;IKEm zTTb*nSYKj_VWF)J@jaM(He3w){nAa&JI{W|+)iUp8*D4GsS91?h4V*u$G7ub!rW)4 z?*YOd+_&QKt9PRil>Ijq#X}66r|kz=&_o?f{hOWY_MI&ax-N!gDUTnX<@cg2zjAjg zx8^$oO8=qDQ6OB`@@njj=g(+pIb+Vw)_(cB_r|bI-y=M_8}A%=W891P8U0Si`-xY7 z`8}3DnEE@N>^4YDyLjyx_RU*h{~lp~RvTP1`!T^euOq~+-T%SVs>t6R_K#N$`+LRT zIHFTdQJN9MeSdJ%Ihgu0JB>%Wjc9uG!}}T@Z+$i9PPU)TEi6CYIKaf~c`vWa)Pcu3 zIpIy!aa@mQ!DJjwPni87G8fWGgD30 zB56^de?PSTtOdtbru|t3J6oEz>g(oFeGPF-yz3|JT9XkAg7t5ES^oxm(#cOL_CMC? zUVq>3`7M3@(diBTwTh-sy;`tW|DDR||In85IgUF3&u@I@zZ$idKXi5bblGY>?AQ-J z4vTMa4cn0gRs*oy)$IX1ANkzCYfh)Z6EgKq;ckq<6>W?S43>)(dQfR>%b@x9JP>n$mB z-uKah(64saL%G*Ia%SxD>*h7QadJt+SGfzDT4P&r588okOCM^m(Y#-+McYVS-y{SBgIIai2 ze&Tt2FG%&^SrdO6WdiGA4ipZ${>>zc{No(6CcH2Dbi^HK{k*^JiS0-IwRh{z#uGfw zTbxgOV%WO}xc@O-y!SNtj)78G(%S#v1BHXGzcYzC^{>{pAGrQCktb9C#w(utfaL(^ z)OGzE;uF3pfaL?rK0a+=jXPWLj3m4_hIvDa;zQ~I!vCiJ$V)a4Z9fgTURpD9>$dIB zEx#dNUXFPk^vB`DS7}tlV5@?G?KAsOe(5dWf4CGJ+zAXcAGrEk{2+M+$fI_40~;{* zqblV}lT5-R{Q{Q`#TB4rSS+A$!`339Z0p}6K(*Pe_cmeYwpy?RTGtGQK80CjKZSW4V3wdGL z!TS+Qk$5)mr|Cm0?pI#bXRCg{;8~;ZU`_Ah4BC~Z`Z|#!Ub^G0gX8fh@z6D_7LR_l zcqOdmb5~3r2w^`!koS9Ttn54K&>%VbGcJH#?mLf@7W4d#KGT`!9mqR&7>iu2miq8;(O*{&I%)E+N+Px0hZ538*&V1&Wj&5?fUQqP7S;M`a%woBk*^W12Y?pmM7YDtymtz)d@Co0seOUAkU>4A*bNfv;cdMNXGHmi}F$KR3WfrJL3=Z2=GI;6-fmG&%XxQ3_j_;@!{@a%lGBtN?eGuZx{NH9DcwPa92lc zDfV9(8Yy;lLB?|B5vztZr{ zo)?<-pnORbFsagM`M4?m7BX;M>u!`8nep=L@ak9=&*pQ@1F<-x4;av9#&$D39ndjN zB+nUd;-%PvZ9sN((C2SMngtKu{3rbQz#9>WzeBKohzq5y4Elrq?C52`rRO-zBK#px z+YtM%s?IX@k3^r{b0%YC(4e+51W;QU0;sJF0n}E;6*3F!r82r6T7;z{n;^uHC5Foq zhC>eJ8Y4F)41L7#P{Pnp48Me-{YZ!oZHDkS0r;f=x}JCY8E2Yvx}#&e;um(%{k-o^ z$gr$5JR8h1-rR^%fp~I8hd!*yA@q*}BO+uH(Wwq1^8Gg4?L}{Kb^sgzyRB zL%=ogb?jLF;Ip4&=@GC* z1D0a~mazd#UcfRvV3`xJR0k||0m}y4l98{@4J9`rqd;A5tA+R}s})bjYPqe>RqJi_Bz3l}&Qq7!>U?#rrRsC(whZ@NdN5#l zGGO^t!17wa@<-c}QH{?+T6=Gy`odNhslB$k7~@!5&NZs5tu9fA+iI;k%2t=E5w^Na zO|sSHYKpC{P$$}IojS!u8S-GlLXW8m%b+N6UrmnWtHR`9fx>nt1tLxNb zwz^(DW2>jD-`MH~^_Hz}RPWpB8R}D8-K6$dsy^bOhD z4_K}bSndc|9u8Q37O=b!u<#^kY zQC*`-+B!#~%J$Gl;?#g;S-`R`U}*?gE)7_=1uVA)EDzY0jGA>z)e~-(pR-+bmYV~X zKLjiv1}vWkEZ+ny;dbt!=@PIU7O)HqScV5I69bmwfMsUDapnjUJ8?ziZBraV%-+-wz{H!W8zLIwedI z856UOf6&af$w4#Q$!MA3={$a ziceBS#Yn4I(pYA%VqPr2aQ3WXRX%%00oJ5fQV}aE%`dJjt}3lkGs|XI#b%V2L+ZHX zAc4Ly2J2(BYpPGLK~@T9l~$O{uD5cNT#kba+M@-|w)45(q*GWiV@AG=NJ#%PV%3Y* zud7iNv8q{>71N7VvAs}b@toqyDr}wEhxxHtrDa9MSSqqRS(@ClvIeA9HZO5T z;(V;cvEm*nDxF$7D>g!%IJ;t2zCJf*winVrPm)+1gP^v*h2HvPj93g$sz*(gvvj06TSuAs zXfq#U=3~u#oS7eI=HtzLLSl&7*;fAR%~k0QxT;TD`-&_+sjw`6hIMh2mUC|u7sY}x zX4jcfaqI1qyuw^M`LW8<@~Pe+xYg!*@J3^uRZ>w|t~VOnu1j~lpAxI|Ul)4(i?pM( zrX1Kc<=Cwzopgh?nrJ;+nq~-B-+j}*lm5RvHftp+8bgWEe`FIlc4nd3nmo)yYKJnP zaZ{piSEauAro_0R68~^wTu;#-N{rhn`h$t@42b@Kx=2Y7{eC@G7A>ORr^m=j>h~&+ z87n<@gh19L; z-&7FtFoiI5_}%^{Z5!FaAn3SXW4U`P-^C z`Qooo{GMAfy&tO!L^a!UxjMqPe52ap^S=x=Q}*(gqKe4YFHvXv{4Yi|s2zWiTI$RH zh3b4?`~~VlpMJjn1_e{d!xX|ugB(AQArDgsql|t;1tAYpNS%`yOI7r<^>;xKW#Svu zZB!8QFoiIRA;$$|$io!E+5TgnzFBSc>1V2|eEKF8&*0MD@@FWH4Vct7s%w4vhQ!#e zd2kA;)768%`1R^(pT17*^66{!SgXnO*Qn2Y@u#V|<_$yAU#+~cwM4H^lpvz7Qu}<% zuT(R9%h##>zW5btnlFC2ddR0QON`|z=`U3w-~OppVV}Olj9>5VzZz6QD;;F{#cGUh zqVeJvaWs1?exWj-j#c7cjV3NTet|NdiZ$^ul`qjoKUJ;wrT-)4jV&wboubUAV~zjG zir=1L$io!Eh*86R+dohB^2MK|%qL@w|6FB06>Ic4%6wMU=(82ShscnJDTGm=!@lba zuTj4EO0|~G2zi)77}b~GfMLkP6vC*|>wS8KI?tzaRY1s`|{QPf@Kty_laU&_U8GQXPDHp*qy37btvY!1B+>H;HXM zPYvBpn?++KdN;(eDP4^v1@QuBTKM77YTPf+zfeY`r;ryr*peEK+b zkxw71uJGw&)O9|6w7S!$k5Ui%^pWa+eEJC0?9+#%YMoo-ZO<_Ej!(}~fAi@>Rf|tQ zR(9u>C=x^J$(9L)z_yFQUiVZQEH@5AE+ky^dnWVPamMle0qOX;nTC# zJf9v_)jqwSTISP_P^bI!zUo|`-bY>P(+^iy`SiooEk3=sdcddmQcXU+r+U(-AF7`5 z={?j-KE1no)2DY+fAQ&upbp+XzFBIIPw%SYKD`UR!eje)R^Hb}@?Z|3b3tEUd?$6Z zPw%Kk`1B5HoKM%i4rB$8-#xZ_$Am8-IM%!F@sRKdj{UBi@2z-_V3-VHYt(dFQ;iLu z^k%$0A|dr2b~JPh_Gg8#9yKv(2xe@T{?h)v-?e zP)E;k^kI%Z+|frkI(v8|L)aQMpVqJ*wb+gylT>v4SVw1vn`8*l3l5mrBP;!kySj-s6m zVYMKsfWmt8?4&8I7A6%PzsS)SJ9>?yFLCr*M_=mb%N%{VqpxuEI!9mW=&KyP-qBY( z`e}}Ck8I5S<2_xATUf1g{MS4B>5jg^(KkB!8II0wb;%G`XC@U;SZ#LnvmAYkqc=GE z*^YjWqo3>O=Q;ZMj(&loU+CywZIPJ6>S8DU5=Xz((b=mo8N&L@$F_cXQUQh4j~)FA zN8jq`S33Gtj()YHU*qW89Q|5HXSc&-2>ZTf%KZK$83_ubKFJPY)Hm57tiO7kw1m~o zNd*+vUph*f!sa`Ao+Yeq^-#~liP{h`hf$wqhj5}c&x^m)j>h`#a`d|${T@fZ*U|5D z^!pwC0Y`t((I0a3haJ7i(YHJL4o82)(I0d4#~uAiNB^0l|6CQcu}zPuN}v9uTHw>& z^*^OnnfSIy<`9lfZECm==36zU;Y-?yon|z<+175B@ij^&8%eBI$v`Vaik3pJ)iK#j zAnmfgw!mcDn%C6#f7O_hY}a<$VSVj$fi`k~i&FvW+NYp~V;Y`9W~d50J5=J!XLHnC z+{NdsRIR{nb8^Zy_h5rkqUl#R;(E`t3GLufe#~w21lIF74(+_80ToB)ujwuLaWA zknc5b+T9;gwK*m_A$V=oUY7!2PX@aM(CcI&ZEs$Crq`RmYoYVCY5a}sAmUbqFFcDM4 zR44E)FJh_^ipYmUAn@%f(nq6wvym%D;9E`P2#xxUB+^fqZxfNIFy90s*}{B^kC>_g zK7mIDh@DT*kt2oqck0F-`^IJd>o-7Ds z$kT-RO|8gu;aqZ=a3Ohya0$6wnBNGBR0vm+XA1KhT#*xnPa#(dSCe@%A}k@#66Wu0 zBC~~8ljjJpC(jjTyJqAh;Rf@VUBY-tMDJhWHspJRJCa#=BXlL-C)|U4zwlw?2ZZs_a20t_ z_((DfdxWFO4-4mzn}kP^w+kOf-XT1h{D^Qq`B7oE`$ZlTo=$#TcqaJ?;r5t?_>nV& z&g2^OC_#KTG7B(-o`&0DemHrl*!z>=--`Jl!=JRlM{*2bfOLutGbt8}^k@4!i!(CI z^=iZ2u#Z`M(Ec&zyzI%`6}()@pGWZfMZ>jim99OZeFN6Z!%uz<%w@>y;q#2)>#^)# z44)03e;DR9%59+kSonvKCo=mv9A=oul4p9KHo4ObzZ3d8KPw7~ExEPIY& ztVZ|W2ytg4TxskXNarSU7qQ=F>^x6dK8L!Bo#iw0b|F;us|aO@{W)WQ1bJ&FA0qZ$ z#?CVPFJvBAgb$4Uc29%5&?%JqH;|4j0sVrSn1+E2xt-`EQA zWI^a}>?}Knl6#4Lq_J`#Hw`9_EeYBgB5Cv0s4gx{2IR?6(>F<*+|Uj*5MUv2TO@X>zvM zpELHGVQ(h)7yB+_zYF%ikOzqU17m*(_Akgsiv25Ne;js}GogWEXF0?D@C(?xk&hC4 zFJu2T>;uVz#Lhkf^gj*f!#MI_u}?Dg0;nbAqs2bM*m(}JKR{@R*ki_iHRg5XW5j-% zv2(X?As;LD^Nf81=3B`_#lFqh-$Q=zmPg*Z>IA91!-CX9;KGBKE%B+J`(x?8lJj3Qr)PBwRwC zCp?$Tn+(Dd^2x%yAB0X3KA-#};j77~3g1qS3GW~;5Pp_iExePwQ21T)BH_=;i-rG7 zt`Y8pn`dZ=@ZscI;V2pVnfLIaWZnP~MjAW&GUSq%iM`O+pT+*4NnS4Y*~Z=z=`19# z5PPk$cSl~|Y!Ee{g+7+QYt1>>bG1Z*L+$J<03E z-pAN4#P%Ld=7R%5jyjkpblFt&p&-m108=oL=5&Kid-Vu4`x9dU;V&~`T zxUOHqpI@E}oh^2LY>xJ^$OFF{7dl7m{8Sw68{p5czJ<;ed$@zx+v1$bBA+MrLybKL zc^*JMU+ja8{W7F8hJ1n8Cm8#oI0vSXFBJP+@@xDjVqazKrC8UQNeuY&qK`Es$pZ0tjj=eNi|7Wd3tak(XI>rSC7XH}yyoh7;6`2=1 z!Z*gw_pLUaV82D|9m&{--@@LDe5=^|8haP0L&&#@eVDO72LDOq+r^$|?7WB1Am1VO zN@K6Uw#UeKihZ%Mv&cG)e3#fyH}9^s!DpF;TDO}t+GLYOP_94dJ8RyS9@^-OLGWLJNUP9g>_8G=L7yEEN`4O?ljQ!70>&TCa z{WN1Ah;+7)9~1j|#-4-yu$BC{*tZ!we=~49`3bQ1bbod6D5-%u5aHTjUS^zW3@i^|dQ& zRt{TSy{>v#qEcQy@a>B;O`OAgMqll}FGgAiTyOb_sNZV0Ex0k(4{hD3)Je%N7X7}7 zCJw*Z-wxuBv)fDD82KHiYfYO|uU*DnAXQGiHXXk&TYLN#yDi9#Nt+R`Rmoi-RYvSq zDZjt3@yd-#bxge0FTZcHbzHANlTkN)CHzsXHyjEv-fm9i>Tdn>6zQ%1gN`6=CT2rkc*?R8xM#H*e zkY9$n#^kU4-I!E|$JeayE|4nIUcUgpZ<Tpht(_FV!JQ)kDO;l)p!bKQ6_O==~0xoYUwG zN8jk^8yx*~M_=#g>l}TpqpxxF(;R)Zqt`q7Do0=G=yi_1!qJyI`Z7m%@1V6#{1QiZ zZ$pcn_(hJs(9x?MU6%=7ha>-?OLR)|o0H{Q>cvuadGaUW_LB0)rs`Ma_n7Z_ko z$F5=XUhe2K9KFoZr#t#IM=y1B_ck@viJ#)= zZdqUC#1}exfurX;y1y5le_#9iefi^pW7hcN?Y?{d7^jn;KQh@D&~KN)Ec`alO} zAhC{5X+18bbzDm8*p${WDXpVZT1Ta{j!bDqMYV}9ieP8`Cb`M#9jMJ6YANd`3 zVd;!3Z?egrXKI+R^iflGboH9*Rkby^v#qJAt2S=zy5=o{Ayz!3nM1CqVTjPh+B;6ZILG?DSYy;r*r;m`IOx8g_bHk={4$Bt5R*OK+iB#>-zL zHarhDFL?Q5)wR7|{th?Kb24#MSv6|=@%OWNj4;7V?{4U}AAk3n=Q)`;s?QqEpn}kt z#_w&!+37W>@%z&8%S7E+9&BFl^2a`Ec6w}2%k!Kt_x$=fevN7TCOUr2Y5Zn6eryLz zwch29Us)Qz3mm`3G=4Wae$8q8bRPt4zjr(`aZaVm-%Cz)A(^*1be;BY5a6Q2P?fy)cvN) z-$W<9vNV3|4`r{nF^%66$FDh!-zLW|6NPrF{OSG?)^?Po@w?wiuQ83^uN}YUG=6V8 zewm$9=kH6$uPlvUdz7=j{g=k?7{{+UjbD-Dmx+d+RQqqf<5!l(Z@uH!n8uIon)Y@y zr}5K$KCI)G*)?_kI1YlHURfHyR~)~_G=3jBe$8q8zIFUEvr^};2kt+<{H5_b#_?-R z<5%SPHK*~5IewXkq|Tr2gJSLHvNV2|Iq5Z~@zZ@&tn`}G_&w&Nm)R|K{$6qX%F_6K z| zJyYjzqmy1)8b3Zy+1t^W#_wUruQ`q1ZydkOUa9l%KE{2lA0SC+#bNn)+ zsq>fT_?4yco9Xy9rtw?g_%)~TTkZH|W~a{I*^XaX8o#ZMUt=1-TOGgVG=AG1zs&xr z^Y^UdSC+=_b;qwUjor}c15)Qt;r%b9lIML{8ow;ZuQ82Zw&T~F#&3k< zmw9CB{ONvgcK*`%&2-XhOyjq}@oP@wx7zW`9GE(PXFGmnY5cZ2evN7TZgu>c)A((7 z{4$S9oxf)tzp^xbuRDH?Y5d-I{F>AF{nzo!9F#hLz43nUJO9%7jd%PS)A&_7e$8q8 z>K(t#!Kw3ik>gjE#_vYQuQ83^4#%%Kjo(X-U*^%N^Y@P9SC+=_E61-fjbDe({^QY{ z#xLslWe!Q5zp;*ASsK6Tj$dOMziP*?IgQ^2$1n4k)cL#I@heN?cbDVWn8xo}$FDh! z--aUN@#}?pEglaqWDdjccr!gM8P^Sd5t#E# z)Wx;vD~)wL4gC>JjN@WQI_Z5f5&eW=_ky>sagN_}la#_MTq1aWBc1gwK0Vn^_c*-0 z^-gor`xDYDPo$RIj$$Xh)ktpv{J0%YV)D|PW6~P|8^hqq_|0ouVM^wYQ?=vwLV?1N zI?3Sqo#yyWC{(`DK|MdtGm?v|GWb1M^lN->RMIt81#)C`JpiVBLE6#UJT zs-&o*m_;$0Vh+VzijyejQOu_}nc@_RA5rj!QYuEVfTEgWAq9Umr501vP%NRSrC3U_ zjAA*(3W_?4l@zNe>M8hBD|H&h8j7_P>nQlUD|I@>28xXoXHaaSIFn*C#aR?vC~l*; zo#GCPJ1Op>xSQf0ihC*et1NXt#RC)%Qanu2M6sP>2gM^4k5W8F@i@g36i-t855>isva_p!hY#ixe+WyiD;5#cwEHrD&#jjpDZyJ1JhL z*hTR>iZ>|Uq_GHpO2k-l2Gxflp_vXF*_r{v|K#6~en&5KX?7fiwZ z0VTh;ywMZ>MjwG&i(cO7SR`Zelxfo{D;G{i@;cz|vBkTGF#XB0fX?8kGQZCC+3{ST zt#f_0&gEr$3Q)eIV9D$;AR||=K&Q|3^=_|2F5{WLtuuXFXZp5o^1CH3Pj;xuUqUze zOXwzl37zYlT!5X9<=bOj47sHpPADlUWqx`O#Lk&qz#Pl|mh~ldZl4`5>rckZ`jfh> zKdGZIEh;KGsi>f!5-B0%Dzj5JV)3%^NT~7w;5C37FpibxxB42f40ue z$M$e(Y>yoO=+Px54J8N_a`<}>99U4Wh1(?gwRLWvtuz0&&h^_m*Kg}we^wU$v$=k1 zxD|C9*n4TWp2w7%{WW0Wz@v}uarl5D^H8RBD_)h93>?^P;J}g+F5P#)fB}6KPhAtT zM$F90%G&Iy_S`$)ktgc`@`O#BHcjlPgK?JQxny46+4ymDmYo84d{Jb4q-cD?3cYuB zp0z$4-Udvn!MI@it+nBxIbm|a&+fYGXZPLZ?GK6Gl97>N9J_I2vB_w6zOdJ;~VjL6ES$imseuq6ZT z**w1`=;PttFJMCMdgB82GN|%Pbr@&)55!JS>~%SwQl9br)0>l68?T7G5t)hoqswnz zA$eYU6Q?kRDHFXTV&AXmW0(Kb?ed@c>5{)vvR9a659Dec>nSRkxnO2Vk!(*Sf-hT0 zD8c^X?zPK*1%D@flyF5wjz0X}^|2Z0Z7wM)^3p>*!~7*2 z3<5#NbBE<=)jRsK_hE9&|AK-gOXkmK65_8Hr7-7r0S|xj_^YTKd>m5ox66N8n367@ zO?u3KUb%O_w#xfFdRw|#AMZyDydN>><#G6Z+fN5mrn%*J-vQI+R904&XZK4ij|0X+ zKy-!U%j-Qm&*;bk$gCZt4=-FYym)=3;w1M@Skb-9m-{~#XRS8|B6Ut)etEt`kO6P~ zeY0_YwBxa>H)DCvKa$yFU{TQ)EF(qsA_Q)+gnzF3$6tbz`DWxSwp2|;BH z&B=f}VvpWKiVLPp5ZlOU)5f%K-*dFN?YL;Wh_0V#7ZI(!XzfLlh4oSyT@NjSdz(!VV#pH1WeLL}hjNW=Zb}&Xh~c4x zp`RFj2}6gG5FOhLVV#7|;<4R+28(b`_X~lt_ThbZg85ZM&PIga#0>iZ3%4Ct>McC} zaH1?cvBz(K89LF)J+9+Ynsd9~s~7E%30Fz&gzzEYHsuhy_NC1sefTr`PR!exfK2YF zuBr{|c=RRIl~#^KW%TZj-pkSZIC|94k973Gj()784|nv@j((h@Pjd7V9KF!dr#kv{ zN3U@7Do3B|=qEdR%+VJ)daa|caP)ddU+d@_9Q{m3Z*cVU9Q`6kzs%9ENa~S%b+x4x zsOv1PP~B*0Md}tyD^_<{+7xwe^^^~QRsb?&0hI-!8 z%GFDjR-s!hZyy?u@zPwKcRag~SqIhJ+-OQ(RPt8EEatL~v>BH@Lqm#r>ReQb5HirQ+8 zI?`5`sKK^ctB$qRrE0jXE>ojzb-6muR#&J=wpxepi&~jnsS0g%m6~d+^=i7UuEzL` z*0QImDqCHn=Gy97b+WClQ!!gzuNK+r>8jRNH=ttNTG2*TZ>wjhwYItmqqrrV_0c@j zJ}%nQ5U`vVuv`?dTo$lg5wKhxuv{0g+!(Oj60qD6u-p@{JP@!n1uTySEKde3PX#Q` z1T4=7EH4EtuLdkT1C}=emOlh6ZwD;z1uP#0EPoGJJ`GrQ2P|I&EMEsK`vR7Dz!J^~ zlo$a^r+}qvz|uWn>1A8O7-^wThI4*LZ4Z5Z9~rO=4p@#2ScV5IqXU-X0+vYu%L%q6 z%yBRZ-7HVFU38YG2P_oiD0n2r^C5&NdZgh{tEw+a~5_beF_XI2t1T0Mf%cB9ylL5<90n0PC zCCovCo_DkSlI^0i{A$3mGhlfmVEIG9@^--TUcmBE!1DKi<^0nFV*kjbHWNCP zcF({oa)xK=G@*Y#F@<4jFHW8bA4CvS(yPrNRf?Z7wC%|hJ5B1u1o3J(P<85*+lie+ z+IQCL3QN@ZPI!Oosyg-07~MZa&yL+gojOhI&*=UgIFNFu5bOl>Y%J|Q9R8gT2_4m? zd#7-;Pc#d?*1MRr@n+Ul=i03Ggu^DIPj=QAHMKi3f-U2A=`VEZXF%N(fDd~TreW3w zwgSvELZN+KI%DW+-R6y51>hL=5;DMD^-G`D_1^X3yt({p+xrRqjQpy?*=42W#j%RY zqSEsGvRG+(QE6fRtcpq%9K|5zkQm8P3GDB*_(sUF2b`H%T2@$DF*jCKI<;JR!#LSL zP)~lJCOIaLJDyEl{i@n*E!MAEyR3Fq&Ejmn`Fo#gNiOIc&}K$yQBfI2BC43B>@m@j zi7^e6+@ht`Yn1O}Hs1GJWY7S;5dFQcwIqgy@(pO@ju7H~0>~cMZ9S41IWD#itCOLF zQVkqpjipmH8-oB;6;_tcoE4ijw?a*=J7e`yd_t+JDmJSmzg+gLH^7$f>ps500}{ic zSYr_Qzf2^#@xE6xXLi}t{L0vr%KXAvr4{9|3Y;`0`DIhkf5SQizTwNf4;clIlnjed zQCdE$w0tU#$m{|fnEdjokj{_U8+Fb%x`aKdoA28~vO50sLypM)Co9>P5 zR!~_ny|_G9kYA~)W|ZP;of?~xUs$YaVluRv_ZcYfTTC)Ml0C$p8C%ddOq)Ig{w!4% zPc7y5&WelVB=SbITW^1=C^^oCe+ZPsX`nA1dx(>%<+HO3Crrp5IcC_XVI#70R<6of zQdhlp>G9*hYga5=owIO#Es(=PY{YzV{rZJK3ns5huV3EVX9+qIJ;LF0Eg)E~jSI`jw1B z3X9e)t6!C~wnoosgXhc5FY#MqAsZ9UEpG zTc=&-{NK5+-aCi7>U>|{kC5O0fB*IB)vKykmAa?y4VRWuOK?psn>MMsoS)h084|;F zuEKS;;&XO{%Y8*t_l489$#zIjM-v?8a5A_a1wH%r@1IXQp5^iJBS^z*b`>F0v=R$$5Yo~6C2e+OYi15Ns$3D#tZ^wadHJ9yH+ zJy;7S>VGO&cP!FR($^5&B>x2cAkyi_>2S5Z$EdN=^@MfC(B$%u66SM>^fqdx^dpp` z^j5;WE>V69U99xOl&AFOV2zk4{}7E<{SVSb!6;X_KMzoa>fc05RR6|ctR~vt{j@;k zHw0_NME&b&zPfxJVeO2l|2~?d^u6?+()SS7CX4dxg0*cTy_UwS$Kx7Wtnzmg=A()7 zs|o8SMfxu4qV%2gk#xKJ=MGw`E`K}Ks_R=t8&v)_nxpc!64p>dll!}tZc_RdTA}nx z8mn&q3c5x0-yE#r6K(G%!dh&RzL6eOdO1C<^s->Ro+!VRur6Apm(V9l-$2`gQOa=t zucxn6|KgwyJG%UJ^tI|=L|fJ6Yv>!*e=TiR{R` z)L%)MFDTN}3G2f}dK#@%$D@L8G*;;$G+F7vG)w70 zRHJTh5iL^v1L;7ImjilXDygXSsSofaycPs^0fqgtiA5!OkIw%3(5Dcyx0Q~EO6q4cG+OX*7p>mNni z>rC$|-HF~;x+DEn>5J)0r7xndmFCaS)bq0g9j$bGI!WnvbiUHLbfMC1=`y8r2=m%R z`+ospEu~1ep(~X>pRkrv)PEjbrS!QpL+Nv9p3<#pvC^%mR_U{8wbEzNMy1cBElQt3 z+mvoe&nTTu4N9L*dz5ZLSgRzuJ*N@Yo``gF!kT}PJ~db)F4Cva530Wzm#)O~CsSjk zPofi*K9O1|eFC*o`grP~^l@~l(#KM7rJK?)rL$wNVxvopE;V|b(c_JtV04+$ z6OEo^G=HiUYe||MQ@DLojK0d~sYX{AJ`x10VujK0(8yNq6K^xa0UF?y}h zD7cPVGFSyVuJ4TmQ^7j z-fi?NM!#zG9;5df{hHCgHTn%&e|X&5Ls+9WYOm3YO55vylYZ;^@vA9nO2Pq_@l;$q zq^P)0aj`&u0UrGgpt_>6xT0NEeBRAi{e>Q@?M^*-8Nti> zP22z)M8jw}jo{&%D`bdr2*wNxio0`RMZbcfWJ^Ze2%ioeI^dcv=TIdJ<7fg+{mA0pq+sRea^12)|_b*bYRaFefa8$DAm@6!)2}`q7MOb{f!LX7|2I0f{im(bREc;LeIAK{*yll?ZQ*b$K zR0R^20fps0s>Di{9LZ9XVcCu{PajtXn$!h$AM>JXMx#A}IkB}lrmB`l8% z%f(d9P`unOESQseu6Q9_PXGAQF}&)J(^w29Qj@1moSqxLmIYNR?nN|uY9`zh{wczJ!KVrrf^p^ChVW0yeY`ai+yXAoy~97L(*q>@wVKKn#$TE#>?}9@ zm6$psz+n78b*3=>I!m1;JP&-fa1FSX@D1SB!uV?>b&fFpl1QB^jK2a>=LzE-dVZ6KHlHQ=< zol^=2o7+DANnIQu{Sn+z_+4-(;Xi{r3x5R0ox|-j{z+XLU{Gt2x=i@L;dc@K2HaKn zdvG`5!xGGS!oLFN3!}(6)m<3hx=i&DM(sfgcRsgM!3DzE;9kOKgL?~~2ks->7K{fA zw+q3S3wH+h6YdJ`FWdt>K)4SW4=!#4zypP`u6?RVcm#Nm@EGu5;ZiUjjNB%IhYAOC zfejO`gg;z(CU}JKTreKI+)zi58YO%^_zGc+&!8aJ@`)Hr@(g! zKMP(h{2~}9OK!WtYlJbro?0vX26&zDTi|*EVg8_mQV$5@8yBeug;A@M!pWOk6Yyr?KQqB#iok)XTzm zf_DqA1-~L(2Yyv}6ZqG{SPLk%NBB|jUg0OfzY#uye!aKEc)AN5DCgO3&ech1La!h7K3 z#Q(tg7x49d0X|;*gU(0Y5-yWCL43T9;Cesj{4roWD7ZCs{^7iz&A}&$-_rRwx3vME zEPgxZf5OM@GH^5T^PQj1*NO9g0uMB9IRE2%2lDpEfKL^_G|cm3Y$~|9_*Xlhca!FW zPZNKU^Ka+v+zf6Z{;kfRiQ^AGUHtXVU%>uWaJKl5IsXRsp9i-Tf0y%Du>U&v4Do;G ze2nYA2R>8$51fxVS-$|ECH_I@Z({#D@Y&+y@r2{>2>Ym!O0*Kcsq>#=zd5+I_${4Z zz>kME;B&-p=lnq|ah^<^D?ZMX*#0{>{^0Y(ALRT=e4NLC&lkVc`G`#gw-Ntp=c7(( zKKKIh7dihq-k+PnIpVJYw-tT}oGTpEJGT?w4Zpqc@4+2}_k%AK{t|qV@OR*gg^%L> zNOTlF8Qe*@6&NQfZWn?t5$+DYRJaIynK0@)6J3O-g1ZXO1$PrhtyCgU_)c)X@J4WV z;m5%}gd4y;g;DpEC=f;sZK9X(=iuJL-+=oFe-GyS>wdn!FcVFpulS9?>`!C=WbozU zpXPkroM4Tve&V-v{xE+0pq44oU;KRMAIXowLhu0bhd4ink8ugOQ2goOfx-*HMZzn< zc(8F>2Ocbpx}yYM5V$=H9x5EHlQm5E9r(kAKLL*r{u(?|_}_TH6QhKKwXX2O!tG4> zqlMdp#|Yeh23t!@u*u72+2-AMYy%gQtlo&d&+Ft^Fh&*tsV0#}MZ&-n$szstZ^ zi@(D8PjG$>xJvx{oc|@ut>78rKj!?8SiS(R79X$ixV^9O?|tBz;{Vb4m}lxkFy0_= z!|Mw2OZawu1-?f7Z=JuB_w#VROk%e9M}s-voR9y>;5p)-=KSt_x%0qt#c%6;?A~Qy zycyw^@BF8j3&HaPJD43A+kc6VX9@fT;+MHRZa1bWPAnAv8t1>y_xttWYsFvg{N;Q+ z?*!L~zt;JX4}lkn|A_Pd$r7^(C$1A869{8}-sbINF5tvs@iF}`{8hX^n8`PBz4(~C z7k*=wn1?rUgZP+w7k)YC4?B{1iTJ+)vyZ<^jt4IlznSwpv)>B5O#EP7BhL5b?R0{_ zT>LIBe~|sl!8eLO(D^6xaTo)>N&Hgh$KY`Veu3;BMz4ZKqP zyPSU-Z)YR;7V$Sb|9;+|?ciGRUj^SP{F=*L%E$H{@NMD;YYOpgoXXq$9R4ct|L*c@ zIR72^cJUKOF>}6@_pLGb4)Kq3em~A@F7Z1$zZLIuPw;B-`#K+M zD-H+WE&gcdV{O55@EY;wfY%BybQydv;3n`o@q=}Lc%Rp^ya)b0;%{*IH#q+&_+Ig! zbpGG@Htqu7C;qF>U&8sfz;)uk z#$eu0tZRBIc%%5)&R@&<3&5MiZ}0pz>~{k{AbwBhzroi#2>hVIr$CiR079Z=%Vn09O>%AMiMf`i6kJs2O;H}~Z>(p=_?|pW{e?MjciX|E=@iWBD$4r}%$%esA99 z7vLAfKj{36_DN#cO?AX;$P|V?f7<00ly;tbm!x}@O<#A;xBSOz8AL={A=-7IlqYg zI`AIxgY{eZdUx>lABVqJ{HI-h3Fmi%e5~kgPv1aHGNV=Sw-OIxT=X@q$xwU zD~r&VQAHBEOAUCbE0O^*o0hNmYd1ceW_w~^RJL82Hzi|+I-4HV)3zS^(|z$FLfcb4 zdFq5RvaWYe!=XrfflPZE4rA&p1~|17AO5sG-W>@CQtbsY?MQqeR_E1tt?kNmpM(Rx zIvWiLYroVUSvQ7kQpFP{mzGtP&6vy&a`mtahoP#PitYcCu? z*KT}>-S$K^Fy!O9VO{V3hLbqh3uM~gu*^Yc zQ2?QxczJ~F@$N`iXkjmqX-DFP8al7)Ic%2{Wmq@U6+{IiI?c5t#*pa}tQk!VVS6&& zJ*tw$ULey>hovw&>#3X3p`WR}`RQ@qz=qA53M;y&o=rRqh}dC(`bHQt6t~r>wcB# zzuM?Zqo*4^&FBiFry6~g(Nm0`Y_xp`H_7x*G}^umnqd0J8_jdx;J=C{p97ZFgIe9(Ibr>Vf1jLhZ%jy+0^t8HhPfJ zMMm56YoX~MV03?@`x$+?(S41!ZboDNgF(U%IeufBPpyX310+KZ;*(tdhoLv6eFXZ)3b!l8W%hV&g`_Ep{hc)MfY zuF%_!zJQ^9^(_tE75_4a?umcpL-&|D40Y$vyb8+{9EAr$}=Ni8qC7#^< zCRgdnVLTwdy&6w0sF#Wz=UPwhL$kd)PwpQkSMSLMbyTtIZSdq;^Z6-$JN9{U-A!)4 zCpXgM4tR2?Esb9EZ8k|hG<6Dy} z@#LED^EJM`N>47R_ln)WHJ)4_v%OkRZk);0d2+K&uHKVdWpWLk+-8&8=gGZja{E2G zKbqVDPwo?wBOcGpbiXC|@f*KCvOKxwCYSBWwKut3Pp*&2q1GwW{*5!aB2R9C$(49= zt4yxalfyiT@#9kC$?Y<^T2JoxCRgXl1$A?=$9=sgm*D$7zJCp#+({<4&yx#k?qb)w z-;?WOws*jj!@OJZ{llBzO!x0%lf%lOnR0j@#$$evTd7fNL_T$?t z^5nXjT!|+)+~g`fxvNdC#*@3zj|C%4z+N<6tgnOvnO z_nFDncyiyGT&*W}Bx(s`kE=RQu9?ZzdvfQRT!Saq)8zJfa-&Udzb7}(F3035J-MzX zSL4YQnp~|XH`e6pJh^EmSMSL!G`R*(Zl%fX^W^R|x&5BpHj_Kx$-Q85m^wGp{q}~* zp|&?u?tPQX_T;`axm-`~2b0V5=Rm*$z^$RH=10wC%4|@ay_|S zCYR^Q?Kin1PwrcjEAix-Hr4k>r6Gnueq|M2sp$qj4G-&qPnE`wZ?VD!~g&Q literal 0 HcmV?d00001 diff --git a/libtft.h b/libtft.h new file mode 100644 index 0000000..59010fe --- /dev/null +++ b/libtft.h @@ -0,0 +1,219 @@ +/* + * File: tft.h + * Author: torsten.roemer@luniks.net + * + * Created on 6. November 2023, 18:45 + */ + +#ifndef LIBTFT_H +#define LIBTFT_H + +#include +#include +#include +#include +#include "font.h" + +#define SWRESET 0x01 +#define SLPIN 0x10 +#define SLPOUT 0x11 +#define NORON 0x13 +#define INVOFF 0x20 +#define INVON 0x21 +#define DISPON 0x29 +#define CASET 0x2a +#define RASET 0x2b +#define RAMWR 0x2c +#define MADCTL 0x36 +#define COLMOD 0x3a + +/** + * F_CPU dependent delay of 100 milliseconds. + * _delay_ms(100); + */ +void _tftDelay100(void); + +/** + * Selects the display to talk to via SPI. + * PORTB &= ~(1 << PB1); + */ +void _tftSel(void); + +/** + * Deselects the display to talk to via SPI. + * PORTB |= (1 << PB1); + */ +void _tftDes(void); + +/** + * Sets display to send a command. + * PORTB &= ~(1 << PB2); + */ +void _tftSetCmd(void); + +/** + * Sets display to send data. + * PORTB |= (1 << PB2); + */ +void _tftSetData(void); + +/** + * Does a hardware reset. + * PORTB &= ~(1 << PB3); + * _delay_ms(10); + * PORTB |= (1 << PB3); + */ +void _tftReset(void); + +/** + * SPI transmits/receives given data/returns it. + * + * @param data + * @return data + */ +uint8_t _tftTx(uint8_t data); + +/** + * Initializes the display. + * + * @param width display width + * @param height display height + * @param hflip horizontal flip + * @param vflip vertical flip + * @param bgr BGR or RGB + * @param invert invert display + */ +void tftInit(width_t width, height_t height, + bool hflip, bool vflip, + bool bgr, bool invert); + +/** + * Sets to write data to display RAM. + */ +void tftWriteStart(void); + +/** + * Restart writing to display after SPI deselecting it. + */ +void tftWriteRestart(void); + +/** + * Writes the given byte to display RAM. + * + * @param byte + */ +void tftWriteByte(uint8_t byte); + +/** + * Completes writing data to display RAM. + */ +void tftWriteEnd(void); + +/** + * Sets the given color in the given area of the display. + * + * @param x in pixels, origin top left + * @param y in pixels, origin top left + * @param width width in pixels + * @param height height in pixels + * @param color 16-Bit (5/6/5) RGB color + */ +void tftFillArea(x_t x, y_t y, + width_t width, height_t height, + uint16_t color); + +/** + * Sets the area to write image data to. + * + * @param x in pixels, origin top left + * @param y in pixels, origin top left + * @param width width of the bitmap in pixels + * @param height height of the bitmap in pixels + * @param hflip if image should be flipped horizontally + * @param vflip if image should be flipped vertically + */ +void tftSetArea(x_t x, y_t y, + width_t width, height_t height, + bool hflip, bool vflip); + +/** + * Sets the whole display to the given 16-Bit (5/6/5) RGB color. + * + * @param color + */ +void tftSetFrame(uint16_t color); + +/** + * Helper to write image data to the display, converting from the given + * color space to that of the display. + * + * @param bitmap pointer to bitmap data in program memory + * @param width width of the bitmap in pixels + * @param height height of the bitmap in pixels + * @param space color space of the bitmap + * @param bg background color (used only with SPACE_MONO1) + * @param fg foreground color (used only with SPACE_MONO1) + */ +void tftWriteSpace(const __flash uint8_t *bitmap, + width_t width, height_t height, + space_t space, uint16_t bg, uint16_t fg); + +/** + * Writes image data to the previously set area. + * + * @param bitmap pointer to bitmap data in program memory + * @param width width of the bitmap in pixels + * @param height height of the bitmap in pixels + * @param space color space of the bitmap + * @param bg background color (used only with SPACE_MONO1) + * @param fg foreground color (used only with SPACE_MONO1) + */ +void tftWriteData(const __flash uint8_t *bitmap, + width_t width, height_t height, + space_t space, uint16_t bg, uint16_t fg); + +/** + * Writes the bitmap with the given index to the given row and column + * and returns the width of the bitmap. + * + * @param x + * @param y + * @param index + * @param bg background color (used only with SPACE_MONO1) + * @param fg foreground color (used only with SPACE_MONO1) + * @return bitmap width + */ +width_t tftWriteBitmap(x_t x, y_t y, uint16_t index, + uint16_t bg, uint16_t fg); + +/** + * Writes the glyph with the given pseudo UTF-8 code point with the given + * font to the given row and column and returns the width of the glyph. + * + * @param x + * @param y + * @param font + * @param code + * @param bg background color (used only with SPACE_MONO1) + * @param fg foreground color (used only with SPACE_MONO1) + * @return glyph width + */ +width_t tftWriteGlyph(x_t x, y_t y, const __flash Font *font, code_t code, + uint16_t bg, uint16_t fg); + +/** + * Writes the given string with the given font to the given row and column + * and returns the width of the string. + * + * @param x + * @param y + * @param font + * @param string + * @param bg background color (used only with SPACE_MONO1) + * @param fg foreground color (used only with SPACE_MONO1) + * @return glyph width + */ +width_t tftWriteString(x_t x, y_t y, const __flash Font *font, const char *string, + uint16_t bg, uint16_t fg); + +#endif /* LIBTFT_H */ diff --git a/tft.c b/tft.c index f66ac05..165d7f1 100644 --- a/tft.c +++ b/tft.c @@ -2,267 +2,41 @@ * File: tft.c * Author: torsten.roemer@luniks.net * - * Created on 6. November 2023, 18:45 + * Created on 06.07.2025, 20:26 */ -#include "tft.h" +#include -/** - * Does a hardware reset. - */ -static void hwReset(void) { - PORT_DISP &= ~(1 << PIN_DRST); - _delay_ms(10); - PORT_DISP |= (1 << PIN_DRST); +#include "libtft.h" +#include "pins.h" +#include "spi.h" + +void _tftDelay100() { + _delay_ms(100); } -static void displaySel(void) { +void _tftSel() { PORT_DISP &= ~(1 << PIN_DCS); } -static void displayDes(void) { +void _tftDes() { PORT_DISP |= (1 << PIN_DCS); } -/** - * Sets display to send a command. - */ -static void displaySetCmd(void) { +void _tftSetCmd(void) { PORT_DISP &= ~(1 << PIN_DDC); } -/** - * Sets display to send data. - */ -static void displaySetData(void) { +void _tftSetData(void){ PORT_DISP |= (1 << PIN_DDC); } -/** - * Sends the given command to the display. - * - * @param cmd - */ -static void displayCmd(uint8_t cmd) { - displaySetCmd(); - transmit(cmd); -} - -/** - * Sends the given data to the display. - * - * @param data - */ -static void displayData(uint8_t data) { - displaySetData(); - transmit(data); -} - -/** - * Sets horizontal and/or vertical flip. - * - * @param hflip - * @param vflip - */ -static void madctl(bool hflip, bool vflip) { - // Memory data access control - uint8_t madctl = 0b00110110; - madctl |= (HFLIP << 7); - madctl |= (VFLIP << 6); - madctl |= (BGR << 3); - - if (hflip) { - // Row Address Order (MY) - madctl ^= (1 << 7); - } - if (vflip) { - // Column Address Order (MX) - madctl ^= (1 << 6); - } - - displaySel(); - displayCmd(MADCTL); - displayData(madctl); - displayDes(); -} - -/** - * Sets the given column start and end address. - * - * @param xs start address - * @param xe end address - */ -static void caset(x_t xs, x_t xe) { - displaySel(); - displayCmd(CASET); - displayData(xs >> 8); - displayData(xs); - displayData(xe >> 8); - displayData(xe); - displayDes(); -} - -/** - * Sets the given row start and end address. - * - * @param ys start address - * @param ye end address - */ -static void raset(y_t ys, y_t ye) { - displaySel(); - displayCmd(RASET); - displayData(ys >> 8); - displayData(ys); - displayData(ye >> 8); - displayData(ye); - displayDes(); -} - -void initDisplay(void) { - _delay_ms(100); - - // Hardware reset - hwReset(); - - // TODO necessary? - _delay_ms(10); - - // Software reset - displaySel(); - displayCmd(SWRESET); - displayDes(); - - // TODO necessary? +void _tftReset(void) { + PORT_DISP &= ~(1 << PIN_DRST); _delay_ms(10); - - // Sleep out & booster on - displaySel(); - displayCmd(SLPOUT); - displayDes(); - - // Partial off (Normal) - displaySel(); - displayCmd(NORON); - displayDes(); - - // Display Inversion on/off - displaySel(); - displayCmd(INVOFF + INVERT); // INVOFF + 1 = INVON - displayDes(); - - // Interface pixel format - displaySel(); - displayCmd(COLMOD); - displayData(0b00111101); - displayDes(); - - // Display on - displaySel(); - displayCmd(DISPON); - displayDes(); - - // Sleep in & booster off - // displaySel(); - // displayCmd(SLPIN); - // displayDes(); - - printString("Display init done\r\n"); -} - -void demoDisplay(void) { - // TODO -} - -void drawPixel(x_t x, y_t y, uint16_t color) { - // TODO -} - -void drawCircle(x_t x, y_t y, uint16_t radius, uint16_t color) { - // TODO -} - -void drawRectangle(x_t x, y_t y, width_t width, height_t height, - uint16_t color) { - // TODO -} - -void writeStart(void) { - // Memory write - displaySel(); - displayCmd(RAMWR); - displaySetData(); -} - -void writeRestart(void) { - displaySel(); -} - -void writeByte(uint8_t byte) { - // Memory write - transmit(byte); -} - -void writeEnd(void) { - // Memory write - displayDes(); -} - -void fillArea(x_t x, x_t y, - width_t width, height_t height, - uint16_t color) { - - madctl(false, false); - - // X address start/end - uint16_t xs = x; - uint16_t xe = x + width - 1; - caset(xs, xe); - - // Y address start/end - uint16_t ys = y; - uint16_t ye = y + height - 1; - raset(ys, ye); - - writeStart(); - - bytes_t pixels = (bytes_t)width * (bytes_t)height; - for (bytes_t i = 0; i < pixels; i++) { - transmit(color >> 8); - transmit(color); - } - - writeEnd(); -} - -void setArea(x_t x, y_t y, - width_t width, height_t height, - bool hflip, bool vflip) { - - madctl(hflip, vflip); - - // X address start/end - uint16_t xs = x; - uint16_t xe = x + width - 1; - if (hflip) { - xs = DISPLAY_WIDTH - x - width; - xe = DISPLAY_WIDTH - x - 1; - } - caset(xs, xe); - - // Y address start/end - uint16_t ys = y; - uint16_t ye = y + height - 1; - if (vflip) { - ys = DISPLAY_HEIGHT - y - height; - ye = DISPLAY_HEIGHT - y - 1; - } - raset(ys, ye); + PORT_DISP |= (1 << PIN_DRST); } -void writeData(const __flash uint8_t *bitmap, - width_t width, height_t height, - space_t space, uint16_t bg, uint16_t fg) { - writeStart(); - writeSpace(bitmap, width, height, space, bg, fg); - writeEnd(); -} +uint8_t _tftTx(uint8_t data) { + return transmit(data); +} \ No newline at end of file diff --git a/tft.h b/tft.h deleted file mode 100644 index 390528d..0000000 --- a/tft.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - * File: tft.h - * Author: torsten.roemer@luniks.net - * - * Created on 6. November 2023, 18:45 - */ - -#ifndef TFT_H -#define TFT_H - -#include -#include -#include -#include -#include -#include "types.h" -#include "pins.h" -#include "usart.h" -#include "spi.h" -#include "colorspace.h" - -#define SWRESET 0x01 -#define SLPIN 0x10 -#define SLPOUT 0x11 -#define NORON 0x13 -#define INVOFF 0x20 -#define INVON 0x21 -#define DISPON 0x29 -#define CASET 0x2a -#define RASET 0x2b -#define RAMWR 0x2c -#define MADCTL 0x36 -#define COLMOD 0x3a - -#ifndef DISPLAY_WIDTH - #define DISPLAY_WIDTH 160 -#endif - -#ifndef DISPLAY_HEIGHT - #define DISPLAY_HEIGHT 128 -#endif - -#ifndef BGR - #define BGR 0 -#endif - -#ifndef INVERT - #define INVERT 0 -#endif - -#ifndef HFLIP - #define HFLIP 0 -#endif - -#ifndef VFLIP - #define VFLIP 0 -#endif - -/** - * Initializes the display. - */ -void initDisplay(void); - -/** - * Displays a demo. - */ -void demoDisplay(void); - -/** - * Draws a pixel at given coordinates and color. - * - * @param x - * @param y - * @param color - */ -void drawPixel(x_t x, y_t y, uint16_t color); - -/** - * Draws a circle at given center coordinates, with given radius and color. - * - * @param x - * @param y - * @param radius - * @param color - */ -void drawCircle(x_t x, y_t y, uint16_t radius, uint16_t color); - -/** - * Draws a rectangle at given origin, with given width, height and color. - * - * @param x - * @param y - * @param width - * @param height - * @param color - */ -void drawRectangle(x_t x, y_t y, width_t width, height_t height, - uint16_t color); - -/** - * Sets to write data to display RAM. - */ -void writeStart(void); - -/** - * Restart writing to display after SPI deselecting it. - */ -void writeRestart(void); - -/** - * Writes the given byte to display RAM. - * - * @param byte - */ -void writeByte(uint8_t byte); - -/** - * Completes writing data to display RAM. - */ -void writeEnd(void); - -/** - * Sets the given color in the given area of the display. - * - * @param x in pixels, origin top left - * @param y in pixels, origin top left - * @param width width in pixels - * @param height height in pixels - * @param color 16-Bit (5/6/5) RGB color - */ -void fillArea(x_t x, y_t y, - width_t width, height_t height, - uint16_t color); - -/** - * Sets the area to write image data to. - * - * @param x in pixels, origin top left - * @param y in pixels, origin top left - * @param width width of the bitmap in pixels - * @param height height of the bitmap in pixels - * @param hflip if image should be flipped horizontally - * @param vflip if image should be flipped vertically - */ -void setArea(x_t x, y_t y, - width_t width, height_t height, - bool hflip, bool vflip); - -/** - * Writes image data to the previously set area. - * - * @param bitmap pointer to bitmap data in program memory - * @param width width of the bitmap in pixels - * @param height height of the bitmap in pixels - * @param space color space of the bitmap - * @param bg background color (used only with SPACE_MONO1) - * @param fg foreground color (used only with SPACE_MONO1) - */ -void writeData(const __flash uint8_t *bitmap, - width_t width, height_t height, - space_t space, uint16_t bg, uint16_t fg); - -#endif /* TFT_H */ diff --git a/unifont.c b/unifont.c deleted file mode 100644 index 489a1e2..0000000 --- a/unifont.c +++ /dev/null @@ -1,982 +0,0 @@ -/* - * File: unifont.c - * Author: torsten.roemer@luniks.net - * Unifont is part of the GNU Project: http://savannah.gnu.org/projects/unifont/ - * - * Created on 8. April 2023, 20:52 - */ - -#include -#include "font.h" -#include "unifont.h" -#include "utils.h" - -#define WIDTH 8 -#define HEIGHT 16 - -static const __flash uint8_t SPACE[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t EXCLAMATION_MARK[] = { - 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00}; - -static const __flash uint8_t QUOTATION_MARK[] = { - 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t NUMBER_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x12, 0x12, 0x12, 0x7E, - 0x24, 0x24, 0x7E, 0x48, 0x48, 0x48, 0x00, 0x00}; - -static const __flash uint8_t DOLLAR_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x08, 0x3E, 0x49, 0x48, - 0x38, 0x0E, 0x09, 0x49, 0x3E, 0x08, 0x00, 0x00}; - -static const __flash uint8_t PERCENT_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x31, 0x4A, 0x4A, 0x34, - 0x08, 0x08, 0x16, 0x29, 0x29, 0x46, 0x00, 0x00}; - -static const __flash uint8_t AMPERSAND[] = { - 0x00, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x22, 0x14, - 0x18, 0x29, 0x45, 0x42, 0x46, 0x39, 0x00, 0x00}; - -static const __flash uint8_t APOSTROPHE[] = { - 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t LEFT_PARENTHESIS[] = { - 0x00, 0x00, 0x00, 0x04, 0x08, 0x08, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x00}; - -static const __flash uint8_t RIGHT_PARENTHESIS[] = { - 0x00, 0x00, 0x00, 0x20, 0x10, 0x10, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x00}; - -static const __flash uint8_t ASTERISK[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x49, - 0x2A, 0x1C, 0x2A, 0x49, 0x08, 0x00, 0x00, 0x00}; - -static const __flash uint8_t PLUS_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, - 0x08, 0x7F, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00}; - -static const __flash uint8_t COMMA[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x08, 0x08, 0x10}; - -static const __flash uint8_t HYPHEN_MINUS[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t FULL_STOP[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00}; - -static const __flash uint8_t SOLIDUS[] = { - 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x08, - 0x08, 0x10, 0x10, 0x20, 0x40, 0x40, 0x00, 0x00}; - -static const __flash uint8_t DIGIT_0[] = { - 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x46, - 0x4A, 0x52, 0x62, 0x42, 0x24, 0x18, 0x00, 0x00}; - -static const __flash uint8_t DIGIT_1[] = { - 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x28, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t DIGIT_2[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x02, - 0x0C, 0x10, 0x20, 0x40, 0x40, 0x7E, 0x00, 0x00}; - -static const __flash uint8_t DIGIT_3[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x02, - 0x1C, 0x02, 0x02, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t DIGIT_4[] = { - 0x00, 0x00, 0x00, 0x00, 0x04, 0x0C, 0x14, 0x24, - 0x44, 0x44, 0x7E, 0x04, 0x04, 0x04, 0x00, 0x00}; - -static const __flash uint8_t DIGIT_5[] = { - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, - 0x7C, 0x02, 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t DIGIT_6[] = { - 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x40, 0x40, - 0x7C, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t DIGIT_7[] = { - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x02, 0x02, 0x04, - 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00}; - -static const __flash uint8_t DIGIT_8[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, - 0x3C, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t DIGIT_9[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, - 0x3E, 0x02, 0x02, 0x02, 0x04, 0x38, 0x00, 0x00}; - -static const __flash uint8_t COLON[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, - 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00}; - -static const __flash uint8_t SEMICOLON[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, - 0x00, 0x00, 0x00, 0x18, 0x08, 0x08, 0x10, 0x00}; - -static const __flash uint8_t LESS_THAN_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x08, - 0x10, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00}; - -static const __flash uint8_t EQUALS_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, - 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t GREATER_THAN_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x10, - 0x08, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00}; - -static const __flash uint8_t QUESTION_MARK[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x02, - 0x04, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00}; - -static const __flash uint8_t COMMERCIAL_AT[] = { - 0x00, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x4A, 0x56, - 0x52, 0x52, 0x52, 0x4E, 0x20, 0x1E, 0x00, 0x00}; - -static const __flash uint8_t A[] = { - 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x42, - 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t B[] = { - 0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, - 0x7C, 0x42, 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00}; - -static const __flash uint8_t C[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x40, - 0x40, 0x40, 0x40, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t D[] = { - 0x00, 0x00, 0x00, 0x00, 0x78, 0x44, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x44, 0x78, 0x00, 0x00}; - -static const __flash uint8_t E[] = { - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, - 0x7C, 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00}; - -static const __flash uint8_t F[] = { - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, - 0x7C, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00}; - -static const __flash uint8_t G[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x40, - 0x40, 0x4E, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t H[] = { - 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, - 0x7E, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t I[] = { - 0x00, 0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t J[] = { - 0x00, 0x00, 0x00, 0x00, 0x1F, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x44, 0x44, 0x38, 0x00, 0x00}; - -static const __flash uint8_t K[] = { - 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, 0x48, 0x50, - 0x60, 0x60, 0x50, 0x48, 0x44, 0x42, 0x00, 0x00}; - -static const __flash uint8_t L[] = { - 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00}; - -static const __flash uint8_t M[] = { - 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x66, 0x66, - 0x5A, 0x5A, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t N[] = { - 0x00, 0x00, 0x00, 0x00, 0x42, 0x62, 0x62, 0x52, - 0x52, 0x4A, 0x4A, 0x46, 0x46, 0x42, 0x00, 0x00}; - -static const __flash uint8_t O[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t P[] = { - 0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, - 0x7C, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00}; - -static const __flash uint8_t Q[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x5A, 0x66, 0x3C, 0x03, 0x00}; - -static const __flash uint8_t R[] = { - 0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, - 0x7C, 0x48, 0x44, 0x44, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t S[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x40, - 0x30, 0x0C, 0x02, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t T[] = { - 0x00, 0x00, 0x00, 0x00, 0x7F, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00}; - -static const __flash uint8_t U[] = { - 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t V[] = { - 0x00, 0x00, 0x00, 0x00, 0x41, 0x41, 0x41, 0x22, - 0x22, 0x22, 0x14, 0x14, 0x08, 0x08, 0x00, 0x00}; - -static const __flash uint8_t W[] = { - 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, - 0x5A, 0x5A, 0x66, 0x66, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t X[] = { - 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x24, 0x24, - 0x18, 0x18, 0x24, 0x24, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t Y[] = { - 0x00, 0x00, 0x00, 0x00, 0x41, 0x41, 0x22, 0x22, - 0x14, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00}; - -static const __flash uint8_t Z[] = { - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x02, 0x02, 0x04, - 0x08, 0x10, 0x20, 0x40, 0x40, 0x7E, 0x00, 0x00}; - -static const __flash uint8_t LEFT_SQUARE_BRACKET[] = { - 0x00, 0x00, 0x00, 0x0E, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0E, 0x00}; - -static const __flash uint8_t REVERSE_SOLIDUS[] = { - 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x20, 0x10, - 0x10, 0x08, 0x08, 0x04, 0x02, 0x02, 0x00, 0x00}; - -static const __flash uint8_t RIGHT_SQUARE_BRACKET[] = { - 0x00, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x70, 0x00}; - -static const __flash uint8_t CIRCUMFLEX_ACCENT[] = { - 0x00, 0x00, 0x18, 0x24, 0x42, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t LOW_LINE[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00}; - -static const __flash uint8_t GRAVE_ACCENT[] = { - 0x00, 0x20, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t a[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x02, 0x3E, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t b[] = { - 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x5C, 0x62, - 0x42, 0x42, 0x42, 0x42, 0x62, 0x5C, 0x00, 0x00}; - -static const __flash uint8_t c[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x40, 0x40, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t d[] = { - 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x3A, 0x46, - 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t e[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x7E, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t f[] = { - 0x00, 0x00, 0x00, 0x0C, 0x10, 0x10, 0x10, 0x7C, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00}; - -static const __flash uint8_t g[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3A, 0x44, - 0x44, 0x44, 0x38, 0x20, 0x3C, 0x42, 0x42, 0x3C}; - -static const __flash uint8_t h[] = { - 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x5C, 0x62, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t i[] = { - 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t j[] = { - 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0C, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x48, 0x30}; - -static const __flash uint8_t k[] = { - 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x44, 0x48, - 0x50, 0x60, 0x50, 0x48, 0x44, 0x42, 0x00, 0x00}; - -static const __flash uint8_t l[] = { - 0x00, 0x00, 0x00, 0x18, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t m[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x00, 0x00}; - -static const __flash uint8_t n[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x62, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t o[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t p[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x62, - 0x42, 0x42, 0x42, 0x42, 0x62, 0x5C, 0x40, 0x40}; - -static const __flash uint8_t q[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x46, - 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x02, 0x02}; - -static const __flash uint8_t r[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x62, - 0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00}; - -static const __flash uint8_t s[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x40, 0x30, 0x0C, 0x02, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t t[] = { - 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x7C, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x00, 0x00}; - -static const __flash uint8_t u[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t v[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x24, 0x24, 0x24, 0x18, 0x18, 0x00, 0x00}; - -static const __flash uint8_t w[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00}; - -static const __flash uint8_t x[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, - 0x24, 0x18, 0x18, 0x24, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t y[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x02, 0x3C}; - -static const __flash uint8_t z[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x02, - 0x04, 0x08, 0x10, 0x20, 0x40, 0x7E, 0x00, 0x00}; - -static const __flash uint8_t LEFT_CURLY_BRACKET[] = { - 0x00, 0x00, 0x00, 0x0C, 0x10, 0x10, 0x08, 0x08, - 0x10, 0x20, 0x10, 0x08, 0x08, 0x10, 0x10, 0x0C}; - -static const __flash uint8_t VERTICAL_LINE[] = { - 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}; - -static const __flash uint8_t RIGHT_CURLY_BRACKET[] = { - 0x00, 0x00, 0x00, 0x30, 0x08, 0x08, 0x10, 0x10, - 0x08, 0x04, 0x08, 0x10, 0x10, 0x08, 0x08, 0x30}; - -static const __flash uint8_t TILDE[] = { - 0x00, 0x00, 0x00, 0x31, 0x49, 0x46, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t INVERTED_EXCLAMATION_MARK[] = { - 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00}; - -static const __flash uint8_t CENT_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x3E, 0x49, - 0x48, 0x48, 0x49, 0x3E, 0x08, 0x08, 0x00, 0x00}; - -static const __flash uint8_t POUND_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x10, 0x10, - 0x7C, 0x10, 0x10, 0x10, 0x3E, 0x61, 0x00, 0x00}; - -static const __flash uint8_t CURRENCY_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3C, 0x24, - 0x42, 0x42, 0x24, 0x3C, 0x42, 0x00, 0x00, 0x00}; - -static const __flash uint8_t YEN_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, - 0x7F, 0x08, 0x7F, 0x08, 0x08, 0x08, 0x00, 0x00}; - -static const __flash uint8_t BROKEN_BAR[] = { - 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, - 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00}; - -static const __flash uint8_t SECTION_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x3C, - 0x42, 0x42, 0x3C, 0x02, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t DIAERESIS[] = { - 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t COPYRIGHT_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x99, 0xA5, - 0xA1, 0xA1, 0xA5, 0x99, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t FEMININE_ORDINAL_INDICATOR[] = { - 0x00, 0x00, 0x1C, 0x02, 0x1E, 0x22, 0x1E, 0x00, - 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x12, 0x24, - 0x24, 0x48, 0x24, 0x24, 0x12, 0x12, 0x00, 0x00}; - -static const __flash uint8_t NOT_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7E, 0x02, 0x02, 0x02, 0x00, 0x00}; - -static const __flash uint8_t REGISTERED_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0xB9, 0xA5, - 0xA5, 0xB9, 0xA9, 0xA5, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t MACRON[] = { - 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t DEGREE_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t PLUS_MINUS_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x7F, - 0x08, 0x08, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00}; - -static const __flash uint8_t SUPERSCRIPT_TWO[] = { - 0x00, 0x00, 0x00, 0x38, 0x44, 0x04, 0x18, 0x20, - 0x40, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t SUPERSCRIPT_THREE[] = { - 0x00, 0x00, 0x00, 0x38, 0x44, 0x04, 0x38, 0x04, - 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t ACUTE_ACCENT[] = { - 0x00, 0x04, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t MICRO_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x66, 0x59, 0x40, 0x80}; - -static const __flash uint8_t PILCROW_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7A, 0x7A, 0x7A, - 0x3A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00}; - -static const __flash uint8_t MIDDLE_DOT[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t CEDILLA[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30}; - -static const __flash uint8_t SUPERSCRIPT_ONE[] = { - 0x00, 0x00, 0x00, 0x10, 0x30, 0x50, 0x10, 0x10, - 0x10, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t MASCULINE_ORDINAL_INDICATOR[] = { - 0x00, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00, - 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x48, 0x24, - 0x24, 0x12, 0x24, 0x24, 0x48, 0x48, 0x00, 0x00}; - -static const __flash uint8_t VULGAR_FRACTION_ONE_QUARTER[] = { - 0x00, 0x00, 0x00, 0x00, 0x22, 0x62, 0x24, 0x28, - 0x28, 0x12, 0x16, 0x2A, 0x4E, 0x42, 0x00, 0x00}; - -static const __flash uint8_t VULGAR_FRACTION_ONE_HALF[] = { - 0x00, 0x00, 0x00, 0x00, 0x22, 0x62, 0x24, 0x28, - 0x28, 0x14, 0x1A, 0x22, 0x44, 0x4E, 0x00, 0x00}; - -static const __flash uint8_t VULGAR_FRACTION_THREE_QUARTERS[] = { - 0x00, 0x00, 0x00, 0x00, 0x62, 0x12, 0x24, 0x18, - 0x68, 0x12, 0x16, 0x2A, 0x4E, 0x42, 0x00, 0x00}; - -static const __flash uint8_t INVERTED_QUESTION_MARK[] = { - 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, - 0x10, 0x20, 0x40, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t A_GRAVE[] = { - 0x30, 0x0C, 0x00, 0x00, 0x18, 0x24, 0x24, 0x42, - 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t A_ACUTE[] = { - 0x0C, 0x30, 0x00, 0x00, 0x18, 0x24, 0x24, 0x42, - 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t A_CIRCUMFLEX[] = { - 0x18, 0x24, 0x00, 0x00, 0x18, 0x24, 0x24, 0x42, - 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t A_TILDE[] = { - 0x32, 0x4C, 0x00, 0x00, 0x18, 0x24, 0x24, 0x42, - 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t A_DIAERESIS[] = { - 0x24, 0x24, 0x00, 0x00, 0x18, 0x24, 0x24, 0x42, - 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t A_RING[] = { - 0x18, 0x24, 0x18, 0x00, 0x18, 0x24, 0x24, 0x42, - 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t AE[] = { - 0x00, 0x00, 0x00, 0x00, 0x1F, 0x28, 0x48, 0x48, - 0x7F, 0x48, 0x48, 0x48, 0x48, 0x4F, 0x00, 0x00}; - -static const __flash uint8_t C_CEDILLA[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x40, - 0x40, 0x40, 0x40, 0x42, 0x42, 0x3C, 0x08, 0x30}; - -static const __flash uint8_t E_GRAVE[] = { - 0x30, 0x0C, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, - 0x7C, 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00}; - -static const __flash uint8_t E_ACUTE[] = { - 0x0C, 0x30, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, - 0x7C, 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00}; - -static const __flash uint8_t E_CIRCUMFLEX[] = { - 0x18, 0x24, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, - 0x7C, 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00}; - -static const __flash uint8_t E_DIAERESIS[] = { - 0x24, 0x24, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, - 0x7C, 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00}; - -static const __flash uint8_t I_GRAVE[] = { - 0x18, 0x06, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t I_ACUTE[] = { - 0x0C, 0x30, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t I_CIRCUMFLEX[] = { - 0x18, 0x24, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t I_DIAERESIS[] = { - 0x24, 0x24, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t ETH[] = { - 0x00, 0x00, 0x00, 0x00, 0x78, 0x44, 0x42, 0x42, - 0xF2, 0x42, 0x42, 0x42, 0x44, 0x78, 0x00, 0x00}; - -static const __flash uint8_t N_TILDE[] = { - 0x32, 0x4C, 0x00, 0x00, 0x42, 0x62, 0x62, 0x52, - 0x52, 0x4A, 0x4A, 0x46, 0x46, 0x42, 0x00, 0x00}; - -static const __flash uint8_t O_GRAVE[] = { - 0x30, 0x0C, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t O_ACUTE[] = { - 0x0C, 0x30, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t O_CIRCUMFLEX[] = { - 0x18, 0x24, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t O_TILDE[] = { - 0x32, 0x4C, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t O_DIAERESIS[] = { - 0x24, 0x24, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t MULTIPLICATION_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, - 0x24, 0x18, 0x24, 0x42, 0x00, 0x00, 0x00, 0x00}; - -static const __flash uint8_t O_STROKE[] = { - 0x00, 0x00, 0x00, 0x02, 0x3A, 0x44, 0x46, 0x4A, - 0x4A, 0x52, 0x52, 0x62, 0x22, 0x5C, 0x40, 0x00}; - -static const __flash uint8_t U_GRAVE[] = { - 0x30, 0x0C, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t U_ACUTE[] = { - 0x0C, 0x30, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t U_CIRCUMFLEX[] = { - 0x18, 0x24, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t U_DIAERESIS[] = { - 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t Y_ACUTE[] = { - 0x0C, 0x30, 0x00, 0x00, 0x41, 0x41, 0x22, 0x22, - 0x14, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00}; - -static const __flash uint8_t THORN[] = { - 0x00, 0x00, 0x00, 0x40, 0x40, 0x78, 0x44, 0x42, - 0x42, 0x44, 0x78, 0x40, 0x40, 0x40, 0x00, 0x00}; - -static const __flash uint8_t SHARP_S[] = { - 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x48, - 0x58, 0x44, 0x42, 0x42, 0x52, 0x4C, 0x00, 0x00}; - -static const __flash uint8_t a_grave[] = { - 0x00, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x3C, 0x42, - 0x02, 0x3E, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t a_acute[] = { - 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x3C, 0x42, - 0x02, 0x3E, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t a_circumflex[] = { - 0x00, 0x00, 0x18, 0x24, 0x00, 0x00, 0x3C, 0x42, - 0x02, 0x3E, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t a_tilde[] = { - 0x00, 0x00, 0x32, 0x4C, 0x00, 0x00, 0x3C, 0x42, - 0x02, 0x3E, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t a_diaeresis[] = { - 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x3C, 0x42, - 0x02, 0x3E, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t a_ring[] = { - 0x00, 0x18, 0x24, 0x18, 0x00, 0x00, 0x3C, 0x42, - 0x02, 0x3E, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t ae[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x49, - 0x09, 0x3F, 0x48, 0x48, 0x49, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t c_cedilla[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x40, 0x40, 0x40, 0x40, 0x42, 0x3C, 0x08, 0x30}; - -static const __flash uint8_t e_grave[] = { - 0x00, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x7E, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t e_acute[] = { - 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x7E, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t e_circumflex[] = { - 0x00, 0x00, 0x18, 0x24, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x7E, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t e_diaeresis[] = { - 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x7E, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t i_grave[] = { - 0x00, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x18, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t i_acute[] = { - 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x18, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t i_circumflex[] = { - 0x00, 0x00, 0x18, 0x24, 0x00, 0x00, 0x18, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t i_diaeresis[] = { - 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}; - -static const __flash uint8_t eth[] = { - 0x00, 0x00, 0x32, 0x0C, 0x14, 0x22, 0x02, 0x3E, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t n_tilde[] = { - 0x00, 0x00, 0x32, 0x4C, 0x00, 0x00, 0x5C, 0x62, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00}; - -static const __flash uint8_t o_grave[] = { - 0x00, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t o_acute[] = { - 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t o_circumflex[] = { - 0x00, 0x00, 0x18, 0x24, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t o_tilde[] = { - 0x00, 0x00, 0x32, 0x4C, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t o_diaeresis[] = { - 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}; - -static const __flash uint8_t DIVISION_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, - 0x00, 0x7E, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00}; - -static const __flash uint8_t o_stroke[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3C, 0x46, - 0x4A, 0x4A, 0x52, 0x52, 0x62, 0x3C, 0x40, 0x00}; - -static const __flash uint8_t u_grave[] = { - 0x00, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t u_acute[] = { - 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t u_circumflex[] = { - 0x00, 0x00, 0x18, 0x24, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t u_diaeresis[] = { - 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00}; - -static const __flash uint8_t y_acute[] = { - 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x02, 0x3C}; - -static const __flash uint8_t thorn[] = { - 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x5C, 0x62, - 0x42, 0x42, 0x42, 0x42, 0x62, 0x5C, 0x40, 0x40}; - -static const __flash uint8_t y_diaeresis[] = { - 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x02, 0x3C}; - -static const __flash uint8_t SMILING_FACE[] = { - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x81, 0xA5, - 0x81, 0xA5, 0x99, 0x42, 0x3C, 0x00, 0x00, 0x00}; - -/* -static const __flash uint8_t YIN_YANG[] = { - 0x07, 0xE0, 0x18, 0x18, 0x20, 0x04, 0x40, 0x02, - 0x40, 0x02, 0x9C, 0x31, 0xBE, 0x31, 0xFF, 0x03, - 0xE7, 0x83, 0xE7, 0xC7, 0xFF, 0xFF, 0x7F, 0xFE, - 0x7F, 0xFE, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0 -}; - */ - -static const __flash Glyph glyphs[] = { - // bell (\a) maps to SMILING_FACE - {0x0007, WIDTH, SMILING_FACE}, - {0x0020, WIDTH, SPACE}, - {0x0021, WIDTH, EXCLAMATION_MARK}, - {0x0022, WIDTH, QUOTATION_MARK}, - {0x0023, WIDTH, NUMBER_SIGN}, - {0x0024, WIDTH, DOLLAR_SIGN}, - {0x0025, WIDTH, PERCENT_SIGN}, - {0x0026, WIDTH, AMPERSAND}, - {0x0027, WIDTH, APOSTROPHE}, - {0x0028, WIDTH, LEFT_PARENTHESIS}, - {0x0029, WIDTH, RIGHT_PARENTHESIS}, - {0x002a, WIDTH, ASTERISK}, - {0x002b, WIDTH, PLUS_SIGN}, - {0x002c, WIDTH, COMMA}, - {0x002d, WIDTH, HYPHEN_MINUS}, - {0x002e, WIDTH, FULL_STOP}, - {0x002f, WIDTH, SOLIDUS}, - {0x0030, WIDTH, DIGIT_0}, - {0x0031, WIDTH, DIGIT_1}, - {0x0032, WIDTH, DIGIT_2}, - {0x0033, WIDTH, DIGIT_3}, - {0x0034, WIDTH, DIGIT_4}, - {0x0035, WIDTH, DIGIT_5}, - {0x0036, WIDTH, DIGIT_6}, - {0x0037, WIDTH, DIGIT_7}, - {0x0038, WIDTH, DIGIT_8}, - {0x0039, WIDTH, DIGIT_9}, - {0x003a, WIDTH, COLON}, - {0x003b, WIDTH, SEMICOLON}, - {0x003c, WIDTH, LESS_THAN_SIGN}, - {0x003d, WIDTH, EQUALS_SIGN}, - {0x003e, WIDTH, GREATER_THAN_SIGN}, - {0x003f, WIDTH, QUESTION_MARK}, - {0x0040, WIDTH, COMMERCIAL_AT}, - {0x0041, WIDTH, A}, - {0x0042, WIDTH, B}, - {0x0043, WIDTH, C}, - {0x0044, WIDTH, D}, - {0x0045, WIDTH, E}, - {0x0046, WIDTH, F}, - {0x0047, WIDTH, G}, - {0x0048, WIDTH, H}, - {0x0049, WIDTH, I}, - {0x004a, WIDTH, J}, - {0x004b, WIDTH, K}, - {0x004c, WIDTH, L}, - {0x004d, WIDTH, M}, - {0x004e, WIDTH, N}, - {0x004f, WIDTH, O}, - {0x0050, WIDTH, P}, - {0x0051, WIDTH, Q}, - {0x0052, WIDTH, R}, - {0x0053, WIDTH, S}, - {0x0054, WIDTH, T}, - {0x0055, WIDTH, U}, - {0x0056, WIDTH, V}, - {0x0057, WIDTH, W}, - {0x0058, WIDTH, X}, - {0x0059, WIDTH, Y}, - {0x005a, WIDTH, Z}, - {0x005b, WIDTH, LEFT_SQUARE_BRACKET}, - {0x005c, WIDTH, REVERSE_SOLIDUS}, - {0x005d, WIDTH, RIGHT_SQUARE_BRACKET}, - {0x005e, WIDTH, CIRCUMFLEX_ACCENT}, - {0x005f, WIDTH, LOW_LINE}, - {0x0060, WIDTH, GRAVE_ACCENT}, - {0x0061, WIDTH, a}, - {0x0062, WIDTH, b}, - {0x0063, WIDTH, c}, - {0x0064, WIDTH, d}, - {0x0065, WIDTH, e}, - {0x0066, WIDTH, f}, - {0x0067, WIDTH, g}, - {0x0068, WIDTH, h}, - {0x0069, WIDTH, i}, - {0x006a, WIDTH, j}, - {0x006b, WIDTH, k}, - {0x006c, WIDTH, l}, - {0x006d, WIDTH, m}, - {0x006e, WIDTH, n}, - {0x006f, WIDTH, o}, - {0x0070, WIDTH, p}, - {0x0071, WIDTH, q}, - {0x0072, WIDTH, r}, - {0x0073, WIDTH, s}, - {0x0074, WIDTH, t}, - {0x0075, WIDTH, u}, - {0x0076, WIDTH, v}, - {0x0077, WIDTH, w}, - {0x0078, WIDTH, x}, - {0x0079, WIDTH, y}, - {0x007a, WIDTH, z}, - {0x007b, WIDTH, LEFT_CURLY_BRACKET}, - {0x007c, WIDTH, VERTICAL_LINE}, - {0x007d, WIDTH, RIGHT_CURLY_BRACKET}, - {0x007e, WIDTH, TILDE}, - // skipped NO-BREAK SPACE - {0x00a1, WIDTH, INVERTED_EXCLAMATION_MARK}, - {0x00a2, WIDTH, CENT_SIGN}, - {0x00a3, WIDTH, POUND_SIGN}, - {0x00a4, WIDTH, CURRENCY_SIGN}, - {0x00a5, WIDTH, YEN_SIGN}, - {0x00a6, WIDTH, BROKEN_BAR}, - {0x00a7, WIDTH, SECTION_SIGN}, - {0x00a8, WIDTH, DIAERESIS}, - {0x00a9, WIDTH, COPYRIGHT_SIGN}, - {0x00aa, WIDTH, FEMININE_ORDINAL_INDICATOR}, - {0x00ab, WIDTH, LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK}, - {0x00ac, WIDTH, NOT_SIGN}, - // skipped SOFT HYPHEN - {0x00ae, WIDTH, REGISTERED_SIGN}, - {0x00af, WIDTH, MACRON}, - {0x00b0, WIDTH, DEGREE_SIGN}, - {0x00b1, WIDTH, PLUS_MINUS_SIGN}, - {0x00b2, WIDTH, SUPERSCRIPT_TWO}, - {0x00b3, WIDTH, SUPERSCRIPT_THREE}, - {0x00b4, WIDTH, ACUTE_ACCENT}, - {0x00b5, WIDTH, MICRO_SIGN}, - {0x00b6, WIDTH, PILCROW_SIGN}, - {0x00b7, WIDTH, MIDDLE_DOT}, - {0x00b8, WIDTH, CEDILLA}, - {0x00b9, WIDTH, SUPERSCRIPT_ONE}, - {0x00ba, WIDTH, MASCULINE_ORDINAL_INDICATOR}, - {0x00bb, WIDTH, RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK}, - {0x00bc, WIDTH, VULGAR_FRACTION_ONE_QUARTER}, - {0x00bd, WIDTH, VULGAR_FRACTION_ONE_HALF}, - {0x00be, WIDTH, VULGAR_FRACTION_THREE_QUARTERS}, - {0x00bf, WIDTH, INVERTED_QUESTION_MARK}, - {0x00c0, WIDTH, A_GRAVE}, - {0x00c1, WIDTH, A_ACUTE}, - {0x00c2, WIDTH, A_CIRCUMFLEX}, - {0x00c3, WIDTH, A_TILDE}, - {0x00c4, WIDTH, A_DIAERESIS}, - {0x00c5, WIDTH, A_RING}, - {0x00c6, WIDTH, AE}, - {0x00c7, WIDTH, C_CEDILLA}, - {0x00c8, WIDTH, E_GRAVE}, - {0x00c9, WIDTH, E_ACUTE}, - {0x00ca, WIDTH, E_CIRCUMFLEX}, - {0x00cb, WIDTH, E_DIAERESIS}, - {0x00cc, WIDTH, I_GRAVE}, - {0x00cd, WIDTH, I_ACUTE}, - {0x00ce, WIDTH, I_CIRCUMFLEX}, - {0x00cf, WIDTH, I_DIAERESIS}, - {0x00d0, WIDTH, ETH}, - {0x00d1, WIDTH, N_TILDE}, - {0x00d2, WIDTH, O_GRAVE}, - {0x00d3, WIDTH, O_ACUTE}, - {0x00d4, WIDTH, O_CIRCUMFLEX}, - {0x00d5, WIDTH, O_TILDE}, - {0x00d6, WIDTH, O_DIAERESIS}, - {0x00d7, WIDTH, MULTIPLICATION_SIGN}, - {0x00d8, WIDTH, O_STROKE}, - {0x00d9, WIDTH, U_GRAVE}, - {0x00da, WIDTH, U_ACUTE}, - {0x00db, WIDTH, U_CIRCUMFLEX}, - {0x00dc, WIDTH, U_DIAERESIS}, - {0x00dd, WIDTH, Y_ACUTE}, - {0x00de, WIDTH, THORN}, - {0x00df, WIDTH, SHARP_S}, - {0x00e0, WIDTH, a_grave}, - {0x00e1, WIDTH, a_acute}, - {0x00e2, WIDTH, a_circumflex}, - {0x00e3, WIDTH, a_tilde}, - {0x00e4, WIDTH, a_diaeresis}, - {0x00e5, WIDTH, a_ring}, - {0x00e6, WIDTH, ae}, - {0x00e7, WIDTH, c_cedilla}, - {0x00e8, WIDTH, e_grave}, - {0x00e9, WIDTH, e_acute}, - {0x00ea, WIDTH, e_circumflex}, - {0x00eb, WIDTH, e_diaeresis}, - {0x00ec, WIDTH, i_grave}, - {0x00ed, WIDTH, i_acute}, - {0x00ee, WIDTH, i_circumflex}, - {0x00ef, WIDTH, i_diaeresis}, - {0x00f0, WIDTH, eth}, - {0x00f1, WIDTH, n_tilde}, - {0x00f2, WIDTH, o_grave}, - {0x00f3, WIDTH, o_acute}, - {0x00f4, WIDTH, o_circumflex}, - {0x00f5, WIDTH, o_tilde}, - {0x00f6, WIDTH, o_diaeresis}, - {0x00f7, WIDTH, DIVISION_SIGN}, - {0x00f8, WIDTH, o_stroke}, - {0x00f9, WIDTH, u_grave}, - {0x00fa, WIDTH, u_acute}, - {0x00fb, WIDTH, u_circumflex}, - {0x00fc, WIDTH, u_diaeresis}, - {0x00fd, WIDTH, y_acute}, - {0x00fe, WIDTH, thorn}, - {0x00ff, WIDTH, y_diaeresis} -}; - -const __flash Font unifontFont = {glyphs, array_length(glyphs), HEIGHT, SPACE_MONO1}; diff --git a/unifont.h b/unifont.h index 305edfe..0850793 100644 --- a/unifont.h +++ b/unifont.h @@ -10,7 +10,6 @@ #define UNIFONT_H #include "font.h" -#include "colorspace.h" /** * Unifont font. From 2bef3b806b985efbfba48d8c03c32c692bc21046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20R=C3=B6mer?= Date: Mon, 7 Jul 2025 00:16:40 +0200 Subject: [PATCH 2/3] Add Tux to the display as bitmap example --- Makefile | 4 +- avrrfm.c | 1 + bitmaps.c | 79 ++++++++++++++++++++++++++++++ dejavu.c | 92 +++++++++++++++++------------------ libtft.a | Bin 162126 -> 163074 bytes nbproject/Makefile-Custom.mk | 47 +++++------------- nbproject/configurations.xml | 21 ++------ 7 files changed, 141 insertions(+), 103 deletions(-) create mode 100644 bitmaps.c diff --git a/Makefile b/Makefile index 2427271..abb9347 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ PROGRAMMER_ARGS = -B 125kHz # Supported RFM radio module variants: 69 and 95 RFM = 95 # LoRa available only with RFM95 -LORA = 0 +LORA = 1 # Display dimensions DISPLAY_WIDTH = 320 @@ -34,7 +34,7 @@ override LORA = 1 endif MAIN = avrrfm.c -SRC = dejavu.c i2c.c mcp9808.c spi.c usart.c rfm.c tft.c sdc.c +SRC = bitmaps.c dejavu.c i2c.c mcp9808.c spi.c usart.c rfm.c tft.c sdc.c CC = avr-gcc OBJCOPY = avr-objcopy diff --git a/avrrfm.c b/avrrfm.c index 03419c6..e4b5681 100644 --- a/avrrfm.c +++ b/avrrfm.c @@ -386,6 +386,7 @@ int main(void) { tftInit(DISPLAY_WIDTH, DISPLAY_HEIGHT, HFLIP, VFLIP, BGR, INVERT); tftSetFrame(WHITE); tftFillArea(0, 0, DISPLAY_WIDTH, 16, BLACK); + tftWriteBitmap(0, 176, 0, 0xffff, 0x0000); // initial rx mode if (radio) { if (LORA) { diff --git a/bitmaps.c b/bitmaps.c new file mode 100644 index 0000000..68bb7a7 --- /dev/null +++ b/bitmaps.c @@ -0,0 +1,79 @@ +/* + * File: bitmaps.c + * Author: torsten.roemer@luniks.net + * + * Created on 06/07/2023, 23:28 + */ + +#include "font.h" + +const __flash uint8_t TUX_DATA[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xff, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xf9, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0xf0, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x60, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x66, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x0b, 0x6e, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x0b, 0x06, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x02, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x04, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x0b, 0x10, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x19, 0xe0, 0x3e, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x1f, 0x80, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x1f, 0xc0, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x1f, 0xc0, 0x00, + 0x00, 0x01, 0xe0, 0x00, 0x0f, 0xe0, 0x00, + 0x00, 0x03, 0xe0, 0x00, 0x0f, 0xf0, 0x00, + 0x00, 0x03, 0xc0, 0x00, 0x07, 0xf0, 0x00, + 0x00, 0x03, 0xc0, 0x00, 0x07, 0x78, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x03, 0x78, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x03, 0xbc, 0x00, + 0x00, 0x0f, 0x80, 0x00, 0x03, 0xbc, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x03, 0xbc, 0x00, + 0x00, 0x1f, 0x00, 0x00, 0x03, 0xbc, 0x00, + 0x00, 0x1f, 0x00, 0x00, 0x03, 0xbe, 0x00, + 0x00, 0x3f, 0x00, 0x00, 0x03, 0xbe, 0x00, + 0x00, 0x3b, 0x00, 0x00, 0x02, 0x3e, 0x00, + 0x00, 0x3d, 0x00, 0x00, 0x01, 0xfe, 0x00, + 0x00, 0x26, 0x00, 0x00, 0x03, 0xfe, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x07, 0xfe, 0x00, + 0x00, 0x01, 0xc0, 0x00, 0x03, 0xf9, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x01, 0xf1, 0x00, + 0x00, 0x40, 0x70, 0x00, 0x00, 0xe1, 0x00, + 0x06, 0x00, 0x78, 0x00, 0x00, 0x01, 0x00, + 0x08, 0x00, 0x3c, 0x00, 0x08, 0x01, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x08, 0x00, 0x80, + 0x04, 0x00, 0x1c, 0x00, 0x08, 0x00, 0x20, + 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, + 0x04, 0x00, 0x08, 0x00, 0x68, 0x00, 0x10, + 0x00, 0x00, 0x04, 0x00, 0xe8, 0x00, 0x60, + 0x08, 0x00, 0x05, 0x03, 0xf8, 0x01, 0x80, + 0x08, 0x00, 0x05, 0xff, 0xf8, 0x06, 0x00, + 0x07, 0x00, 0x07, 0xff, 0xf8, 0x08, 0x00, + 0x00, 0x38, 0x06, 0x00, 0x18, 0x30, 0x00, + 0x00, 0x03, 0x0c, 0x00, 0x0c, 0x60, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x07, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const __flash Bitmap bitmaps[] = { + {56, 64, SPACE_MONO1, TUX_DATA} +}; \ No newline at end of file diff --git a/dejavu.c b/dejavu.c index df07eac..fb86c2c 100644 --- a/dejavu.c +++ b/dejavu.c @@ -1,4 +1,4 @@ -/* +/* * File: dejavu.c * Author: torsten.roemer@luniks.net * https://dejavu-fonts.github.io/License.html @@ -6,33 +6,31 @@ * Created on 23. April 2023, 18:41 */ -#include -#include "font.h" #include "dejavu.h" #include "utils.h" #define HEIGHT 56 static const __flash uint8_t SPACE[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -86,33 +84,33 @@ static const __flash uint8_t NUMBER_SIGN[] = { }; static const __flash uint8_t PERCENT_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, - 0x03, 0xfe, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, + 0x03, 0xfe, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x0f, 0x07, 0x80, 0x00, 0x0e, 0x03, 0x80, 0x00, - 0x1c, 0x01, 0xc0, 0x00, 0x1c, 0x01, 0xc0, 0x00, 0x1c, 0x01, 0xc0, 0x00, 0x1c, 0x01, 0xc0, 0x00, - 0x1c, 0x01, 0xc0, 0x00, 0x0e, 0x03, 0x80, 0x00, + 0x1c, 0x01, 0xc0, 0x00, 0x1c, 0x01, 0xc0, 0x00, + 0x1c, 0x01, 0xc0, 0x00, 0x0e, 0x03, 0x80, 0x00, 0x0f, 0x07, 0x80, 0x18, 0x07, 0xff, 0x00, 0xf8, - 0x03, 0xfe, 0x03, 0xf0, 0x00, 0xf8, 0x1f, 0xc0, + 0x03, 0xfe, 0x03, 0xf0, 0x00, 0xf8, 0x1f, 0xc0, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x03, 0xf8, 0x00, - 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x3f, 0x00, 0x00, + 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xf8, 0x0f, 0x80, 0x07, 0xe0, 0x3f, 0xe0, - 0x0f, 0x80, 0x7f, 0xf0, 0x04, 0x00, 0xf0, 0x78, + 0x0f, 0x80, 0x7f, 0xf0, 0x04, 0x00, 0xf0, 0x78, 0x00, 0x00, 0xe0, 0x38, 0x00, 0x01, 0xc0, 0x1c, - 0x00, 0x01, 0xc0, 0x1c, 0x00, 0x01, 0xc0, 0x1c, 0x00, 0x01, 0xc0, 0x1c, 0x00, 0x01, 0xc0, 0x1c, - 0x00, 0x00, 0xe0, 0x38, 0x00, 0x00, 0xf0, 0x78, + 0x00, 0x01, 0xc0, 0x1c, 0x00, 0x01, 0xc0, 0x1c, + 0x00, 0x00, 0xe0, 0x38, 0x00, 0x00, 0xf0, 0x78, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 0x3f, 0xe0, - 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -141,25 +139,25 @@ static const __flash uint8_t ASTERISK[] = { }; static const __flash uint8_t PLUS_SIGN[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, + 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, - 0x00, 0x00, 0x3c, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x3c, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, + 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, + 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -182,25 +180,25 @@ static const __flash uint8_t COMMA[] = { }; static const __flash uint8_t HYPHEN_MINUS[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x03, 0xff, 0xc0, - 0x03, 0xff, 0xc0, 0x03, 0xff, 0xc0, 0x00, 0x00, + 0x03, 0xff, 0xc0, 0x03, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/libtft.a b/libtft.a index cf495f8447bf8c6e0432c95ab893dc684bb84b7e..4ea32aaa0be00a8fb93338bf9ccbc2cd14ef1920 100644 GIT binary patch literal 163074 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

(=Aw1L*du>c!b9B)%d8jnQ-u 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 z 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 diff --git a/nbproject/Makefile-Custom.mk b/nbproject/Makefile-Custom.mk index f6f45f1..41e749a 100644 --- a/nbproject/Makefile-Custom.mk +++ b/nbproject/Makefile-Custom.mk @@ -36,20 +36,15 @@ OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} # Object Files OBJECTFILES= \ ${OBJECTDIR}/_ext/48b9ad18/avrrfm.o \ - ${OBJECTDIR}/_ext/48b9ad18/bitmaps.o \ - ${OBJECTDIR}/_ext/48b9ad18/colorspace.o \ - ${OBJECTDIR}/_ext/48b9ad18/dejavu.o \ - ${OBJECTDIR}/_ext/48b9ad18/display.o \ - ${OBJECTDIR}/_ext/48b9ad18/font.o \ ${OBJECTDIR}/_ext/48b9ad18/i2c.o \ ${OBJECTDIR}/_ext/48b9ad18/librfm69.o \ ${OBJECTDIR}/_ext/48b9ad18/mcp9808.o \ ${OBJECTDIR}/_ext/48b9ad18/rfm.o \ ${OBJECTDIR}/_ext/48b9ad18/sdc.o \ ${OBJECTDIR}/_ext/48b9ad18/spi.o \ - ${OBJECTDIR}/_ext/48b9ad18/tft.o \ - ${OBJECTDIR}/_ext/48b9ad18/unifont.o \ - ${OBJECTDIR}/_ext/48b9ad18/usart.o + ${OBJECTDIR}/_ext/48b9ad18/usart.o \ + ${OBJECTDIR}/bitmaps.o \ + ${OBJECTDIR}/tft.o # C Compiler Flags @@ -80,26 +75,6 @@ ${OBJECTDIR}/_ext/48b9ad18/avrrfm.o: /home/dode/dev/avrrfm/avrrfm.c ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -std=c99 -o ${OBJECTDIR}/_ext/48b9ad18/avrrfm.o /home/dode/dev/avrrfm/avrrfm.c -${OBJECTDIR}/_ext/48b9ad18/bitmaps.o: /home/dode/dev/avrrfm/bitmaps.c - ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 - $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/bitmaps.o /home/dode/dev/avrrfm/bitmaps.c - -${OBJECTDIR}/_ext/48b9ad18/colorspace.o: /home/dode/dev/avrrfm/colorspace.c - ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 - $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/colorspace.o /home/dode/dev/avrrfm/colorspace.c - -${OBJECTDIR}/_ext/48b9ad18/dejavu.o: /home/dode/dev/avrrfm/dejavu.c - ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 - $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/dejavu.o /home/dode/dev/avrrfm/dejavu.c - -${OBJECTDIR}/_ext/48b9ad18/display.o: /home/dode/dev/avrrfm/display.c - ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 - $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/display.o /home/dode/dev/avrrfm/display.c - -${OBJECTDIR}/_ext/48b9ad18/font.o: /home/dode/dev/avrrfm/font.c - ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 - $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/font.o /home/dode/dev/avrrfm/font.c - ${OBJECTDIR}/_ext/48b9ad18/i2c.o: /home/dode/dev/avrrfm/i2c.c ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/i2c.o /home/dode/dev/avrrfm/i2c.c @@ -124,18 +99,18 @@ ${OBJECTDIR}/_ext/48b9ad18/spi.o: /home/dode/dev/avrrfm/spi.c ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -std=c99 -o ${OBJECTDIR}/_ext/48b9ad18/spi.o /home/dode/dev/avrrfm/spi.c -${OBJECTDIR}/_ext/48b9ad18/tft.o: /home/dode/dev/avrrfm/tft.c - ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 - $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/tft.o /home/dode/dev/avrrfm/tft.c - -${OBJECTDIR}/_ext/48b9ad18/unifont.o: /home/dode/dev/avrrfm/unifont.c - ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 - $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/unifont.o /home/dode/dev/avrrfm/unifont.c - ${OBJECTDIR}/_ext/48b9ad18/usart.o: /home/dode/dev/avrrfm/usart.c ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/usart.o /home/dode/dev/avrrfm/usart.c +${OBJECTDIR}/bitmaps.o: bitmaps.c + ${MKDIR} -p ${OBJECTDIR} + $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/bitmaps.o bitmaps.c + +${OBJECTDIR}/tft.o: tft.c + ${MKDIR} -p ${OBJECTDIR} + $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=8000000UL -DRFM=95 -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/tft.o tft.c + # Subprojects .build-subprojects: diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index 858d46d..73de51b 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -4,10 +4,6 @@ avrrfm.c bitmaps.c - colorspace.c - dejavu.c - display.c - font.c i2c.c librfm69.c mcp9808.c @@ -16,7 +12,6 @@ sdc.c spi.c tft.c - unifont.c usart.c - - - - - - - - - - @@ -80,11 +65,11 @@ - + - + - + From 2e30ed7e5d266c2853e43ae506c271220083451d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20R=C3=B6mer?= Date: Mon, 7 Jul 2025 00:44:48 +0200 Subject: [PATCH 3/3] Update libtft --- libtft.a | Bin 163074 -> 156404 bytes libtft.h | 31 ++++++++----------------------- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/libtft.a b/libtft.a index 4ea32aaa0be00a8fb93338bf9ccbc2cd14ef1920..b4ae5c9f50ec6c0333a83916fb64f09321000b7f 100644 GIT binary patch delta 37582 zcmb`w3!F{W|Np<%oS88fGZ+lUm~&Z8)__j>L3+UKk}d>@bh_y72=2eY5g_gZ_cwfA0opM9G% z3oga~d?0>ltzgrFX3Yx%f&2iI{WB0KY}VY31_C1zlu{Lx(w+WS|8??0rR&EjeRS50 zu`{|&oiIaTI$-*Q8Dsj)7&)D`Y+dh%^rRTK7o}TsbhYS~En5^i_v?C}5~ro%%0*_p;^7Sn{BD=EMh_ zOXd24CscIsGsZ`D1BsP3lns{R?bdMi`_`@tlV5U;7-Jf~x&m8w>k^3_%les;e zk>yi^J$3pCnn~quQ$2ORW&mV5Ew@z|<&Hz$9{z$z+_0^T^a5aWA@ZX*1dZ%ep-C#~HxVuQj+N<{* zLVEQ=jDT{pRI#oZv5dt!>#}7m)~zmE#$w&sUE!#WiObko2kZqZH#W#vBRl5yt&2|M zmh)29NgivwlmqCh2cUbtFRi%mye+@k5}oMHi+L*8azmPBv2|?8x226Ooh?aX&3{%_ zDh~b8dc4lpdaTY@ZhTIPQUx*2y6UMFW~tdKs~}yud*SaDozuzwpj&1ThQ@Sv-m&qI z`<_UtyQ%3W3|&?`47-|+9p>oaj*gm(fV-XAgtpT*g!Jk`D246R=CZNa<_cr6jcy!T z*+IYY?082{ zz#8p26Fk<@;~ZUXrkZ1K9;?)>a3OCS+FM8Jie9XiM>!v7)d)r}4ldU^c7&rxqKO%0 zw_i;j8S8UpR&z&p0NY-#9*3do9u%tS+z!^LcVpFcO>ej4d?wa_$4D=^u^PJO^9XRA zx``XMhHenr*a-57QbV`2LoHeMI1c>oURO(3J?PFXKitE`J>b*{Dnr+_=c~sOxzopu zQhv?uM=jRX8LG(k`=P!X6IG_p;K9c|@&);`!Q*Z#CKS+>d{3JIGF7Wx5Z~)o#COz^ zhW|Da`+*(()Qg@GkmZm4&ML#om2$hc2k=O|S=xG6SlV4EfThhTyR`0#Sc)uniRW9Z#}{8&rIa$TrB?0R@67wlGyufaV){CvM4+Vp79o? zFtjM+SwOiR&H`Xrnv`9ZaHmw(vq^4g<&HTnNSeL|ix%^}`$30JG8+MPv?YG}el=l6 zqnuCusbd+>^96L z)T>V>I7z8Bqk1Pgxv90gv_VYiOR>5)4#AaXsY_K)AW-Qxbt#=6Nn8f?dkyX|g7vwd zxcEmZ&msh~oaLznH>9)hC;YJq|MhD2y7DabN$Ls4OsagF`lOZ}a1Z^b)9igxLb>)X z>4rY7>Eu-FTa?GDezbQicPuhI47+aH1a%?B&UIHFcbIFDi%*oO`OeaeDs3*?SU(&@ z{uQ>>c7!kARs$Peaa*-5v#s9)@?rQ8aSxMdz>8QD@3 zDmtxe^w5=^`)bt9zHG3rpN07^TLD$->w+t-uFcQ?52dfZQt4+e{12r&MwZ6;7CuvEhx7-k){nzU?d3z_)vvEu zbr7FKZjDdlrwdPd5Za-+*ScB%ml1dSJ`%-aWi9+yv)AAV=kA)bvp7O3@q=Y{0i*fM zznwvs=8#klf4Xx{{N0;#VtCGp?wpnI0XV7l6qKxl&%H_cq=MQL)Z`S-T~K@YD4csv zanFxy4@Zfq-l=jnvQ>Zn=!O4!HBaIy-*&U=U+p6XO{#p`7}eizM=oFQ18=Gnx&1l! zZCIfk?9O-ogq#Lf+Ps6F<&2kYUT1AaO!j4CVeofXEL?v+nz(%AT;BkTb9vSEAGl)a zArr1tx`z94t~eyjro_zdYU>OztBpsE%Cl}(ovWQ-(4@+<#;DGIJ97DI>w1BWmie^d z+}>(a!6@gvzg$l4l@_mCKAOFJ@vgk)x=+1g;s0UHU9;uNrLVl^O1{2Q=^AxHJ5$7( z!_p|#9sl*}52`o|{5dW17-`7C>ZQw9RhxTp2q?R%@WGsR`5g%Ae_W!Hrgp#)WpJ8>Wm_Rpm;#(EC(kQN4ORvM=xC(S8V*?IbJa_H@4TCkO3M zCU>p4XAyJWItE|0uLAcUw_kVrqfw@9g9uwIa-~ZXAM?UVh@Kbvpevai; zTN3N%L1a)WuKH3t%`%r7?$Yr1#RYT=gsx2HFrvGusOocZt`OB#-JydVPBE&Wa#Xb! zimEw{Yp)7wMm6HeEU-Y=V3`WpDlxHrq7SuKY^r?8tuu9-m{y71WIk-Y80Cv&Fp)uQ zW4K$$c;zzrZezG1lBce!!D2C(Ei<-WjkYy#!d}&@-<>rIJxxW#t=w+0TB5F`Q(|%6 zDuB=JrP`?aTshI_ zuj%hst&*;Y_L`b;5r^AynHXKo-Kr8%JBGnk?gnjPLhi;>swJ0{YpoTB9d3w)md9PK ziCC-Xej9gNbWCpTR)u~ha+bECvRL-SL5Tz0XuGZ$vSysN&%=uF);IdIr{ebO>Q#(N zeqYB9cJ%d*j(%UC)6TM{HL5o^7wOT>Pw3bojvk846Ux`h3Xq&uIZykO!h6jV{P>0 z8+}VKxp9^D%?z%MUZpoU!*f?*)tdI3o7)W0&9~^-{*E4iUT@LcWRZG!i_~M2jveUe zLCD<1%yspvCH9FO?dUOx^x5Wo+913ARvp{d(fttEiX!YJZW4tSH`L%9uY+?|hn8x! z-sTiHY#Qx0k=~%Dv#?=BXH!Fe(7oHS7FT!}4>(eoKHyYOJkH$ekTq(pg^u1*b$lnv z>-alSr=!@b>e8#|(^2c9y$U(2B(qvNx=Wsih3Pmiv^D2xsUbB~!%m;KrFZ()MLXX& zN^KLWz^t8)TcSei)%3s&1N30M&&ylS`LD~X;x7wCvV(eX%>zCQYhnMLlmt#vz% zVYfA}N^psH`zCsc>6aNfD0Du`Tg&I87W%ldlyw z6*tVes_|*P%L(LHEteLRzcxB;m(w;sC)&5{`nAra{2|Ve25H;h%`b`5i=8U1C)EkK zXB0|pGp(F6(=BGo$s5j=)&bwnsAJCCty@OrH+ACM3`koick;Js+`CiioJ_W8^-aa? z^V+-_qqDY`Ts=YS`rCIF-Jt_*RgBw^Z)KE@^(owW&@nNwJ{{iy5bN9OOu43Y^idTb z?OfZbM&)D#8+yf(SS;4LwsU$q9{XV4XyjI65XJD5RVDe}+5TLo>RPXLjua0ah#D)p z@mSybptR+Sa;Iqgl-oM$$#83n#q2S@$Aj_ZLzSb&_oa)McVcL{7`H`)fEA|1j{ zbWXa(io9+eaenArCt-(Zq3>-cqstq5r*p1LJN=GRw`+bvp|@gQa^kx+!2_ap-KGs~ z?Dn-Pmyt_X-4}Eh8jm^RqudtpGuG#ePeCTYErmR;4;5YxF#3l%a4Hc~;I(tWnbo~Z zTuf}NZ(A@v**V&M%%oOsE0w+GV$d8HrkYfSwc}QVpVBy%kBxIPSdFJyt3p-_>WEKp z8xJky+uLIR=@<@bg!vHbc79}Qn&hO;&&y4Wg2yYVMZQ*A^^9R#ZF#=zQ0%@uT{JiBn z-}>3|5fMHi!ly_0?eIUW`R{^9;{?)8LF{G^AQ0;X;49#9mam1Ew|rBCKNsPrJ{3OMYT#D*G|T6~=U9Fp ze4gbG!53Qoi05wm=)eXq!1m!!!&g}|?2PbNBm6LYjaB|Qe7)r-;hQc0489XC?W4hO zO~7p*{@)1yE5gg+0-F_h zQQ(5*@56t#{1Z4|m5`LC&PDi-@F<*{c=?wioVOt2to-uH*u=?JpehQaS)Kt;x4a%a z!}9zHFG0)R*)K<`oqQ@?wL?S0|E3DTqKN1<@SISwbk#S)her5Vcyp`#jquKv z^XUV7CMjLbFY7_I2!S46KDz0^`&zy_!k>unXCnNC2!9Rk4Q8xR^#*)&sQzHOI#DK& zu0D+L&m;W12)_uQ8mcf|{S6PFx}>W(JZ-SOlI=nCC=G#GRt2@;;d7gG)et_%%5Mf= zVtM-r?*dJF3-50wmc4;+tkOv+FXM)*p2doLT!J_auedr)mgpi?-YwnzBO@bFN| zPzT_ntn$Yq{NM12R{rS-|Ei1!Gt`ALfeiI~gh%6cW_Z(Qs3drJ%Vwz52=_;LPJ|cO z9>gkXjlf-2k2}H_SzZ$1{UUrA{2{CSIQSaNr@_}-ej9v)aU8xf)B*&yS_STh@34G% zgg**DX60{$pRoK{`1_XgEr^dT=g>SSo{C9ED2w1z0kzk8^%j5d2xbeXfch7_Whf9( zA4T{V5&nII{}SN}&zQnPH=yF-9m4eoRSE*(u^Lb{;o+egP}%VCVKSf^MR@ZFzY5+p z+<@u|A8h$`@L?ej2Gn2#!ec$4Ziw*7@X?_e0_v6spBv%#M)*?rSZn@&z(e~^5F28> z9e_U-;XB~r!)8Fe65$8o)2#;HhKKj1fchZ9KeZe~GoZe<0`#BYGp!2$fQNU+fQm`6 z53>Q444-F}uLfUfc>uoA^7`=2;@Ox4RAD&aI>)Ye+(mxrD~`UgwC!>oaOTYEpqn^H z=R6;@Kfogo!`9eGO>%s->a#v(k&U-a+o1iWL^oAY9pKYE#ao@l@DU+TRozo?N;J<3 z^hANSmiL8+2W_ev1h-F~hp|HK&5)*UfZLZJ&)#oEfe)+- z?|{E+`JHh4Byb_zK81P!Zl9_?1h>!OO5ygo^6DT0_BMSC9vaoyq#NP(n0X3r??qeT z;WZRc&%?uOG@y3F!>PVH0-qEL?&?d=M9pJH+^O;aP%X`CHSbjY` zyvc*PYBU1ltpZcvTP&Xm4_`p#Dn8{K9_mn@S_nU3m0t!wX89_(y@}StLz|EXuFVL9 zuRLn1L9~O9cYHYUaLTR_<75_z|UIV z3qHzQKrHdV2p<8r&q~I_GefU?=c=3Fe%IMPIxri70;|BC@Wz%ehF@*@!|Q>+4S!Y5h&F8mJ5Pr+}u{4D%I%YT4BU^(CBSZle) zGN`u?0Gz(s2ZGv3*4$BMS;e?Ap__k0WU3Gvz@AKM6 z2f8BgtkuI_@UxZ=grBy21iWgrS7WZ?yAPEtp9XJj`7C%-%jdx-MVsa47+8qF7^}ci zI6na;rK^<@z79Ua%f>~^CiqHg{;lv8mhXaZw){2t#-J5AjKD$5-+}M9`~&#=mY;^d zYxz0&S_yx-qPH2PYtw0{Z$q9{#*eS3}_8gwK1peF8HP-qvbxI=rdnv*CAG zz91Fb|7I(&2nCK={t$e><*VSeV!bZps`c=ymT!h%XZbdGvE{qrTP@!gL}0TOI0CQk z)vxl@3HYa0{z>>L%g?~=yMtfD?KN@%F3%ZRX|B2iSMCEx@n96*O{hzDQ=UqI+h;5( zaQiM&8ayg=C{9yZaQloV7hdR9hXp8v*R~pL4X+vYpejP3b2y;7!;38M4Igd!VE72j zN5Sv1d?I|V<eU_huhxdv!bp~$Vr2iToK0``V7b5a6!9Owe zVf^RfH75)ztAPY~_0S1Jno5DM2(7|2l@{SyaJ#`=_%~L4h48N|Zwnxj3)IT-6&czX``!t{M!_vGPa3>sme$ZeJHnhuhZ;v*AtL^6v2;V*r5ytAa)F zvDO-RD58Q@@Xl8G_3$FgH^c3x0Ndalyyd|r-|e~EKF0t8y{!UA;GHZ#5#cA{J*@mQ z@L^U5zJ?F6`~tkIRsNEhU)o0pqVPtU-CzRT?obNc9_4B9KA{TpR2JM`<+<>1s;&y) zIiWyx)e?SVob~zN0f7ltkGsONtQmU2!>NiI0N)e}R8hm=k6QDOg_l}B75% z9U2YiV{1vdYBD^0N>@eQoQCahS1=m|>;~tB;5vA= zoDb$D<*KUiDwfxRhkuz9*Z*}8Xkis-1RrF1 zGk8DC+re+OycmA7<=4VXE$;_+EFTKb^ZKXoR>kNtfdn-P-ZE4mK~0B0Z&ffGzTNT# z@ItHneG&67g?F&>OKlJ0_q*00(A_HV1bna6z|-(oEq@*!-fI%n%MtUx4i69N1a&0B zkHd$U_Avev)CUM0wHi1Lf79}F@bF%cpnk9_;QSZiqpbz_Gs2_O?fZZUDiMB4>gVw{ zS5-#f-&TV);p43evmz>}51(b_=SO%8_yQ}xJ^WXz{?71=uDi$oT-5`CIo1sQ;C2N= zBK(F3p9o)U&3_X-CUjuPRky)?md}UZ!}4zXScMBCDtHjS+^TRzgg**jW94svr&tYa zfmgJA2YjVf{v|WNw2uz#Lm+$|kf7dx=UOwo0}t;u3F_bQwpRYf@D7%L0S}*`B&cuU z_MrR;KEhjm4x&p4*n>#pHy%Q#$;gj`+uOVXJbWllP^oZxjn#tN2d->*IK|=haQ>!@ zS$K7n!t<^9 zkHYV@>VFS@x8<+i*zYfoI%M6-<@Ltvo z!{Ol+tHzeek5yCPo2>?Cz&BccJN%gC3*dZ1ND^*l--keW)W)i%5nc)pkJ?zZ2L7v6 z!4vR{mT!TF2W_m{9x?y!vK~}>%Lde8czD#ts<+`Wc(ujr@%wO}<)`2QFB>oae;zUa zHxYiJj0a=YZwQ1(Z7l8#AXg2CceZ>SJdQ=(R9;ODl%4+;I2)8y zUd;)(9Ww2s!8;KMrxdja9-bjZEsOA#@Ni01YvJKDoK&?D&UeQo<*H}keJtMz-^5qq zB;~3-2&}OR9EAU5`7!u6mcI|r!}~Xqa@EK1x|W}XkF)%H_(;ny!WRdvz+VXP6(vcz zDmD`r8kQ%+pRzm^{*&by@GmT{3m;f9Twfl%hvm)T!BtkEJpz1x#_K?5c($iFs`r4m zw7frjgyqBFb1WYV52t{dT4w%$nwg35*Ev)opyrmD0WWO9JB9Ky)Drk8%U6^spRU%x zOG5eSYGaxFH1!PJzFWRC6Wiaud%Xt*?C1Lj;WI)Nrm16a`%dTk@D*16$MDsbpM|fp z{Cl{4U-4oPfpDs>{wm{DR7{q=#8p&zcsNy5mCJa7N-N`WDzl8os+=+&t%7+7M1^XM zR!z$kNL6jics4@daw2;UUpTaEMjAO+VJyCU)rl=Yx`+XQ$BO~JwHlyM%QQgEF7u8dby zm&$mGimi=;NYY>xm13MRE>MPX9>7wtr`0!}8zHz6&f^^1 zb5#Y`yteaOI%{67>2!H@uyg-QU7PeTDQLw`bK2ZY*S(VZn#tC)0yvf3;AXp%VtGBy_f~u z?Oasg4kx%fMTIR*$7EVk(9|v0t)LmVJ{xeSn7@@1yRS)*bC|X4PEkVE7-}?KY-twB zoig8aQPv#hH;X9K60?Zi3Yxg(ip;dwOc6Id;nX?5w|o(PZ` z-b5ETr(XY;^X!3C=ivTY&KXR9+h41KS!9_Mw{+?p$aWrnBh?vx0C}<)GC|(`2eK=; z!?&nNCdI9sJ&d^nsz@e?{di!9vvq%}^U}du&S#i@k7+8}%RE%8f*A!eDQ@9hdnmg? z3u#9th|N1R#ChUis&nB`%?iz>ZkZG}chV1MRcOw&R#YSt#I8M@<+MLk&AI1rx^okz zFCHG@+;}+EY5Yc-vmVpoZ#1vaN;Z{Did${p@J3}F?2p}4wm_k~F5&Jf=B~#+Vd^dv zr)EpY=*LdOb&PluvunD84(@I_PQ84#3vcQUAxzD#-4r`rvYX*m(9|hk>t$!%(ZSAdM{|P<wuV_ydXipKrX==|mfRpXIz0we>`2!-+P*<v2U_4yB;+_%FJebio~nv@Zts2AyHE$BZrJvA85H?-;EL< z!Wqmqp2#w$qFIca&fUfMG%0@%*lTRHRh}=t`fidkCmEmaeytdOhk_Y5O9o$N^_j1y zJx9Jp;ukrC;lIFM!?DPYnki*c$+rqu$HeOde=*Ighua~3m8^AqPXeAMtir%~w|;OD zGE&StdD&cD=J)H|4fu6A#$&m@}-eGi%YCel{?_v+++A2mxl*9q+7 zcPb&dqwo>4YmG-BYPMu>TSnb3%>6ZLjxe{YH}hul9TJZN>$$?bzoq*`Dg47F0JyKj zQw{S?fi$vwI~ZP`z{RbeCxz-W19Lu!h0Zt3my}x=z6D%tI2v4Hn7=Q`1?RkvAU@PE z7mE8ARGu)r4rO*4?uMBU8SaYdmxk+M`m5m` zm{vqN*7FRQgPnW`Qx10W1DH0&{~%=n3UxLaQ!yQ9*uiwR;omUj2=^*|$S~(!Yj_U$ z1;bp;uNxkS>Dz|ci4P5<6G8Qzk-k_;j&L?G7o33As^_B?qzYujTVPs~e3!&|smC}g z?p) zVXpGkhV#IDrJH4v(AXx!cY>es;wZDj@NmTUa3JdW_<^(!lfVMu_Zh!a_$2u*;dA7> zg})`=Bm5&74f9mv5AwYdS6B$WP?+Cf&N5Zea7FTcQF3#$3T2TLs!hIMxE^`2aC7nl z!mY_mgs&o_(i+h2c=D=P3FKriYJ?nRv`x;myGI^4Z`)vPY5?4ZxrUM z+M3^giPWCV5r))}j7lp*dyxMr@!sUk!q=0Z5*|U`A{-nI2|O)wGc!0;k!~eFD?E?9 zRroIQbHWdhw+SyJZx`n0jOH*$T0?$b_(}3k;it$im`}nTR>m&LaA)32-X${}AipSl zjJ#X;1o+DYwoAXsZ(WxWrSzL486b4HEd5aD5hfSGW=RJ>lkL z9+{9@lm9K;k^F&h7xI6Edy#qcLh4KYP2|yo`KC_+j#A!fVK%3$G`C!Q(H|la#Z*%&`M`PQ{Q zFY%|yJn$p&?P-?b=lV>i=E}RGs@RJCs2IGGU*CPKVoW+-0_1_}Rn8A-Lq*k06-!sKj z!g!SMV6snmI5}E)5?TI02j7@g_{u1E-aE+Ugy)mvgcp(H$=LsvP!c4AZ^L?(t|KQ( zd;__>@YCcZ;hp4U;oam4!mpG08H;p?TuJx@IYsz=a3EM&pUFtyldB5< zL{1gvTeksxc@|R)PHS~_;dpWl;bd}}a0)n3Q@9S}>B7PK%%~;Oh8Y>cSCRd~oyY;< z-emKOVgtxo62BfC;K>8hc*e7ZCzI<4-$Je{d>gqQKYx)HP;w;W9&&x*2g$j@4!MEw zYH~y2b>KiF;eRr2*5VFwp2T;N8w zza{gu2a4)j?wYz>~?w?3Q$sL9HHCS9Ly%1kQ?j-Stz`;PV$fKrECJJpLca}K6150-i zevaH#_(M~ED)f?J9>ijBM}Up-U{%pDXQ^rUGnDCL7?*cJHIULxDjfn2@GKJPM#irZ z=F6+PM0g(gT48=Wl;)Wx(tTt!>>f$UJtfW;U3D+v)us$Pw~>4uufLEsQ+f+OYYK5q zyy&vTUm^1<1&ObI>VCp+llu$vl}$ZB_*3#g;UCC@gnuFr7S?>ZOZ2f%?5!Uc?v6mCWyCES{PgK!V>X!Fa3H&Dh%#(45r;mP0t z&&!ec5}Y0{>~?yB@SQ9(QFs~4m|w|!m^@kHtH@J?A18CrAnhp6I1U2ksEw$oO30t)~1p=)_KP5WPE! znfX;n+6=~5!GU=)!x6^KsD76`U*aE-7YLs+WjLz8B;P6VZ^(BEpEqT=EAm^A^xYB< z{zbV*#Fq?4W1pczN#uJaUWvR=I6%HnIGemkxIP*4*1@NF6Y~8MZ$Vxx+=2Xna4~s_ zIsSKp1Rj)(0nAt`d_8%Y@Cfol!V}1j@Ezpk!VAa`3*Q3{tPoz#c&YG8@=D=H`ErZ? zhsZ`|tP{J6aIy~Uic64<6s{D`4{Q} z8zdtcte+50A#W6}Mt)K_K;9(G?;XMLtW${&#`$rDXgA6kt+!ItIXqnMUi35Fkg>wGdV@#v&fZ& z=YRveafh^sar5;GOUS7bcgWR*SCe^f59v8_4dI>SG%%0B4W3YY87G zX9%Ap`-Q(D2ZVnnXA1vC#+ay&E#<2M&XRaJaG-xY<@StwgF0^~Zvb;zjb zGjy~uxvs>Uka?#Psii5y#;zvkNW7R_U$_T3SGW(EcQ(2F10aEhk}-xEjf5wV^Mt38 z8w=k`&KKr)j_3m6W#mF(e)mYAiSXl$Hx=f0j_78>Tgc7LmrFcPX(1U0$t{K7Cbts) z4;gDBABW-33>RXraqXFK`MQXx~ ztAtySI|#QWUoBirE)wof=FMNE;p9%jQ^>`_H-Q74h37EdMR*apD_(Bo%u86Pn`Hch z8Qp~+C0`@Fkz69YnS8DAb~5ieBfUWGDa^0#(7lBBldls#O6Hwuq~lf5zV0J(k{Nx4 zKPLAR{*v5Z_#5&7;h)I^h55A|dXTWj!#+J&IEKty-$=>iA;Kx-p=2z7HOer_C?F3P z9!wq~%x}@qBZbixE~$h|EWX3yT^93MkXOFF#W#_IH%LWKQw;x$JX+#kS{#MJrpHLU ziN&KV=A$963?D6c%=^(E^Om6=EA<4ku+QpoB83(gS=`&=Q5H`no4e<8E#}#~cPE`E z!XEQfP>(kYChU$s#UrPe!9B*~$rk^EJOMwD+=mB-4_WblTl}TPKatJtUHpZb5Lb;s z``*3YI?OQlecO>IVlJe)7QbzA2Ja1=2x5RS?2gZ*vgn?@k)z#lFdcMKJq?k z>=@ZxJMhcEz3T;jvA1`P5X&1B=IYA5onx*MvfNuKw@L3hvykCwWOJ@}2icrfFC?3@ zVTbIV#o{p=*_?bnMV>8nzHRYuWOJ?%%gcVBIsR9oB*+ZuWOEke-b$%1aem{pzFpY8 zm16iV#^*@C7H%h$>$+^l&2?Q4<3Sm84H=&&oX@y9>1fJ051~jc z@!z{4#n*7W8&Vw@zg6Z9c4EdXk*>@zCk`cyn-hm#jCYeVeHrgAJdkmmL@@Cdn|BT| z0_@#n9?f{MlpoKyc~Ul+@o&uY-)YP+k56YXgCAE&v+&=0G(QLIJ({1#xOr>hF2)x~ zc?=t@A?Xmlr~|L|2-kDV3pXJz5H8~JSKleZCDV5ak09SI%$|Cu&(q0flewKUn~5(C zdYk5Mve_K>ljq3NFC&}PUP|Vg=JEegidnrI$Yzy3MeZasKSwsJZWr0Ctyjt3%L`<) zRHeF4el<3!S2LQ0x9L?Dugx;Dt^xc%Y^SmiCI%!}Xxjt#P`V z9$b1jPS>t+y==kP@d4{U=~k-_k%znx9j_}y>7g%FNz}h+J*>2RlJ261m-bD<+4~px zwDEV9runGM&-bH{E|R+o|3SV+*oO}re~EA+`C4H<9`pAQu1W4GT$|iWxFNZ>a5Hir z&8>%bF(`c{qcgdmFdvoq`wR2&n4j-KA&n#t5}rsNEIf^Ty)Yk-`G*M4Cl3`~L>?yW z@adJGuMr{fk(hsk@Dt>b!u)m||0v<-$TtY@CXW{8pQ`bX5$2z%@tfbjI!+!Z@ss57 z!k>{RfVup94Cd$ikw`z2CkbC7PZq}S4=Mi?VLk@)^DQ%^isT!GYmm*ij`As(pXbL& z{4+HE>B9W#9{yg_Fn+2v;UA5$0)-|3Tp_@>1a( z@-pEHOad^Ss(WQZ~(S@=p>UL%t|H zHAwkI}hnoG_QzL(5LQAoV}@dt$YP|u$!yq26LyoFp_co#XC zEwYbNNB9W2uJAkLdcyq69{wERQ{?)>XUVz3-;)~%^SaC5P?*2K>u)3+PtFq#rcfG- z@ClzkUziX0`~|{|$h>ol#6Q;I=gl;v&g7=TJ;}|4`3E}u&4u~LIs7ez`G-0DErt0< zIsC26<;*NfYsr{PZXSBNquDCU+Emw<0e8 z{GCKjF{4=cEV;Ar*W??7t7ED4=+YT!x;7>&W%9C2PRk^^rkj@|lM0(%DhIdCGq{3 z1iA>Tyqj;EGGpW@OlOq#Xs;WTevz&(zVLG`Jx-Sn^Xskg6?fzO4h!6(v|2!SiJt>q z>gqUZ`IkI>fw~&H0X=C^S}qgX;T5@bYEe3XIt_}CKjc11ofFbus0%~dB@4P7y4o#V zO3mNnHS{I*HE3Hmw?%DT8-J&=bVzNT)#wj|dA7}8K1suWUW&RcBE}WO8w^a7agDUi zd9F?6c7+JDR0oEUM!%-q?`dQW>G%bXc~on5*_GHG;YLAHaXFetrbuic86LE5GNrv|=5dn!*#;E5&*Gc%?Yc@gm|Q zSP##Qt`HA$Y~f!h@%x2u!)<#nd3ikRu-DUwy|`0?6~yJ>eFASe_@VF3!#Wyd;8Bma zP;f8L9pw1E29|MCS{8n%06UqNyn?1opK!q-4z<+I^j{P!Bh$5^Ox*6~px28_Fj z`Qd2Su=O*gW+28I8d^2*W5H{cHB81mkE5(1$PXL4hU_n}GEEJ6Rt-G-+BM)8g4GXK zSSB9g?fM#?RjL#2ys$_4R((8rqP`|>5OI}Ltkgdv)+QU|5sp*N%yhhK>C$>SHF#Y_ zyhk^@7bivBpPYyPhnsR<)@YQ=w%TE5nFgbr-SKIEV=qCB9p`-!=5c>xod}1=(ZUkE z?TJcTB4c4`n;cy;cGe1|9)}f&~;2 z1gU}z5U^oG>|GxbyI4@s2k!4T|J`#Yi_g99d+&SaL)h>4KeMy5v$K14_iQ%59!^|x zCUJSKaMR}b1ua9N{1B7-L?vI@KZTAJ752*_UGp7pVa={s~%o; zf7;`*j2y^&BkxtMSLf-oy4mWmGc4}4K*AkP42#>Ex2h?)hpvz_|(eV zN2~qoR&HJS?8?_xezNk%mFHGga)Qol&L_^hOs|U)Q zg)Q|T&R^vkb^Lbm-;0~AUbXy`KD_++@;}gkUCWoQShZr!wYOY*ezl2Pp2a9m}oI%;}I=JwG|293?p*6P-Y79*CPdV~$FWjWc-?Ozg>W z&W(vp5|U%3wDW9Y*Yfq|jh>^bO-E)ur&3Zw9dg`R2XB@6pQPXI0ErISd73-rCOW+8=L>@oBunR|8r_Hcd%x& znKt7`ui1_jC^rw`n#W93{wp^hk=h?xkqYF&x;2`E<-5rZmaq~pl^Zu%4bfTbTQ8NH z#85*!RGE1f>55)ss3ta4S2U}_08#_~moZ)q*OepTRD{wQ&%%$HX{_^1g}UJj`oYag z_KvKiLYL_^>*CEy_SQ9gE7@D;oVSv_bu0F{m&`i$*4@k|aD!aO5?#w)p>mVLj9p;I zOxybCOm0grrED-2y2{Pi7Y87v0^6;4;7MB!+47n#@7pr^OUvSavgI#Z;wyS>Q7XQ& zC6yR|0b?Zr?a_LQ&ewX9&Q~VhJP$-xhEv8QMk~RwQK<{{4d~>+3@aX3 zV9WKkth8mVEe~6gvcN1F)pB9n>}_>jEF~^?ui5@+B{TRr@k$jg{W&+xXpGapO7*ZA znD=9T1Kd+oN;S7uGcyk>?R5{#ZA#q366R3zI2xkkr#O15qhnWGvMQkCCpmhuqXP>N zpWx_;z^lBK}fH;7|X#9 zSbW|NSo{w=V6kpu4=|3yPUr7yog(|1?5eG>AbcL`8eG=-1F(zEP57S}fd4T5+(SkD ze{%r7g+ulE15l~6jJw+;a0O7dNVzN20+mxxQ#RZY3>2@Bb7e3stQwXXt-0uot~&1j z|4{u2y&AVSJ%_!IChKvdo zW>t+aKm1yombTLIn!~>)t(Cr@BXSJ4)-`y*cDW%x?+mxmHFkmXFdWTMJ`V@{mS&(f zLReKZ>wXsh>otWq6q%z@HQkW)dZ~i>bk5K{eef}x~34PcY~VOe+}A6BhLe|J#Tk zy@sDeY4g-4>8#RAY4g=5wd?>oU#U;4aS>jUP(6DuF`>^goUhUbg$r2jls(wZ@Mw%^ zgJh*Lr>dV*?OgML$U&TeTpV}oStFG$0DrzBX(WG9r8QSoZ~@b8RH z4~7d_$NQ$k-y+81N3R)y3Qb47Rf7Y>OC1UBy7B`%!~MWEv%kSinVmgg8poATW)Ux$ zGPkpgY*X$E<(2dA^j3=Nk zgfe_5O&sex|N5uGRU0e}{ZrL@TVa1Zui5F7@RR)@o3i8Ve<0!xNS@6E+4==jv60P=y < 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 P^x*ZDZ+u0U-0{Bv>e6Qh diff --git a/libtft.h b/libtft.h index 59010fe..b0c68b1 100644 --- a/libtft.h +++ b/libtft.h @@ -119,22 +119,22 @@ void tftWriteEnd(void); * @param color 16-Bit (5/6/5) RGB color */ void tftFillArea(x_t x, y_t y, - width_t width, height_t height, - uint16_t color); + width_t width, height_t height, + uint16_t color); /** * Sets the area to write image data to. * * @param x in pixels, origin top left * @param y in pixels, origin top left - * @param width width of the bitmap in pixels - * @param height height of the bitmap in pixels + * @param width width in pixels + * @param height height in pixels * @param hflip if image should be flipped horizontally * @param vflip if image should be flipped vertically */ void tftSetArea(x_t x, y_t y, - width_t width, height_t height, - bool hflip, bool vflip); + width_t width, height_t height, + bool hflip, bool vflip); /** * Sets the whole display to the given 16-Bit (5/6/5) RGB color. @@ -143,21 +143,6 @@ void tftSetArea(x_t x, y_t y, */ void tftSetFrame(uint16_t color); -/** - * Helper to write image data to the display, converting from the given - * color space to that of the display. - * - * @param bitmap pointer to bitmap data in program memory - * @param width width of the bitmap in pixels - * @param height height of the bitmap in pixels - * @param space color space of the bitmap - * @param bg background color (used only with SPACE_MONO1) - * @param fg foreground color (used only with SPACE_MONO1) - */ -void tftWriteSpace(const __flash uint8_t *bitmap, - width_t width, height_t height, - space_t space, uint16_t bg, uint16_t fg); - /** * Writes image data to the previously set area. * @@ -169,8 +154,8 @@ void tftWriteSpace(const __flash uint8_t *bitmap, * @param fg foreground color (used only with SPACE_MONO1) */ void tftWriteData(const __flash uint8_t *bitmap, - width_t width, height_t height, - space_t space, uint16_t bg, uint16_t fg); + width_t width, height_t height, + space_t space, uint16_t bg, uint16_t fg); /** * Writes the bitmap with the given index to the given row and column