Mercurial > public > ostc4
changeset 1048:493a5903ec20 GasConsumption
Merge with 9d9d506a82d3162b6b2323819cc08652887d7dd4 (Bootloader)
| author | Ideenmodellierer |
|---|---|
| date | Sat, 15 Nov 2025 19:29:44 +0100 |
| parents | 6fb16ca39125 (current diff) 9d9d506a82d3 (diff) |
| children | d91345e9c009 |
| files | BootLoader/Src/base_bootlader.c BootLoader/Src/display_mini.c BootLoader/Src/externLogbookFlash_mini.c BootLoader/Src/gfx_engine_mini.c BootLoader/Src/ostc_mini.c BootLoader/Src/tComm_mini.c Discovery/Inc/tComm.h OtherSources/data_central_mini.c |
| diffstat | 15 files changed, 9594 insertions(+), 377 deletions(-) [+] |
line wrap: on
line diff
--- a/BootLoader/CPU1-F429_boot.ld Sat Nov 15 15:16:14 2025 +0100 +++ b/BootLoader/CPU1-F429_boot.ld Sat Nov 15 19:29:44 2025 +0100 @@ -48,7 +48,7 @@ /***************************** Memory Definition ****************************/ MEMORY { - ROM_BOOT (rx) : ORIGIN = 0x08000000, LENGTH = 0x00040000 /* 256K */ + ROM_BOOT (rx) : ORIGIN = 0x08000000, LENGTH = 0x00020000 /* 128K */ ROM (rx) : ORIGIN = 0x08040000, LENGTH = 0x00090000 /* 576K */ UPPER(rx) : ORIGIN = 0x08132000, LENGTH = 0xAE270 /* 713K */ RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 192K @@ -113,13 +113,6 @@ *libm.a:*(*) } >ROM_BOOT - .rodata : - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >ROM_BOOT /********************** Constant data into ROM memory *********************/ @@ -169,16 +162,6 @@ /************* The program code and other data into ROM memory ************/ -/* - .firmware_FirmwareData 0x08050000 : { - KEEP( *(.firmware_firmware_data) ) - } >ROM - - .font_firmware_data 0x08132000 : { - KEEP( *(.font_firmware_data) ) - - } >UPPER - */ /************* Data and Structures at absolute address in ROM *************/ @@ -215,12 +198,18 @@ _etext = .; /* define a global symbols at end of code */ } >ROM_BOOT - + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM_BOOT /* Define Known Address for Each Font */ /* Flash Sector 23 is protected (bootloader font + image) => use end of sector 22 */ -.lower_fonts 0x08016000 : { +.lower_fonts 0x0801F000 : { *(.lower_fonts.image_data_*) *(.lower_fonts.*) *(.upper_fonts.image_data_FontT48*) @@ -235,7 +224,6 @@ *(.upper_font_directory.FontT24*) } > ROM_BOOT - .lower_image 0x08009000 : { *(.lower_image*) @@ -244,301 +232,6 @@ .lower_directory 0x08009500 : { *(.lower_image_directory*) } > ROM_BOOT - - .upper_fonts 0x08132040 : { - __upper_font_data = .; - . = 0x13E; - *(.upper_fonts.image_data_FontT144_0x0030) - . = 0x02515; - *(.upper_fonts.image_data_FontT144_0x0031) - . = 0x03469; - *(.upper_fonts.image_data_FontT144_0x0032) - . = 0x4FDC; - *(.upper_fonts.image_data_FontT144_0x0033) - . = 0x6862; - *(.upper_fonts.image_data_FontT144_0x0034) - . = 0x86C2; - *(.upper_fonts.image_data_FontT144_0x0035) - . = 0x9FB3; - *(.upper_fonts.image_data_FontT144_0x0036) - . = 0xBB26; - *(.upper_fonts.image_data_FontT144_0x0037) - . = 0xD845; - *(.upper_fonts.image_data_FontT144_0x0038) - . = 0xF34D; - *(.upper_fonts.image_data_FontT144_0x0039) - . = 0x10EC0; - *(.upper_fonts.image_data_FontT24_0x0020) - *(.upper_fonts.image_data_FontT24_0x0021) - *(.upper_fonts.image_data_FontT24_0x0022) - *(.upper_fonts.image_data_FontT24_0x0023) - *(.upper_fonts.image_data_FontT24_0x0024) - *(.upper_fonts.image_data_FontT24_0x0025) - *(.upper_fonts.image_data_FontT24_0x0026) - *(.upper_fonts.image_data_FontT24_0x0027) - *(.upper_fonts.image_data_FontT24_0x0028) - *(.upper_fonts.image_data_FontT24_0x0029) - *(.upper_fonts.image_data_FontT24_0x002a) - *(.upper_fonts.image_data_FontT24_0x003f) - *(.upper_fonts.image_data_FontT24_0x002c) - *(.upper_fonts.image_data_FontT24_0x002d) - *(.upper_fonts.image_data_FontT24_0x002e) - *(.upper_fonts.image_data_FontT24_0x002f) - *(.upper_fonts.image_data_FontT24_0x0030) - *(.upper_fonts.image_data_FontT24_0x0031) - *(.upper_fonts.image_data_FontT24_0x0032) - *(.upper_fonts.image_data_FontT24_0x0033) - *(.upper_fonts.image_data_FontT24_0x0034) - *(.upper_fonts.image_data_FontT24_0x0035) - *(.upper_fonts.image_data_FontT24_0x0036) - *(.upper_fonts.image_data_FontT24_0x0037) - *(.upper_fonts.image_data_FontT24_0x0038) - *(.upper_fonts.image_data_FontT24_0x0039) - *(.upper_fonts.image_data_FontT24_0x003a) - *(.upper_fonts.image_data_FontT24_0x003b) - *(.upper_fonts.image_data_FontT24_0x003c) - *(.upper_fonts.image_data_FontT24_0x003d) - *(.upper_fonts.image_data_FontT24_0x003e) - . = . + 0x8c; - *(.upper_fonts.image_data_FontT24_0x0040) - *(.upper_fonts.image_data_FontT24_0x0041) - *(.upper_fonts.image_data_FontT24_0x0042) - *(.upper_fonts.image_data_FontT24_0x0043) - *(.upper_fonts.image_data_FontT24_0x0044) - *(.upper_fonts.image_data_FontT24_0x0045) - *(.upper_fonts.image_data_FontT24_0x0046) - *(.upper_fonts.image_data_FontT24_0x0047) - *(.upper_fonts.image_data_FontT24_0x0048) - *(.upper_fonts.image_data_FontT24_0x0049) - *(.upper_fonts.image_data_FontT24_0x004a) - *(.upper_fonts.image_data_FontT24_0x004b) - *(.upper_fonts.image_data_FontT24_0x004c) - *(.upper_fonts.image_data_FontT24_0x004d) - *(.upper_fonts.image_data_FontT24_0x004e) - *(.upper_fonts.image_data_FontT24_0x004f) - *(.upper_fonts.image_data_FontT24_0x0050) - *(.upper_fonts.image_data_FontT24_0x0051) - *(.upper_fonts.image_data_FontT24_0x0052) - *(.upper_fonts.image_data_FontT24_0x0053) - *(.upper_fonts.image_data_FontT24_0x0054) - *(.upper_fonts.image_data_FontT24_0x0055) - *(.upper_fonts.image_data_FontT24_0x0056) - *(.upper_fonts.image_data_FontT24_0x0057) - *(.upper_fonts.image_data_FontT24_0x0058) - *(.upper_fonts.image_data_FontT24_0x0059) - *(.upper_fonts.image_data_FontT24_0x005a) - *(.upper_fonts.image_data_FontT24_0x005b) - *(.upper_fonts.image_data_FontT24_0x005c) - *(.upper_fonts.image_data_FontT24_0x005d) - *(.upper_fonts.image_data_FontT24_0x005e) - *(.upper_fonts.image_data_FontT24_0x005f) - *(.upper_fonts.image_data_FontT24_0x0060) - *(.upper_fonts.image_data_FontT24_0x0061) - *(.upper_fonts.image_data_FontT24_0x0062) - *(.upper_fonts.image_data_FontT24_0x0063) - . = . + 0x1c; - *(.upper_fonts.image_data_FontT24_0x0064) - *(.upper_fonts.image_data_FontT24_0x0065) - *(.upper_fonts.image_data_FontT24_0x0066) - *(.upper_fonts.image_data_FontT24_0x0067) - *(.upper_fonts.image_data_FontT24_0x0068) - *(.upper_fonts.image_data_FontT24_0x0069) - *(.upper_fonts.image_data_FontT24_0x006a) - *(.upper_fonts.image_data_FontT24_0x006b) - *(.upper_fonts.image_data_FontT24_0x006c) - *(.upper_fonts.image_data_FontT24_0x006d) - *(.upper_fonts.image_data_FontT24_0x006e) - *(.upper_fonts.image_data_FontT24_0x006f) - *(.upper_fonts.image_data_FontT24_0x0070) - *(.upper_fonts.image_data_FontT24_0x0071) - *(.upper_fonts.image_data_FontT24_0x0072) - *(.upper_fonts.image_data_FontT24_0x0073) - *(.upper_fonts.image_data_FontT24_0x0074) - *(.upper_fonts.image_data_FontT24_0x0075) - *(.upper_fonts.image_data_FontT24_0x0076) - *(.upper_fonts.image_data_FontT24_0x0077) - *(.upper_fonts.image_data_FontT24_0x0078) - *(.upper_fonts.image_data_FontT24_0x0079) - *(.upper_fonts.image_data_FontT24_0x007a) - *(.upper_fonts.image_data_FontT24_0x007b) - *(.upper_fonts.image_data_FontT24_0x007c) - . = . + 0x1c; - *(.upper_fonts.image_data_FontT24_0x007d) - *(.upper_fonts.image_data_FontT24_0x007e) - *(.upper_fonts.image_data_FontT24_0x00a1) - *(.upper_fonts.image_data_FontT24_0x00bf) - *(.upper_fonts.image_data_FontT24_0x00c1) - *(.upper_fonts.image_data_FontT24_0x00c4) - *(.upper_fonts.image_data_FontT24_0x00c6) - *(.upper_fonts.image_data_FontT24_0x00c7) - *(.upper_fonts.image_data_FontT24_0x00c9) - *(.upper_fonts.image_data_FontT24_0x00cd) - *(.upper_fonts.image_data_FontT24_0x00d1) - *(.upper_fonts.image_data_FontT24_0x00d3) - *(.upper_fonts.image_data_FontT24_0x00d6) - *(.upper_fonts.image_data_FontT24_0x00da) - *(.upper_fonts.image_data_FontT24_0x00dc) - *(.upper_fonts.image_data_FontT24_0x00df) - *(.upper_fonts.image_data_FontT24_0x00e0) - *(.upper_fonts.image_data_FontT24_0x00e1) - *(.upper_fonts.image_data_FontT24_0x00e2) - *(.upper_fonts.image_data_FontT24_0x00e4) - *(.upper_fonts.image_data_FontT24_0x00e6) - *(.upper_fonts.image_data_FontT24_0x00e7) - *(.upper_fonts.image_data_FontT24_0x00e8) - *(.upper_fonts.image_data_FontT24_0x00e9) - *(.upper_fonts.image_data_FontT24_0x00ec) - *(.upper_fonts.image_data_FontT24_0x00ed) - *(.upper_fonts.image_data_FontT24_0x00f0) - *(.upper_fonts.image_data_FontT24_0x00f1) - *(.upper_fonts.image_data_FontT24_0x00f2) - *(.upper_fonts.image_data_FontT24_0x00f3) - *(.upper_fonts.image_data_FontT24_0x00f6) - *(.upper_fonts.image_data_FontT24_0x00f9) - *(.upper_fonts.image_data_FontT24_0x00fa) - *(.upper_fonts.image_data_FontT24_0x00fc) - *(.upper_fonts.image_data_FontT24_0x00ff) - *(.upper_fonts.image_data_FontT24_0x0152) - *(.upper_fonts.image_data_FontT24_0x0153) - *(.upper_fonts.image_data_FontT24_0x0178) - *(.upper_fonts.image_data_FontT24_0x002b) - . = . + 0x1d642; - *(.upper_images.image_data_ostc_fuer_Tauchcomputer_240px) - *(.upper_fonts.image_data_FontT84_0x002e) - . = . + 0x9f; - *(.upper_fonts.image_data_FontT84_0x0030) - . = . + 0x0d; - *(.upper_fonts.image_data_FontT84_0x0031) - . = . + 0xaa; - *(.upper_fonts.image_data_FontT84_0x0032) - . = . + 0x7b; - *(.upper_fonts.image_data_FontT84_0x0033) - . = . + 0x38; - *(.upper_fonts.image_data_FontT84_0x0034) - . = . + 0x7f; - *(.upper_fonts.image_data_FontT84_0x0035) - . = . + 0x77; - *(.upper_fonts.image_data_FontT84_0x0036) - . = . + 0x7b; - *(.upper_fonts.image_data_FontT84_0x0037) - . = . + 0x0d; - *(.upper_fonts.image_data_FontT84_0x0038) - . = . + 0x2b; - *(.upper_fonts.image_data_FontT84_0x0039) - . = . + 0xe8; - *(.upper_fonts.image_data_FontT54_0x0022) - *(.upper_fonts.image_data_FontT54_0x0025) - . = . + 0x112; - *(.upper_fonts.image_data_FontT54_0x0027) - . = . + 0xd8; - *(.upper_fonts.image_data_FontT54_0x002a) - . = . + 0x133; - *(.upper_fonts.image_data_FontT54_0x002d) - . = . + 0x1d7; - *(.upper_fonts.image_data_FontT54_0x002e) - . = . + 0x17b; - *(.upper_fonts.image_data_FontT54_0x002f) - . = . + 0x02; - *(.upper_fonts.image_data_FontT54_0x0030) - . = . + 0x0ba; - *(.upper_fonts.image_data_FontT54_0x0031) - . = . + 0x27d; - *(.upper_fonts.image_data_FontT54_0x0032) - . = . + 0xe3; - *(.upper_fonts.image_data_FontT54_0x0033) - . = . + 0x35; - *(.upper_fonts.image_data_FontT54_0x0034) - . = . + 0x68; - *(.upper_fonts.image_data_FontT54_0x0035) - . = . + 0x35; - *(.upper_fonts.image_data_FontT54_0x0036) - . = . + 0xba; - *(.upper_fonts.image_data_FontT54_0x0037) - . = . + 0x191; - *(.upper_fonts.image_data_FontT54_0x0038) - . = . + 0xe3; - *(.upper_fonts.image_data_FontT54_0x0039) - . = . + 0xe3; - *(.upper_fonts.image_data_FontT54_0x003a) - . = . + 0x7b; - *(.upper_fonts.image_data_FontT54_0x0043) - . = . + 0x3b; - *(.upper_fonts.image_data_FontT54_0x006c) - . = . + 0x2d; - *(.upper_fonts.image_data_FontT54_0x006d) - . = . + 0x94; - *(.upper_fonts.image_data_FontT54_0x00ba) - . = . + 0x0a; - - *(.upper_fonts.image_data_FontT105_0x002*) - *(.upper_fonts.image_data_FontT105_0x003*) - *(.upper_fonts.image_data_FontT105_0x0043) - . = . + 0x17c8; - *(.upper_fonts.image_data_FontT105_0x007c) - *(.upper_fonts.image_data_FontT105_0x00ba) - *(.upper_fonts.image_data_FontT105_54_0x006d) - - *(.upper_fonts.image_data_FontT54_0x0068) - . = . + 0x1195; - - *(.upper_fonts.image_data_FontT42_0x00b0) - *(.upper_fonts.image_data_FontT42_0x0020) - . = . + 0x23; - *(.upper_fonts.image_data_FontT42_0x002*) - *(.upper_fonts.image_data_FontT42_0x003*) - *(.upper_fonts.image_data_FontT42_0x004*) - *(.upper_fonts.image_data_FontT42_0x005*) - . = . + 0x420; - *(.upper_fonts.image_data_FontT42_0x006*) - *(.upper_fonts.image_data_FontT42_0x0070) - *(.upper_fonts.image_data_FontT42_0x0071) - *(.upper_fonts.image_data_FontT42_0x0072) - *(.upper_fonts.image_data_FontT42_0x0073) - *(.upper_fonts.image_data_FontT42_0x0074) - *(.upper_fonts.image_data_FontT42_0x0075) - *(.upper_fonts.image_data_FontT42_0x0076) - *(.upper_fonts.image_data_FontT42_0x0077) - *(.upper_fonts.image_data_FontT42_0x0078) - *(.upper_fonts.image_data_FontT42_0x0079) - . = . + 0x12c0; - *(.upper_fonts.image_data_FontT42_*) - *(.upper_fonts.image_data_T54addon_0x002b_PLUS*) - *(.upper_fonts.image_data_T54addon_0x0040_AT*) - *(.upper_fonts.image_data_FontT48addon*) - *(.upper_fonts.image_data_FontT24plus_0x00fb*) - *(.upper_fonts.image_data_FontT24plus_0x00fd*) - *(.upper_fonts.image_data_FontT48_*) - *(.upper_fonts.image_data_awe48_*) - -/* moving of fonts from lower to upper */ - - *(.upper_fonts.*) - - __upper_font_data_end = .; - } >UPPER - - - - .upper_directory 0x081DEF00 : { - __font_directory = .; - *(.upper_font_directory.Awe48) - *(.upper_font_directory.FontT24) - *(.upper_font_directory.FontT42) - *(.upper_font_directory.FontT48) - *(.upper_font_directory.FontT54) - *(.upper_font_directory.FontT84) - *(.upper_font_directory.FontT105) - *(.upper_font_directory.FontT144) - *(.upper_font_directory.Batt24*) - - __font_directory_end = .; - LONG( -1 ); /* Magic End Marker */ - - } >UPPER - - - - /* Used by the startup to initialize data */ _sidata = LOADADDR(.data);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Inc/font_T24_min.h Sat Nov 15 19:29:44 2025 +0100 @@ -0,0 +1,743 @@ +/////////////////////////////////////////////////////////////////////////////// +/// -*- coding: UTF-8 -*- +/// +/// \file Discovery/Inc/Fonts/font_T24.h +/// \brief Font Trebuchet MS, size = 24 +/// \author heinrichs weikamp gmbh +/// \date 2014-06-09 +/// +/// \details +/// Imported from lcd-image-converter/OSTC4_T24.xml +/// +/// $Id$ +/////////////////////////////////////////////////////////////////////////////// +/// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program. If not, see <http://www.gnu.org/licenses/>. +////////////////////////////////////////////////////////////////////////////// + +/******************************************************************************* +* font +* filename: C:/Users/hw/Downloads/l +* name: FontT24 +* family: Trebuchet MS +* size: 24 +* style: Normal +* included characters: !"#$%&'()*+,-./0123456789:;<=>?\x0040ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÖÜäöüßáéíúóàèìòù�?çÉ�?ÑñÓÚ¡¿âÆæÇŒœŸÿ +* antialiasing: yes +* type: proportional +* encoding: UTF-16 +* unicode bom: no +* +* preset name: Grayscale 8 +* data block size: 8 bit(s), uint8_t +* RLE compression enabled: no +* conversion type: Grayscale, not_used not_used +* bits per pixel: 8 +* +* preprocess: +* main scan direction: left_to_right +* line scan direction: backward +* inverse: no +*******************************************************************************/ + + +#include "gfx_fonts.h" + + +static uint8_t image_data_FontT24_0x0030[364]; + +static uint8_t image_data_FontT24_0x0031[364]; + +static uint8_t image_data_FontT24_0x0032[364]; + +static uint8_t image_data_FontT24_0x0033[364]; + +static uint8_t image_data_FontT24_0x0034[364]; + +static uint8_t image_data_FontT24_0x0035[364]; + +static uint8_t image_data_FontT24_0x0036[364]; + +static uint8_t image_data_FontT24_0x0037[364]; + +static uint8_t image_data_FontT24_0x0038[364]; + +static uint8_t image_data_FontT24_0x0039[364]; + +static uint8_t image_data_FontT24_0x003a[252]; + +static uint8_t image_data_FontT24_0x003b[252]; + +static uint8_t image_data_FontT24_0x003c[364]; + +static uint8_t image_data_FontT24_0x003d[364]; + +static uint8_t image_data_FontT24_0x003e[364]; + +static uint8_t image_data_FontT24_0x003f[252]; + +static uint8_t image_data_FontT24_0x0040[532]; + +static uint8_t image_data_FontT24_0x0041[420]; + +static uint8_t image_data_FontT24_0x0042[392]; + +static uint8_t image_data_FontT24_0x0043[392]; + +static uint8_t image_data_FontT24_0x0044[420]; + +static uint8_t image_data_FontT24_0x0045[364]; + +static uint8_t image_data_FontT24_0x0046[364]; + +static uint8_t image_data_FontT24_0x0047[448]; + +static uint8_t image_data_FontT24_0x0048[448]; + +static uint8_t image_data_FontT24_0x0049[196]; + +static uint8_t image_data_FontT24_0x004a[308]; + +static uint8_t image_data_FontT24_0x004b[392]; + +static uint8_t image_data_FontT24_0x004c[336]; + +static uint8_t image_data_FontT24_0x004d[476]; + +static uint8_t image_data_FontT24_0x004e[420]; + +static uint8_t image_data_FontT24_0x004f[448]; + +static uint8_t image_data_FontT24_0x0050[364]; + +static uint8_t image_data_FontT24_0x0051[476]; + +static uint8_t image_data_FontT24_0x0052[392]; + +static uint8_t image_data_FontT24_0x0053[336]; + +static uint8_t image_data_FontT24_0x0054[392]; + +static uint8_t image_data_FontT24_0x0055[448]; + +static uint8_t image_data_FontT24_0x0056[392]; + +static uint8_t image_data_FontT24_0x0057[560]; + +static uint8_t image_data_FontT24_0x0058[364]; + +static uint8_t image_data_FontT24_0x0059[392]; + +static uint8_t image_data_FontT24_0x005a[364]; + +static uint8_t image_data_FontT24_0x005b[252]; + +static uint8_t image_data_FontT24_0x005c[252]; + +static uint8_t image_data_FontT24_0x005d[252]; + +static uint8_t image_data_FontT24_0x005e[364]; + +static uint8_t image_data_FontT24_0x005f[364]; + +static uint8_t image_data_FontT24_0x0060[364]; + +static uint8_t image_data_FontT24_0x0061[364]; + +static uint8_t image_data_FontT24_0x0062[364]; + +static uint8_t image_data_FontT24_0x0063[336]; + +static uint8_t image_data_FontT24_0x0064[364]; + +static uint8_t image_data_FontT24_0x0065[364]; + +static uint8_t image_data_FontT24_0x0066[252]; + +static uint8_t image_data_FontT24_0x0067[336]; + +static uint8_t image_data_FontT24_0x0068[364]; + +static uint8_t image_data_FontT24_0x0069[196]; + +static uint8_t image_data_FontT24_0x006a[252]; + +static uint8_t image_data_FontT24_0x006b[336]; + +static uint8_t image_data_FontT24_0x006c[196]; + +static uint8_t image_data_FontT24_0x006d[560]; + +static uint8_t image_data_FontT24_0x006e[364]; + +static uint8_t image_data_FontT24_0x006f[364]; + +static uint8_t image_data_FontT24_0x0070[364]; + +static uint8_t image_data_FontT24_0x0071[364]; + +static uint8_t image_data_FontT24_0x0072[252]; + +static uint8_t image_data_FontT24_0x0073[280]; + +static uint8_t image_data_FontT24_0x0074[280]; + +static uint8_t image_data_FontT24_0x0075[364]; + +static uint8_t image_data_FontT24_0x0076[336]; + +static uint8_t image_data_FontT24_0x0077[504]; + +static uint8_t image_data_FontT24_0x0078[336]; + +static uint8_t image_data_FontT24_0x0079[336]; + +static uint8_t image_data_FontT24_0x007a[308]; + +static const tImage FontT24_0x0030 __attribute__(( section(".upper_fonts.FontT24_0x0030") )) = { image_data_FontT24_0x0030, 13, 28}; +static const tImage FontT24_0x0031 __attribute__(( section(".upper_fonts.FontT24_0x0031") )) = { image_data_FontT24_0x0031, 13, 28}; +static const tImage FontT24_0x0032 __attribute__(( section(".upper_fonts.FontT24_0x0032") )) = { image_data_FontT24_0x0032, 13, 28}; +static const tImage FontT24_0x0033 __attribute__(( section(".upper_fonts.FontT24_0x0033") )) = { image_data_FontT24_0x0033, 13, 28}; +static const tImage FontT24_0x0034 __attribute__(( section(".upper_fonts.FontT24_0x0034") )) = { image_data_FontT24_0x0034, 13, 28}; +static const tImage FontT24_0x0035 __attribute__(( section(".upper_fonts.FontT24_0x0035") )) = { image_data_FontT24_0x0035, 13, 28}; +static const tImage FontT24_0x0036 __attribute__(( section(".upper_fonts.FontT24_0x0036") )) = { image_data_FontT24_0x0036, 13, 28}; +static const tImage FontT24_0x0037 __attribute__(( section(".upper_fonts.FontT24_0x0037") )) = { image_data_FontT24_0x0037, 13, 28}; +static const tImage FontT24_0x0038 __attribute__(( section(".upper_fonts.FontT24_0x0038") )) = { image_data_FontT24_0x0038, 13, 28}; +static const tImage FontT24_0x0039 __attribute__(( section(".upper_fonts.FontT24_0x0039") )) = { image_data_FontT24_0x0039, 13, 28}; +static const tImage FontT24_0x003a __attribute__(( section(".upper_fonts.FontT24_0x003a") )) = { image_data_FontT24_0x003a, 9, 28}; +static const tImage FontT24_0x003b __attribute__(( section(".upper_fonts.FontT24_0x003b") )) = { image_data_FontT24_0x003b, 9, 28}; +static const tImage FontT24_0x003c __attribute__(( section(".upper_fonts.FontT24_0x003c") )) = { image_data_FontT24_0x003c, 13, 28}; +static const tImage FontT24_0x003d __attribute__(( section(".upper_fonts.FontT24_0x003d") )) = { image_data_FontT24_0x003d, 13, 28}; +static const tImage FontT24_0x003e __attribute__(( section(".upper_fonts.FontT24_0x003e") )) = { image_data_FontT24_0x003e, 13, 28}; +static const tImage FontT24_0x003f __attribute__(( section(".upper_fonts.FontT24_0x003f") )) = { image_data_FontT24_0x003f, 9, 28}; +static const tImage FontT24_0x0040 __attribute__(( section(".upper_fonts.FontT24_0x0040") )) = { image_data_FontT24_0x0040, 19, 28}; +static const tImage FontT24_0x0041 __attribute__(( section(".upper_fonts.FontT24_0x0041") )) = { image_data_FontT24_0x0041, 15, 28}; +static const tImage FontT24_0x0042 __attribute__(( section(".upper_fonts.FontT24_0x0042") )) = { image_data_FontT24_0x0042, 14, 28}; +static const tImage FontT24_0x0043 __attribute__(( section(".upper_fonts.FontT24_0x0043") )) = { image_data_FontT24_0x0043, 14, 28}; +static const tImage FontT24_0x0044 __attribute__(( section(".upper_fonts.FontT24_0x0044") )) = { image_data_FontT24_0x0044, 15, 28}; +static const tImage FontT24_0x0045 __attribute__(( section(".upper_fonts.FontT24_0x0045") )) = { image_data_FontT24_0x0045, 13, 28}; +static const tImage FontT24_0x0046 __attribute__(( section(".upper_fonts.FontT24_0x0046") )) = { image_data_FontT24_0x0046, 13, 28}; +static const tImage FontT24_0x0047 __attribute__(( section(".upper_fonts.FontT24_0x0047") )) = { image_data_FontT24_0x0047, 16, 28}; +static const tImage FontT24_0x0048 __attribute__(( section(".upper_fonts.FontT24_0x0048") )) = { image_data_FontT24_0x0048, 16, 28}; +static const tImage FontT24_0x0049 __attribute__(( section(".upper_fonts.FontT24_0x0049") )) = { image_data_FontT24_0x0049, 7, 28}; +static const tImage FontT24_0x004a __attribute__(( section(".upper_fonts.FontT24_0x004a") )) = { image_data_FontT24_0x004a, 11, 28}; +static const tImage FontT24_0x004b __attribute__(( section(".upper_fonts.FontT24_0x004b") )) = { image_data_FontT24_0x004b, 14, 28}; +static const tImage FontT24_0x004c __attribute__(( section(".upper_fonts.FontT24_0x004c") )) = { image_data_FontT24_0x004c, 12, 28}; +static const tImage FontT24_0x004d __attribute__(( section(".upper_fonts.FontT24_0x004d") )) = { image_data_FontT24_0x004d, 17, 28}; +static const tImage FontT24_0x004e __attribute__(( section(".upper_fonts.FontT24_0x004e") )) = { image_data_FontT24_0x004e, 15, 28}; +static const tImage FontT24_0x004f __attribute__(( section(".upper_fonts.FontT24_0x004f") )) = { image_data_FontT24_0x004f, 16, 28}; +static const tImage FontT24_0x0050 __attribute__(( section(".upper_fonts.FontT24_0x0050") )) = { image_data_FontT24_0x0050, 13, 28}; +static const tImage FontT24_0x0051 __attribute__(( section(".upper_fonts.FontT24_0x0051") )) = { image_data_FontT24_0x0051, 17, 28}; +static const tImage FontT24_0x0052 __attribute__(( section(".upper_fonts.FontT24_0x0052") )) = { image_data_FontT24_0x0052, 14, 28}; +static const tImage FontT24_0x0053 __attribute__(( section(".upper_fonts.FontT24_0x0053") )) = { image_data_FontT24_0x0053, 12, 28}; +static const tImage FontT24_0x0054 __attribute__(( section(".upper_fonts.FontT24_0x0054") )) = { image_data_FontT24_0x0054, 14, 28}; +static const tImage FontT24_0x0055 __attribute__(( section(".upper_fonts.FontT24_0x0055") )) = { image_data_FontT24_0x0055, 16, 28}; +static const tImage FontT24_0x0056 __attribute__(( section(".upper_fonts.FontT24_0x0056") )) = { image_data_FontT24_0x0056, 14, 28}; +static const tImage FontT24_0x0057 __attribute__(( section(".upper_fonts.FontT24_0x0057") )) = { image_data_FontT24_0x0057, 20, 28}; +static const tImage FontT24_0x0058 __attribute__(( section(".upper_fonts.FontT24_0x0058") )) = { image_data_FontT24_0x0058, 13, 28}; +static const tImage FontT24_0x0059 __attribute__(( section(".upper_fonts.FontT24_0x0059") )) = { image_data_FontT24_0x0059, 14, 28}; +static const tImage FontT24_0x005a __attribute__(( section(".upper_fonts.FontT24_0x005a") )) = { image_data_FontT24_0x005a, 13, 28}; +static const tImage FontT24_0x005b __attribute__(( section(".upper_fonts.FontT24_0x005b") )) = { image_data_FontT24_0x005b, 9, 28}; +static const tImage FontT24_0x005c __attribute__(( section(".upper_fonts.FontT24_0x005c") )) = { image_data_FontT24_0x005c, 9, 28}; +static const tImage FontT24_0x005d __attribute__(( section(".upper_fonts.FontT24_0x005d") )) = { image_data_FontT24_0x005d, 9, 28}; +static const tImage FontT24_0x005e __attribute__(( section(".upper_fonts.FontT24_0x005e") )) = { image_data_FontT24_0x005e, 13, 28}; +static const tImage FontT24_0x005f __attribute__(( section(".upper_fonts.FontT24_0x005f") )) = { image_data_FontT24_0x005f, 13, 28}; +static const tImage FontT24_0x0060 __attribute__(( section(".upper_fonts.FontT24_0x0060") )) = { image_data_FontT24_0x0060, 13, 28}; +static const tImage FontT24_0x0061 __attribute__(( section(".upper_fonts.FontT24_0x0061") )) = { image_data_FontT24_0x0061, 13, 28}; +static const tImage FontT24_0x0062 __attribute__(( section(".upper_fonts.FontT24_0x0062") )) = { image_data_FontT24_0x0062, 13, 28}; +static const tImage FontT24_0x0063 __attribute__(( section(".upper_fonts.FontT24_0x0063") )) = { image_data_FontT24_0x0063, 12, 28}; +static const tImage FontT24_0x0064 __attribute__(( section(".upper_fonts.FontT24_0x0064") )) = { image_data_FontT24_0x0064, 13, 28}; +static const tImage FontT24_0x0065 __attribute__(( section(".upper_fonts.FontT24_0x0065") )) = { image_data_FontT24_0x0065, 13, 28}; +static const tImage FontT24_0x0066 __attribute__(( section(".upper_fonts.FontT24_0x0066") )) = { image_data_FontT24_0x0066, 9, 28}; +static const tImage FontT24_0x0067 __attribute__(( section(".upper_fonts.FontT24_0x0067") )) = { image_data_FontT24_0x0067, 12, 28}; +static const tImage FontT24_0x0068 __attribute__(( section(".upper_fonts.FontT24_0x0068") )) = { image_data_FontT24_0x0068, 13, 28}; +static const tImage FontT24_0x0069 __attribute__(( section(".upper_fonts.FontT24_0x0069") )) = { image_data_FontT24_0x0069, 7, 28}; +static const tImage FontT24_0x006a __attribute__(( section(".upper_fonts.FontT24_0x006a") )) = { image_data_FontT24_0x006a, 9, 28}; +static const tImage FontT24_0x006b __attribute__(( section(".upper_fonts.FontT24_0x006b") )) = { image_data_FontT24_0x006b, 12, 28}; +static const tImage FontT24_0x006c __attribute__(( section(".upper_fonts.FontT24_0x006c") )) = { image_data_FontT24_0x006c, 7, 28}; +static const tImage FontT24_0x006d __attribute__(( section(".upper_fonts.FontT24_0x006d") )) = { image_data_FontT24_0x006d, 20, 28}; +static const tImage FontT24_0x006e __attribute__(( section(".upper_fonts.FontT24_0x006e") )) = { image_data_FontT24_0x006e, 13, 28}; +static const tImage FontT24_0x006f __attribute__(( section(".upper_fonts.FontT24_0x006f") )) = { image_data_FontT24_0x006f, 13, 28}; +static const tImage FontT24_0x0070 __attribute__(( section(".upper_fonts.FontT24_0x0070") )) = { image_data_FontT24_0x0070, 13, 28}; +static const tImage FontT24_0x0071 __attribute__(( section(".upper_fonts.FontT24_0x0071") )) = { image_data_FontT24_0x0071, 13, 28}; +static const tImage FontT24_0x0072 __attribute__(( section(".upper_fonts.FontT24_0x0072") )) = { image_data_FontT24_0x0072, 9, 28}; +static const tImage FontT24_0x0073 __attribute__(( section(".upper_fonts.FontT24_0x0073") )) = { image_data_FontT24_0x0073, 10, 28}; +static const tImage FontT24_0x0074 __attribute__(( section(".upper_fonts.FontT24_0x0074") )) = { image_data_FontT24_0x0074, 10, 28}; +static const tImage FontT24_0x0075 __attribute__(( section(".upper_fonts.FontT24_0x0075") )) = { image_data_FontT24_0x0075, 13, 28}; +static const tImage FontT24_0x0076 __attribute__(( section(".upper_fonts.FontT24_0x0076") )) = { image_data_FontT24_0x0076, 12, 28}; +static const tImage FontT24_0x0077 __attribute__(( section(".upper_fonts.FontT24_0x0077") )) = { image_data_FontT24_0x0077, 18, 28}; +static const tImage FontT24_0x0078 __attribute__(( section(".upper_fonts.FontT24_0x0078") )) = { image_data_FontT24_0x0078, 12, 28}; +static const tImage FontT24_0x0079 __attribute__(( section(".upper_fonts.FontT24_0x0079") )) = { image_data_FontT24_0x0079, 12, 28}; +static const tImage FontT24_0x007a __attribute__(( section(".upper_fonts.FontT24_0x007a") )) = { image_data_FontT24_0x007a, 11, 28}; + +static const tChar FontT24_array[] __attribute__(( section(".upper_fonts.FontT24min_array") )) = { + + // character: '0' + {0x0030, &FontT24_0x0030}, + + // character: '1' + {0x0031, &FontT24_0x0031}, + + // character: '2' + {0x0032, &FontT24_0x0032}, + + // character: '3' + {0x0033, &FontT24_0x0033}, + + // character: '4' + {0x0034, &FontT24_0x0034}, + + // character: '5' + {0x0035, &FontT24_0x0035}, + + // character: '6' + {0x0036, &FontT24_0x0036}, + + // character: '7' + {0x0037, &FontT24_0x0037}, + + // character: '8' + {0x0038, &FontT24_0x0038}, + + // character: '9' + {0x0039, &FontT24_0x0039}, + + // character: ':' + {0x003a, &FontT24_0x003a}, + + // character: ';' + {0x003b, &FontT24_0x003b}, + + // character: '<' + {0x003c, &FontT24_0x003c}, + + // character: '=' + {0x003d, &FontT24_0x003d}, + + // character: '>' + {0x003e, &FontT24_0x003e}, + + // character: '?' + {0x003f, &FontT24_0x003f}, + + // character: '\x0040' + {0x0040, &FontT24_0x0040}, + + // character: 'A' + {0x0041, &FontT24_0x0041}, + + // character: 'B' + {0x0042, &FontT24_0x0042}, + + // character: 'C' + {0x0043, &FontT24_0x0043}, + + // character: 'D' + {0x0044, &FontT24_0x0044}, + + // character: 'E' + {0x0045, &FontT24_0x0045}, + + // character: 'F' + {0x0046, &FontT24_0x0046}, + + // character: 'G' + {0x0047, &FontT24_0x0047}, + + // character: 'H' + {0x0048, &FontT24_0x0048}, + + // character: 'I' + {0x0049, &FontT24_0x0049}, + + // character: 'J' + {0x004a, &FontT24_0x004a}, + + // character: 'K' + {0x004b, &FontT24_0x004b}, + + // character: 'L' + {0x004c, &FontT24_0x004c}, + + // character: 'M' + {0x004d, &FontT24_0x004d}, + + // character: 'N' + {0x004e, &FontT24_0x004e}, + + // character: 'O' + {0x004f, &FontT24_0x004f}, + + // character: 'P' + {0x0050, &FontT24_0x0050}, + + // character: 'Q' + {0x0051, &FontT24_0x0051}, + + // character: 'R' + {0x0052, &FontT24_0x0052}, + + // character: 'S' + {0x0053, &FontT24_0x0053}, + + // character: 'T' + {0x0054, &FontT24_0x0054}, + + // character: 'U' + {0x0055, &FontT24_0x0055}, + + // character: 'V' + {0x0056, &FontT24_0x0056}, + + // character: 'W' + {0x0057, &FontT24_0x0057}, + + // character: 'X' + {0x0058, &FontT24_0x0058}, + + // character: 'Y' + {0x0059, &FontT24_0x0059}, + + // character: 'Z' + {0x005a, &FontT24_0x005a}, + + // character: '[' + {0x005b, &FontT24_0x005b}, + + // character: '\' + {0x005c, &FontT24_0x005c}, + + // character: ']' + {0x005d, &FontT24_0x005d}, + + // character: '^' + {0x005e, &FontT24_0x005e}, + + // character: '_' + {0x005f, &FontT24_0x005f}, + + // character: '`' + {0x0060, &FontT24_0x0060}, + + // character: 'a' + {0x0061, &FontT24_0x0061}, + + // character: 'b' + {0x0062, &FontT24_0x0062}, + + // character: 'c' + {0x0063, &FontT24_0x0063}, + + // character: 'd' + {0x0064, &FontT24_0x0064}, + + // character: 'e' + {0x0065, &FontT24_0x0065}, + + // character: 'f' + {0x0066, &FontT24_0x0066}, + + // character: 'g' + {0x0067, &FontT24_0x0067}, + + // character: 'h' + {0x0068, &FontT24_0x0068}, + + // character: 'i' + {0x0069, &FontT24_0x0069}, + + // character: 'j' + {0x006a, &FontT24_0x006a}, + + // character: 'k' + {0x006b, &FontT24_0x006b}, + + // character: 'l' + {0x006c, &FontT24_0x006c}, + + // character: 'm' + {0x006d, &FontT24_0x006d}, + + // character: 'n' + {0x006e, &FontT24_0x006e}, + + // character: 'o' + {0x006f, &FontT24_0x006f}, + + // character: 'p' + {0x0070, &FontT24_0x0070}, + + // character: 'q' + {0x0071, &FontT24_0x0071}, + + // character: 'r' + {0x0072, &FontT24_0x0072}, + + // character: 's' + {0x0073, &FontT24_0x0073}, + + // character: 't' + {0x0074, &FontT24_0x0074}, + + // character: 'u' + {0x0075, &FontT24_0x0075}, + + // character: 'v' + {0x0076, &FontT24_0x0076}, + + // character: 'w' + {0x0077, &FontT24_0x0077}, + + // character: 'x' + {0x0078, &FontT24_0x0078}, + + // character: 'y' + {0x0079, &FontT24_0x0079}, + + // character: 'z' + {0x007a, &FontT24_0x007a} +}; + +const tFont FontT24min __attribute__ (( used, section(".upper_font_directory.FontT24") )) = { 75, FontT24_array, 7, 13, 28 }; + +static const uint8_t image_data_FontT24_0x0030_mod[216] = { 0, 9, 5, 1, 11, 1, 35, 5, 11, 1, 0, 18, 35, 1, 98, 1, 176, 1, 219, 1, 235, 5, 219, 1, 141, 1, 60, 1, 5, 1, 0, 14, 98, 1, 235, 1, 255, 4, 245, 3, 255, 4, 176, 1, 11, 1, 0, 12, 11, 1, 255, 2, 239, 1, 175, 1, 128, 1, 89, 1, 56, 3, 89, 2, 175, 1, 239, 1, 255, 1, 219, 1, 0, 12, 219, 1, 255, 1, 203, 1, 25, 1, 0, 9, 25, 1, 239, 1, 255, 1, 141, 1, 0, 11, 255, 2, 12, 1, 0, 11, 25, 1, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 255, 2, 5, 1, 0, 12, 255, 2, 0, 11, 203, 1, 255, 1, 176, 1, 11, 1, 0, 9, 5, 1, 141, 1, 255, 1, 245, 1, 0, 11, 12, 1, 245, 1, 255, 1, 219, 1, 141, 1, 60, 2, 35, 4, 60, 1, 98, 1, 176, 1, 255, 2, 56, 1, 0, 12, 56, 1, 203, 1, 255, 4, 235, 4, 255, 3, 245, 1, 128, 1, 0, 14, 12, 1, 89, 1, 175, 1, 239, 1, 245, 5, 239, 1, 203, 1, 175, 1, 56, 1, 0, 18, 25, 1, 56, 5, 25, 1, 12, 1, 0, 10 }; +static const uint8_t image_data_FontT24_0x0031_mod[54] = { 0, 72, 98, 2, 0, 26, 89, 1, 255, 1, 98, 1, 0, 26, 239, 1, 255, 1, 11, 1, 0, 13, 11, 12, 36, 1, 255, 1, 219, 1, 5, 1, 0, 12, 219, 13, 255, 2, 176, 1, 5, 1, 0, 11, 255, 16, 176, 1, 0, 11, 89, 17, 0, 118 }; +static const uint8_t image_data_FontT24_0x0032_mod[204] = { 0, 5, 11, 1, 0, 13, 11, 1, 0, 13, 219, 1, 60, 1, 0, 11, 35, 1, 219, 1, 98, 1, 0, 12, 255, 2, 141, 1, 11, 1, 0, 9, 155, 1, 255, 2, 35, 1, 0, 11, 255, 3, 219, 1, 35, 1, 0, 9, 203, 1, 255, 1, 235, 1, 0, 11, 255, 2, 239, 1, 255, 1, 235, 1, 98, 1, 5, 1, 0, 7, 12, 1, 255, 2, 0, 11, 255, 2, 25, 1, 175, 1, 255, 2, 176, 1, 35, 1, 0, 7, 255, 2, 0, 11, 255, 2, 0, 2, 89, 1, 239, 1, 255, 1, 235, 1, 98, 1, 5, 1, 0, 5, 255, 2, 0, 11, 255, 2, 0, 3, 25, 1, 175, 1, 255, 2, 176, 1, 60, 1, 5, 1, 0, 1, 5, 1, 98, 1, 255, 1, 245, 1, 0, 11, 255, 2, 0, 5, 128, 1, 239, 1, 255, 2, 176, 1, 141, 1, 176, 1, 255, 2, 56, 1, 0, 11, 255, 2, 0, 6, 25, 1, 175, 1, 245, 1, 255, 4, 175, 1, 0, 12, 255, 2, 0, 8, 56, 1, 128, 1, 175, 2, 89, 1, 0, 13, 203, 2, 0, 26, 12, 2, 0, 21 }; +static const uint8_t image_data_FontT24_0x0033_mod[188] = { 0, 33, 36, 1, 60, 1, 5, 1, 0, 12, 35, 1, 0, 12, 98, 1, 255, 1, 167, 1, 0, 11, 98, 1, 235, 1, 98, 1, 0, 11, 255, 2, 56, 1, 0, 11, 128, 1, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 255, 2, 0, 6, 141, 2, 0, 5, 255, 2, 0, 11, 255, 2, 0, 6, 255, 2, 0, 5, 255, 2, 0, 11, 255, 2, 35, 1, 0, 4, 60, 1, 255, 1, 245, 1, 98, 1, 0, 3, 98, 1, 255, 2, 0, 11, 128, 1, 255, 1, 235, 1, 60, 1, 11, 2, 60, 1, 255, 2, 56, 1, 255, 1, 141, 1, 98, 1, 141, 1, 255, 2, 89, 1, 0, 12, 239, 1, 255, 2, 219, 2, 255, 2, 239, 1, 0, 1, 175, 1, 255, 4, 203, 1, 0, 13, 25, 1, 203, 1, 245, 1, 255, 2, 245, 1, 175, 1, 25, 1, 0, 2, 128, 1, 175, 1, 203, 1, 128, 1, 12, 1, 0, 14, 12, 1, 56, 1, 89, 2, 56, 1, 0, 6, 12, 1, 0, 37 }; +static const uint8_t image_data_FontT24_0x0034_mod[126] = { 0, 10, 141, 1, 98, 1, 0, 26, 255, 2, 141, 1, 0, 25, 255, 3, 141, 1, 5, 1, 0, 23, 255, 2, 128, 1, 255, 1, 176, 1, 11, 1, 0, 22, 255, 2, 0, 1, 128, 1, 255, 1, 219, 1, 11, 1, 0, 21, 255, 2, 0, 2, 89, 1, 245, 1, 219, 1, 35, 1, 0, 20, 255, 2, 0, 3, 56, 1, 239, 1, 235, 1, 60, 1, 0, 19, 255, 2, 0, 4, 25, 1, 203, 1, 255, 1, 60, 1, 0, 13, 141, 5, 255, 2, 141, 5, 154, 1, 255, 2, 98, 1, 0, 12, 255, 16, 141, 1, 0, 11, 175, 5, 255, 2, 175, 10, 0, 16, 255, 2, 0, 26, 128, 2, 0, 16 }; +static const uint8_t image_data_FontT24_0x0035_mod[174] = { 0, 34, 35, 1, 0, 7, 11, 8, 0, 11, 60, 1, 235, 1, 141, 1, 0, 6, 219, 8, 0, 11, 255, 2, 128, 1, 0, 6, 175, 1, 255, 7, 0, 11, 255, 2, 0, 8, 255, 1, 153, 1, 89, 3, 255, 2, 0, 11, 255, 2, 0, 8, 255, 2, 0, 3, 255, 2, 0, 11, 255, 2, 0, 8, 255, 2, 0, 3, 255, 2, 0, 11, 255, 2, 35, 1, 0, 6, 35, 1, 255, 2, 0, 3, 255, 2, 0, 11, 128, 1, 255, 1, 235, 1, 60, 1, 5, 2, 0, 1, 5, 1, 35, 1, 235, 1, 255, 1, 245, 1, 0, 3, 255, 2, 0, 12, 239, 1, 255, 2, 176, 2, 141, 1, 176, 1, 235, 1, 255, 2, 56, 1, 0, 3, 255, 2, 0, 12, 25, 1, 203, 1, 245, 1, 255, 5, 239, 1, 89, 1, 0, 4, 203, 2, 0, 13, 12, 1, 56, 1, 128, 1, 175, 3, 89, 1, 25, 1, 0, 5, 12, 2, 0, 34 }; +static const uint8_t image_data_FontT24_0x0036_mod[220] = { 0, 10, 5, 4, 0, 21, 11, 1, 60, 1, 141, 1, 176, 4, 98, 1, 35, 1, 5, 1, 0, 17, 35, 1, 219, 1, 255, 7, 235, 1, 176, 1, 35, 1, 0, 15, 5, 1, 235, 1, 255, 1, 203, 1, 128, 3, 203, 1, 255, 2, 239, 1, 255, 1, 235, 1, 98, 1, 0, 14, 176, 1, 255, 1, 175, 1, 12, 1, 0, 3, 12, 1, 175, 1, 255, 1, 124, 1, 128, 1, 255, 2, 141, 1, 0, 13, 255, 2, 0, 7, 255, 2, 0, 1, 89, 1, 245, 1, 255, 1, 141, 1, 0, 12, 255, 2, 0, 7, 255, 2, 0, 2, 56, 1, 245, 1, 255, 1, 35, 1, 0, 11, 255, 2, 5, 1, 0, 5, 5, 1, 255, 2, 0, 3, 56, 1, 255, 1, 235, 1, 0, 11, 239, 1, 255, 1, 176, 1, 11, 1, 0, 3, 11, 1, 176, 1, 255, 1, 245, 1, 0, 4, 146, 1, 175, 1, 0, 11, 25, 1, 255, 2, 219, 1, 141, 1, 98, 1, 141, 1, 219, 1, 255, 2, 56, 1, 0, 4, 56, 1, 0, 13, 89, 1, 245, 1, 255, 5, 245, 1, 128, 1, 0, 20, 56, 1, 128, 1, 203, 3, 128, 1, 56, 1, 0, 23, 12, 3, 0, 16 }; +static const uint8_t image_data_FontT24_0x0037_mod[170] = { 0, 48, 219, 2, 0, 11, 60, 1, 11, 1, 0, 13, 255, 2, 0, 11, 255, 1, 219, 1, 141, 1, 35, 1, 5, 1, 0, 10, 255, 2, 0, 11, 255, 3, 235, 1, 176, 1, 60, 1, 5, 1, 0, 8, 255, 2, 0, 11, 89, 1, 175, 1, 239, 1, 255, 3, 176, 1, 98, 1, 11, 1, 0, 6, 255, 2, 0, 13, 25, 1, 89, 1, 203, 1, 245, 1, 255, 2, 219, 1, 98, 1, 11, 1, 0, 4, 255, 2, 0, 15, 12, 1, 56, 1, 175, 1, 245, 1, 255, 2, 219, 1, 98, 1, 11, 1, 0, 2, 255, 2, 0, 18, 56, 1, 175, 1, 239, 1, 255, 2, 219, 1, 98, 1, 11, 1, 255, 2, 0, 20, 25, 1, 128, 1, 239, 1, 255, 2, 219, 1, 255, 2, 0, 22, 25, 1, 128, 1, 245, 1, 255, 3, 0, 24, 56, 1, 175, 1, 245, 1, 255, 1, 0, 26, 56, 1, 128, 1, 0, 6 }; +static const uint8_t image_data_FontT24_0x0038_mod[260] = { 0, 9, 5, 2, 0, 23, 5, 1, 98, 1, 141, 1, 176, 2, 98, 1, 11, 1, 0, 3, 5, 1, 35, 2, 11, 1, 0, 14, 176, 1, 255, 5, 219, 1, 11, 1, 0, 1, 35, 1, 176, 1, 235, 2, 219, 1, 60, 1, 0, 12, 60, 1, 255, 2, 203, 1, 128, 2, 239, 1, 255, 1, 219, 1, 5, 1, 235, 1, 255, 1, 245, 2, 255, 2, 11, 1, 0, 11, 255, 2, 175, 1, 12, 1, 0, 2, 25, 1, 203, 1, 255, 1, 176, 1, 255, 1, 239, 1, 56, 2, 203, 1, 255, 1, 219, 1, 0, 11, 255, 2, 0, 5, 12, 1, 255, 3, 25, 1, 0, 2, 12, 1, 255, 2, 0, 11, 255, 2, 0, 6, 255, 2, 128, 1, 0, 4, 255, 2, 0, 11, 255, 2, 0, 5, 35, 1, 255, 2, 35, 1, 0, 4, 255, 2, 0, 11, 255, 2, 141, 1, 0, 3, 11, 1, 235, 1, 255, 2, 235, 1, 98, 1, 11, 2, 141, 1, 255, 1, 245, 1, 0, 11, 89, 1, 255, 2, 141, 1, 60, 1, 98, 1, 219, 1, 255, 1, 203, 1, 89, 1, 255, 2, 219, 2, 255, 2, 56, 1, 0, 12, 203, 1, 255, 5, 239, 1, 12, 1, 0, 1, 89, 1, 239, 1, 255, 2, 245, 1, 128, 1, 0, 13, 12, 1, 128, 1, 203, 1, 239, 2, 175, 1, 25, 1, 0, 3, 25, 1, 89, 2, 56, 1, 0, 16, 12, 1, 25, 2, 0, 17 }; +static const uint8_t image_data_FontT24_0x0039_mod[210] = { 0, 14, 5, 1, 11, 3, 5, 1, 0, 22, 60, 1, 176, 1, 219, 3, 176, 1, 60, 1, 0, 20, 141, 1, 255, 7, 141, 1, 0, 12, 60, 1, 0, 5, 60, 1, 255, 2, 203, 1, 89, 3, 175, 1, 255, 2, 35, 1, 0, 11, 255, 1, 141, 1, 0, 4, 255, 2, 175, 1, 12, 1, 0, 4, 128, 1, 255, 1, 235, 1, 0, 11, 239, 1, 255, 1, 60, 1, 0, 3, 255, 2, 0, 7, 255, 2, 0, 11, 25, 1, 255, 2, 60, 1, 0, 2, 255, 2, 0, 7, 255, 2, 0, 12, 128, 1, 255, 2, 98, 1, 0, 1, 255, 2, 5, 1, 0, 5, 5, 1, 255, 2, 0, 13, 128, 1, 255, 2, 141, 1, 125, 1, 255, 1, 176, 1, 11, 1, 0, 3, 11, 1, 176, 1, 255, 1, 175, 1, 0, 14, 89, 1, 239, 1, 255, 1, 235, 1, 255, 2, 219, 1, 141, 3, 219, 1, 255, 1, 239, 1, 0, 16, 25, 1, 175, 1, 239, 1, 255, 6, 245, 1, 203, 1, 25, 1, 0, 18, 25, 1, 128, 1, 175, 1, 203, 2, 175, 1, 128, 1, 56, 1, 12, 1, 0, 22, 12, 2, 0, 12 }; +static const uint8_t image_data_FontT24_0x003a_mod[74] = { 0, 61, 11, 1, 98, 2, 11, 1, 0, 5, 11, 1, 98, 2, 11, 1, 0, 15, 219, 1, 255, 2, 219, 1, 0, 5, 219, 1, 255, 2, 219, 1, 0, 15, 255, 4, 0, 5, 255, 4, 0, 15, 89, 1, 203, 1, 239, 1, 89, 1, 0, 5, 89, 1, 203, 1, 239, 1, 89, 1, 0, 16, 12, 1, 25, 1, 0, 7, 12, 1, 25, 1, 0, 67 }; +static const uint8_t image_data_FontT24_0x003b_mod[96] = { 0, 29, 11, 1, 0, 27, 210, 1, 60, 1, 0, 3, 11, 1, 60, 1, 11, 1, 0, 5, 11, 1, 98, 2, 11, 1, 0, 11, 56, 1, 255, 1, 98, 1, 11, 2, 219, 1, 255, 1, 219, 1, 0, 5, 219, 1, 255, 2, 219, 1, 0, 12, 89, 1, 245, 1, 219, 2, 255, 3, 0, 5, 255, 4, 0, 13, 56, 1, 175, 1, 239, 3, 128, 1, 0, 5, 89, 1, 203, 1, 239, 1, 89, 1, 0, 15, 25, 3, 0, 7, 12, 1, 25, 1, 0, 67 }; +static const uint8_t image_data_FontT24_0x003c_mod[114] = { 0, 40, 60, 1, 0, 26, 35, 1, 255, 1, 35, 1, 0, 25, 235, 1, 255, 1, 235, 1, 0, 24, 5, 1, 255, 1, 203, 1, 255, 1, 5, 1, 0, 23, 176, 1, 255, 1, 12, 1, 255, 1, 176, 1, 0, 23, 255, 1, 245, 1, 0, 1, 245, 1, 255, 1, 0, 22, 98, 1, 255, 1, 56, 1, 0, 1, 56, 1, 255, 1, 98, 1, 0, 21, 255, 2, 0, 3, 255, 2, 0, 20, 60, 1, 255, 1, 175, 1, 0, 3, 175, 1, 255, 1, 60, 1, 0, 19, 203, 2, 0, 5, 203, 2, 0, 19, 12, 2, 0, 5, 12, 2, 0, 39 }; +static const uint8_t image_data_FontT24_0x003d_mod[90] = { 0, 38, 60, 2, 0, 2, 60, 2, 0, 22, 255, 2, 0, 2, 255, 2, 0, 22, 255, 2, 0, 2, 255, 2, 0, 22, 255, 2, 0, 2, 255, 2, 0, 22, 255, 2, 0, 2, 255, 2, 0, 22, 255, 2, 0, 2, 255, 2, 0, 22, 255, 2, 0, 2, 255, 2, 0, 22, 255, 2, 0, 2, 255, 2, 0, 22, 255, 2, 0, 2, 255, 2, 0, 22, 255, 2, 0, 2, 255, 2, 0, 22, 89, 2, 0, 2, 89, 2, 0, 40 }; +static const uint8_t image_data_FontT24_0x003e_mod[110] = { 0, 36, 60, 2, 0, 5, 60, 2, 0, 19, 203, 1, 255, 1, 11, 1, 0, 3, 11, 1, 255, 1, 203, 1, 0, 19, 12, 1, 255, 1, 219, 1, 0, 3, 219, 1, 255, 1, 12, 1, 0, 20, 245, 1, 255, 1, 0, 3, 255, 1, 245, 1, 0, 21, 56, 1, 255, 1, 141, 1, 0, 1, 141, 1, 255, 1, 56, 1, 0, 22, 255, 2, 0, 1, 255, 2, 0, 23, 128, 1, 255, 1, 60, 1, 255, 1, 128, 1, 0, 24, 255, 3, 0, 25, 175, 1, 255, 1, 175, 1, 0, 26, 203, 1, 0, 27, 12, 1, 0, 43 }; +static const uint8_t image_data_FontT24_0x003f_mod[144] = { 0, 20, 11, 1, 98, 1, 0, 12, 11, 2, 0, 12, 140, 1, 255, 1, 141, 1, 0, 10, 98, 1, 219, 2, 98, 1, 0, 1, 98, 1, 141, 2, 60, 1, 5, 1, 0, 6, 255, 2, 0, 10, 255, 4, 0, 1, 245, 2, 255, 2, 176, 1, 35, 1, 0, 5, 255, 2, 0, 10, 203, 1, 255, 2, 203, 1, 0, 1, 56, 2, 89, 1, 175, 1, 255, 1, 235, 1, 60, 1, 0, 3, 5, 1, 255, 2, 0, 10, 12, 1, 89, 2, 12, 1, 0, 5, 128, 1, 255, 2, 98, 1, 35, 2, 176, 1, 255, 1, 245, 1, 0, 20, 128, 1, 255, 2, 235, 2, 255, 2, 56, 1, 0, 21, 89, 1, 203, 1, 245, 2, 239, 1, 128, 1, 0, 23, 12, 1, 56, 2, 25, 1, 0, 7 }; +static const uint8_t image_data_FontT24_0x0040_mod[368] = { 0, 11, 5, 2, 0, 23, 35, 1, 98, 1, 141, 1, 176, 2, 141, 1, 98, 1, 11, 1, 0, 18, 5, 1, 141, 1, 235, 1, 245, 1, 239, 1, 203, 2, 239, 1, 255, 1, 219, 1, 98, 1, 0, 17, 176, 1, 245, 1, 128, 1, 56, 1, 25, 1, 12, 2, 25, 1, 89, 1, 175, 1, 255, 1, 141, 1, 0, 15, 141, 1, 239, 1, 56, 1, 0, 8, 89, 1, 245, 1, 141, 1, 0, 13, 5, 1, 255, 1, 25, 1, 0, 2, 35, 1, 60, 1, 11, 1, 0, 5, 56, 1, 255, 1, 0, 13, 176, 1, 175, 1, 0, 2, 60, 1, 235, 1, 255, 1, 219, 1, 0, 2, 60, 1, 35, 1, 0, 2, 203, 1, 141, 1, 0, 12, 255, 1, 0, 3, 255, 1, 203, 1, 128, 1, 239, 1, 141, 1, 0, 1, 128, 1, 235, 1, 0, 2, 12, 1, 255, 1, 0, 12, 255, 1, 0, 3, 255, 1, 12, 1, 0, 1, 25, 1, 255, 1, 0, 2, 255, 1, 0, 3, 255, 1, 0, 12, 255, 1, 0, 3, 255, 1, 0, 3, 255, 1, 0, 1, 11, 1, 255, 1, 0, 3, 255, 1, 0, 12, 255, 1, 0, 3, 128, 1, 141, 3, 255, 1, 141, 1, 219, 1, 203, 1, 0, 3, 255, 1, 0, 12, 255, 1, 5, 1, 0, 2, 141, 1, 255, 1, 245, 3, 239, 1, 175, 1, 12, 1, 0, 2, 11, 1, 255, 1, 0, 12, 203, 1, 176, 1, 0, 2, 255, 1, 89, 1, 56, 3, 25, 1, 0, 4, 219, 1, 175, 1, 0, 12, 12, 1, 255, 1, 53, 1, 0, 1, 255, 1, 0, 8, 60, 1, 255, 1, 0, 14, 245, 1, 56, 1, 0, 1, 255, 1, 35, 1, 0, 5, 5, 1, 98, 1, 255, 1, 175, 1, 0, 14, 56, 1, 0, 2, 128, 1, 235, 1, 98, 1, 60, 3, 98, 1, 176, 1, 255, 1, 175, 1, 0, 19, 128, 1, 239, 1, 255, 3, 245, 1, 239, 1, 128, 1, 0, 21, 25, 1, 89, 1, 128, 1, 89, 1, 56, 1, 25, 1, 0, 40 }; +static const uint8_t image_data_FontT24_0x0041_mod[236] = { 0, 5, 176, 1, 60, 1, 11, 1, 0, 25, 255, 2, 219, 1, 98, 1, 35, 1, 0, 23, 203, 1, 245, 1, 255, 2, 235, 1, 141, 1, 60, 1, 11, 1, 0, 20, 12, 1, 56, 1, 128, 1, 203, 1, 255, 3, 219, 1, 98, 1, 35, 1, 0, 21, 12, 1, 255, 2, 203, 1, 245, 1, 255, 1, 235, 1, 141, 1, 60, 1, 5, 1, 0, 19, 255, 2, 12, 1, 56, 1, 128, 1, 239, 1, 255, 2, 176, 1, 98, 1, 11, 1, 0, 17, 255, 2, 0, 3, 25, 1, 89, 1, 175, 1, 239, 1, 255, 1, 219, 1, 141, 1, 35, 1, 0, 15, 255, 2, 0, 4, 5, 1, 35, 1, 124, 1, 255, 2, 245, 1, 183, 1, 0, 15, 255, 2, 0, 1, 11, 1, 60, 1, 98, 1, 176, 1, 235, 1, 255, 1, 239, 1, 128, 1, 56, 1, 12, 1, 0, 15, 255, 2, 141, 1, 219, 1, 255, 2, 239, 1, 175, 1, 89, 1, 25, 1, 0, 15, 11, 1, 60, 1, 141, 1, 255, 3, 245, 1, 203, 1, 128, 1, 25, 1, 0, 17, 141, 1, 219, 1, 255, 3, 239, 1, 175, 1, 56, 1, 12, 1, 0, 19, 255, 2, 245, 1, 175, 1, 89, 1, 25, 1, 0, 22, 203, 1, 128, 1, 56, 1, 0, 25, 12, 1, 0, 22 }; +static const uint8_t image_data_FontT24_0x0042_mod[190] = { 0, 33, 35, 17, 0, 11, 235, 17, 0, 11, 255, 2, 245, 6, 255, 2, 245, 5, 255, 2, 0, 11, 255, 2, 56, 6, 255, 2, 56, 5, 255, 2, 0, 11, 255, 2, 0, 6, 255, 2, 0, 5, 255, 2, 0, 11, 255, 2, 0, 6, 255, 2, 0, 5, 255, 2, 0, 11, 255, 2, 0, 6, 255, 2, 0, 5, 255, 2, 0, 11, 255, 2, 5, 1, 0, 4, 5, 1, 255, 1, 239, 1, 141, 1, 0, 3, 60, 1, 255, 2, 0, 11, 203, 1, 255, 1, 176, 1, 5, 1, 0, 3, 176, 1, 255, 1, 25, 1, 255, 1, 141, 1, 98, 1, 141, 1, 255, 2, 128, 1, 0, 11, 12, 1, 255, 2, 176, 1, 98, 1, 60, 1, 141, 1, 255, 2, 0, 1, 203, 1, 255, 4, 239, 1, 0, 13, 128, 1, 255, 6, 89, 1, 0, 1, 12, 1, 128, 1, 203, 2, 175, 1, 25, 1, 0, 14, 89, 1, 203, 1, 239, 2, 203, 1, 89, 1, 0, 4, 12, 2, 0, 17, 12, 1, 25, 2, 12, 1, 0, 16 }; +static const uint8_t image_data_FontT24_0x0043_mod[196] = { 0, 10, 5, 1, 11, 2, 35, 1, 11, 2, 0, 20, 11, 1, 98, 1, 176, 1, 219, 2, 235, 1, 219, 2, 141, 1, 60, 1, 5, 1, 0, 16, 60, 1, 219, 1, 255, 9, 176, 1, 35, 1, 0, 14, 60, 1, 255, 2, 245, 1, 175, 1, 128, 1, 89, 3, 128, 1, 203, 1, 245, 1, 255, 1, 235, 1, 35, 1, 0, 12, 5, 1, 255, 2, 203, 1, 56, 1, 0, 6, 12, 1, 56, 1, 203, 1, 255, 1, 235, 1, 0, 12, 176, 1, 255, 1, 245, 1, 12, 1, 0, 9, 12, 1, 245, 1, 255, 1, 98, 1, 0, 11, 255, 2, 56, 1, 0, 11, 56, 1, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 203, 1, 255, 1, 141, 1, 0, 11, 35, 1, 255, 2, 0, 11, 12, 1, 255, 2, 47, 1, 0, 10, 183, 1, 245, 1, 89, 1, 0, 12, 155, 1, 175, 1, 25, 1, 0, 10, 12, 1, 56, 1, 0, 13, 12, 1, 0, 21 }; +static const uint8_t image_data_FontT24_0x0044_mod[168] = { 0, 33, 35, 17, 0, 11, 235, 17, 0, 11, 255, 2, 245, 13, 255, 2, 0, 11, 255, 2, 56, 13, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 239, 1, 255, 1, 98, 1, 0, 11, 35, 1, 255, 2, 0, 11, 25, 1, 255, 2, 35, 1, 0, 9, 5, 1, 235, 1, 255, 1, 89, 1, 0, 12, 239, 1, 255, 1, 235, 1, 60, 1, 5, 1, 0, 6, 11, 1, 176, 1, 255, 1, 245, 1, 0, 13, 25, 1, 239, 1, 255, 2, 176, 1, 98, 1, 60, 3, 98, 1, 141, 1, 219, 1, 255, 1, 245, 1, 56, 1, 0, 14, 25, 1, 203, 1, 255, 9, 239, 1, 56, 1, 0, 16, 12, 1, 89, 1, 175, 1, 203, 1, 239, 4, 203, 1, 128, 1, 25, 1, 0, 20, 12, 1, 25, 4, 12, 1, 0, 11 }; +static const uint8_t image_data_FontT24_0x0045_mod[122] = { 0, 33, 35, 17, 0, 11, 235, 17, 0, 11, 255, 2, 245, 6, 255, 2, 245, 5, 255, 2, 0, 11, 255, 2, 56, 6, 255, 2, 56, 5, 255, 2, 0, 11, 255, 2, 0, 6, 255, 2, 0, 5, 255, 2, 0, 11, 255, 2, 0, 6, 255, 2, 0, 5, 255, 2, 0, 11, 255, 2, 0, 6, 255, 2, 0, 5, 255, 2, 0, 11, 255, 2, 0, 6, 255, 2, 0, 5, 255, 2, 0, 11, 255, 2, 0, 6, 203, 2, 0, 5, 255, 2, 0, 11, 255, 2, 0, 6, 12, 2, 0, 5, 255, 2, 0, 11, 239, 2, 0, 13, 239, 2, 0, 11, 25, 2, 0, 13, 25, 2, 0, 6 }; +static const uint8_t image_data_FontT24_0x0046_mod[86] = { 0, 33, 35, 17, 0, 11, 235, 17, 0, 11, 245, 8, 255, 2, 245, 5, 255, 2, 0, 11, 56, 8, 255, 2, 56, 5, 255, 2, 0, 19, 255, 2, 0, 5, 255, 2, 0, 19, 255, 2, 0, 5, 255, 2, 0, 19, 255, 2, 0, 5, 255, 2, 0, 19, 255, 2, 0, 5, 255, 2, 0, 19, 245, 2, 0, 5, 255, 2, 0, 19, 56, 2, 0, 5, 255, 2, 0, 26, 255, 2, 0, 26, 128, 2, 0, 6 }; +static const uint8_t image_data_FontT24_0x0047_mod[216] = { 0, 11, 11, 2, 35, 1, 11, 1, 5, 1, 0, 20, 11, 1, 60, 1, 141, 1, 219, 2, 235, 1, 219, 1, 176, 1, 141, 1, 60, 1, 5, 1, 0, 16, 35, 1, 219, 1, 255, 9, 176, 1, 11, 1, 0, 14, 35, 1, 235, 1, 255, 1, 245, 1, 175, 1, 128, 1, 89, 3, 128, 1, 203, 1, 255, 2, 219, 1, 5, 1, 0, 13, 235, 1, 255, 1, 239, 1, 56, 1, 0, 6, 12, 1, 89, 1, 245, 1, 255, 1, 176, 1, 0, 12, 98, 1, 255, 2, 25, 1, 0, 9, 56, 1, 255, 2, 11, 1, 0, 11, 255, 2, 89, 1, 0, 11, 128, 1, 255, 1, 219, 1, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 255, 2, 0, 5, 98, 2, 0, 6, 255, 2, 0, 11, 255, 2, 11, 1, 0, 4, 255, 2, 0, 6, 255, 2, 0, 11, 175, 1, 255, 1, 219, 1, 35, 4, 255, 2, 0, 5, 98, 1, 255, 2, 0, 12, 255, 2, 235, 4, 255, 2, 0, 5, 175, 1, 245, 1, 89, 1, 0, 12, 203, 1, 245, 7, 0, 6, 56, 1, 0, 13, 12, 1, 56, 7, 0, 42 }; +static const uint8_t image_data_FontT24_0x0048_mod[74] = { 0, 33, 35, 17, 0, 11, 235, 17, 0, 11, 245, 8, 255, 2, 245, 7, 0, 11, 56, 8, 255, 2, 56, 7, 0, 19, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 18, 35, 8, 255, 2, 35, 7, 0, 11, 235, 8, 255, 2, 235, 7, 0, 11, 245, 17, 0, 11, 56, 17, 0, 34 }; +static const uint8_t image_data_FontT24_0x0049_mod[14] = { 0, 61, 141, 17, 0, 11, 255, 17, 0, 11, 175, 17, 0, 62 }; +static const uint8_t image_data_FontT24_0x004a_mod[90] = { 0, 7, 35, 1, 98, 1, 0, 25, 141, 1, 235, 1, 255, 1, 0, 24, 141, 1, 255, 1, 245, 1, 175, 1, 0, 24, 255, 2, 56, 1, 0, 25, 255, 2, 0, 26, 255, 2, 5, 1, 0, 25, 239, 1, 255, 1, 176, 1, 60, 1, 35, 1, 11, 12, 0, 11, 25, 1, 245, 1, 255, 2, 235, 1, 219, 12, 0, 12, 56, 1, 203, 1, 239, 1, 245, 1, 255, 12, 0, 13, 12, 1, 25, 1, 56, 1, 89, 12, 0, 34 }; +static const uint8_t image_data_FontT24_0x004b_mod[192] = { 0, 33, 35, 17, 0, 11, 235, 17, 0, 11, 245, 5, 255, 3, 245, 9, 0, 11, 56, 5, 203, 1, 255, 2, 92, 1, 56, 8, 0, 16, 12, 1, 128, 1, 245, 1, 235, 1, 98, 1, 5, 1, 0, 24, 117, 1, 255, 2, 176, 1, 35, 1, 0, 21, 35, 1, 141, 1, 255, 2, 245, 1, 255, 1, 235, 1, 98, 1, 5, 1, 0, 17, 5, 1, 98, 1, 235, 1, 255, 2, 203, 1, 56, 1, 128, 1, 245, 1, 255, 1, 176, 1, 35, 1, 0, 15, 35, 1, 176, 1, 255, 2, 239, 1, 128, 1, 12, 1, 0, 2, 56, 1, 239, 1, 255, 1, 235, 1, 98, 1, 0, 12, 5, 1, 98, 1, 235, 1, 255, 1, 245, 1, 175, 1, 25, 1, 0, 5, 25, 1, 175, 1, 255, 2, 141, 1, 0, 11, 176, 1, 255, 2, 203, 1, 56, 1, 0, 9, 89, 1, 245, 1, 255, 1, 0, 11, 255, 1, 239, 1, 128, 1, 12, 1, 0, 11, 56, 1, 239, 1, 0, 11, 203, 1, 25, 1, 0, 14, 25, 1, 0, 6 }; +static const uint8_t image_data_FontT24_0x004c_mod[50] = { 0, 33, 60, 17, 0, 11, 255, 17, 0, 11, 255, 2, 245, 15, 0, 11, 255, 2, 56, 15, 0, 11, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 175, 2, 0, 21 }; +static const uint8_t image_data_FontT24_0x004d_mod[350] = { 0, 5, 141, 1, 98, 1, 60, 1, 35, 1, 5, 1, 0, 23, 255, 3, 235, 1, 176, 1, 141, 1, 98, 1, 60, 1, 35, 1, 11, 1, 5, 1, 0, 17, 128, 1, 175, 1, 239, 1, 245, 1, 255, 4, 235, 1, 219, 1, 176, 1, 98, 1, 60, 1, 35, 1, 11, 1, 5, 1, 0, 14, 25, 1, 56, 1, 89, 1, 128, 1, 175, 1, 203, 1, 239, 1, 245, 1, 255, 3, 235, 1, 219, 1, 176, 1, 141, 1, 0, 18, 12, 1, 25, 1, 67, 1, 153, 1, 255, 4, 239, 1, 175, 1, 0, 17, 11, 1, 60, 1, 141, 1, 219, 1, 255, 2, 239, 1, 175, 1, 89, 1, 25, 1, 0, 15, 11, 1, 60, 1, 141, 1, 219, 1, 255, 2, 239, 1, 175, 1, 89, 1, 25, 1, 0, 15, 11, 1, 60, 1, 141, 1, 219, 1, 255, 2, 239, 1, 175, 1, 89, 1, 25, 1, 0, 18, 210, 1, 255, 4, 125, 1, 30, 1, 0, 21, 56, 1, 128, 1, 203, 1, 245, 1, 255, 1, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 20, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 1, 235, 1, 176, 1, 141, 1, 60, 1, 11, 1, 0, 20, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 2, 219, 1, 141, 1, 60, 1, 11, 1, 5, 1, 0, 19, 18, 1, 92, 1, 197, 1, 255, 4, 219, 1, 176, 1, 0, 13, 5, 1, 11, 1, 35, 1, 60, 1, 98, 1, 141, 1, 176, 1, 235, 1, 255, 3, 245, 1, 239, 1, 175, 1, 128, 1, 0, 11, 60, 1, 141, 1, 176, 1, 219, 1, 235, 1, 255, 3, 245, 1, 239, 1, 203, 1, 128, 1, 89, 1, 56, 1, 25, 1, 0, 13, 255, 3, 245, 1, 239, 1, 203, 1, 128, 1, 89, 1, 56, 1, 25, 1, 12, 1, 0, 17, 203, 1, 175, 1, 89, 1, 56, 1, 25, 1, 12, 1, 0, 17 }; +static const uint8_t image_data_FontT24_0x004e_mod[134] = { 0, 33, 60, 17, 0, 11, 255, 16, 239, 1, 0, 11, 239, 12, 255, 3, 175, 1, 25, 1, 0, 11, 25, 10, 30, 1, 124, 1, 255, 1, 245, 1, 128, 1, 0, 22, 11, 1, 176, 1, 255, 1, 203, 1, 56, 1, 0, 22, 60, 1, 219, 1, 255, 1, 128, 1, 12, 1, 0, 21, 11, 1, 141, 1, 255, 1, 239, 1, 89, 1, 0, 22, 60, 1, 219, 1, 255, 1, 175, 1, 25, 1, 0, 21, 5, 1, 98, 1, 255, 1, 239, 1, 89, 1, 0, 22, 35, 1, 176, 1, 255, 1, 216, 1, 36, 1, 11, 10, 0, 11, 5, 1, 98, 1, 235, 1, 255, 2, 235, 1, 219, 11, 0, 11, 176, 1, 255, 16, 0, 11, 89, 17, 0, 34 }; +static const uint8_t image_data_FontT24_0x004f_mod[234] = { 0, 11, 5, 1, 11, 4, 0, 20, 11, 1, 60, 1, 141, 1, 176, 1, 219, 4, 141, 1, 60, 1, 11, 1, 0, 16, 60, 1, 219, 1, 255, 9, 219, 1, 60, 1, 0, 14, 60, 1, 255, 2, 245, 1, 175, 1, 128, 1, 89, 3, 128, 1, 175, 1, 239, 1, 255, 2, 60, 1, 0, 12, 5, 1, 255, 2, 175, 1, 56, 1, 0, 7, 25, 1, 128, 1, 255, 2, 5, 1, 0, 11, 176, 1, 255, 1, 203, 1, 0, 11, 175, 1, 255, 1, 176, 1, 0, 11, 255, 2, 12, 1, 0, 12, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 255, 2, 11, 1, 0, 11, 5, 1, 255, 2, 0, 11, 175, 1, 255, 1, 219, 1, 0, 11, 176, 1, 255, 1, 203, 1, 0, 12, 255, 2, 141, 1, 35, 1, 0, 7, 11, 1, 141, 1, 255, 2, 12, 1, 0, 12, 89, 1, 255, 2, 235, 1, 141, 1, 98, 1, 60, 4, 141, 1, 219, 1, 255, 2, 128, 1, 0, 14, 89, 1, 239, 1, 255, 9, 239, 1, 128, 1, 0, 16, 25, 1, 128, 1, 175, 1, 239, 2, 245, 1, 239, 2, 203, 1, 128, 1, 25, 1, 0, 20, 25, 2, 56, 1, 25, 2, 12, 1, 0, 11 }; +static const uint8_t image_data_FontT24_0x0050_mod[124] = { 0, 33, 60, 17, 0, 11, 255, 17, 0, 11, 239, 6, 255, 2, 239, 7, 255, 2, 0, 11, 25, 6, 255, 2, 25, 7, 255, 2, 0, 17, 255, 2, 0, 7, 255, 2, 0, 17, 255, 2, 0, 7, 255, 2, 0, 17, 255, 2, 11, 1, 0, 5, 11, 1, 255, 2, 0, 17, 203, 1, 255, 1, 219, 1, 5, 1, 0, 3, 5, 1, 219, 1, 255, 1, 175, 1, 0, 17, 12, 1, 255, 2, 176, 1, 60, 3, 176, 1, 255, 2, 0, 19, 128, 1, 255, 7, 128, 1, 0, 20, 89, 1, 203, 1, 239, 1, 245, 2, 203, 1, 128, 1, 0, 22, 12, 1, 25, 1, 56, 2, 12, 1, 0, 9 }; +static const uint8_t image_data_FontT24_0x0051_mod[268] = { 0, 11, 11, 2, 35, 1, 11, 2, 0, 20, 11, 1, 60, 1, 141, 1, 219, 2, 235, 1, 219, 2, 141, 1, 98, 1, 11, 1, 0, 16, 60, 1, 219, 1, 255, 9, 219, 1, 60, 1, 0, 14, 98, 1, 255, 2, 245, 1, 175, 1, 128, 1, 89, 4, 175, 1, 239, 1, 255, 2, 60, 1, 0, 12, 5, 1, 255, 2, 175, 1, 56, 1, 0, 7, 25, 1, 128, 1, 255, 2, 5, 1, 0, 11, 176, 1, 255, 1, 203, 1, 0, 11, 175, 1, 255, 1, 176, 1, 0, 11, 255, 2, 12, 1, 0, 12, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 11, 255, 2, 0, 13, 255, 2, 0, 10, 35, 1, 255, 2, 11, 1, 0, 11, 5, 1, 255, 2, 0, 9, 35, 1, 235, 1, 255, 2, 219, 1, 5, 1, 0, 10, 176, 1, 255, 1, 175, 1, 0, 9, 235, 1, 255, 1, 203, 1, 255, 2, 176, 1, 35, 1, 0, 7, 11, 1, 141, 1, 255, 2, 0, 9, 5, 1, 255, 1, 245, 1, 12, 1, 128, 1, 255, 2, 235, 1, 141, 1, 98, 1, 60, 3, 98, 1, 141, 1, 219, 1, 255, 2, 128, 1, 0, 9, 176, 1, 255, 1, 56, 1, 0, 2, 89, 1, 239, 1, 255, 9, 239, 1, 128, 1, 0, 10, 255, 2, 0, 4, 25, 1, 128, 1, 175, 1, 239, 5, 203, 1, 128, 1, 25, 1, 0, 11, 255, 2, 0, 7, 25, 5, 12, 1, 0, 13, 255, 2, 0, 24 }; +static const uint8_t image_data_FontT24_0x0052_mod[170] = { 0, 33, 35, 17, 0, 11, 235, 17, 0, 11, 255, 17, 0, 11, 89, 7, 255, 2, 89, 6, 255, 2, 0, 18, 255, 2, 0, 6, 255, 2, 0, 17, 11, 1, 255, 2, 0, 6, 255, 2, 0, 16, 60, 1, 219, 1, 255, 2, 0, 6, 255, 2, 0, 14, 11, 1, 141, 1, 255, 2, 239, 1, 255, 1, 60, 1, 0, 4, 60, 1, 255, 2, 0, 13, 60, 1, 219, 1, 255, 2, 175, 1, 25, 1, 255, 2, 60, 1, 35, 2, 60, 1, 255, 2, 128, 1, 0, 11, 11, 1, 141, 1, 255, 2, 239, 1, 89, 1, 0, 2, 175, 1, 255, 2, 235, 2, 255, 2, 239, 1, 0, 12, 219, 1, 255, 2, 175, 1, 25, 1, 0, 4, 128, 1, 239, 1, 255, 2, 245, 1, 203, 1, 25, 1, 0, 12, 255, 1, 239, 1, 89, 1, 0, 7, 25, 1, 89, 2, 56, 1, 12, 1, 0, 13, 203, 1, 25, 1, 0, 21 }; +static const uint8_t image_data_FontT24_0x0053_mod[204] = { 0, 5, 5, 1, 0, 10, 5, 1, 11, 2, 0, 14, 36, 1, 141, 1, 60, 1, 0, 7, 98, 1, 176, 1, 219, 2, 141, 1, 5, 1, 0, 12, 176, 1, 255, 1, 239, 1, 0, 6, 141, 1, 255, 5, 176, 1, 0, 12, 255, 2, 25, 1, 0, 5, 35, 1, 255, 2, 175, 1, 89, 1, 128, 1, 255, 2, 98, 1, 0, 11, 255, 2, 0, 6, 235, 1, 255, 1, 203, 1, 0, 3, 89, 1, 255, 2, 0, 11, 255, 2, 0, 5, 11, 1, 255, 2, 12, 1, 0, 4, 255, 2, 0, 11, 255, 2, 0, 5, 219, 1, 255, 1, 203, 1, 0, 5, 255, 2, 0, 11, 239, 1, 255, 1, 98, 1, 0, 3, 35, 1, 255, 2, 12, 1, 0, 5, 255, 2, 0, 11, 25, 1, 255, 2, 141, 1, 60, 1, 98, 1, 235, 1, 255, 1, 203, 1, 0, 5, 141, 1, 255, 2, 0, 12, 175, 1, 255, 5, 239, 1, 12, 1, 0, 5, 128, 1, 239, 1, 89, 1, 0, 13, 128, 1, 203, 1, 239, 2, 175, 1, 25, 1, 0, 7, 25, 1, 0, 15, 12, 1, 25, 2, 0, 17 }; +static const uint8_t image_data_FontT24_0x0054_mod[64] = { 0, 20, 176, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 11, 60, 15, 255, 2, 0, 11, 255, 17, 0, 11, 245, 15, 255, 2, 0, 11, 56, 15, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 175, 2, 0, 6 }; +static const uint8_t image_data_FontT24_0x0055_mod[110] = { 0, 36, 11, 1, 35, 13, 0, 13, 98, 1, 219, 1, 235, 13, 0, 12, 141, 1, 255, 3, 245, 12, 0, 11, 35, 1, 255, 2, 203, 1, 89, 1, 56, 12, 0, 11, 235, 1, 255, 1, 203, 1, 12, 1, 0, 24, 255, 2, 12, 1, 0, 25, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 5, 1, 0, 25, 239, 1, 255, 1, 176, 1, 5, 1, 0, 24, 25, 1, 255, 2, 176, 1, 60, 1, 35, 12, 0, 12, 175, 1, 255, 3, 235, 12, 0, 13, 128, 1, 203, 1, 245, 13, 0, 14, 12, 1, 56, 13, 0, 34 }; +static const uint8_t image_data_FontT24_0x0056_mod[222] = { 0, 19, 5, 1, 35, 1, 141, 1, 0, 23, 35, 1, 98, 1, 176, 1, 235, 1, 255, 1, 0, 20, 11, 1, 60, 1, 141, 1, 235, 1, 255, 3, 239, 1, 0, 17, 5, 1, 60, 1, 141, 1, 219, 1, 255, 3, 245, 1, 203, 1, 89, 1, 25, 1, 0, 14, 5, 1, 35, 1, 98, 1, 176, 1, 255, 3, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 14, 11, 1, 60, 1, 176, 1, 235, 1, 255, 3, 203, 1, 128, 1, 56, 1, 12, 1, 0, 16, 141, 1, 219, 1, 255, 3, 239, 1, 175, 1, 89, 1, 12, 1, 0, 19, 203, 1, 255, 4, 168, 1, 60, 1, 5, 1, 0, 20, 12, 1, 89, 1, 175, 1, 239, 1, 255, 3, 176, 1, 98, 1, 35, 1, 5, 1, 0, 20, 25, 1, 89, 1, 175, 1, 245, 1, 255, 2, 235, 1, 176, 1, 98, 1, 11, 1, 0, 21, 56, 1, 128, 1, 203, 1, 245, 1, 255, 2, 219, 1, 141, 1, 60, 1, 11, 1, 0, 20, 12, 1, 56, 1, 128, 1, 239, 1, 255, 3, 219, 1, 98, 1, 0, 22, 25, 1, 89, 1, 175, 1, 239, 1, 255, 2, 0, 25, 25, 1, 128, 1, 203, 1, 0, 6 }; +static const uint8_t image_data_FontT24_0x0057_mod[380] = { 0, 18, 11, 1, 60, 1, 141, 1, 219, 1, 0, 21, 11, 1, 60, 1, 141, 1, 219, 1, 255, 3, 0, 18, 11, 1, 60, 1, 141, 1, 219, 1, 255, 3, 239, 1, 203, 1, 128, 1, 0, 14, 5, 1, 35, 1, 98, 1, 141, 1, 219, 1, 255, 3, 239, 1, 175, 1, 89, 1, 25, 1, 12, 1, 0, 12, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 2, 245, 1, 203, 1, 128, 1, 89, 1, 25, 1, 0, 16, 167, 1, 235, 1, 255, 3, 216, 1, 134, 1, 56, 1, 12, 1, 0, 19, 56, 1, 128, 1, 203, 1, 245, 1, 255, 1, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 20, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 1, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 20, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 1, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 20, 12, 1, 56, 1, 128, 1, 216, 1, 255, 2, 235, 1, 176, 1, 141, 1, 0, 19, 11, 1, 60, 1, 141, 1, 235, 1, 255, 2, 245, 1, 203, 1, 128, 1, 0, 16, 11, 1, 60, 1, 141, 1, 219, 1, 255, 2, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 14, 5, 1, 35, 1, 141, 1, 219, 1, 255, 2, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 15, 35, 1, 98, 1, 176, 1, 235, 1, 255, 2, 203, 1, 128, 1, 56, 1, 12, 1, 0, 18, 183, 1, 245, 1, 255, 4, 111, 1, 35, 1, 5, 1, 0, 19, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 2, 235, 1, 176, 1, 141, 1, 60, 1, 11, 1, 0, 19, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 3, 219, 1, 141, 1, 60, 1, 35, 1, 5, 1, 0, 18, 12, 1, 56, 1, 89, 1, 175, 1, 239, 1, 255, 3, 235, 1, 176, 1, 98, 1, 0, 21, 25, 1, 89, 1, 175, 1, 239, 1, 255, 3, 0, 24, 25, 1, 89, 1, 175, 1, 239, 1, 0, 6 }; +static const uint8_t image_data_FontT24_0x0058_mod[264] = { 0, 5, 141, 1, 11, 1, 0, 14, 60, 1, 0, 11, 255, 1, 219, 1, 60, 1, 5, 1, 0, 10, 11, 1, 98, 1, 255, 1, 0, 11, 203, 1, 255, 2, 176, 1, 35, 1, 0, 7, 5, 1, 60, 1, 219, 1, 255, 1, 245, 1, 0, 11, 12, 1, 89, 1, 239, 1, 255, 1, 235, 1, 141, 1, 11, 1, 0, 4, 35, 1, 176, 1, 255, 2, 203, 1, 56, 1, 0, 13, 25, 1, 128, 1, 245, 1, 255, 1, 219, 1, 98, 1, 5, 1, 11, 1, 141, 1, 235, 1, 255, 1, 239, 1, 128, 1, 12, 1, 0, 16, 56, 1, 175, 1, 255, 2, 176, 1, 219, 1, 255, 1, 245, 1, 175, 1, 25, 1, 0, 20, 153, 1, 255, 4, 67, 1, 0, 20, 35, 1, 141, 1, 255, 2, 239, 1, 245, 1, 255, 1, 219, 1, 98, 1, 5, 1, 0, 16, 11, 1, 98, 1, 235, 1, 255, 1, 245, 1, 128, 1, 25, 1, 56, 1, 203, 1, 255, 2, 176, 1, 35, 1, 0, 13, 5, 1, 60, 1, 219, 1, 255, 2, 175, 1, 56, 1, 0, 3, 12, 1, 89, 1, 239, 1, 255, 1, 235, 1, 141, 1, 11, 1, 0, 11, 176, 1, 255, 2, 203, 1, 89, 1, 0, 7, 25, 1, 128, 1, 245, 1, 255, 1, 219, 1, 0, 11, 255, 1, 239, 1, 128, 1, 12, 1, 0, 10, 56, 1, 175, 1, 255, 1, 0, 11, 175, 1, 25, 1, 0, 14, 128, 1, 0, 6 }; +static const uint8_t image_data_FontT24_0x0059_mod[154] = { 0, 20, 5, 1, 141, 1, 0, 25, 60, 1, 176, 1, 255, 1, 0, 23, 35, 1, 141, 1, 255, 2, 203, 1, 0, 21, 5, 1, 98, 1, 235, 1, 255, 1, 245, 1, 128, 1, 12, 1, 0, 20, 60, 1, 176, 1, 255, 2, 175, 1, 56, 1, 0, 13, 35, 8, 141, 1, 255, 2, 203, 1, 89, 1, 0, 15, 235, 8, 255, 2, 128, 1, 12, 1, 0, 16, 245, 8, 255, 2, 98, 1, 5, 1, 0, 16, 56, 8, 203, 1, 255, 2, 176, 1, 35, 1, 0, 23, 12, 1, 89, 1, 239, 1, 255, 1, 235, 1, 141, 1, 11, 1, 0, 23, 25, 1, 128, 1, 245, 1, 255, 1, 219, 1, 98, 1, 5, 1, 0, 23, 56, 1, 175, 1, 255, 2, 176, 1, 0, 25, 89, 1, 239, 1, 255, 1, 0, 26, 25, 1, 175, 1, 0, 6 }; +static const uint8_t image_data_FontT24_0x005a_mod[200] = { 0, 5, 5, 1, 0, 14, 5, 2, 0, 11, 176, 1, 60, 1, 5, 1, 0, 12, 176, 2, 0, 11, 255, 2, 176, 1, 60, 1, 5, 1, 0, 10, 255, 2, 0, 11, 255, 4, 176, 1, 60, 1, 5, 1, 0, 8, 255, 2, 0, 11, 255, 2, 175, 1, 245, 1, 255, 2, 176, 1, 60, 1, 5, 1, 0, 6, 255, 2, 0, 11, 255, 2, 0, 1, 56, 1, 175, 1, 245, 1, 255, 2, 176, 1, 60, 1, 5, 1, 0, 4, 255, 2, 0, 11, 255, 2, 0, 3, 56, 1, 175, 1, 245, 1, 255, 2, 176, 1, 60, 1, 5, 1, 0, 2, 255, 2, 0, 11, 255, 2, 0, 5, 56, 1, 175, 1, 245, 1, 255, 2, 176, 1, 60, 1, 5, 1, 255, 2, 0, 11, 255, 2, 0, 7, 56, 1, 175, 1, 245, 1, 255, 2, 176, 1, 255, 2, 0, 11, 255, 2, 0, 9, 56, 1, 175, 1, 245, 1, 255, 3, 0, 11, 255, 2, 0, 11, 56, 1, 175, 1, 245, 1, 255, 1, 0, 11, 203, 2, 0, 13, 56, 1, 175, 1, 0, 11, 12, 2, 0, 21 }; +static const uint8_t image_data_FontT24_0x005b_mod[50] = { 0, 56, 98, 23, 0, 5, 255, 23, 0, 5, 255, 2, 203, 19, 255, 2, 0, 5, 255, 2, 12, 19, 255, 2, 0, 5, 255, 2, 0, 19, 255, 2, 0, 5, 239, 2, 0, 19, 239, 2, 0, 5, 25, 2, 0, 19, 25, 2, 0, 5 }; +static const uint8_t image_data_FontT24_0x005c_mod[126] = { 0, 19, 35, 1, 98, 1, 176, 1, 0, 22, 11, 1, 60, 1, 141, 1, 235, 1, 245, 1, 203, 1, 0, 19, 5, 1, 35, 1, 141, 1, 219, 1, 255, 1, 239, 1, 175, 1, 56, 1, 12, 1, 0, 17, 11, 1, 98, 1, 176, 1, 235, 1, 245, 1, 175, 1, 89, 1, 25, 1, 0, 17, 11, 1, 60, 1, 141, 1, 219, 1, 245, 1, 203, 1, 128, 1, 56, 1, 0, 17, 5, 1, 35, 1, 98, 1, 219, 1, 255, 1, 239, 1, 175, 1, 56, 1, 12, 1, 0, 19, 176, 1, 235, 1, 245, 1, 175, 1, 89, 1, 25, 1, 0, 22, 203, 1, 128, 1, 56, 1, 0, 25, 12, 1, 0, 22 }; +static const uint8_t image_data_FontT24_0x005d_mod[48] = { 11, 2, 0, 19, 11, 2, 0, 5, 219, 2, 0, 19, 219, 2, 0, 5, 255, 2, 0, 19, 255, 2, 0, 5, 255, 2, 5, 19, 255, 2, 0, 5, 255, 2, 176, 19, 255, 2, 0, 5, 255, 23, 0, 5, 128, 23, 0, 61 }; +static const uint8_t image_data_FontT24_0x005e_mod[96] = { 0, 44, 11, 1, 0, 27, 219, 1, 60, 1, 5, 1, 0, 25, 128, 1, 239, 1, 176, 1, 35, 1, 0, 25, 25, 1, 128, 1, 219, 1, 141, 1, 35, 1, 0, 25, 25, 1, 128, 1, 219, 1, 98, 1, 0, 25, 11, 1, 124, 1, 245, 1, 0, 23, 11, 1, 98, 1, 219, 1, 203, 1, 56, 1, 0, 21, 11, 1, 98, 1, 219, 1, 203, 1, 89, 1, 12, 1, 0, 22, 219, 1, 239, 1, 89, 1, 12, 1, 0, 24, 175, 1, 25, 1, 0, 66 }; +static const uint8_t image_data_FontT24_0x005f_mod[54] = { 0, 2, 235, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 245, 2, 0, 24 }; +static const uint8_t image_data_FontT24_0x0060_mod[44] = { 0, 107, 11, 1, 0, 26, 35, 1, 219, 1, 0, 24, 5, 1, 98, 1, 235, 1, 255, 1, 0, 24, 176, 1, 255, 1, 239, 1, 128, 1, 0, 24, 239, 1, 128, 1, 25, 1, 0, 25, 25, 1, 0, 119 }; +static const uint8_t image_data_FontT24_0x0061_mod[190] = { 0, 7, 5, 1, 11, 1, 5, 1, 0, 24, 60, 1, 176, 1, 219, 1, 176, 1, 98, 1, 0, 5, 35, 1, 0, 16, 35, 1, 255, 5, 141, 1, 0, 3, 141, 1, 235, 1, 35, 1, 0, 15, 235, 1, 255, 1, 203, 1, 89, 1, 175, 1, 255, 2, 11, 1, 0, 2, 89, 1, 255, 1, 235, 1, 0, 15, 255, 2, 12, 1, 0, 2, 203, 1, 255, 1, 219, 1, 0, 3, 255, 2, 0, 15, 255, 2, 0, 3, 12, 1, 255, 2, 0, 3, 255, 2, 0, 15, 245, 1, 255, 1, 5, 1, 0, 3, 255, 2, 0, 3, 255, 2, 0, 15, 56, 1, 255, 1, 176, 1, 0, 3, 255, 2, 0, 2, 60, 1, 255, 2, 0, 16, 140, 1, 255, 1, 141, 1, 60, 2, 255, 2, 60, 1, 141, 1, 255, 2, 175, 1, 0, 15, 35, 1, 219, 1, 255, 9, 239, 1, 0, 16, 235, 1, 255, 1, 239, 7, 203, 1, 128, 1, 25, 1, 0, 16, 239, 1, 128, 1, 25, 7, 12, 1, 0, 18, 25, 1, 0, 22 }; +static const uint8_t image_data_FontT24_0x0062_mod[158] = { 0, 33, 98, 18, 0, 10, 239, 1, 255, 17, 0, 10, 25, 1, 255, 2, 203, 7, 255, 2, 203, 6, 0, 10, 141, 1, 255, 1, 128, 1, 12, 7, 128, 1, 255, 1, 72, 1, 12, 5, 0, 10, 255, 2, 0, 9, 255, 2, 0, 15, 255, 2, 0, 9, 255, 2, 0, 15, 255, 2, 0, 8, 11, 1, 255, 2, 0, 15, 239, 1, 255, 1, 141, 1, 0, 6, 5, 1, 219, 1, 255, 1, 239, 1, 0, 15, 25, 1, 255, 2, 141, 1, 60, 1, 35, 1, 11, 1, 35, 1, 60, 1, 176, 1, 255, 2, 25, 1, 0, 16, 128, 1, 245, 1, 255, 2, 235, 1, 219, 1, 235, 1, 255, 3, 128, 1, 0, 18, 56, 1, 175, 1, 239, 1, 245, 1, 255, 2, 245, 1, 203, 1, 89, 1, 0, 21, 25, 1, 56, 1, 89, 2, 56, 1, 12, 1, 0, 13 }; +static const uint8_t image_data_FontT24_0x0063_mod[158] = { 0, 9, 11, 1, 35, 3, 11, 1, 0, 21, 35, 1, 141, 1, 219, 1, 235, 3, 219, 1, 141, 1, 11, 1, 0, 18, 60, 1, 235, 1, 255, 2, 245, 3, 255, 2, 219, 1, 35, 1, 0, 16, 5, 1, 255, 2, 203, 1, 89, 1, 56, 3, 128, 1, 239, 1, 255, 1, 235, 1, 0, 16, 176, 1, 255, 1, 239, 1, 12, 1, 0, 5, 25, 1, 245, 1, 255, 1, 98, 1, 0, 15, 255, 2, 25, 1, 0, 7, 56, 1, 255, 2, 0, 15, 255, 2, 0, 9, 255, 2, 0, 15, 255, 2, 0, 9, 255, 2, 0, 15, 255, 2, 0, 9, 255, 2, 0, 15, 239, 1, 255, 1, 141, 1, 0, 7, 141, 1, 255, 1, 239, 1, 0, 15, 25, 1, 239, 1, 128, 1, 0, 7, 89, 1, 239, 1, 25, 1, 0, 16, 25, 1, 0, 9, 25, 1, 0, 11 }; +static const uint8_t image_data_FontT24_0x0064_mod[150] = { 0, 8, 5, 1, 11, 1, 35, 3, 5, 1, 0, 21, 60, 1, 176, 1, 219, 1, 235, 3, 176, 1, 98, 1, 11, 1, 0, 18, 141, 1, 255, 3, 245, 2, 255, 3, 219, 1, 35, 1, 0, 16, 60, 1, 255, 2, 203, 1, 128, 1, 56, 2, 89, 1, 128, 1, 239, 1, 255, 1, 235, 1, 5, 1, 0, 15, 255, 2, 203, 1, 12, 1, 0, 5, 25, 1, 245, 1, 255, 1, 176, 1, 0, 15, 255, 2, 12, 1, 0, 7, 56, 1, 255, 2, 0, 15, 255, 2, 0, 9, 255, 2, 0, 15, 255, 2, 0, 9, 255, 2, 0, 15, 134, 1, 255, 1, 60, 1, 5, 7, 98, 1, 255, 1, 134, 1, 5, 5, 0, 10, 176, 1, 255, 2, 176, 7, 255, 2, 176, 6, 0, 10, 255, 18, 0, 10, 128, 18, 0, 33 }; +static const uint8_t image_data_FontT24_0x0065_mod[216] = { 0, 9, 11, 1, 35, 1, 60, 1, 35, 1, 11, 1, 0, 21, 35, 1, 141, 1, 219, 1, 235, 1, 255, 1, 235, 1, 219, 1, 141, 1, 11, 1, 0, 18, 60, 1, 235, 1, 255, 2, 245, 1, 255, 2, 245, 1, 255, 1, 219, 1, 35, 1, 0, 16, 5, 1, 255, 2, 203, 1, 89, 1, 56, 1, 255, 2, 56, 1, 175, 1, 255, 1, 235, 1, 0, 16, 176, 1, 255, 1, 239, 1, 12, 1, 0, 2, 255, 2, 0, 2, 175, 1, 255, 1, 141, 1, 0, 15, 255, 2, 25, 1, 0, 3, 255, 2, 0, 3, 255, 2, 0, 15, 255, 2, 0, 4, 255, 2, 0, 3, 255, 2, 0, 15, 255, 2, 0, 4, 255, 2, 0, 3, 255, 2, 0, 15, 255, 2, 0, 4, 255, 2, 0, 2, 60, 1, 255, 2, 0, 15, 245, 1, 255, 1, 98, 1, 0, 3, 255, 2, 35, 1, 98, 1, 255, 2, 89, 1, 0, 15, 56, 1, 239, 1, 128, 1, 0, 3, 255, 2, 235, 1, 255, 2, 203, 1, 0, 17, 25, 1, 0, 4, 245, 1, 255, 1, 245, 1, 239, 1, 128, 1, 12, 1, 0, 22, 56, 1, 89, 1, 56, 1, 25, 1, 0, 13 }; +static const uint8_t image_data_FontT24_0x0066_mod[88] = { 0, 16, 35, 2, 0, 26, 235, 2, 0, 15, 60, 11, 255, 2, 60, 1, 35, 1, 5, 1, 0, 12, 255, 14, 235, 1, 176, 1, 35, 1, 0, 11, 239, 11, 255, 2, 239, 1, 245, 1, 255, 1, 235, 1, 11, 1, 0, 10, 25, 11, 255, 2, 25, 1, 56, 1, 203, 1, 255, 1, 219, 1, 0, 21, 255, 2, 0, 2, 12, 1, 255, 2, 0, 21, 175, 2, 0, 3, 255, 2, 0, 26, 203, 1, 245, 1, 0, 5 }; +static const uint8_t image_data_FontT24_0x0067_mod[276] = { 0, 1, 5, 1, 0, 9, 5, 1, 11, 3, 0, 14, 176, 1, 11, 1, 0, 2, 11, 1, 98, 1, 60, 1, 0, 2, 98, 1, 176, 1, 219, 3, 98, 1, 5, 1, 0, 11, 11, 1, 255, 1, 219, 1, 0, 2, 219, 1, 255, 1, 245, 1, 11, 1, 141, 1, 255, 6, 176, 1, 0, 11, 219, 1, 255, 1, 89, 1, 0, 2, 255, 2, 56, 1, 219, 1, 255, 2, 175, 1, 89, 2, 175, 1, 255, 2, 98, 1, 0, 10, 255, 2, 0, 3, 255, 2, 0, 1, 255, 2, 89, 1, 0, 4, 89, 1, 255, 2, 0, 10, 255, 2, 0, 3, 255, 2, 0, 1, 255, 2, 0, 6, 255, 2, 0, 10, 255, 2, 0, 3, 255, 2, 0, 1, 255, 2, 0, 5, 5, 1, 255, 2, 0, 10, 255, 2, 5, 1, 0, 2, 255, 2, 0, 1, 245, 1, 255, 1, 141, 1, 11, 1, 5, 1, 0, 1, 11, 1, 176, 1, 255, 1, 245, 1, 0, 10, 175, 1, 255, 1, 176, 1, 11, 1, 60, 1, 255, 2, 0, 1, 56, 1, 255, 2, 219, 1, 176, 1, 141, 1, 219, 1, 255, 2, 92, 1, 0, 11, 255, 2, 219, 1, 255, 2, 203, 1, 0, 2, 89, 1, 245, 1, 255, 4, 245, 1, 255, 1, 235, 1, 132, 1, 0, 10, 89, 1, 239, 1, 255, 2, 203, 1, 12, 1, 0, 3, 56, 1, 128, 1, 175, 2, 128, 1, 56, 1, 89, 1, 239, 1, 56, 1, 0, 11, 25, 1, 89, 2, 12, 1, 0, 11, 25, 1, 0, 10 }; +static const uint8_t image_data_FontT24_0x0068_mod[84] = { 0, 33, 98, 18, 0, 10, 255, 18, 0, 10, 239, 10, 255, 2, 239, 6, 0, 10, 25, 10, 239, 1, 255, 1, 30, 1, 25, 5, 0, 20, 25, 1, 255, 1, 176, 1, 0, 26, 255, 2, 0, 25, 5, 1, 255, 2, 0, 15, 5, 9, 11, 1, 176, 1, 255, 2, 0, 15, 176, 9, 219, 1, 255, 2, 128, 1, 0, 15, 255, 10, 245, 1, 175, 1, 0, 16, 175, 8, 128, 2, 56, 1, 0, 40 }; +static const uint8_t image_data_FontT24_0x0069_mod[60] = { 0, 16, 35, 2, 0, 26, 235, 2, 0, 15, 60, 11, 255, 2, 0, 2, 11, 1, 60, 1, 11, 1, 0, 10, 255, 13, 0, 2, 219, 1, 255, 1, 219, 1, 0, 10, 239, 13, 0, 2, 239, 1, 255, 1, 239, 1, 0, 10, 25, 13, 0, 2, 25, 1, 89, 1, 25, 1, 0, 33 }; +static const uint8_t image_data_FontT24_0x006a_mod[94] = { 176, 2, 0, 26, 255, 2, 0, 14, 60, 2, 0, 10, 255, 2, 11, 1, 0, 13, 255, 2, 0, 10, 175, 1, 255, 1, 219, 1, 35, 1, 5, 12, 255, 2, 0, 2, 11, 1, 60, 1, 11, 1, 0, 6, 255, 2, 235, 1, 176, 12, 255, 2, 0, 2, 219, 1, 255, 1, 219, 1, 0, 6, 89, 1, 239, 1, 255, 15, 0, 2, 245, 1, 255, 1, 245, 1, 0, 7, 25, 1, 89, 1, 128, 14, 0, 2, 56, 1, 128, 1, 56, 1, 0, 61 }; +static const uint8_t image_data_FontT24_0x006b_mod[142] = { 0, 33, 98, 18, 0, 10, 255, 18, 0, 10, 203, 4, 239, 1, 255, 1, 216, 1, 203, 11, 0, 10, 12, 4, 25, 1, 203, 1, 235, 1, 72, 1, 12, 10, 0, 15, 12, 1, 255, 2, 141, 1, 5, 1, 0, 22, 11, 1, 98, 1, 255, 3, 176, 1, 35, 1, 0, 20, 60, 1, 219, 1, 255, 1, 245, 1, 175, 2, 255, 1, 235, 1, 98, 1, 0, 17, 35, 1, 141, 1, 255, 2, 203, 1, 56, 1, 0, 2, 128, 1, 255, 2, 141, 1, 0, 15, 98, 1, 235, 1, 255, 1, 239, 1, 128, 1, 12, 1, 0, 4, 89, 1, 239, 1, 255, 1, 0, 15, 255, 2, 175, 1, 25, 1, 0, 7, 25, 1, 245, 1, 0, 15, 239, 1, 89, 1, 0, 10, 56, 1, 0, 10 }; +static const uint8_t image_data_FontT24_0x006c_mod[42] = { 0, 35, 35, 1, 60, 15, 0, 11, 141, 1, 235, 1, 255, 15, 0, 10, 98, 1, 255, 2, 245, 15, 0, 10, 255, 2, 203, 1, 56, 15, 0, 10, 245, 2, 12, 1, 0, 25, 56, 2, 0, 21 }; +static const uint8_t image_data_FontT24_0x006d_mod[136] = { 0, 33, 98, 13, 0, 15, 255, 12, 245, 1, 0, 15, 239, 9, 245, 1, 255, 1, 181, 1, 56, 1, 0, 15, 25, 9, 56, 1, 245, 1, 176, 1, 0, 26, 56, 1, 255, 1, 141, 1, 0, 26, 255, 2, 0, 25, 5, 1, 255, 2, 0, 15, 35, 10, 176, 1, 255, 2, 0, 15, 235, 10, 255, 2, 89, 1, 0, 15, 245, 9, 255, 2, 134, 1, 0, 16, 56, 9, 89, 1, 245, 1, 176, 1, 0, 26, 56, 1, 255, 1, 141, 1, 0, 26, 255, 2, 0, 26, 255, 2, 0, 15, 5, 9, 35, 1, 141, 1, 255, 2, 0, 15, 176, 9, 235, 1, 255, 2, 128, 1, 0, 15, 255, 10, 245, 1, 175, 1, 0, 16, 128, 10, 56, 1, 0, 40 }; +static const uint8_t image_data_FontT24_0x006e_mod[82] = { 0, 33, 98, 13, 0, 15, 255, 13, 0, 15, 239, 10, 255, 1, 216, 1, 89, 1, 0, 15, 25, 10, 239, 1, 235, 1, 11, 1, 0, 25, 25, 1, 255, 1, 219, 1, 0, 26, 255, 2, 0, 26, 255, 2, 0, 15, 5, 9, 11, 1, 141, 1, 255, 2, 0, 15, 176, 9, 219, 1, 255, 2, 175, 1, 0, 15, 255, 10, 245, 1, 175, 1, 0, 16, 175, 8, 128, 2, 56, 1, 0, 40 }; +static const uint8_t image_data_FontT24_0x006f_mod[184] = { 0, 9, 11, 1, 35, 3, 11, 1, 0, 21, 60, 1, 141, 1, 219, 1, 235, 3, 219, 1, 141, 1, 35, 1, 0, 18, 98, 1, 255, 3, 245, 3, 255, 2, 235, 1, 60, 1, 0, 16, 11, 1, 255, 2, 175, 1, 89, 1, 56, 3, 89, 1, 203, 1, 255, 2, 11, 1, 0, 15, 219, 1, 255, 1, 175, 1, 0, 6, 12, 1, 203, 1, 255, 1, 219, 1, 0, 15, 255, 2, 0, 8, 12, 1, 255, 2, 0, 15, 255, 2, 0, 9, 255, 2, 0, 15, 255, 2, 5, 1, 0, 8, 255, 2, 0, 15, 239, 1, 255, 1, 176, 1, 5, 1, 0, 6, 141, 1, 255, 1, 245, 1, 0, 15, 25, 1, 255, 2, 176, 1, 60, 1, 35, 3, 60, 1, 141, 1, 255, 2, 56, 1, 0, 16, 128, 1, 245, 1, 255, 2, 235, 3, 255, 3, 128, 1, 0, 18, 56, 1, 175, 1, 239, 1, 245, 3, 239, 1, 203, 1, 89, 1, 0, 21, 25, 1, 56, 3, 25, 1, 12, 1, 0, 13 }; +static const uint8_t image_data_FontT24_0x0070_mod[150] = { 0, 28, 98, 18, 0, 10, 255, 18, 0, 10, 203, 6, 255, 2, 203, 7, 255, 2, 203, 1, 0, 10, 12, 5, 111, 1, 255, 1, 89, 1, 12, 7, 128, 1, 255, 1, 72, 1, 0, 15, 255, 2, 0, 9, 255, 2, 0, 15, 255, 2, 0, 9, 255, 2, 0, 15, 255, 2, 5, 1, 0, 8, 255, 2, 0, 15, 245, 1, 255, 1, 176, 1, 5, 1, 0, 6, 141, 1, 255, 2, 0, 15, 56, 1, 255, 2, 176, 1, 60, 1, 35, 1, 11, 1, 35, 1, 60, 1, 141, 1, 255, 2, 89, 1, 0, 16, 128, 1, 255, 3, 235, 1, 219, 1, 235, 1, 255, 3, 175, 1, 0, 18, 89, 1, 203, 1, 245, 1, 255, 3, 245, 1, 203, 1, 128, 1, 0, 20, 12, 1, 56, 1, 89, 3, 56, 1, 12, 1, 0, 13 }; +static const uint8_t image_data_FontT24_0x0071_mod[152] = { 0, 8, 5, 1, 11, 1, 35, 3, 11, 1, 0, 21, 60, 1, 176, 1, 219, 1, 235, 3, 219, 1, 141, 1, 35, 1, 0, 18, 141, 1, 255, 3, 245, 2, 255, 3, 235, 1, 60, 1, 0, 16, 60, 1, 255, 2, 239, 1, 128, 1, 56, 2, 89, 1, 128, 1, 239, 1, 255, 2, 5, 1, 0, 15, 255, 2, 239, 1, 25, 1, 0, 5, 25, 1, 239, 1, 255, 1, 176, 1, 0, 15, 255, 2, 25, 1, 0, 7, 25, 1, 255, 2, 0, 15, 255, 2, 0, 9, 255, 2, 0, 15, 255, 2, 0, 9, 255, 2, 0, 10, 5, 5, 134, 1, 255, 1, 35, 1, 5, 7, 60, 1, 255, 1, 203, 1, 0, 10, 176, 6, 255, 1, 235, 1, 176, 7, 255, 2, 47, 1, 0, 10, 255, 17, 235, 1, 0, 10, 128, 18, 0, 38 }; +static const uint8_t image_data_FontT24_0x0072_mod[56] = { 0, 33, 60, 13, 0, 15, 255, 13, 0, 15, 239, 8, 245, 1, 255, 2, 239, 2, 0, 15, 25, 8, 56, 1, 128, 1, 255, 1, 168, 1, 25, 1, 0, 25, 128, 1, 255, 1, 98, 1, 0, 26, 255, 2, 0, 26, 255, 2, 0, 26, 203, 1, 255, 1, 0, 10 }; +static const uint8_t image_data_FontT24_0x0073_mod[156] = { 0, 5, 5, 2, 0, 6, 5, 1, 11, 2, 0, 17, 66, 1, 176, 1, 98, 1, 0, 4, 35, 1, 176, 1, 219, 2, 98, 1, 0, 16, 235, 1, 255, 1, 175, 1, 0, 3, 5, 1, 235, 1, 255, 4, 60, 1, 0, 15, 255, 2, 0, 4, 176, 1, 255, 1, 203, 1, 89, 1, 175, 1, 255, 2, 0, 15, 255, 2, 0, 4, 255, 2, 12, 1, 0, 2, 255, 2, 0, 15, 255, 2, 0, 3, 141, 1, 255, 1, 175, 1, 0, 3, 255, 2, 0, 15, 255, 2, 141, 1, 35, 1, 60, 1, 255, 2, 0, 3, 5, 1, 255, 2, 0, 15, 89, 1, 255, 2, 235, 1, 255, 2, 175, 1, 0, 3, 167, 1, 255, 1, 175, 1, 0, 16, 128, 1, 239, 1, 245, 2, 175, 1, 0, 4, 56, 1, 128, 1, 0, 18, 25, 1, 56, 2, 0, 18 }; +static const uint8_t image_data_FontT24_0x0074_mod[86] = { 0, 16, 5, 2, 0, 26, 176, 2, 0, 17, 35, 1, 98, 8, 255, 2, 98, 2, 0, 14, 141, 1, 235, 1, 255, 12, 141, 1, 0, 12, 141, 1, 255, 2, 239, 8, 255, 2, 239, 3, 0, 12, 255, 2, 175, 1, 25, 8, 255, 2, 25, 3, 0, 12, 255, 2, 0, 9, 255, 2, 0, 15, 255, 2, 0, 9, 255, 2, 0, 15, 255, 1, 239, 1, 0, 9, 89, 2, 0, 15, 89, 1, 25, 1, 0, 21 }; +static const uint8_t image_data_FontT24_0x0075_mod[84] = { 0, 35, 35, 1, 98, 10, 0, 16, 141, 1, 235, 1, 255, 10, 0, 15, 98, 1, 255, 2, 239, 1, 203, 9, 0, 15, 255, 2, 175, 1, 25, 1, 12, 9, 0, 15, 255, 2, 0, 26, 255, 2, 0, 26, 203, 1, 255, 1, 11, 1, 0, 25, 12, 1, 255, 1, 219, 1, 5, 1, 0, 24, 141, 1, 255, 2, 176, 1, 141, 9, 0, 15, 255, 13, 0, 15, 203, 13, 0, 15, 12, 13, 0, 10 }; +static const uint8_t image_data_FontT24_0x0076_mod[174] = { 0, 16, 35, 1, 141, 1, 0, 23, 5, 1, 60, 1, 141, 1, 235, 1, 255, 1, 0, 21, 11, 1, 98, 1, 176, 1, 255, 2, 245, 1, 203, 1, 0, 18, 5, 1, 35, 1, 141, 1, 219, 1, 255, 2, 239, 1, 175, 1, 56, 1, 12, 1, 0, 16, 11, 1, 98, 1, 176, 1, 235, 1, 255, 1, 245, 1, 175, 1, 89, 1, 25, 1, 0, 18, 141, 1, 219, 1, 255, 2, 210, 1, 128, 1, 56, 1, 0, 21, 89, 1, 203, 1, 255, 2, 190, 1, 98, 1, 35, 1, 0, 22, 12, 1, 89, 1, 175, 1, 245, 1, 255, 1, 235, 1, 141, 1, 60, 1, 11, 1, 0, 22, 56, 1, 128, 1, 239, 1, 255, 2, 219, 1, 98, 1, 35, 1, 5, 1, 0, 21, 25, 1, 89, 1, 203, 1, 245, 1, 255, 1, 235, 1, 176, 1, 0, 23, 12, 1, 56, 1, 175, 1, 239, 1, 255, 1, 0, 26, 25, 1, 128, 1, 0, 10 }; +static const uint8_t image_data_FontT24_0x0077_mod[290] = { 0, 15, 5, 1, 35, 1, 141, 1, 0, 22, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 1, 0, 19, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 2, 245, 1, 203, 1, 0, 16, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 2, 239, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 15, 98, 1, 176, 1, 235, 1, 255, 2, 239, 1, 175, 1, 89, 1, 25, 1, 12, 1, 0, 18, 128, 1, 239, 1, 255, 3, 85, 1, 11, 1, 0, 22, 25, 1, 89, 1, 203, 1, 245, 1, 255, 1, 219, 1, 98, 1, 35, 1, 0, 22, 12, 1, 56, 1, 175, 1, 245, 1, 255, 1, 235, 1, 141, 1, 60, 1, 11, 1, 0, 22, 56, 1, 128, 1, 255, 3, 219, 1, 98, 1, 0, 21, 35, 1, 98, 1, 255, 3, 203, 1, 128, 1, 0, 18, 5, 1, 35, 1, 141, 1, 235, 1, 255, 1, 245, 1, 175, 1, 89, 1, 12, 1, 0, 17, 11, 1, 60, 1, 176, 1, 235, 1, 255, 1, 239, 1, 128, 1, 56, 1, 0, 19, 98, 1, 219, 1, 255, 3, 100, 1, 25, 1, 0, 21, 128, 1, 203, 1, 245, 1, 255, 2, 219, 1, 141, 1, 60, 1, 11, 1, 0, 20, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 2, 219, 1, 141, 1, 60, 1, 11, 1, 0, 20, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 2, 219, 1, 141, 1, 0, 22, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 1, 0, 25, 12, 1, 56, 1, 175, 1, 0, 10 }; +static const uint8_t image_data_FontT24_0x0078_mod[226] = { 0, 5, 141, 1, 5, 1, 0, 10, 60, 1, 0, 15, 255, 1, 176, 1, 35, 1, 0, 7, 5, 1, 98, 1, 255, 1, 0, 15, 245, 1, 255, 1, 235, 1, 60, 1, 0, 5, 35, 1, 176, 1, 255, 1, 245, 1, 0, 15, 56, 1, 203, 1, 255, 2, 141, 1, 11, 1, 0, 1, 5, 1, 98, 1, 235, 1, 255, 1, 203, 1, 56, 1, 0, 16, 12, 1, 128, 1, 245, 1, 255, 1, 219, 1, 35, 1, 176, 1, 255, 1, 245, 1, 128, 1, 12, 1, 0, 19, 56, 1, 210, 1, 255, 1, 235, 1, 255, 1, 210, 1, 56, 1, 0, 21, 35, 1, 190, 1, 255, 1, 245, 1, 255, 1, 190, 1, 35, 1, 0, 19, 5, 1, 98, 1, 235, 1, 255, 1, 239, 1, 56, 1, 203, 1, 255, 1, 235, 1, 98, 1, 5, 1, 0, 16, 35, 1, 176, 1, 255, 2, 175, 1, 25, 1, 0, 1, 12, 1, 128, 1, 245, 1, 255, 1, 176, 1, 35, 1, 0, 15, 235, 1, 255, 1, 245, 1, 89, 1, 0, 5, 56, 1, 203, 1, 255, 1, 235, 1, 0, 15, 255, 1, 203, 1, 56, 1, 0, 7, 12, 1, 128, 1, 255, 1, 0, 15, 175, 1, 12, 1, 0, 10, 89, 1, 0, 10 }; +static const uint8_t image_data_FontT24_0x0079_mod[214] = { 0, 15, 5, 1, 35, 1, 98, 1, 0, 10, 98, 2, 0, 11, 11, 1, 98, 1, 176, 1, 235, 1, 255, 1, 0, 10, 255, 2, 0, 8, 11, 1, 60, 1, 141, 1, 219, 1, 255, 2, 239, 1, 175, 1, 0, 10, 239, 1, 255, 1, 60, 1, 0, 4, 5, 1, 35, 1, 141, 1, 219, 1, 255, 2, 245, 1, 203, 1, 128, 1, 25, 1, 0, 11, 25, 1, 255, 2, 60, 1, 35, 2, 98, 1, 176, 1, 235, 1, 255, 2, 203, 1, 128, 1, 56, 1, 12, 1, 0, 14, 128, 1, 255, 2, 235, 2, 255, 2, 239, 1, 175, 1, 89, 1, 12, 1, 0, 18, 89, 1, 175, 1, 239, 1, 255, 3, 168, 1, 60, 1, 11, 1, 0, 21, 25, 1, 89, 1, 203, 1, 245, 1, 255, 2, 219, 1, 141, 1, 60, 1, 11, 1, 0, 20, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 2, 219, 1, 141, 1, 60, 1, 11, 1, 0, 20, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 2, 219, 1, 141, 1, 0, 22, 12, 1, 56, 1, 175, 1, 239, 1, 255, 2, 0, 25, 25, 1, 89, 1, 175, 1, 0, 10 }; +static const uint8_t image_data_FontT24_0x007a_mod[160] = { 0, 5, 98, 1, 5, 1, 0, 9, 60, 2, 0, 15, 255, 1, 176, 1, 35, 1, 0, 8, 255, 2, 0, 15, 255, 2, 235, 1, 98, 1, 5, 1, 0, 6, 255, 2, 0, 15, 255, 4, 176, 1, 35, 1, 0, 5, 255, 2, 0, 15, 255, 2, 89, 1, 239, 1, 255, 1, 235, 1, 98, 1, 5, 1, 0, 3, 255, 2, 0, 15, 255, 2, 0, 1, 25, 1, 175, 1, 255, 2, 176, 1, 35, 1, 0, 2, 255, 2, 0, 15, 255, 2, 0, 3, 89, 1, 239, 1, 255, 1, 235, 1, 60, 1, 0, 1, 255, 2, 0, 15, 255, 2, 0, 4, 25, 1, 175, 1, 255, 2, 141, 1, 255, 2, 0, 15, 255, 2, 0, 6, 89, 1, 239, 1, 255, 3, 0, 15, 255, 2, 0, 7, 25, 1, 175, 1, 255, 2, 0, 15, 239, 2, 0, 9, 89, 1, 203, 1, 0, 10 }; + +static const tImageComp FontT24_0x0030_mod = { image_data_FontT24_0x0030, image_data_FontT24_0x0030_mod, 216, 13, 28 }; +static const tImageComp FontT24_0x0031_mod = { image_data_FontT24_0x0031, image_data_FontT24_0x0031_mod, 54, 13, 28 }; +static const tImageComp FontT24_0x0032_mod = { image_data_FontT24_0x0032, image_data_FontT24_0x0032_mod, 204, 13, 28 }; +static const tImageComp FontT24_0x0033_mod = { image_data_FontT24_0x0033, image_data_FontT24_0x0033_mod, 188, 13, 28 }; +static const tImageComp FontT24_0x0034_mod = { image_data_FontT24_0x0034, image_data_FontT24_0x0034_mod, 126, 13, 28 }; +static const tImageComp FontT24_0x0035_mod = { image_data_FontT24_0x0035, image_data_FontT24_0x0035_mod, 174, 13, 28 }; +static const tImageComp FontT24_0x0036_mod = { image_data_FontT24_0x0036, image_data_FontT24_0x0036_mod, 220, 13, 28 }; +static const tImageComp FontT24_0x0037_mod = { image_data_FontT24_0x0037, image_data_FontT24_0x0037_mod, 170, 13, 28 }; +static const tImageComp FontT24_0x0038_mod = { image_data_FontT24_0x0038, image_data_FontT24_0x0038_mod, 260, 13, 28 }; +static const tImageComp FontT24_0x0039_mod = { image_data_FontT24_0x0039, image_data_FontT24_0x0039_mod, 210, 13, 28 }; +static const tImageComp FontT24_0x003a_mod = { image_data_FontT24_0x003a, image_data_FontT24_0x003a_mod, 74, 9, 28 }; +static const tImageComp FontT24_0x003b_mod = { image_data_FontT24_0x003b, image_data_FontT24_0x003b_mod, 96, 9, 28 }; +static const tImageComp FontT24_0x003c_mod = { image_data_FontT24_0x003c, image_data_FontT24_0x003c_mod, 114, 13, 28 }; +static const tImageComp FontT24_0x003d_mod = { image_data_FontT24_0x003d, image_data_FontT24_0x003d_mod, 90, 13, 28 }; +static const tImageComp FontT24_0x003e_mod = { image_data_FontT24_0x003e, image_data_FontT24_0x003e_mod, 110, 13, 28 }; +static const tImageComp FontT24_0x003f_mod = { image_data_FontT24_0x003f, image_data_FontT24_0x003f_mod, 144, 9, 28 }; +static const tImageComp FontT24_0x0040_mod = { image_data_FontT24_0x0040, image_data_FontT24_0x0040_mod, 368, 19, 28 }; +static const tImageComp FontT24_0x0041_mod = { image_data_FontT24_0x0041, image_data_FontT24_0x0041_mod, 236, 15, 28 }; +static const tImageComp FontT24_0x0042_mod = { image_data_FontT24_0x0042, image_data_FontT24_0x0042_mod, 190, 14, 28 }; +static const tImageComp FontT24_0x0043_mod = { image_data_FontT24_0x0043, image_data_FontT24_0x0043_mod, 196, 14, 28 }; +static const tImageComp FontT24_0x0044_mod = { image_data_FontT24_0x0044, image_data_FontT24_0x0044_mod, 168, 15, 28 }; +static const tImageComp FontT24_0x0045_mod = { image_data_FontT24_0x0045, image_data_FontT24_0x0045_mod, 122, 13, 28 }; +static const tImageComp FontT24_0x0046_mod = { image_data_FontT24_0x0046, image_data_FontT24_0x0046_mod, 86, 13, 28 }; +static const tImageComp FontT24_0x0047_mod = { image_data_FontT24_0x0047, image_data_FontT24_0x0047_mod, 216, 16, 28 }; +static const tImageComp FontT24_0x0048_mod = { image_data_FontT24_0x0048, image_data_FontT24_0x0048_mod, 74, 16, 28 }; +static const tImageComp FontT24_0x0049_mod = { image_data_FontT24_0x0049, image_data_FontT24_0x0049_mod, 14, 7, 28 }; +static const tImageComp FontT24_0x004a_mod = { image_data_FontT24_0x004a, image_data_FontT24_0x004a_mod, 90, 11, 28 }; +static const tImageComp FontT24_0x004b_mod = { image_data_FontT24_0x004b, image_data_FontT24_0x004b_mod, 192, 14, 28 }; +static const tImageComp FontT24_0x004c_mod = { image_data_FontT24_0x004c, image_data_FontT24_0x004c_mod, 50, 12, 28 }; +static const tImageComp FontT24_0x004d_mod = { image_data_FontT24_0x004d, image_data_FontT24_0x004d_mod, 350, 17, 28 }; +static const tImageComp FontT24_0x004e_mod = { image_data_FontT24_0x004e, image_data_FontT24_0x004e_mod, 134, 15, 28 }; +static const tImageComp FontT24_0x004f_mod = { image_data_FontT24_0x004f, image_data_FontT24_0x004f_mod, 234, 16, 28 }; +static const tImageComp FontT24_0x0050_mod = { image_data_FontT24_0x0050, image_data_FontT24_0x0050_mod, 124, 13, 28 }; +static const tImageComp FontT24_0x0051_mod = { image_data_FontT24_0x0051, image_data_FontT24_0x0051_mod, 268, 17, 28 }; +static const tImageComp FontT24_0x0052_mod = { image_data_FontT24_0x0052, image_data_FontT24_0x0052_mod, 170, 14, 28 }; +static const tImageComp FontT24_0x0053_mod = { image_data_FontT24_0x0053, image_data_FontT24_0x0053_mod, 204, 12, 28 }; +static const tImageComp FontT24_0x0054_mod = { image_data_FontT24_0x0054, image_data_FontT24_0x0054_mod, 64, 14, 28 }; +static const tImageComp FontT24_0x0055_mod = { image_data_FontT24_0x0055, image_data_FontT24_0x0055_mod, 110, 16, 28 }; +static const tImageComp FontT24_0x0056_mod = { image_data_FontT24_0x0056, image_data_FontT24_0x0056_mod, 222, 14, 28 }; +static const tImageComp FontT24_0x0057_mod = { image_data_FontT24_0x0057, image_data_FontT24_0x0057_mod, 380, 20, 28 }; +static const tImageComp FontT24_0x0058_mod = { image_data_FontT24_0x0058, image_data_FontT24_0x0058_mod, 264, 13, 28 }; +static const tImageComp FontT24_0x0059_mod = { image_data_FontT24_0x0059, image_data_FontT24_0x0059_mod, 154, 14, 28 }; +static const tImageComp FontT24_0x005a_mod = { image_data_FontT24_0x005a, image_data_FontT24_0x005a_mod, 200, 13, 28 }; +static const tImageComp FontT24_0x005b_mod = { image_data_FontT24_0x005b, image_data_FontT24_0x005b_mod, 50, 9, 28 }; +static const tImageComp FontT24_0x005c_mod = { image_data_FontT24_0x005c, image_data_FontT24_0x005c_mod, 126, 9, 28 }; +static const tImageComp FontT24_0x005d_mod = { image_data_FontT24_0x005d, image_data_FontT24_0x005d_mod, 48, 9, 28 }; +static const tImageComp FontT24_0x005e_mod = { image_data_FontT24_0x005e, image_data_FontT24_0x005e_mod, 96, 13, 28 }; +static const tImageComp FontT24_0x005f_mod = { image_data_FontT24_0x005f, image_data_FontT24_0x005f_mod, 54, 13, 28 }; +static const tImageComp FontT24_0x0060_mod = { image_data_FontT24_0x0060, image_data_FontT24_0x0060_mod, 44, 13, 28 }; +static const tImageComp FontT24_0x0061_mod = { image_data_FontT24_0x0061, image_data_FontT24_0x0061_mod, 190, 13, 28 }; +static const tImageComp FontT24_0x0062_mod = { image_data_FontT24_0x0062, image_data_FontT24_0x0062_mod, 158, 13, 28 }; +static const tImageComp FontT24_0x0063_mod = { image_data_FontT24_0x0063, image_data_FontT24_0x0063_mod, 158, 12, 28 }; +static const tImageComp FontT24_0x0064_mod = { image_data_FontT24_0x0064, image_data_FontT24_0x0064_mod, 150, 13, 28 }; +static const tImageComp FontT24_0x0065_mod = { image_data_FontT24_0x0065, image_data_FontT24_0x0065_mod, 216, 13, 28 }; +static const tImageComp FontT24_0x0066_mod = { image_data_FontT24_0x0066, image_data_FontT24_0x0066_mod, 88, 9, 28 }; +static const tImageComp FontT24_0x0067_mod = { image_data_FontT24_0x0067, image_data_FontT24_0x0067_mod, 276, 12, 28 }; +static const tImageComp FontT24_0x0068_mod = { image_data_FontT24_0x0068, image_data_FontT24_0x0068_mod, 84, 13, 28 }; +static const tImageComp FontT24_0x0069_mod = { image_data_FontT24_0x0069, image_data_FontT24_0x0069_mod, 60, 7, 28 }; +static const tImageComp FontT24_0x006a_mod = { image_data_FontT24_0x006a, image_data_FontT24_0x006a_mod, 94, 9, 28 }; +static const tImageComp FontT24_0x006b_mod = { image_data_FontT24_0x006b, image_data_FontT24_0x006b_mod, 142, 12, 28 }; +static const tImageComp FontT24_0x006c_mod = { image_data_FontT24_0x006c, image_data_FontT24_0x006c_mod, 42, 7, 28 }; +static const tImageComp FontT24_0x006d_mod = { image_data_FontT24_0x006d, image_data_FontT24_0x006d_mod, 136, 20, 28 }; +static const tImageComp FontT24_0x006e_mod = { image_data_FontT24_0x006e, image_data_FontT24_0x006e_mod, 82, 13, 28 }; +static const tImageComp FontT24_0x006f_mod = { image_data_FontT24_0x006f, image_data_FontT24_0x006f_mod, 184, 13, 28 }; +static const tImageComp FontT24_0x0070_mod = { image_data_FontT24_0x0070, image_data_FontT24_0x0070_mod, 150, 13, 28 }; +static const tImageComp FontT24_0x0071_mod = { image_data_FontT24_0x0071, image_data_FontT24_0x0071_mod, 152, 13, 28 }; +static const tImageComp FontT24_0x0072_mod = { image_data_FontT24_0x0072, image_data_FontT24_0x0072_mod, 56, 9, 28 }; +static const tImageComp FontT24_0x0073_mod = { image_data_FontT24_0x0073, image_data_FontT24_0x0073_mod, 156, 10, 28 }; +static const tImageComp FontT24_0x0074_mod = { image_data_FontT24_0x0074, image_data_FontT24_0x0074_mod, 86, 10, 28 }; +static const tImageComp FontT24_0x0075_mod = { image_data_FontT24_0x0075, image_data_FontT24_0x0075_mod, 84, 13, 28 }; +static const tImageComp FontT24_0x0076_mod = { image_data_FontT24_0x0076, image_data_FontT24_0x0076_mod, 174, 12, 28 }; +static const tImageComp FontT24_0x0077_mod = { image_data_FontT24_0x0077, image_data_FontT24_0x0077_mod, 290, 18, 28 }; +static const tImageComp FontT24_0x0078_mod = { image_data_FontT24_0x0078, image_data_FontT24_0x0078_mod, 226, 12, 28 }; +static const tImageComp FontT24_0x0079_mod = { image_data_FontT24_0x0079, image_data_FontT24_0x0079_mod, 214, 12, 28 }; +static const tImageComp FontT24_0x007a_mod = { image_data_FontT24_0x007a, image_data_FontT24_0x007a_mod, 160, 11, 28 }; + +static const tImageComp* FontT24_Comp[] = { + &FontT24_0x0030_mod, + &FontT24_0x0031_mod, + &FontT24_0x0032_mod, + &FontT24_0x0033_mod, + &FontT24_0x0034_mod, + &FontT24_0x0035_mod, + &FontT24_0x0036_mod, + &FontT24_0x0037_mod, + &FontT24_0x0038_mod, + &FontT24_0x0039_mod, + &FontT24_0x003a_mod, + &FontT24_0x003b_mod, + &FontT24_0x003c_mod, + &FontT24_0x003d_mod, + &FontT24_0x003e_mod, + &FontT24_0x003f_mod, + &FontT24_0x0040_mod, + &FontT24_0x0041_mod, + &FontT24_0x0042_mod, + &FontT24_0x0043_mod, + &FontT24_0x0044_mod, + &FontT24_0x0045_mod, + &FontT24_0x0046_mod, + &FontT24_0x0047_mod, + &FontT24_0x0048_mod, + &FontT24_0x0049_mod, + &FontT24_0x004a_mod, + &FontT24_0x004b_mod, + &FontT24_0x004c_mod, + &FontT24_0x004d_mod, + &FontT24_0x004e_mod, + &FontT24_0x004f_mod, + &FontT24_0x0050_mod, + &FontT24_0x0051_mod, + &FontT24_0x0052_mod, + &FontT24_0x0053_mod, + &FontT24_0x0054_mod, + &FontT24_0x0055_mod, + &FontT24_0x0056_mod, + &FontT24_0x0057_mod, + &FontT24_0x0058_mod, + &FontT24_0x0059_mod, + &FontT24_0x005a_mod, + &FontT24_0x005b_mod, + &FontT24_0x005c_mod, + &FontT24_0x005d_mod, + &FontT24_0x005e_mod, + &FontT24_0x005f_mod, + &FontT24_0x0060_mod, + &FontT24_0x0061_mod, + &FontT24_0x0062_mod, + &FontT24_0x0063_mod, + &FontT24_0x0064_mod, + &FontT24_0x0065_mod, + &FontT24_0x0066_mod, + &FontT24_0x0067_mod, + &FontT24_0x0068_mod, + &FontT24_0x0069_mod, + &FontT24_0x006a_mod, + &FontT24_0x006b_mod, + &FontT24_0x006c_mod, + &FontT24_0x006d_mod, + &FontT24_0x006e_mod, + &FontT24_0x006f_mod, + &FontT24_0x0070_mod, + &FontT24_0x0071_mod, + &FontT24_0x0072_mod, + &FontT24_0x0073_mod, + &FontT24_0x0074_mod, + &FontT24_0x0075_mod, + &FontT24_0x0076_mod, + &FontT24_0x0077_mod, + &FontT24_0x0078_mod, + &FontT24_0x0079_mod, + &FontT24_0x007a_mod +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Inc/font_T48_min.h Sat Nov 15 19:29:44 2025 +0100 @@ -0,0 +1,874 @@ +#include "gfx_fonts.h" + +static uint8_t image_data_FontT48_0x00b0[784]; + +static uint8_t image_data_FontT48_0x0020[14]; + +static uint8_t image_data_FontT48_0x0021[403]; + +static uint8_t image_data_FontT48_0x0022[621]; + +static uint8_t image_data_FontT48_0x0023[1456]; + +static uint8_t image_data_FontT48_0x0024[1180]; + +static uint8_t image_data_FontT48_0x0025[1514]; + +static uint8_t image_data_FontT48_0x0026[1574]; + +static uint8_t image_data_FontT48_0x0027[338]; + +static uint8_t image_data_FontT48_0x0028[678]; + +static uint8_t image_data_FontT48_0x0029[623]; + +static uint8_t image_data_FontT48_0x002a[843]; + +static uint8_t image_data_FontT48_0x002b[1180]; + +static uint8_t image_data_FontT48_0x002c[513]; + +static uint8_t image_data_FontT48_0x002d[678]; + +static uint8_t image_data_FontT48_0x002e[513]; + +static uint8_t image_data_FontT48_0x002f[960]; + +static uint8_t image_data_FontT48_0x0030[1290]; + +static uint8_t image_data_FontT48_0x0031[740]; + +static uint8_t image_data_FontT48_0x0032[1235]; + +static uint8_t image_data_FontT48_0x0033[1070]; + +static uint8_t image_data_FontT48_0x0034[1400]; + +static uint8_t image_data_FontT48_0x0035[1125]; + +static uint8_t image_data_FontT48_0x0036[1235]; + +static uint8_t image_data_FontT48_0x0037[1345]; + +static uint8_t image_data_FontT48_0x0038[1125]; + +static uint8_t image_data_FontT48_0x0039[1235]; + +static uint8_t image_data_FontT48_0x003a[513]; + +static uint8_t image_data_FontT48_0x003b[513]; + +static uint8_t image_data_FontT48_0x003c[1015]; + +static uint8_t image_data_FontT48_0x003d[1180]; + +static uint8_t image_data_FontT48_0x003e[1015]; + +static uint8_t image_data_FontT48_0x003f[898]; + +static uint8_t image_data_FontT48_0x0040[1852]; + +static uint8_t image_data_FontT48_0x0041[1568]; + +static uint8_t image_data_FontT48_0x0042[1292]; + +static uint8_t image_data_FontT48_0x0043[1404]; + +static uint8_t image_data_FontT48_0x0044[1404]; + +static uint8_t image_data_FontT48_0x0045[1236]; + +static uint8_t image_data_FontT48_0x0046[1236]; + +static uint8_t image_data_FontT48_0x0047[1572]; + +static uint8_t image_data_FontT48_0x0048[1406]; + +static uint8_t image_data_FontT48_0x0049[398]; + +static uint8_t image_data_FontT48_0x004a[1068]; + +static uint8_t image_data_FontT48_0x004b[1293]; + +static uint8_t image_data_FontT48_0x004c[1179]; + +static uint8_t image_data_FontT48_0x004d[1851]; + +static uint8_t image_data_FontT48_0x004e[1406]; + +static uint8_t image_data_FontT48_0x004f[1627]; + +static uint8_t image_data_FontT48_0x0050[1292]; + +static uint8_t image_data_FontT48_0x0051[1849]; + +static uint8_t image_data_FontT48_0x0052[1403]; + +static uint8_t image_data_FontT48_0x0053[1288]; + +static uint8_t image_data_FontT48_0x0054[1568]; + +static uint8_t image_data_FontT48_0x0055[1406]; + +static uint8_t image_data_FontT48_0x0056[1568]; + +static uint8_t image_data_FontT48_0x0057[2296]; + +static uint8_t image_data_FontT48_0x0058[1512]; + +static uint8_t image_data_FontT48_0x0059[1512]; + +static uint8_t image_data_FontT48_0x005a[1456]; + +static uint8_t image_data_FontT48_0x005b[733]; + +static uint8_t image_data_FontT48_0x005c[842]; + +static uint8_t image_data_FontT48_0x005d[733]; + +static uint8_t image_data_FontT48_0x005e[1015]; + +static uint8_t image_data_FontT48_0x005f[1400]; + +//static uint8_t image_data_FontT48_0x0060[1015]; + +static uint8_t image_data_FontT48_0x0061[1290]; + +static uint8_t image_data_FontT48_0x0062[1347]; + +static uint8_t image_data_FontT48_0x0063[1234]; + +static uint8_t image_data_FontT48_0x0064[1347]; + +static uint8_t image_data_FontT48_0x0065[1346]; + +static uint8_t image_data_FontT48_0x0066[843]; + +static uint8_t image_data_FontT48_0x0067[1234]; + +static uint8_t image_data_FontT48_0x0068[1236]; + +static uint8_t image_data_FontT48_0x0069[564]; + +static uint8_t image_data_FontT48_0x006a[788]; + +static uint8_t image_data_FontT48_0x006b[1290]; + +static uint8_t image_data_FontT48_0x006c[564]; + +static uint8_t image_data_FontT48_0x006d[2020]; + +static uint8_t image_data_FontT48_0x006e[1236]; + +static uint8_t image_data_FontT48_0x006f[1346]; + +static uint8_t image_data_FontT48_0x0070[1347]; + +static uint8_t image_data_FontT48_0x0071[1347]; + +static uint8_t image_data_FontT48_0x0072[900]; + +static uint8_t image_data_FontT48_0x0073[954]; + +static uint8_t image_data_FontT48_0x0074[954]; + +static uint8_t image_data_FontT48_0x0075[1236]; + +static uint8_t image_data_FontT48_0x0076[1289]; + +static uint8_t image_data_FontT48_0x0077[2016]; + +static uint8_t image_data_FontT48_0x0078[1289]; + +static uint8_t image_data_FontT48_0x0079[1344]; + +static uint8_t image_data_FontT48_0x007a[1288]; + +static uint8_t image_data_FontT48_0x007b[1008]; + +static uint8_t image_data_FontT48_0x007c[300]; + +static uint8_t image_data_FontT48_0x007d[843]; + +static uint8_t image_data_FontT48_0x007e[1015]; + + +static const tImage FontT48_0x00b0 __attribute__(( section(".upper_fonts.FontT48_0x00b0") )) = { image_data_FontT48_0x00b0, 14, 56}; +static const tImage FontT48_0x0020 __attribute__(( section(".upper_fonts.FontT48_0x0020") )) = { image_data_FontT48_0x0020, 14, 56}; +static const tImage FontT48_0x0021 __attribute__(( section(".upper_fonts.FontT48_0x0021") )) = { image_data_FontT48_0x0021, 18, 56}; +static const tImage FontT48_0x0022 __attribute__(( section(".upper_fonts.FontT48_0x0022") )) = { image_data_FontT48_0x0022, 16, 56}; +static const tImage FontT48_0x0023 __attribute__(( section(".upper_fonts.FontT48_0x0023") )) = { image_data_FontT48_0x0023, 26, 56}; +static const tImage FontT48_0x0024 __attribute__(( section(".upper_fonts.FontT48_0x0024") )) = { image_data_FontT48_0x0024, 25, 56}; +static const tImage FontT48_0x0025 __attribute__(( section(".upper_fonts.FontT48_0x0025") )) = { image_data_FontT48_0x0025, 29, 56}; +static const tImage FontT48_0x0026 __attribute__(( section(".upper_fonts.FontT48_0x0026") )) = { image_data_FontT48_0x0026, 34, 56}; +static const tImage FontT48_0x0027 __attribute__(( section(".upper_fonts.FontT48_0x0027") )) = { image_data_FontT48_0x0027, 8, 56}; +static const tImage FontT48_0x0028 __attribute__(( section(".upper_fonts.FontT48_0x0028") )) = { image_data_FontT48_0x0028, 18, 56}; +static const tImage FontT48_0x0029 __attribute__(( section(".upper_fonts.FontT48_0x0029") )) = { image_data_FontT48_0x0029, 18, 56}; +static const tImage FontT48_0x002a __attribute__(( section(".upper_fonts.FontT48_0x002a") )) = { image_data_FontT48_0x002a, 18, 56}; +static const tImage FontT48_0x002b __attribute__(( section(".upper_fonts.FontT48_0x002b") )) = { image_data_FontT48_0x002b, 25, 56}; +static const tImage FontT48_0x002c __attribute__(( section(".upper_fonts.FontT48_0x002c") )) = { image_data_FontT48_0x002c, 18, 56}; +static const tImage FontT48_0x002d __attribute__(( section(".upper_fonts.FontT48_0x002d") )) = { image_data_FontT48_0x002d, 18, 56}; +static const tImage FontT48_0x002e __attribute__(( section(".upper_fonts.FontT48_0x002e") )) = { image_data_FontT48_0x002e, 18, 56}; +static const tImage FontT48_0x002f __attribute__(( section(".upper_fonts.FontT48_0x002f") )) = { image_data_FontT48_0x002f, 25, 56}; +static const tImage FontT48_0x0030 __attribute__(( section(".upper_fonts.FontT48_0x0030") )) = { image_data_FontT48_0x0030, 25, 56}; +static const tImage FontT48_0x0031 __attribute__(( section(".upper_fonts.FontT48_0x0031") )) = { image_data_FontT48_0x0031, 25, 56}; +static const tImage FontT48_0x0032 __attribute__(( section(".upper_fonts.FontT48_0x0032") )) = { image_data_FontT48_0x0032, 25, 56}; +static const tImage FontT48_0x0033 __attribute__(( section(".upper_fonts.FontT48_0x0033") )) = { image_data_FontT48_0x0033, 25, 56}; +static const tImage FontT48_0x0034 __attribute__(( section(".upper_fonts.FontT48_0x0034") )) = { image_data_FontT48_0x0034, 25, 56}; +static const tImage FontT48_0x0035 __attribute__(( section(".upper_fonts.FontT48_0x0035") )) = { image_data_FontT48_0x0035, 25, 56}; +static const tImage FontT48_0x0036 __attribute__(( section(".upper_fonts.FontT48_0x0036") )) = { image_data_FontT48_0x0036, 25, 56}; +static const tImage FontT48_0x0037 __attribute__(( section(".upper_fonts.FontT48_0x0037") )) = { image_data_FontT48_0x0037, 25, 56}; +static const tImage FontT48_0x0038 __attribute__(( section(".upper_fonts.FontT48_0x0038") )) = { image_data_FontT48_0x0038, 25, 56}; +static const tImage FontT48_0x0039 __attribute__(( section(".upper_fonts.FontT48_0x0039") )) = { image_data_FontT48_0x0039, 25, 56}; +static const tImage FontT48_0x003a __attribute__(( section(".upper_fonts.FontT48_0x003a") )) = { image_data_FontT48_0x003a, 18, 56}; +static const tImage FontT48_0x003b __attribute__(( section(".upper_fonts.FontT48_0x003b") )) = { image_data_FontT48_0x003b, 18, 56}; +static const tImage FontT48_0x003c __attribute__(( section(".upper_fonts.FontT48_0x003c") )) = { image_data_FontT48_0x003c, 25, 56}; +static const tImage FontT48_0x003d __attribute__(( section(".upper_fonts.FontT48_0x003d") )) = { image_data_FontT48_0x003d, 25, 56}; +static const tImage FontT48_0x003e __attribute__(( section(".upper_fonts.FontT48_0x003e") )) = { image_data_FontT48_0x003e, 25, 56}; +static const tImage FontT48_0x003f __attribute__(( section(".upper_fonts.FontT48_0x003f") )) = { image_data_FontT48_0x003f, 18, 56}; +static const tImage FontT48_0x0040 __attribute__(( section(".upper_fonts.FontT48_0x0040") )) = { image_data_FontT48_0x0040, 37, 56}; +static const tImage FontT48_0x0041 __attribute__(( section(".upper_fonts.FontT48_0x0041") )) = { image_data_FontT48_0x0041, 28, 56}; +static const tImage FontT48_0x0042 __attribute__(( section(".upper_fonts.FontT48_0x0042") )) = { image_data_FontT48_0x0042, 27, 56}; +static const tImage FontT48_0x0043 __attribute__(( section(".upper_fonts.FontT48_0x0043") )) = { image_data_FontT48_0x0043, 29, 56}; +static const tImage FontT48_0x0044 __attribute__(( section(".upper_fonts.FontT48_0x0044") )) = { image_data_FontT48_0x0044, 29, 56}; +static const tImage FontT48_0x0045 __attribute__(( section(".upper_fonts.FontT48_0x0045") )) = { image_data_FontT48_0x0045, 26, 56}; +static const tImage FontT48_0x0046 __attribute__(( section(".upper_fonts.FontT48_0x0046") )) = { image_data_FontT48_0x0046, 26, 56}; +static const tImage FontT48_0x0047 __attribute__(( section(".upper_fonts.FontT48_0x0047") )) = { image_data_FontT48_0x0047, 32, 56}; +static const tImage FontT48_0x0048 __attribute__(( section(".upper_fonts.FontT48_0x0048") )) = { image_data_FontT48_0x0048, 31, 56}; +static const tImage FontT48_0x0049 __attribute__(( section(".upper_fonts.FontT48_0x0049") )) = { image_data_FontT48_0x0049, 13, 56}; +static const tImage FontT48_0x004a __attribute__(( section(".upper_fonts.FontT48_0x004a") )) = { image_data_FontT48_0x004a, 23, 56}; +static const tImage FontT48_0x004b __attribute__(( section(".upper_fonts.FontT48_0x004b") )) = { image_data_FontT48_0x004b, 28, 56}; +static const tImage FontT48_0x004c __attribute__(( section(".upper_fonts.FontT48_0x004c") )) = { image_data_FontT48_0x004c, 24, 56}; +static const tImage FontT48_0x004d __attribute__(( section(".upper_fonts.FontT48_0x004d") )) = { image_data_FontT48_0x004d, 36, 56}; +static const tImage FontT48_0x004e __attribute__(( section(".upper_fonts.FontT48_0x004e") )) = { image_data_FontT48_0x004e, 31, 56}; +static const tImage FontT48_0x004f __attribute__(( section(".upper_fonts.FontT48_0x004e") )) = { image_data_FontT48_0x004f, 32, 56}; +static const tImage FontT48_0x0050 __attribute__(( section(".upper_fonts.FontT48_0x0050") )) = { image_data_FontT48_0x0050, 27, 56}; +static const tImage FontT48_0x0051 __attribute__(( section(".upper_fonts.FontT48_0x0051") )) = { image_data_FontT48_0x0051, 34, 56}; +static const tImage FontT48_0x0052 __attribute__(( section(".upper_fonts.FontT48_0x0052") )) = { image_data_FontT48_0x0052, 28, 56}; +static const tImage FontT48_0x0053 __attribute__(( section(".upper_fonts.FontT48_0x0053") )) = { image_data_FontT48_0x0053, 23, 56}; +static const tImage FontT48_0x0054 __attribute__(( section(".upper_fonts.FontT48_0x0054") )) = { image_data_FontT48_0x0054, 28, 56}; +static const tImage FontT48_0x0055 __attribute__(( section(".upper_fonts.FontT48_0x0055") )) = { image_data_FontT48_0x0055, 31, 56}; +static const tImage FontT48_0x0056 __attribute__(( section(".upper_fonts.FontT48_0x0056") )) = { image_data_FontT48_0x0056, 28, 56}; +static const tImage FontT48_0x0057 __attribute__(( section(".upper_fonts.FontT48_0x0057") )) = { image_data_FontT48_0x0057, 41, 56}; +static const tImage FontT48_0x0058 __attribute__(( section(".upper_fonts.FontT48_0x0058") )) = { image_data_FontT48_0x0058, 27, 56}; +static const tImage FontT48_0x0059 __attribute__(( section(".upper_fonts.FontT48_0x0059") )) = { image_data_FontT48_0x0059, 27, 56}; +static const tImage FontT48_0x005a __attribute__(( section(".upper_fonts.FontT48_0x005b") )) = { image_data_FontT48_0x005a, 26, 56}; +static const tImage FontT48_0x005b __attribute__(( section(".upper_fonts.FontT48_0x005b") )) = { image_data_FontT48_0x005b, 18, 56}; +static const tImage FontT48_0x005c __attribute__(( section(".upper_fonts.FontT48_0x005c") )) = { image_data_FontT48_0x005c, 17, 56}; +static const tImage FontT48_0x005d __attribute__(( section(".upper_fonts.FontT48_0x005d") )) = { image_data_FontT48_0x005d, 18, 56}; +static const tImage FontT48_0x005e __attribute__(( section(".upper_fonts.FontT48_0x005e") )) = { image_data_FontT48_0x005e, 25, 56}; +static const tImage FontT48_0x005f __attribute__(( section(".upper_fonts.FontT48_0x005f") )) = { image_data_FontT48_0x005f, 25, 56}; +static const tImage FontT48_0x0061 __attribute__(( section(".upper_fonts.FontT48_0x0061") )) = { image_data_FontT48_0x0061, 25, 56}; +static const tImage FontT48_0x0062 __attribute__(( section(".upper_fonts.FontT48_0x0062") )) = { image_data_FontT48_0x0062, 27, 56}; +static const tImage FontT48_0x0063 __attribute__(( section(".upper_fonts.FontT48_0x0063") )) = { image_data_FontT48_0x0063, 24, 56}; +static const tImage FontT48_0x0064 __attribute__(( section(".upper_fonts.FontT48_0x0064") )) = { image_data_FontT48_0x0064, 27, 56}; +static const tImage FontT48_0x0065 __attribute__(( section(".upper_fonts.FontT48_0x0065") )) = { image_data_FontT48_0x0065, 26, 56}; +static const tImage FontT48_0x0066 __attribute__(( section(".upper_fonts.FontT48_0x0066") )) = { image_data_FontT48_0x0066, 18, 56}; +static const tImage FontT48_0x0067 __attribute__(( section(".upper_fonts.FontT48_0x0067") )) = { image_data_FontT48_0x0067, 24, 56}; +static const tImage FontT48_0x0068 __attribute__(( section(".upper_fonts.FontT48_0x0068") )) = { image_data_FontT48_0x0068, 26, 56}; +static const tImage FontT48_0x0069 __attribute__(( section(".upper_fonts.FontT48_0x0069") )) = { image_data_FontT48_0x0069, 14, 56}; +static const tImage FontT48_0x006a __attribute__(( section(".upper_fonts.FontT48_0x006a") )) = { image_data_FontT48_0x006a, 18, 56}; +static const tImage FontT48_0x006b __attribute__(( section(".upper_fonts.FontT48_0x006b") )) = { image_data_FontT48_0x006b, 25, 56}; +static const tImage FontT48_0x006c __attribute__(( section(".upper_fonts.FontT48_0x006c") )) = { image_data_FontT48_0x006c, 14, 56}; +static const tImage FontT48_0x006d __attribute__(( section(".upper_fonts.FontT48_0x006d") )) = { image_data_FontT48_0x006d, 40, 56}; +static const tImage FontT48_0x006e __attribute__(( section(".upper_fonts.FontT48_0x006e") )) = { image_data_FontT48_0x006e, 26, 56}; +static const tImage FontT48_0x006f __attribute__(( section(".upper_fonts.FontT48_0x006f") )) = { image_data_FontT48_0x006f, 26, 56}; +static const tImage FontT48_0x0070 __attribute__(( section(".upper_fonts.FontT48_0x0070") )) = { image_data_FontT48_0x0070, 27, 56}; +static const tImage FontT48_0x0071 __attribute__(( section(".upper_fonts.FontT48_0x0071") )) = { image_data_FontT48_0x0071, 27, 56}; +static const tImage FontT48_0x0072 __attribute__(( section(".upper_fonts.FontT48_0x0072") )) = { image_data_FontT48_0x0072, 20, 56}; +static const tImage FontT48_0x0073 __attribute__(( section(".upper_fonts.FontT48_0x0073") )) = { image_data_FontT48_0x0073, 19, 56}; +static const tImage FontT48_0x0074 __attribute__(( section(".upper_fonts.FontT48_0x0074") )) = { image_data_FontT48_0x0074, 19, 56}; +static const tImage FontT48_0x0075 __attribute__(( section(".upper_fonts.FontT48_0x0075") )) = { image_data_FontT48_0x0075, 26, 56}; +static const tImage FontT48_0x0076 __attribute__(( section(".upper_fonts.FontT48_0x0076") )) = { image_data_FontT48_0x0076, 24, 56}; +static const tImage FontT48_0x0077 __attribute__(( section(".upper_fonts.FontT48_0x0077") )) = { image_data_FontT48_0x0077, 36, 56}; +static const tImage FontT48_0x0078 __attribute__(( section(".upper_fonts.FontT48_0x0078") )) = { image_data_FontT48_0x0078, 24, 56}; +static const tImage FontT48_0x0079 __attribute__(( section(".upper_fonts.FontT48_0x0079") )) = { image_data_FontT48_0x0079, 24, 56}; +static const tImage FontT48_0x007a __attribute__(( section(".upper_fonts.FontT48_0x007a") )) = { image_data_FontT48_0x007a, 23, 56}; +static const tImage FontT48_0x007b __attribute__(( section(".upper_fonts.FontT48_0x007b") )) = { image_data_FontT48_0x007b, 18, 56}; +static const tImage FontT48_0x007c __attribute__(( section(".upper_fonts.FontT48_0x007c") )) = { image_data_FontT48_0x007c, 25, 56}; +static const tImage FontT48_0x007d __attribute__(( section(".upper_fonts.FontT48_0x007d") )) = { image_data_FontT48_0x007d, 18, 56}; +static const tImage FontT48_0x007e __attribute__(( section(".upper_fonts.FontT48_0x007e") )) = { image_data_FontT48_0x007e, 25, 56}; + +static const tChar FontT48_array[] __attribute__(( section(".upper_fonts.FontT48_array") )) = { + + + {0x0020, &FontT48_0x0020}, + + + {0x0021, &FontT48_0x0021}, + + + {0x0022, &FontT48_0x0022}, + + + {0x0023, &FontT48_0x0023}, + + + {0x0024, &FontT48_0x0024}, + + + {0x0025, &FontT48_0x0025}, + + + {0x0026, &FontT48_0x0026}, + + + {0x0027, &FontT48_0x0027}, + + + {0x0028, &FontT48_0x0028}, + + + {0x0029, &FontT48_0x0029}, + + + {0x002a, &FontT48_0x002a}, + + + {0x002b, &FontT48_0x002b}, + + + {0x002c, &FontT48_0x002c}, + + + {0x002d, &FontT48_0x002d}, + + + {0x002e, &FontT48_0x002e}, + + + {0x002f, &FontT48_0x002f}, + + + {0x0030, &FontT48_0x0030}, + + + {0x0031, &FontT48_0x0031}, + + + {0x0032, &FontT48_0x0032}, + + + {0x0033, &FontT48_0x0033}, + + + {0x0034, &FontT48_0x0034}, + + + {0x0035, &FontT48_0x0035}, + + + {0x0036, &FontT48_0x0036}, + + + {0x0037, &FontT48_0x0037}, + + + {0x0038, &FontT48_0x0038}, + + + {0x0039, &FontT48_0x0039}, + + + {0x003a, &FontT48_0x003a}, + + + {0x003b, &FontT48_0x003b}, + + + {0x003c, &FontT48_0x003c}, + + + {0x003d, &FontT48_0x003d}, + + + {0x003e, &FontT48_0x003e}, + + + {0x003f, &FontT48_0x003f}, + + + {0x0040, &FontT48_0x0040}, + + + {0x0041, &FontT48_0x0041}, + + + {0x0042, &FontT48_0x0042}, + + + {0x0043, &FontT48_0x0043}, + + + {0x0044, &FontT48_0x0044}, + + + {0x0045, &FontT48_0x0045}, + + + {0x0046, &FontT48_0x0046}, + + + {0x0047, &FontT48_0x0047}, + + + {0x0048, &FontT48_0x0048}, + + + {0x0049, &FontT48_0x0049}, + + + {0x004a, &FontT48_0x004a}, + + + {0x004b, &FontT48_0x004b}, + + + {0x004c, &FontT48_0x004c}, + + + {0x004d, &FontT48_0x004d}, + + + {0x004e, &FontT48_0x004e}, + + + {0x004f, &FontT48_0x004f}, + + + {0x0050, &FontT48_0x0050}, + + + {0x0051, &FontT48_0x0051}, + + + {0x0052, &FontT48_0x0052}, + + + {0x0053, &FontT48_0x0053}, + + + {0x0054, &FontT48_0x0054}, + + + {0x0055, &FontT48_0x0055}, + + + {0x0056, &FontT48_0x0056}, + + + {0x0057, &FontT48_0x0057}, + + + {0x0058, &FontT48_0x0058}, + + + {0x0059, &FontT48_0x0059}, + + + {0x005a, &FontT48_0x005a}, + + + {0x005b, &FontT48_0x005b}, + + + {0x005c, &FontT48_0x005c}, + + + {0x005d, &FontT48_0x005d}, + + + {0x005e, &FontT48_0x005e}, + + + {0x005f, &FontT48_0x005f}, + + + {0x0060, &FontT48_0x00b0}, + + + {0x0061, &FontT48_0x0061}, + + + {0x0062, &FontT48_0x0062}, + + + {0x0063, &FontT48_0x0063}, + + + {0x0064, &FontT48_0x0064}, + + + {0x0065, &FontT48_0x0065}, + + + {0x0066, &FontT48_0x0066}, + + + {0x0067, &FontT48_0x0067}, + + + {0x0068, &FontT48_0x0068}, + + + {0x0069, &FontT48_0x0069}, + + + {0x006a, &FontT48_0x006a}, + + + {0x006b, &FontT48_0x006b}, + + + {0x006c, &FontT48_0x006c}, + + + {0x006d, &FontT48_0x006d}, + + + {0x006e, &FontT48_0x006e}, + + + {0x006f, &FontT48_0x006f}, + + + {0x0070, &FontT48_0x0070}, + + + {0x0071, &FontT48_0x0071}, + + + {0x0072, &FontT48_0x0072}, + + + {0x0073, &FontT48_0x0073}, + + + {0x0074, &FontT48_0x0074}, + + + {0x0075, &FontT48_0x0075}, + + + {0x0076, &FontT48_0x0076}, + + + {0x0077, &FontT48_0x0077}, + + + {0x0078, &FontT48_0x0078}, + + + {0x0079, &FontT48_0x0079}, + + + {0x007a, &FontT48_0x007a}, + + + {0x007b, &FontT48_0x007b}, + + + {0x007c, &FontT48_0x007c}, + + + {0x007d, &FontT48_0x007d}, + + + {0x007e, &FontT48_0x007e}, +}; + +const tFont FontT48min __attribute__ (( used, section(".upper_font_directory.FontT48") )) = { 95, FontT48_array, 14, 25, 56 }; + +static const uint8_t image_data_FontT48_0x00b0_mod[146] = { 0, 95, 5, 1, 11, 2, 5, 1, 0, 51, 60, 1, 176, 1, 219, 2, 176, 1, 60, 1, 0, 49, 141, 1, 255, 1, 239, 1, 175, 2, 239, 1, 255, 1, 141, 1, 0, 47, 60, 1, 255, 1, 245, 1, 25, 1, 0, 2, 25, 1, 245, 1, 255, 1, 60, 1, 0, 46, 255, 2, 56, 1, 0, 4, 56, 1, 255, 2, 0, 46, 255, 2, 0, 6, 255, 2, 0, 46, 255, 2, 0, 6, 255, 2, 0, 46, 239, 1, 255, 1, 60, 1, 0, 4, 60, 1, 255, 1, 239, 1, 0, 46, 25, 1, 255, 2, 60, 1, 5, 2, 60, 1, 255, 2, 25, 1, 0, 47, 89, 1, 245, 1, 255, 1, 176, 2, 255, 1, 245, 1, 89, 1, 0, 49, 56, 1, 128, 1, 175, 2, 128, 1, 56, 1, 0, 124 }; +static const uint8_t image_data_FontT48_0x0020_mod[2] = { 1, 14 }; +static const uint8_t image_data_FontT48_0x0021_mod[154] = { 1, 6, 0, 12, 141, 1, 235, 1, 255, 1, 235, 1, 141, 1, 0, 10, 5, 1, 11, 2, 35, 1, 60, 2, 98, 13, 0, 21, 141, 1, 255, 5, 141, 1, 0, 2, 5, 1, 11, 1, 35, 1, 60, 2, 98, 1, 141, 1, 176, 1, 219, 2, 235, 1, 255, 15, 0, 21, 255, 7, 0, 2, 176, 1, 219, 1, 235, 1, 255, 23, 0, 21, 255, 7, 0, 2, 239, 1, 245, 1, 255, 24, 0, 21, 239, 1, 255, 5, 239, 1, 0, 2, 25, 1, 56, 1, 89, 1, 128, 1, 175, 2, 203, 1, 239, 1, 245, 2, 255, 16, 0, 21, 25, 1, 245, 1, 255, 3, 245, 1, 25, 1, 0, 8, 12, 1, 25, 1, 56, 2, 89, 1, 128, 2, 175, 3, 203, 10, 0, 22, 56, 1, 175, 3, 56, 1, 0, 19, 12, 10, 0, 10, 1, 5 }; +static const uint8_t image_data_FontT48_0x0022_mod[94] = { 1, 1, 0, 37, 5, 3, 11, 2, 35, 3, 60, 1, 0, 47, 176, 3, 219, 2, 235, 3, 255, 1, 0, 47, 255, 9, 0, 47, 255, 9, 0, 47, 89, 1, 128, 2, 175, 2, 203, 3, 239, 1, 0, 52, 12, 3, 25, 1, 0, 10, 1, 2, 0, 37, 11, 1, 35, 3, 60, 3, 98, 2, 0, 47, 219, 1, 235, 3, 255, 5, 0, 47, 255, 9, 0, 47, 245, 2, 255, 7, 0, 47, 56, 2, 89, 2, 128, 3, 175, 2, 0, 10, 1, 2 }; +static const uint8_t image_data_FontT48_0x0023_mod[546] = { 0, 21, 35, 3, 0, 43, 60, 1, 11, 1, 0, 8, 235, 3, 0, 43, 255, 1, 219, 1, 141, 1, 98, 1, 35, 1, 5, 1, 0, 4, 255, 3, 0, 43, 255, 4, 235, 1, 176, 1, 141, 1, 60, 1, 35, 1, 5, 1, 255, 3, 0, 9, 98, 3, 0, 31, 203, 1, 239, 1, 255, 6, 235, 1, 176, 1, 255, 3, 5, 1, 0, 8, 255, 3, 0, 31, 12, 1, 25, 1, 89, 1, 175, 1, 203, 1, 245, 1, 255, 7, 176, 1, 98, 1, 35, 1, 11, 1, 0, 5, 255, 3, 0, 35, 12, 1, 56, 1, 128, 1, 175, 1, 239, 1, 255, 6, 235, 1, 219, 1, 141, 1, 98, 1, 35, 1, 5, 1, 0, 1, 255, 3, 0, 39, 25, 1, 89, 1, 255, 9, 235, 1, 176, 1, 141, 1, 255, 3, 0, 41, 255, 3, 89, 1, 128, 1, 203, 1, 239, 1, 255, 8, 98, 1, 60, 1, 11, 1, 0, 38, 255, 3, 0, 2, 12, 1, 25, 1, 89, 1, 175, 1, 203, 1, 245, 1, 255, 6, 219, 1, 141, 1, 98, 1, 35, 1, 11, 1, 0, 34, 255, 3, 0, 6, 12, 1, 56, 1, 89, 1, 255, 8, 235, 1, 219, 1, 141, 1, 60, 1, 0, 22, 60, 1, 11, 1, 0, 8, 255, 3, 0, 9, 255, 3, 89, 1, 175, 1, 239, 1, 255, 6, 0, 22, 255, 1, 219, 1, 141, 1, 98, 1, 35, 1, 11, 1, 0, 4, 255, 3, 0, 9, 255, 3, 0, 2, 25, 1, 89, 1, 128, 1, 203, 1, 245, 1, 255, 2, 0, 22, 255, 4, 235, 1, 219, 1, 141, 1, 60, 1, 35, 1, 5, 1, 255, 3, 0, 9, 255, 3, 0, 5, 12, 1, 56, 1, 89, 1, 175, 1, 0, 22, 203, 1, 239, 1, 255, 6, 235, 1, 176, 1, 255, 3, 5, 1, 0, 8, 255, 3, 0, 31, 12, 1, 25, 1, 89, 1, 175, 1, 203, 1, 245, 1, 255, 7, 176, 1, 98, 1, 60, 1, 11, 1, 0, 5, 255, 3, 0, 35, 12, 1, 56, 1, 89, 1, 175, 1, 239, 1, 245, 1, 255, 6, 219, 1, 141, 1, 98, 1, 35, 1, 11, 1, 0, 1, 255, 3, 0, 39, 25, 1, 56, 1, 255, 3, 245, 1, 255, 5, 235, 1, 219, 1, 141, 1, 255, 3, 0, 41, 255, 3, 56, 1, 128, 1, 175, 1, 239, 1, 245, 1, 255, 7, 141, 1, 60, 1, 35, 1, 5, 1, 0, 37, 255, 3, 0, 3, 25, 1, 56, 1, 128, 1, 203, 1, 239, 1, 255, 6, 235, 1, 176, 1, 98, 1, 60, 1, 11, 1, 5, 1, 0, 33, 255, 3, 0, 6, 12, 1, 25, 1, 89, 1, 255, 9, 219, 1, 176, 1, 98, 1, 0, 32, 239, 3, 0, 9, 255, 3, 89, 1, 175, 1, 203, 1, 245, 1, 255, 5, 0, 32, 25, 3, 0, 9, 255, 3, 0, 2, 12, 1, 56, 1, 128, 1, 175, 1, 239, 1, 245, 1, 255, 1, 0, 44, 255, 3, 0, 6, 25, 1, 56, 1, 128, 1, 0, 44, 255, 3, 0, 53, 89, 3, 0, 20 }; +static const uint8_t image_data_FontT48_0x0024_mod[400] = { 1, 2, 0, 35, 5, 3, 0, 31, 98, 1, 35, 1, 0, 17, 35, 1, 98, 1, 141, 1, 176, 3, 141, 1, 60, 1, 5, 1, 0, 27, 141, 1, 255, 1, 235, 1, 141, 1, 60, 1, 0, 13, 5, 1, 141, 1, 235, 1, 255, 7, 176, 1, 35, 1, 0, 26, 255, 4, 203, 1, 0, 12, 11, 1, 176, 1, 255, 10, 235, 1, 60, 1, 0, 25, 255, 4, 12, 1, 0, 12, 219, 1, 255, 13, 35, 1, 0, 23, 60, 1, 255, 4, 0, 12, 98, 1, 255, 5, 245, 1, 203, 2, 239, 1, 255, 5, 235, 1, 0, 23, 255, 4, 128, 1, 0, 12, 255, 5, 175, 1, 56, 1, 12, 2, 25, 1, 89, 1, 239, 1, 255, 4, 35, 1, 0, 22, 255, 4, 0, 12, 141, 1, 255, 4, 128, 1, 0, 6, 25, 1, 255, 4, 235, 1, 0, 17, 60, 5, 255, 4, 0, 12, 255, 4, 245, 1, 0, 8, 89, 1, 255, 4, 60, 4, 0, 13, 255, 9, 0, 11, 98, 1, 255, 4, 56, 1, 0, 9, 255, 8, 0, 13, 255, 9, 0, 11, 255, 4, 245, 1, 0, 10, 255, 8, 0, 13, 239, 5, 255, 4, 0, 10, 60, 1, 255, 4, 56, 1, 0, 10, 255, 4, 239, 4, 0, 13, 25, 5, 255, 4, 98, 1, 0, 9, 255, 5, 0, 11, 255, 4, 25, 4, 0, 18, 239, 1, 255, 4, 5, 1, 0, 7, 60, 1, 255, 4, 89, 1, 0, 10, 11, 1, 255, 4, 0, 22, 25, 1, 255, 4, 176, 1, 11, 1, 0, 5, 60, 1, 255, 5, 0, 11, 219, 1, 255, 4, 0, 23, 255, 5, 219, 1, 98, 1, 60, 3, 141, 1, 255, 5, 89, 1, 0, 11, 255, 4, 203, 1, 0, 23, 89, 1, 255, 14, 203, 1, 0, 11, 98, 1, 255, 4, 12, 1, 0, 24, 175, 1, 255, 12, 203, 1, 12, 1, 0, 11, 128, 1, 203, 1, 245, 1, 255, 2, 0, 26, 175, 1, 255, 10, 175, 1, 12, 1, 0, 13, 12, 1, 56, 1, 128, 1, 89, 1, 0, 27, 89, 1, 203, 1, 245, 1, 255, 4, 239, 1, 203, 1, 89, 1, 0, 47, 12, 1, 56, 1, 89, 1, 128, 1, 89, 2, 25, 1, 12, 1, 0, 32, 1, 2 }; +static const uint8_t image_data_FontT48_0x0025_mod[726] = { 1, 1, 0, 33, 35, 1, 60, 1, 98, 4, 60, 1, 11, 1, 0, 26, 141, 1, 11, 1, 0, 18, 35, 1, 141, 1, 235, 1, 255, 6, 219, 1, 141, 1, 11, 1, 0, 24, 255, 1, 219, 1, 60, 1, 0, 16, 60, 1, 235, 1, 255, 10, 219, 1, 11, 1, 0, 23, 255, 3, 141, 1, 35, 1, 0, 13, 5, 1, 255, 3, 203, 1, 175, 1, 128, 1, 89, 2, 128, 1, 175, 1, 239, 1, 255, 2, 219, 1, 0, 23, 128, 1, 239, 1, 255, 2, 235, 1, 98, 1, 5, 1, 0, 11, 176, 1, 255, 2, 89, 1, 12, 1, 0, 6, 25, 1, 128, 1, 255, 2, 60, 1, 0, 23, 25, 1, 175, 1, 255, 3, 176, 1, 60, 1, 0, 10, 255, 2, 89, 1, 0, 10, 128, 1, 255, 2, 0, 25, 89, 1, 203, 1, 255, 3, 141, 1, 11, 1, 0, 8, 255, 2, 0, 12, 255, 2, 0, 26, 12, 1, 128, 1, 245, 1, 255, 2, 219, 1, 60, 1, 5, 1, 0, 6, 255, 2, 0, 12, 255, 2, 0, 28, 56, 1, 175, 1, 255, 3, 176, 1, 35, 1, 0, 5, 255, 2, 60, 1, 0, 10, 35, 1, 255, 2, 0, 30, 89, 1, 239, 1, 255, 2, 235, 1, 98, 1, 11, 1, 0, 3, 128, 1, 255, 2, 60, 1, 5, 1, 0, 6, 5, 1, 35, 1, 235, 1, 255, 1, 203, 1, 0, 31, 25, 1, 128, 1, 245, 1, 255, 2, 219, 1, 60, 1, 0, 3, 245, 1, 255, 2, 176, 1, 141, 1, 98, 1, 60, 3, 98, 1, 176, 1, 235, 1, 255, 2, 12, 1, 0, 33, 56, 1, 203, 1, 255, 3, 141, 1, 35, 1, 0, 1, 56, 1, 239, 1, 255, 10, 245, 1, 89, 1, 0, 29, 5, 4, 0, 2, 12, 1, 89, 1, 239, 1, 255, 2, 235, 1, 98, 1, 5, 1, 25, 1, 175, 1, 239, 1, 255, 6, 245, 1, 175, 1, 56, 1, 0, 27, 11, 1, 60, 1, 141, 1, 176, 4, 141, 1, 60, 1, 5, 1, 0, 1, 25, 1, 175, 1, 245, 1, 255, 2, 176, 1, 60, 1, 0, 1, 25, 1, 89, 1, 128, 4, 89, 1, 56, 1, 0, 28, 98, 1, 219, 1, 255, 8, 176, 1, 60, 1, 0, 2, 56, 1, 203, 1, 255, 3, 141, 1, 11, 1, 0, 34, 141, 1, 255, 4, 245, 4, 255, 4, 60, 1, 0, 2, 12, 1, 128, 1, 239, 1, 255, 2, 219, 1, 98, 1, 5, 1, 0, 31, 35, 1, 255, 2, 245, 1, 175, 1, 89, 1, 56, 4, 89, 1, 175, 1, 245, 1, 255, 2, 0, 4, 25, 1, 175, 1, 255, 3, 176, 1, 35, 1, 0, 30, 235, 1, 255, 1, 239, 1, 56, 1, 0, 8, 56, 1, 245, 1, 255, 1, 141, 1, 0, 5, 89, 1, 203, 1, 255, 2, 235, 1, 141, 1, 11, 1, 0, 28, 255, 2, 25, 1, 0, 10, 56, 1, 255, 2, 0, 6, 12, 1, 128, 1, 245, 1, 255, 2, 219, 1, 60, 1, 5, 1, 0, 26, 255, 2, 0, 12, 255, 2, 0, 8, 56, 1, 175, 1, 255, 3, 176, 1, 35, 1, 0, 25, 255, 2, 0, 12, 255, 2, 0, 10, 89, 1, 239, 1, 255, 2, 235, 1, 98, 1, 11, 1, 0, 23, 255, 2, 141, 1, 0, 10, 60, 1, 255, 2, 0, 11, 25, 1, 128, 1, 245, 1, 255, 2, 219, 1, 60, 1, 0, 22, 89, 1, 255, 2, 141, 1, 35, 1, 5, 1, 0, 4, 5, 1, 11, 1, 98, 1, 255, 2, 128, 1, 0, 13, 56, 1, 203, 1, 255, 3, 0, 23, 203, 1, 255, 2, 235, 1, 176, 1, 141, 4, 176, 1, 219, 1, 255, 2, 239, 1, 0, 15, 12, 1, 89, 1, 239, 1, 255, 1, 0, 23, 12, 1, 175, 1, 255, 10, 203, 1, 25, 1, 0, 17, 25, 1, 175, 1, 0, 25, 89, 1, 203, 1, 239, 1, 245, 1, 255, 2, 245, 1, 239, 1, 203, 1, 128, 1, 12, 1, 0, 46, 12, 1, 25, 1, 56, 1, 89, 2, 56, 1, 25, 1, 12, 1, 0, 33, 1, 1 }; +static const uint8_t image_data_FontT48_0x0026_mod[492] = { 1, 3, 0, 17, 11, 1, 60, 1, 98, 1, 141, 4, 98, 1, 35, 1, 5, 1, 0, 8, 11, 1, 35, 3, 5, 1, 0, 31, 35, 1, 141, 1, 219, 1, 255, 7, 235, 1, 176, 1, 60, 1, 0, 5, 35, 1, 141, 1, 219, 1, 235, 3, 176, 1, 98, 1, 11, 1, 0, 28, 98, 1, 235, 1, 255, 12, 141, 1, 5, 1, 0, 1, 5, 1, 98, 1, 235, 1, 255, 7, 219, 1, 60, 1, 0, 26, 141, 1, 255, 15, 176, 1, 5, 1, 176, 1, 255, 11, 60, 1, 0, 24, 60, 1, 255, 7, 245, 1, 239, 2, 245, 1, 255, 6, 176, 1, 255, 13, 35, 1, 0, 23, 255, 5, 245, 1, 175, 1, 89, 1, 56, 1, 25, 2, 56, 1, 89, 1, 175, 1, 245, 1, 255, 7, 203, 1, 89, 3, 128, 1, 203, 1, 255, 4, 235, 1, 0, 22, 35, 1, 255, 4, 245, 1, 56, 1, 0, 8, 56, 1, 203, 1, 255, 5, 89, 1, 12, 1, 0, 4, 12, 1, 175, 1, 255, 4, 5, 1, 0, 21, 235, 1, 255, 4, 56, 1, 0, 10, 12, 1, 255, 4, 89, 1, 0, 8, 255, 4, 176, 1, 0, 21, 255, 4, 203, 1, 0, 12, 255, 4, 0, 9, 89, 1, 255, 4, 0, 21, 255, 4, 12, 1, 0, 12, 255, 4, 0, 10, 255, 4, 0, 21, 255, 4, 0, 13, 255, 4, 0, 10, 255, 4, 0, 21, 255, 4, 0, 13, 255, 4, 0, 10, 255, 4, 0, 21, 255, 4, 0, 13, 255, 4, 0, 10, 255, 4, 0, 21, 255, 4, 0, 13, 255, 4, 0, 9, 35, 1, 255, 4, 0, 21, 239, 1, 255, 3, 0, 13, 255, 4, 0, 9, 235, 1, 255, 3, 245, 1, 0, 21, 25, 1, 255, 3, 11, 1, 0, 12, 255, 4, 0, 8, 60, 1, 255, 4, 56, 1, 0, 22, 255, 3, 219, 1, 11, 1, 35, 11, 255, 4, 35, 4, 0, 4, 128, 1, 239, 1, 255, 3, 0, 23, 203, 1, 255, 3, 219, 1, 235, 11, 255, 4, 235, 4, 141, 1, 0, 4, 25, 1, 128, 1, 245, 1, 128, 1, 0, 23, 12, 1, 255, 24, 0, 6, 56, 1, 0, 24, 141, 1, 255, 24, 35, 1, 0, 29, 35, 1, 255, 7, 245, 9, 255, 4, 245, 5, 226, 1, 0, 29, 235, 1, 255, 4, 203, 1, 128, 1, 89, 1, 56, 9, 255, 4, 56, 6, 0, 29, 255, 4, 203, 1, 12, 1, 0, 11, 255, 4, 0, 35, 255, 4, 12, 1, 0, 12, 255, 4, 0, 35, 255, 4, 0, 13, 255, 4, 0, 35, 255, 4, 0, 13, 255, 4, 0, 35, 245, 1, 255, 3, 5, 1, 0, 12, 239, 4, 0, 35, 56, 1, 255, 3, 167, 1, 0, 12, 25, 4, 0, 24, 1, 3 }; +static const uint8_t image_data_FontT48_0x0027_mod[52] = { 1, 1, 0, 37, 5, 3, 11, 2, 35, 3, 60, 1, 0, 47, 176, 3, 219, 2, 235, 3, 255, 1, 0, 47, 255, 9, 0, 47, 255, 9, 0, 47, 89, 1, 128, 2, 175, 2, 203, 3, 239, 1, 0, 52, 12, 3, 25, 1, 0, 10, 1, 1 }; +static const uint8_t image_data_FontT48_0x0028_mod[294] = { 1, 4, 0, 18, 5, 1, 11, 1, 35, 3, 60, 3, 35, 2, 11, 1, 5, 1, 0, 40, 11, 1, 60, 1, 98, 1, 141, 1, 176, 1, 219, 1, 235, 3, 255, 3, 235, 2, 219, 1, 176, 1, 141, 1, 60, 1, 11, 1, 5, 1, 0, 33, 11, 1, 60, 1, 141, 1, 219, 1, 255, 17, 219, 1, 176, 1, 98, 1, 11, 1, 0, 29, 35, 1, 141, 1, 219, 1, 255, 23, 219, 1, 141, 1, 35, 1, 0, 25, 11, 1, 141, 1, 235, 1, 255, 27, 235, 1, 141, 1, 35, 1, 0, 22, 98, 1, 219, 1, 255, 10, 245, 3, 239, 6, 245, 2, 255, 10, 235, 1, 98, 1, 5, 1, 0, 18, 11, 1, 141, 1, 255, 5, 245, 1, 239, 1, 203, 1, 175, 1, 128, 1, 89, 2, 56, 3, 25, 6, 56, 2, 89, 2, 128, 1, 175, 1, 203, 1, 239, 1, 245, 1, 255, 5, 176, 1, 35, 1, 0, 16, 11, 1, 219, 1, 255, 3, 239, 1, 175, 1, 89, 1, 56, 1, 25, 1, 12, 1, 0, 19, 12, 1, 25, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 3, 235, 1, 60, 1, 0, 14, 11, 1, 219, 1, 255, 1, 245, 1, 175, 1, 89, 1, 25, 1, 0, 28, 12, 1, 56, 1, 128, 1, 203, 1, 255, 3, 60, 1, 0, 12, 5, 1, 219, 1, 255, 1, 203, 1, 56, 1, 0, 34, 12, 1, 89, 1, 239, 1, 255, 2, 11, 1, 0, 11, 132, 1, 203, 1, 128, 1, 12, 1, 0, 37, 25, 1, 128, 1, 203, 1, 168, 1, 0, 11, 12, 2, 0, 41, 12, 2, 0, 10, 1, 2 }; +static const uint8_t image_data_FontT48_0x0029_mod[272] = { 1, 4, 0, 1, 98, 2, 11, 1, 0, 39, 35, 1, 98, 2, 0, 11, 89, 1, 255, 1, 219, 1, 60, 1, 0, 36, 11, 1, 98, 1, 235, 1, 255, 1, 128, 1, 0, 12, 128, 1, 255, 2, 141, 1, 35, 1, 5, 1, 0, 31, 11, 1, 98, 1, 219, 1, 255, 2, 175, 1, 0, 14, 128, 1, 255, 2, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 24, 5, 1, 11, 1, 60, 1, 141, 1, 219, 1, 255, 3, 203, 1, 0, 16, 128, 1, 245, 1, 255, 3, 235, 1, 176, 1, 141, 1, 98, 1, 60, 1, 35, 1, 11, 1, 5, 2, 0, 11, 5, 2, 11, 1, 35, 1, 60, 1, 98, 1, 176, 1, 219, 1, 255, 5, 175, 1, 12, 1, 0, 17, 56, 1, 203, 1, 255, 7, 235, 1, 219, 1, 176, 2, 141, 4, 98, 4, 141, 3, 176, 2, 219, 1, 235, 1, 255, 7, 239, 1, 89, 1, 0, 20, 12, 1, 128, 1, 245, 1, 255, 29, 245, 1, 175, 1, 25, 1, 0, 23, 56, 1, 175, 1, 239, 1, 255, 25, 239, 1, 175, 1, 56, 1, 0, 27, 25, 1, 128, 1, 203, 1, 245, 1, 255, 19, 245, 1, 203, 1, 128, 1, 25, 1, 0, 31, 12, 1, 56, 1, 128, 1, 175, 1, 239, 1, 245, 1, 255, 12, 239, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 37, 25, 1, 56, 1, 89, 1, 128, 2, 175, 6, 128, 2, 89, 1, 25, 1, 12, 1, 0, 24, 1, 3 }; +static const uint8_t image_data_FontT48_0x002a_mod[224] = { 1, 1, 0, 39, 141, 1, 35, 1, 0, 49, 60, 1, 0, 3, 35, 1, 255, 1, 235, 1, 141, 1, 0, 47, 98, 1, 255, 1, 141, 1, 0, 2, 235, 1, 255, 3, 0, 46, 35, 1, 255, 3, 35, 1, 0, 1, 255, 4, 0, 46, 183, 1, 255, 3, 235, 1, 0, 1, 255, 3, 89, 1, 0, 46, 12, 1, 128, 1, 245, 1, 255, 2, 35, 1, 255, 2, 175, 1, 0, 1, 11, 1, 60, 1, 98, 2, 0, 44, 56, 1, 175, 1, 245, 1, 235, 1, 255, 2, 60, 1, 141, 1, 219, 1, 255, 3, 0, 46, 61, 1, 255, 2, 245, 1, 255, 6, 0, 44, 5, 1, 60, 1, 176, 1, 255, 2, 206, 1, 128, 1, 203, 1, 245, 1, 255, 3, 0, 43, 60, 1, 176, 1, 255, 2, 203, 1, 255, 2, 35, 1, 12, 1, 56, 1, 89, 1, 175, 2, 0, 42, 98, 1, 255, 4, 12, 1, 255, 2, 235, 1, 0, 47, 128, 1, 255, 3, 128, 1, 0, 1, 255, 3, 141, 1, 0, 47, 175, 1, 255, 1, 203, 1, 0, 2, 255, 4, 0, 48, 175, 1, 12, 1, 0, 2, 239, 1, 255, 2, 239, 1, 0, 52, 25, 1, 203, 1, 89, 1, 25, 1, 0, 14, 1, 2 }; +static const uint8_t image_data_FontT48_0x002b_mod[102] = { 1, 2, 0, 24, 35, 3, 0, 53, 235, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 45, 11, 8, 255, 3, 11, 8, 0, 37, 219, 8, 255, 3, 219, 8, 0, 37, 255, 19, 0, 37, 255, 19, 0, 37, 89, 8, 255, 3, 89, 8, 0, 45, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 128, 3, 0, 29, 1, 2 }; +static const uint8_t image_data_FontT48_0x002c_mod[140] = { 1, 4, 0, 2, 5, 1, 141, 1, 11, 1, 0, 53, 160, 1, 255, 1, 219, 1, 11, 1, 0, 7, 35, 1, 60, 2, 11, 1, 0, 41, 25, 1, 245, 1, 255, 1, 219, 1, 35, 1, 0, 5, 35, 1, 235, 1, 255, 2, 219, 1, 11, 1, 0, 41, 56, 1, 255, 2, 235, 1, 98, 1, 11, 1, 5, 2, 35, 1, 235, 1, 255, 4, 219, 1, 0, 42, 89, 1, 245, 1, 255, 2, 219, 1, 176, 2, 235, 1, 255, 6, 0, 43, 56, 1, 239, 1, 255, 11, 0, 44, 25, 1, 175, 1, 245, 1, 255, 8, 128, 1, 0, 46, 56, 1, 128, 1, 203, 1, 239, 1, 245, 3, 239, 1, 128, 1, 0, 49, 12, 1, 25, 1, 56, 3, 25, 1, 0, 40, 1, 5 }; +static const uint8_t image_data_FontT48_0x002d_mod[54] = { 1, 3, 0, 23, 60, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 203, 4, 0, 52, 12, 4, 0, 29, 1, 3 }; +static const uint8_t image_data_FontT48_0x002e_mod[74] = { 1, 4, 0, 13, 5, 1, 11, 1, 5, 1, 0, 52, 60, 1, 176, 1, 219, 1, 176, 1, 60, 1, 0, 50, 60, 1, 255, 5, 60, 1, 0, 49, 255, 7, 0, 49, 255, 7, 0, 49, 255, 7, 0, 49, 89, 1, 255, 5, 89, 1, 0, 50, 89, 1, 203, 1, 239, 1, 203, 1, 128, 1, 0, 52, 12, 1, 25, 1, 12, 1, 0, 40, 1, 5 }; +static const uint8_t image_data_FontT48_0x002f_mod[274] = { 1, 4, 0, 11, 98, 1, 11, 1, 0, 54, 255, 1, 219, 1, 141, 1, 60, 1, 11, 1, 0, 51, 255, 4, 219, 1, 141, 1, 35, 1, 5, 1, 0, 48, 255, 6, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 45, 89, 1, 175, 1, 245, 1, 255, 6, 235, 1, 176, 1, 98, 1, 11, 1, 0, 45, 56, 1, 128, 1, 203, 1, 245, 1, 255, 6, 219, 1, 141, 1, 60, 1, 11, 1, 0, 44, 12, 1, 56, 1, 128, 1, 239, 1, 255, 7, 219, 1, 141, 1, 35, 1, 5, 1, 0, 44, 25, 1, 89, 1, 175, 1, 239, 1, 255, 6, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 44, 25, 1, 89, 1, 203, 1, 245, 1, 255, 6, 235, 1, 176, 1, 98, 1, 11, 1, 0, 44, 12, 1, 56, 1, 128, 1, 203, 1, 255, 7, 219, 1, 141, 1, 60, 1, 11, 1, 0, 44, 12, 1, 89, 1, 175, 1, 239, 1, 255, 7, 219, 1, 141, 1, 35, 1, 5, 1, 0, 44, 25, 1, 89, 1, 175, 1, 245, 1, 255, 6, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 44, 56, 1, 128, 1, 203, 1, 245, 1, 255, 6, 235, 1, 176, 1, 98, 1, 0, 45, 12, 1, 56, 1, 128, 1, 239, 1, 255, 7, 0, 48, 25, 1, 89, 1, 175, 1, 239, 1, 255, 4, 0, 51, 25, 1, 89, 1, 203, 1, 245, 1, 255, 1, 0, 53, 12, 1, 56, 1, 128, 1, 0, 11, 1, 4 }; +static const uint8_t image_data_FontT48_0x0030_mod[426] = { 1, 1, 0, 20, 5, 1, 11, 1, 35, 1, 60, 2, 98, 7, 60, 1, 35, 1, 11, 1, 5, 1, 0, 37, 35, 1, 98, 1, 141, 1, 176, 1, 219, 1, 235, 1, 255, 10, 235, 1, 219, 1, 176, 1, 98, 1, 35, 1, 0, 33, 35, 1, 141, 1, 235, 1, 255, 19, 235, 1, 141, 1, 35, 1, 0, 30, 98, 1, 235, 1, 255, 23, 235, 1, 98, 1, 5, 1, 0, 27, 141, 1, 255, 11, 245, 6, 255, 10, 176, 1, 5, 1, 0, 25, 60, 1, 255, 6, 245, 1, 239, 1, 175, 1, 128, 1, 89, 2, 56, 6, 89, 2, 128, 1, 175, 1, 203, 1, 245, 1, 255, 5, 176, 1, 0, 25, 255, 5, 245, 1, 175, 1, 56, 1, 25, 1, 0, 14, 12, 1, 56, 1, 175, 1, 245, 1, 255, 4, 141, 1, 0, 23, 35, 1, 255, 4, 203, 1, 56, 1, 0, 20, 56, 1, 239, 1, 255, 4, 0, 23, 235, 1, 255, 3, 245, 1, 12, 1, 0, 22, 25, 1, 255, 4, 98, 1, 0, 22, 255, 4, 56, 1, 0, 24, 89, 1, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 60, 1, 0, 24, 5, 1, 255, 4, 0, 22, 203, 1, 255, 4, 5, 1, 0, 23, 176, 1, 255, 4, 0, 22, 12, 1, 255, 4, 176, 1, 11, 1, 0, 21, 98, 1, 255, 4, 128, 1, 0, 23, 203, 1, 255, 4, 219, 1, 98, 1, 11, 1, 5, 1, 0, 15, 5, 1, 35, 1, 141, 1, 255, 5, 0, 24, 12, 1, 245, 1, 255, 5, 219, 1, 176, 1, 141, 1, 98, 1, 60, 1, 35, 4, 11, 1, 35, 4, 60, 2, 98, 1, 176, 1, 235, 1, 255, 5, 128, 1, 0, 25, 56, 1, 239, 1, 255, 9, 235, 4, 219, 1, 235, 4, 255, 9, 203, 1, 0, 27, 25, 1, 175, 1, 255, 25, 175, 1, 12, 1, 0, 29, 89, 1, 203, 1, 245, 1, 255, 20, 203, 1, 89, 1, 0, 32, 12, 1, 56, 1, 128, 1, 203, 1, 239, 1, 245, 1, 255, 11, 245, 1, 239, 1, 203, 1, 175, 1, 89, 1, 12, 1, 0, 36, 12, 1, 25, 1, 56, 1, 89, 1, 128, 3, 175, 3, 128, 3, 89, 1, 56, 1, 25, 1, 12, 1, 0, 19, 1, 1 }; +static const uint8_t image_data_FontT48_0x0031_mod[96] = { 1, 4, 0, 32, 60, 4, 0, 52, 89, 1, 255, 3, 98, 1, 0, 52, 203, 1, 255, 3, 11, 1, 0, 51, 12, 1, 255, 3, 219, 1, 0, 52, 128, 1, 255, 3, 141, 1, 0, 52, 239, 1, 255, 3, 98, 1, 0, 51, 25, 1, 255, 4, 60, 1, 0, 26, 60, 25, 197, 1, 255, 4, 35, 1, 0, 25, 255, 30, 235, 1, 60, 1, 0, 24, 255, 32, 60, 1, 0, 23, 255, 33, 98, 1, 0, 22, 255, 34, 0, 22, 89, 34, 0, 11, 1, 8 }; +static const uint8_t image_data_FontT48_0x0032_mod[386] = { 1, 1, 0, 11, 60, 1, 11, 1, 0, 26, 35, 1, 11, 1, 0, 26, 255, 1, 219, 1, 60, 1, 0, 24, 11, 1, 235, 1, 219, 1, 98, 1, 0, 25, 255, 3, 141, 1, 11, 1, 0, 21, 11, 1, 219, 1, 255, 3, 141, 1, 0, 24, 255, 4, 219, 1, 60, 1, 0, 20, 168, 1, 255, 5, 60, 1, 0, 23, 255, 6, 141, 1, 11, 1, 0, 18, 12, 1, 128, 1, 255, 5, 0, 23, 255, 7, 219, 1, 60, 1, 0, 19, 128, 1, 255, 4, 35, 1, 0, 22, 255, 9, 141, 1, 11, 1, 0, 18, 245, 1, 255, 3, 235, 1, 0, 22, 255, 10, 219, 1, 60, 1, 0, 17, 56, 1, 255, 4, 0, 22, 255, 4, 128, 1, 245, 1, 255, 6, 141, 1, 11, 1, 0, 16, 255, 4, 0, 22, 255, 4, 0, 1, 56, 1, 203, 1, 255, 6, 219, 1, 60, 1, 0, 15, 255, 4, 0, 22, 255, 4, 0, 2, 12, 1, 128, 1, 245, 1, 255, 6, 141, 1, 11, 1, 0, 13, 255, 4, 0, 22, 255, 4, 0, 4, 56, 1, 175, 1, 255, 6, 219, 1, 60, 1, 0, 12, 255, 4, 0, 22, 255, 4, 0, 6, 89, 1, 239, 1, 255, 6, 141, 1, 35, 1, 0, 9, 141, 1, 255, 4, 0, 22, 255, 4, 0, 7, 25, 1, 175, 1, 255, 6, 235, 1, 141, 1, 35, 1, 5, 1, 0, 5, 60, 1, 255, 4, 89, 1, 0, 22, 255, 4, 0, 9, 89, 1, 239, 1, 255, 6, 235, 1, 176, 1, 141, 1, 98, 1, 60, 1, 98, 1, 141, 1, 255, 5, 0, 23, 255, 4, 0, 10, 25, 1, 175, 1, 245, 1, 255, 15, 175, 1, 0, 23, 255, 4, 0, 12, 56, 1, 203, 1, 255, 13, 245, 1, 0, 24, 255, 4, 0, 13, 12, 1, 89, 1, 203, 1, 255, 10, 239, 1, 56, 1, 0, 24, 255, 4, 0, 15, 12, 1, 89, 1, 203, 1, 245, 1, 255, 5, 245, 1, 175, 1, 25, 1, 0, 25, 255, 4, 0, 17, 12, 1, 56, 1, 89, 1, 128, 3, 89, 1, 56, 1, 0, 27, 255, 4, 0, 52, 128, 4, 0, 41, 1, 2 }; +static const uint8_t image_data_FontT48_0x0033_mod[378] = { 1, 3, 0, 13, 190, 1, 235, 1, 141, 1, 11, 1, 0, 24, 60, 1, 35, 1, 0, 25, 60, 1, 255, 3, 219, 1, 91, 1, 0, 21, 5, 1, 98, 1, 255, 1, 235, 1, 11, 1, 0, 24, 255, 4, 245, 1, 56, 1, 0, 21, 160, 1, 255, 3, 219, 1, 0, 23, 5, 1, 255, 4, 56, 1, 0, 22, 25, 1, 255, 4, 11, 1, 0, 22, 176, 1, 255, 3, 203, 1, 0, 24, 175, 1, 255, 3, 219, 1, 0, 22, 255, 4, 12, 1, 0, 25, 255, 4, 0, 22, 255, 4, 0, 12, 60, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 11, 5, 1, 255, 4, 5, 1, 0, 9, 255, 4, 0, 22, 255, 4, 60, 1, 0, 10, 176, 1, 255, 4, 176, 1, 0, 8, 141, 1, 255, 4, 0, 22, 203, 1, 255, 4, 0, 9, 35, 1, 255, 6, 60, 1, 0, 6, 60, 1, 255, 4, 128, 1, 0, 22, 12, 1, 255, 4, 141, 1, 5, 1, 0, 6, 35, 1, 235, 1, 255, 3, 128, 1, 255, 3, 141, 1, 60, 1, 35, 2, 60, 1, 141, 1, 255, 5, 0, 24, 255, 5, 176, 1, 60, 1, 35, 1, 11, 2, 35, 1, 98, 1, 235, 1, 255, 4, 0, 1, 255, 5, 235, 2, 255, 6, 203, 1, 0, 24, 89, 1, 255, 6, 235, 1, 219, 2, 235, 1, 255, 5, 175, 1, 0, 1, 128, 1, 255, 12, 12, 1, 0, 25, 203, 1, 255, 13, 239, 1, 0, 3, 128, 1, 255, 10, 89, 1, 0, 26, 12, 1, 203, 1, 255, 11, 239, 1, 25, 1, 0, 4, 89, 1, 239, 1, 255, 6, 239, 1, 89, 1, 0, 28, 12, 1, 175, 1, 245, 1, 255, 7, 245, 1, 175, 1, 25, 1, 0, 6, 25, 1, 128, 1, 175, 1, 203, 2, 175, 1, 89, 1, 25, 1, 0, 31, 56, 1, 128, 1, 175, 1, 203, 1, 239, 1, 203, 2, 128, 1, 56, 1, 0, 11, 12, 2, 0, 18, 1, 3 }; +static const uint8_t image_data_FontT48_0x0034_mod[254] = { 0, 20, 60, 3, 0, 53, 255, 3, 141, 1, 5, 1, 0, 51, 255, 4, 176, 1, 11, 1, 0, 50, 255, 5, 219, 1, 35, 1, 0, 49, 255, 6, 235, 1, 98, 1, 0, 48, 255, 8, 141, 1, 5, 1, 0, 46, 255, 4, 175, 1, 255, 4, 176, 1, 11, 1, 0, 45, 255, 4, 0, 1, 128, 1, 245, 1, 255, 3, 219, 1, 35, 1, 0, 44, 255, 4, 0, 2, 56, 1, 239, 1, 255, 3, 235, 1, 60, 1, 0, 43, 255, 4, 0, 3, 25, 1, 203, 1, 255, 4, 98, 1, 0, 42, 255, 4, 0, 4, 12, 1, 175, 1, 255, 4, 141, 1, 5, 1, 0, 40, 255, 4, 0, 6, 128, 1, 255, 4, 176, 1, 11, 1, 0, 39, 255, 4, 0, 7, 89, 1, 245, 1, 255, 3, 219, 1, 60, 1, 0, 38, 255, 4, 0, 8, 56, 1, 239, 1, 255, 4, 98, 1, 0, 37, 255, 4, 0, 9, 25, 1, 203, 1, 255, 4, 141, 1, 5, 1, 0, 26, 11, 9, 255, 4, 11, 10, 23, 1, 188, 1, 255, 4, 176, 1, 11, 1, 0, 25, 219, 9, 255, 4, 219, 12, 255, 5, 219, 1, 35, 1, 0, 24, 255, 31, 235, 1, 60, 1, 0, 23, 255, 33, 98, 1, 0, 22, 255, 34, 0, 22, 128, 9, 255, 4, 128, 21, 0, 31, 255, 4, 0, 52, 255, 4, 0, 52, 239, 4, 0, 52, 25, 4, 0, 32 }; +static const uint8_t image_data_FontT48_0x0035_mod[334] = { 1, 3, 0, 13, 98, 1, 176, 1, 60, 1, 5, 1, 0, 11, 35, 17, 0, 23, 11, 1, 255, 3, 176, 1, 60, 1, 0, 9, 60, 1, 235, 17, 0, 23, 219, 1, 255, 4, 89, 1, 0, 9, 203, 1, 255, 17, 0, 23, 255, 4, 175, 1, 0, 10, 12, 1, 239, 1, 255, 16, 0, 22, 141, 1, 255, 4, 0, 12, 25, 1, 255, 16, 0, 22, 255, 4, 128, 1, 0, 13, 128, 1, 255, 3, 89, 8, 255, 4, 0, 22, 255, 4, 0, 15, 255, 3, 60, 1, 0, 7, 255, 4, 0, 22, 255, 4, 0, 15, 255, 4, 0, 7, 255, 4, 0, 22, 255, 4, 0, 15, 255, 4, 0, 7, 255, 4, 0, 22, 255, 4, 0, 15, 255, 4, 0, 7, 255, 4, 0, 22, 255, 4, 35, 1, 0, 13, 11, 1, 255, 4, 0, 7, 255, 4, 0, 22, 245, 1, 255, 3, 235, 1, 0, 13, 219, 1, 255, 4, 0, 7, 255, 4, 0, 22, 56, 1, 255, 4, 98, 1, 0, 11, 98, 1, 255, 5, 0, 7, 255, 4, 0, 23, 255, 5, 141, 1, 35, 1, 5, 1, 0, 5, 5, 1, 35, 1, 141, 1, 255, 5, 89, 1, 0, 7, 255, 4, 0, 23, 128, 1, 255, 5, 235, 1, 176, 1, 141, 1, 98, 3, 141, 1, 176, 1, 235, 1, 255, 6, 0, 8, 255, 4, 0, 24, 239, 1, 255, 18, 128, 1, 0, 8, 255, 4, 0, 24, 25, 1, 203, 1, 255, 16, 175, 1, 0, 9, 255, 4, 0, 25, 12, 1, 175, 1, 245, 1, 255, 12, 245, 1, 128, 1, 0, 10, 203, 4, 0, 27, 56, 1, 128, 1, 203, 1, 239, 1, 245, 1, 255, 5, 245, 1, 239, 1, 175, 1, 56, 1, 0, 11, 12, 4, 0, 29, 12, 1, 25, 1, 56, 1, 89, 2, 128, 1, 89, 2, 56, 1, 25, 1, 0, 28, 1, 2 }; +static const uint8_t image_data_FontT48_0x0036_mod[446] = { 1, 1, 0, 21, 5, 2, 11, 4, 5, 1, 0, 45, 5, 1, 35, 1, 98, 1, 141, 1, 176, 2, 219, 4, 176, 1, 141, 1, 98, 1, 35, 1, 5, 1, 0, 39, 5, 1, 60, 1, 176, 1, 235, 1, 255, 11, 235, 1, 176, 1, 98, 1, 11, 1, 0, 36, 35, 1, 176, 1, 255, 17, 219, 1, 98, 1, 11, 1, 0, 33, 35, 1, 235, 1, 255, 20, 219, 1, 60, 1, 0, 31, 5, 1, 235, 1, 255, 5, 245, 1, 239, 1, 203, 1, 239, 2, 255, 13, 141, 1, 11, 1, 0, 29, 176, 1, 255, 4, 203, 1, 89, 1, 56, 1, 25, 1, 12, 1, 25, 2, 89, 1, 175, 1, 255, 4, 210, 1, 245, 1, 255, 6, 219, 1, 35, 1, 0, 28, 255, 4, 175, 1, 12, 1, 0, 8, 128, 1, 255, 3, 190, 1, 56, 1, 175, 1, 255, 6, 235, 1, 60, 1, 0, 26, 141, 1, 255, 3, 245, 1, 0, 11, 239, 1, 255, 3, 11, 1, 0, 1, 89, 1, 239, 1, 255, 6, 60, 1, 0, 25, 255, 4, 56, 1, 0, 11, 25, 1, 255, 3, 219, 1, 0, 2, 25, 1, 203, 1, 255, 6, 35, 1, 0, 24, 255, 4, 0, 13, 255, 4, 0, 3, 12, 1, 175, 1, 255, 5, 235, 1, 5, 1, 0, 23, 255, 4, 0, 13, 255, 4, 0, 5, 128, 1, 255, 5, 176, 1, 0, 23, 255, 4, 0, 13, 255, 4, 0, 6, 128, 1, 255, 5, 5, 1, 0, 22, 255, 4, 0, 12, 5, 1, 255, 4, 0, 7, 128, 1, 255, 4, 176, 1, 0, 22, 255, 4, 141, 1, 0, 11, 176, 1, 255, 4, 0, 8, 175, 1, 255, 3, 239, 1, 0, 22, 128, 1, 255, 4, 60, 1, 0, 9, 60, 1, 255, 4, 175, 1, 0, 9, 239, 1, 255, 1, 203, 1, 25, 1, 0, 23, 255, 5, 98, 1, 11, 1, 5, 1, 0, 3, 5, 1, 35, 1, 141, 1, 255, 5, 0, 10, 86, 1, 128, 1, 12, 1, 0, 24, 128, 1, 255, 5, 219, 1, 176, 1, 141, 1, 98, 1, 141, 1, 176, 1, 235, 1, 255, 5, 203, 1, 0, 10, 12, 1, 0, 27, 203, 1, 255, 15, 245, 1, 12, 1, 0, 38, 12, 1, 203, 1, 255, 13, 239, 1, 56, 1, 0, 40, 12, 1, 128, 1, 239, 1, 255, 9, 245, 1, 175, 1, 25, 1, 0, 43, 25, 1, 128, 1, 203, 1, 239, 2, 245, 2, 239, 1, 203, 1, 128, 1, 56, 1, 0, 29, 1, 2 }; +static const uint8_t image_data_FontT48_0x0037_mod[336] = { 1, 1, 0, 41, 11, 4, 0, 52, 219, 4, 0, 52, 255, 4, 0, 22, 11, 1, 0, 29, 255, 4, 0, 22, 219, 1, 141, 1, 60, 1, 11, 1, 0, 26, 255, 4, 0, 22, 255, 3, 219, 1, 141, 1, 35, 1, 5, 1, 0, 23, 255, 4, 0, 22, 255, 5, 235, 1, 176, 1, 98, 1, 11, 1, 0, 21, 255, 4, 0, 22, 255, 8, 219, 1, 141, 1, 35, 1, 0, 19, 255, 4, 0, 22, 245, 1, 255, 9, 235, 1, 141, 1, 60, 1, 5, 1, 0, 16, 255, 4, 0, 22, 56, 1, 128, 1, 203, 1, 245, 1, 255, 9, 176, 1, 98, 1, 11, 1, 0, 14, 255, 4, 0, 24, 12, 1, 56, 1, 128, 1, 203, 1, 255, 9, 219, 1, 98, 1, 11, 1, 0, 12, 255, 4, 0, 27, 12, 1, 89, 1, 175, 1, 239, 1, 255, 8, 219, 1, 141, 1, 35, 1, 0, 10, 255, 4, 0, 30, 25, 1, 128, 1, 203, 1, 255, 8, 235, 1, 141, 1, 35, 1, 0, 8, 255, 4, 0, 32, 12, 1, 89, 1, 175, 1, 245, 1, 255, 7, 235, 1, 141, 1, 35, 1, 0, 6, 255, 4, 0, 35, 56, 1, 128, 1, 239, 1, 255, 7, 235, 1, 141, 1, 60, 1, 5, 1, 0, 3, 255, 4, 0, 37, 25, 1, 128, 1, 203, 1, 255, 8, 176, 1, 60, 1, 0, 2, 255, 4, 0, 39, 12, 1, 89, 1, 203, 1, 255, 8, 141, 1, 35, 1, 255, 4, 0, 41, 12, 1, 89, 1, 175, 1, 245, 1, 255, 6, 235, 1, 255, 4, 0, 44, 56, 1, 175, 1, 245, 1, 255, 9, 0, 46, 56, 1, 175, 1, 245, 1, 255, 7, 0, 48, 56, 1, 175, 1, 245, 1, 255, 5, 0, 50, 56, 1, 175, 1, 245, 1, 255, 3, 0, 52, 56, 1, 203, 1, 245, 2, 0, 53, 12, 1, 56, 2, 0, 11 }; +static const uint8_t image_data_FontT48_0x0038_mod[486] = { 1, 3, 0, 14, 60, 1, 176, 1, 255, 8, 219, 1, 98, 1, 5, 1, 0, 7, 35, 1, 98, 1, 141, 2, 98, 1, 60, 1, 11, 1, 0, 28, 98, 1, 255, 12, 176, 1, 11, 1, 0, 4, 11, 1, 141, 1, 235, 1, 255, 5, 219, 1, 60, 1, 0, 26, 35, 1, 255, 14, 219, 1, 5, 1, 0, 2, 35, 1, 219, 1, 255, 9, 98, 1, 0, 25, 235, 1, 255, 5, 245, 1, 203, 3, 239, 1, 255, 5, 176, 1, 0, 1, 11, 1, 235, 1, 255, 11, 35, 1, 0, 24, 255, 5, 175, 1, 56, 1, 12, 3, 25, 1, 89, 1, 203, 1, 255, 4, 60, 1, 219, 1, 255, 5, 239, 2, 245, 1, 255, 4, 235, 1, 0, 23, 141, 1, 255, 4, 128, 1, 0, 7, 12, 1, 175, 1, 255, 8, 239, 1, 89, 1, 25, 2, 56, 1, 175, 1, 255, 4, 11, 1, 0, 22, 255, 4, 239, 1, 0, 10, 203, 1, 255, 6, 245, 1, 25, 1, 0, 5, 239, 1, 255, 3, 219, 1, 0, 22, 255, 4, 25, 1, 0, 10, 12, 1, 255, 6, 56, 1, 0, 6, 25, 1, 255, 4, 0, 22, 255, 4, 0, 12, 89, 1, 255, 4, 128, 1, 0, 8, 255, 4, 0, 22, 255, 4, 0, 12, 98, 1, 255, 4, 0, 9, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 89, 1, 0, 9, 255, 4, 0, 22, 255, 4, 11, 1, 0, 10, 141, 1, 255, 4, 141, 1, 0, 8, 11, 1, 255, 4, 0, 22, 255, 4, 219, 1, 0, 9, 35, 1, 255, 6, 141, 1, 11, 1, 0, 6, 219, 1, 255, 4, 0, 22, 128, 1, 255, 4, 60, 1, 0, 7, 35, 1, 235, 1, 255, 3, 245, 1, 255, 3, 219, 1, 98, 1, 35, 1, 5, 2, 35, 1, 141, 1, 255, 4, 89, 1, 0, 23, 255, 5, 98, 1, 11, 1, 0, 3, 5, 1, 60, 1, 235, 1, 255, 4, 56, 1, 255, 5, 235, 1, 176, 2, 235, 1, 255, 5, 0, 24, 203, 1, 255, 5, 219, 1, 141, 1, 98, 1, 141, 1, 176, 1, 255, 5, 89, 1, 0, 1, 128, 1, 255, 12, 128, 1, 0, 24, 12, 1, 245, 1, 255, 13, 175, 1, 0, 3, 128, 1, 245, 1, 255, 9, 203, 1, 0, 26, 56, 1, 245, 1, 255, 11, 175, 1, 0, 5, 56, 1, 203, 1, 255, 6, 245, 1, 128, 1, 12, 1, 0, 27, 56, 1, 203, 1, 255, 8, 245, 1, 128, 1, 0, 7, 12, 1, 89, 1, 175, 1, 203, 2, 175, 1, 128, 1, 56, 1, 0, 30, 12, 1, 89, 1, 175, 1, 239, 2, 245, 1, 239, 1, 203, 1, 175, 1, 56, 1, 0, 11, 12, 2, 0, 18, 1, 2 }; +static const uint8_t image_data_FontT48_0x0039_mod[446] = { 1, 1, 0, 30, 5, 1, 11, 1, 35, 1, 60, 2, 35, 2, 11, 1, 0, 46, 5, 1, 60, 1, 176, 1, 219, 1, 235, 1, 255, 2, 235, 2, 219, 1, 141, 1, 35, 1, 0, 43, 35, 1, 176, 1, 255, 10, 235, 1, 141, 1, 11, 1, 0, 40, 60, 1, 235, 1, 255, 13, 219, 1, 11, 1, 0, 38, 11, 1, 255, 16, 219, 1, 5, 1, 0, 25, 11, 1, 0, 11, 219, 1, 255, 5, 239, 1, 175, 1, 128, 1, 89, 1, 128, 1, 175, 1, 203, 1, 255, 5, 176, 1, 0, 24, 11, 1, 219, 1, 35, 1, 0, 9, 5, 1, 255, 4, 245, 1, 128, 1, 25, 1, 0, 5, 12, 1, 89, 1, 239, 1, 255, 4, 0, 23, 35, 1, 219, 1, 255, 1, 235, 1, 5, 1, 0, 8, 176, 1, 255, 4, 56, 1, 0, 9, 25, 1, 255, 4, 141, 1, 0, 22, 235, 1, 255, 3, 176, 1, 0, 8, 255, 4, 175, 1, 0, 11, 128, 1, 255, 4, 0, 22, 175, 1, 255, 4, 141, 1, 0, 7, 255, 4, 0, 13, 255, 4, 0, 23, 255, 5, 141, 1, 5, 1, 0, 5, 255, 4, 0, 13, 255, 4, 0, 23, 175, 1, 255, 5, 176, 1, 5, 1, 0, 4, 255, 4, 0, 13, 255, 4, 0, 24, 239, 1, 255, 5, 176, 1, 11, 1, 0, 3, 255, 4, 0, 13, 255, 4, 0, 24, 25, 1, 245, 1, 255, 5, 219, 1, 35, 1, 0, 2, 203, 1, 255, 3, 35, 1, 0, 11, 60, 1, 255, 4, 0, 25, 56, 1, 239, 1, 255, 5, 235, 1, 98, 1, 11, 1, 12, 1, 255, 3, 235, 1, 0, 10, 5, 1, 255, 4, 89, 1, 0, 26, 25, 1, 239, 1, 255, 6, 219, 1, 98, 1, 216, 1, 255, 3, 141, 1, 11, 1, 0, 7, 35, 1, 176, 1, 255, 4, 0, 28, 25, 1, 175, 1, 255, 7, 235, 1, 255, 4, 219, 1, 98, 1, 60, 1, 35, 2, 60, 2, 141, 1, 235, 1, 255, 4, 175, 1, 0, 30, 128, 1, 245, 1, 255, 13, 235, 2, 255, 7, 239, 1, 0, 32, 56, 1, 175, 1, 255, 20, 203, 1, 25, 1, 0, 34, 89, 1, 203, 1, 245, 1, 255, 15, 245, 1, 128, 1, 12, 1, 0, 36, 12, 1, 56, 1, 175, 1, 239, 1, 245, 1, 255, 9, 245, 1, 203, 1, 128, 1, 56, 1, 0, 41, 25, 1, 56, 1, 128, 1, 175, 6, 128, 1, 89, 1, 56, 1, 12, 1, 0, 18, 1, 2 }; +static const uint8_t image_data_FontT48_0x003a_mod[142] = { 1, 4, 0, 13, 5, 1, 11, 1, 5, 1, 0, 15, 5, 1, 11, 1, 5, 1, 0, 34, 60, 1, 176, 1, 219, 1, 176, 1, 60, 1, 0, 13, 60, 1, 176, 1, 219, 1, 176, 1, 60, 1, 0, 32, 60, 1, 255, 5, 60, 1, 0, 11, 60, 1, 255, 5, 60, 1, 0, 31, 255, 7, 0, 11, 255, 7, 0, 31, 255, 7, 0, 11, 255, 7, 0, 31, 255, 7, 0, 11, 255, 7, 0, 31, 89, 1, 255, 5, 89, 1, 0, 11, 89, 1, 255, 5, 89, 1, 0, 32, 89, 1, 203, 1, 239, 1, 203, 1, 128, 1, 0, 13, 89, 1, 203, 1, 239, 1, 203, 1, 128, 1, 0, 34, 12, 1, 25, 1, 12, 1, 0, 15, 12, 1, 25, 1, 12, 1, 0, 22, 1, 5 }; +static const uint8_t image_data_FontT48_0x003b_mod[200] = { 1, 4, 0, 2, 5, 1, 141, 1, 11, 1, 0, 26, 11, 3, 0, 24, 160, 1, 255, 1, 219, 1, 11, 1, 0, 7, 35, 1, 60, 2, 11, 1, 0, 13, 98, 1, 219, 3, 98, 1, 0, 23, 25, 1, 245, 1, 255, 1, 219, 1, 35, 1, 0, 5, 35, 1, 235, 1, 255, 2, 219, 1, 11, 1, 0, 11, 60, 1, 255, 5, 60, 1, 0, 23, 56, 1, 255, 2, 235, 1, 98, 1, 11, 1, 5, 2, 35, 1, 235, 1, 255, 4, 219, 1, 0, 11, 255, 7, 0, 24, 89, 1, 245, 1, 255, 2, 219, 1, 176, 2, 235, 1, 255, 6, 0, 11, 255, 7, 0, 25, 56, 1, 239, 1, 255, 11, 0, 11, 255, 7, 0, 26, 25, 1, 175, 1, 245, 1, 255, 8, 128, 1, 0, 11, 89, 1, 255, 5, 89, 1, 0, 28, 56, 1, 128, 1, 203, 1, 239, 1, 245, 3, 239, 1, 128, 1, 0, 13, 89, 1, 203, 1, 239, 1, 203, 1, 89, 1, 0, 31, 12, 1, 25, 1, 56, 3, 25, 1, 0, 15, 12, 1, 25, 1, 12, 1, 0, 22, 1, 5 }; +static const uint8_t image_data_FontT48_0x003c_mod[214] = { 1, 3, 0, 24, 98, 3, 0, 52, 98, 1, 255, 3, 98, 1, 0, 51, 255, 5, 0, 50, 60, 1, 255, 5, 60, 1, 0, 49, 255, 7, 0, 48, 35, 1, 255, 2, 128, 1, 89, 1, 255, 3, 35, 1, 0, 47, 235, 1, 255, 2, 0, 2, 255, 3, 235, 1, 0, 46, 11, 1, 255, 2, 203, 1, 0, 2, 89, 1, 255, 3, 11, 1, 0, 45, 219, 1, 255, 2, 12, 1, 0, 3, 245, 1, 255, 2, 219, 1, 0, 44, 5, 1, 255, 2, 239, 1, 0, 4, 56, 1, 255, 3, 5, 1, 0, 43, 176, 1, 255, 2, 25, 1, 0, 5, 239, 1, 255, 2, 176, 1, 0, 43, 255, 2, 245, 1, 0, 6, 25, 1, 255, 3, 0, 42, 141, 1, 255, 2, 56, 1, 0, 7, 239, 1, 255, 2, 141, 1, 0, 41, 255, 3, 0, 8, 25, 1, 255, 3, 0, 40, 98, 1, 255, 2, 89, 1, 0, 9, 203, 1, 255, 2, 98, 1, 0, 39, 255, 3, 0, 10, 12, 1, 255, 3, 0, 38, 60, 1, 255, 2, 175, 1, 0, 11, 203, 1, 255, 2, 60, 1, 0, 37, 175, 3, 0, 12, 12, 1, 175, 3, 0, 21, 1, 4 }; +static const uint8_t image_data_FontT48_0x003d_mod[174] = { 1, 2, 0, 20, 35, 3, 0, 5, 35, 3, 0, 45, 235, 3, 0, 5, 235, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 255, 3, 0, 5, 255, 3, 0, 45, 89, 3, 0, 5, 89, 3, 0, 25, 1, 2 }; +static const uint8_t image_data_FontT48_0x003e_mod[216] = { 1, 3, 0, 16, 98, 3, 0, 13, 98, 3, 0, 37, 128, 1, 255, 2, 60, 1, 0, 11, 98, 1, 255, 2, 128, 1, 0, 38, 255, 3, 0, 11, 255, 3, 0, 39, 175, 1, 255, 2, 35, 1, 0, 9, 141, 1, 255, 2, 175, 1, 0, 40, 255, 2, 235, 1, 0, 8, 5, 1, 255, 3, 0, 41, 203, 1, 255, 2, 11, 1, 0, 7, 176, 1, 255, 2, 203, 1, 0, 41, 12, 1, 255, 2, 219, 1, 0, 6, 5, 1, 255, 3, 12, 1, 0, 42, 239, 1, 255, 2, 5, 1, 0, 5, 176, 1, 255, 2, 239, 1, 0, 43, 25, 1, 255, 2, 176, 1, 0, 4, 11, 1, 255, 3, 25, 1, 0, 44, 245, 1, 255, 2, 0, 4, 219, 1, 255, 2, 245, 1, 0, 45, 56, 1, 255, 2, 98, 1, 0, 2, 11, 1, 255, 3, 56, 1, 0, 46, 255, 3, 0, 2, 219, 1, 255, 3, 0, 47, 89, 1, 255, 2, 60, 1, 35, 1, 255, 3, 89, 1, 0, 48, 255, 3, 235, 1, 255, 3, 0, 49, 128, 1, 255, 5, 128, 1, 0, 50, 255, 5, 0, 51, 175, 1, 255, 3, 175, 1, 0, 52, 175, 3, 0, 29, 1, 4 }; +static const uint8_t image_data_FontT48_0x003f_mod[312] = { 1, 1, 0, 42, 35, 1, 141, 1, 5, 1, 0, 51, 29, 1, 141, 1, 235, 1, 255, 1, 176, 1, 0, 25, 5, 1, 0, 25, 43, 1, 255, 4, 0, 23, 35, 1, 141, 1, 176, 1, 141, 1, 35, 1, 0, 6, 11, 3, 0, 15, 175, 1, 255, 3, 141, 1, 0, 21, 11, 1, 235, 1, 255, 3, 235, 1, 35, 1, 0, 3, 60, 1, 141, 1, 219, 3, 141, 1, 60, 1, 11, 1, 0, 13, 255, 4, 0, 21, 219, 1, 255, 5, 235, 1, 0, 3, 255, 7, 219, 1, 60, 1, 0, 12, 255, 4, 0, 21, 255, 7, 0, 3, 255, 9, 141, 1, 5, 1, 0, 10, 255, 4, 0, 21, 255, 7, 0, 3, 203, 1, 175, 1, 128, 1, 175, 1, 203, 1, 245, 1, 255, 4, 176, 1, 5, 1, 0, 9, 255, 4, 0, 21, 128, 1, 255, 5, 175, 1, 0, 3, 12, 1, 0, 3, 12, 1, 56, 1, 175, 1, 255, 4, 176, 1, 11, 1, 0, 7, 11, 1, 255, 4, 0, 22, 175, 1, 245, 1, 255, 1, 245, 1, 175, 1, 0, 11, 89, 1, 245, 1, 255, 3, 219, 1, 60, 1, 0, 6, 219, 1, 255, 4, 0, 23, 56, 1, 89, 1, 56, 1, 0, 13, 56, 1, 245, 1, 255, 4, 141, 1, 35, 1, 5, 2, 35, 1, 141, 1, 255, 4, 128, 1, 0, 40, 56, 1, 245, 1, 255, 4, 235, 1, 176, 2, 235, 1, 255, 5, 0, 42, 56, 1, 239, 1, 255, 11, 128, 1, 0, 43, 25, 1, 203, 1, 255, 9, 175, 1, 0, 45, 12, 1, 128, 1, 239, 1, 245, 1, 255, 4, 239, 1, 128, 1, 0, 48, 25, 1, 56, 1, 89, 1, 128, 2, 89, 1, 25, 1, 0, 14, 1, 1 }; +static const uint8_t image_data_FontT48_0x0040_mod[774] = { 1, 2, 0, 18, 5, 1, 35, 1, 60, 1, 98, 2, 141, 3, 98, 1, 60, 1, 35, 1, 11, 1, 0, 42, 11, 1, 98, 1, 176, 1, 235, 1, 255, 8, 235, 1, 219, 1, 141, 1, 35, 1, 5, 1, 0, 37, 5, 1, 98, 1, 219, 1, 255, 14, 235, 1, 176, 1, 35, 1, 0, 35, 35, 1, 176, 1, 255, 5, 245, 1, 203, 2, 175, 3, 203, 1, 239, 1, 245, 1, 255, 4, 235, 1, 98, 1, 5, 1, 0, 32, 35, 1, 235, 1, 255, 3, 245, 1, 175, 1, 89, 1, 56, 1, 12, 2, 0, 3, 12, 1, 25, 1, 56, 1, 128, 1, 239, 1, 255, 4, 176, 1, 5, 1, 0, 30, 11, 1, 235, 1, 255, 3, 203, 1, 56, 1, 0, 12, 25, 1, 128, 1, 239, 1, 255, 3, 176, 1, 0, 30, 219, 1, 255, 3, 128, 1, 12, 1, 0, 15, 25, 1, 203, 1, 255, 3, 141, 1, 0, 28, 141, 1, 255, 3, 89, 1, 0, 18, 12, 1, 175, 1, 255, 3, 60, 1, 0, 26, 5, 1, 255, 3, 128, 1, 0, 21, 203, 1, 255, 3, 0, 26, 176, 1, 255, 2, 245, 1, 0, 6, 11, 1, 98, 1, 141, 2, 98, 1, 35, 1, 0, 10, 12, 1, 255, 3, 98, 1, 0, 25, 255, 3, 56, 1, 0, 5, 60, 1, 219, 1, 255, 4, 235, 1, 60, 1, 0, 5, 5, 1, 0, 4, 128, 1, 255, 3, 0, 24, 5, 1, 255, 3, 0, 5, 5, 1, 255, 8, 35, 1, 0, 3, 35, 1, 176, 1, 0, 5, 255, 3, 0, 24, 176, 1, 255, 2, 203, 1, 0, 5, 176, 1, 255, 3, 239, 2, 245, 1, 255, 2, 235, 1, 0, 3, 219, 1, 255, 1, 141, 1, 0, 4, 239, 1, 255, 2, 141, 1, 0, 23, 255, 3, 12, 1, 0, 5, 255, 3, 89, 1, 25, 2, 56, 1, 175, 1, 255, 2, 0, 3, 25, 1, 255, 2, 0, 4, 25, 1, 255, 3, 0, 23, 255, 3, 0, 6, 255, 2, 89, 1, 0, 5, 203, 1, 255, 1, 141, 1, 0, 3, 255, 2, 0, 5, 255, 3, 0, 23, 255, 3, 0, 6, 255, 2, 0, 6, 12, 1, 255, 2, 0, 3, 255, 2, 0, 5, 255, 3, 0, 23, 255, 3, 0, 6, 255, 2, 0, 7, 255, 2, 0, 3, 255, 2, 0, 5, 255, 3, 0, 23, 255, 3, 0, 6, 175, 1, 255, 1, 35, 1, 0, 6, 255, 2, 0, 2, 98, 1, 255, 2, 0, 5, 255, 3, 0, 23, 255, 3, 0, 7, 255, 1, 235, 1, 60, 6, 255, 2, 60, 1, 141, 1, 255, 2, 128, 1, 0, 5, 255, 3, 0, 23, 255, 3, 0, 7, 168, 1, 255, 12, 245, 1, 0, 6, 255, 3, 0, 23, 255, 3, 35, 1, 0, 6, 235, 1, 255, 11, 239, 1, 56, 1, 0, 5, 60, 1, 255, 3, 0, 23, 89, 1, 255, 2, 235, 1, 0, 5, 98, 1, 255, 2, 245, 7, 239, 1, 203, 1, 128, 1, 25, 1, 0, 6, 255, 3, 128, 1, 0, 24, 255, 3, 5, 1, 0, 4, 255, 3, 56, 7, 25, 1, 12, 1, 0, 7, 5, 1, 255, 3, 0, 25, 245, 1, 255, 2, 176, 1, 0, 4, 255, 2, 89, 1, 0, 16, 176, 1, 255, 3, 0, 25, 56, 1, 255, 3, 60, 1, 0, 3, 255, 2, 0, 16, 60, 1, 255, 3, 128, 1, 0, 26, 203, 1, 255, 3, 0, 3, 255, 2, 0, 15, 35, 1, 255, 4, 0, 27, 12, 1, 245, 1, 255, 2, 0, 3, 255, 2, 11, 1, 0, 13, 35, 1, 235, 1, 255, 3, 89, 1, 0, 28, 56, 1, 255, 1, 175, 1, 0, 3, 203, 1, 255, 1, 219, 1, 5, 1, 0, 10, 5, 1, 98, 1, 235, 1, 255, 3, 175, 1, 0, 30, 175, 1, 0, 4, 12, 1, 255, 2, 176, 1, 60, 1, 11, 1, 5, 1, 0, 4, 5, 1, 35, 1, 98, 1, 176, 1, 255, 4, 203, 1, 0, 37, 128, 1, 255, 3, 219, 1, 176, 1, 141, 4, 176, 1, 235, 1, 255, 5, 175, 1, 12, 1, 0, 38, 128, 1, 245, 1, 255, 12, 239, 1, 128, 1, 0, 41, 56, 1, 175, 1, 245, 1, 255, 7, 245, 1, 203, 1, 128, 1, 25, 1, 0, 44, 56, 1, 89, 1, 175, 4, 128, 1, 89, 1, 56, 1, 12, 1, 0, 24, 1, 2 }; +static const uint8_t image_data_FontT48_0x0041_mod[472] = { 0, 11, 141, 1, 60, 1, 5, 1, 0, 53, 255, 2, 176, 1, 98, 1, 11, 1, 0, 51, 255, 4, 219, 1, 141, 1, 35, 1, 5, 1, 0, 48, 255, 6, 235, 1, 176, 1, 60, 1, 11, 1, 0, 46, 255, 9, 219, 1, 141, 1, 35, 1, 5, 1, 0, 43, 128, 1, 203, 1, 245, 1, 255, 8, 235, 1, 176, 1, 60, 1, 11, 1, 0, 42, 12, 1, 56, 1, 175, 1, 239, 1, 255, 9, 219, 1, 98, 1, 35, 1, 0, 43, 25, 1, 89, 1, 175, 1, 255, 9, 235, 1, 141, 1, 60, 1, 5, 1, 0, 43, 255, 12, 176, 1, 98, 1, 11, 1, 0, 41, 255, 4, 128, 1, 203, 1, 245, 1, 255, 7, 219, 1, 141, 1, 60, 1, 5, 1, 0, 38, 255, 4, 0, 1, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 7, 176, 1, 98, 1, 11, 1, 0, 36, 255, 4, 0, 4, 12, 1, 56, 1, 175, 1, 239, 1, 255, 7, 219, 1, 141, 1, 35, 1, 5, 1, 0, 33, 255, 4, 0, 7, 25, 1, 89, 1, 175, 1, 239, 1, 255, 6, 235, 1, 176, 1, 60, 1, 11, 1, 0, 31, 255, 4, 0, 10, 25, 1, 89, 1, 175, 1, 245, 1, 255, 6, 219, 1, 98, 1, 35, 1, 0, 29, 255, 4, 0, 12, 5, 1, 92, 1, 255, 8, 235, 1, 0, 29, 255, 4, 0, 9, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 6, 245, 1, 203, 1, 128, 1, 0, 29, 255, 4, 0, 6, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 7, 239, 1, 175, 1, 56, 1, 12, 1, 0, 30, 255, 4, 0, 3, 11, 1, 60, 1, 141, 1, 176, 1, 235, 1, 255, 7, 245, 1, 175, 1, 89, 1, 25, 1, 0, 33, 255, 4, 11, 1, 60, 1, 141, 1, 219, 1, 255, 8, 245, 1, 203, 1, 128, 1, 56, 1, 0, 36, 255, 4, 219, 1, 255, 9, 239, 1, 175, 1, 56, 1, 12, 1, 0, 36, 11, 1, 60, 1, 255, 11, 239, 1, 175, 1, 89, 1, 25, 1, 0, 36, 11, 1, 60, 1, 141, 1, 219, 1, 255, 9, 245, 1, 203, 1, 128, 1, 25, 1, 0, 37, 60, 1, 141, 1, 219, 1, 255, 10, 239, 1, 128, 1, 56, 1, 12, 1, 0, 39, 255, 10, 239, 1, 175, 1, 89, 1, 25, 1, 0, 42, 255, 7, 245, 1, 203, 1, 128, 1, 25, 1, 0, 45, 255, 5, 239, 1, 128, 1, 56, 1, 12, 1, 0, 47, 255, 2, 239, 1, 175, 1, 89, 1, 25, 1, 0, 50, 203, 1, 89, 1, 25, 1, 0, 42 }; +static const uint8_t image_data_FontT48_0x0042_mod[378] = { 1, 3, 0, 11, 98, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 4, 245, 13, 255, 4, 245, 9, 255, 4, 0, 22, 255, 4, 56, 13, 255, 4, 56, 9, 255, 4, 0, 22, 255, 4, 0, 13, 255, 4, 0, 9, 255, 4, 0, 22, 255, 4, 0, 13, 255, 4, 0, 9, 255, 4, 0, 22, 255, 4, 0, 13, 255, 4, 0, 9, 255, 4, 0, 22, 255, 4, 0, 13, 255, 4, 0, 9, 255, 4, 0, 22, 255, 4, 0, 13, 255, 4, 0, 9, 255, 4, 0, 22, 255, 4, 0, 13, 255, 4, 0, 9, 255, 4, 0, 22, 255, 4, 11, 1, 0, 11, 5, 1, 255, 4, 141, 1, 0, 7, 5, 1, 255, 4, 0, 22, 255, 4, 219, 1, 0, 11, 176, 1, 255, 5, 5, 1, 0, 6, 176, 1, 255, 3, 203, 1, 0, 22, 128, 1, 255, 4, 5, 1, 0, 10, 255, 3, 89, 1, 255, 2, 176, 1, 35, 1, 0, 3, 5, 1, 98, 1, 255, 4, 12, 1, 0, 23, 255, 4, 176, 1, 5, 1, 0, 7, 5, 1, 141, 1, 255, 3, 0, 1, 255, 3, 235, 1, 141, 1, 98, 1, 141, 1, 176, 1, 255, 5, 0, 24, 239, 1, 255, 4, 176, 1, 60, 1, 11, 1, 5, 3, 11, 1, 35, 1, 176, 1, 255, 4, 0, 1, 175, 1, 255, 11, 128, 1, 0, 24, 25, 1, 255, 6, 219, 1, 176, 3, 219, 1, 235, 1, 255, 4, 89, 1, 0, 2, 239, 1, 255, 9, 203, 1, 0, 26, 175, 1, 255, 14, 239, 1, 0, 3, 25, 1, 203, 1, 255, 7, 203, 1, 12, 1, 0, 27, 175, 1, 255, 12, 239, 1, 25, 1, 0, 4, 12, 1, 128, 1, 239, 1, 245, 2, 239, 1, 203, 1, 89, 1, 12, 1, 0, 29, 128, 1, 245, 1, 255, 9, 203, 1, 25, 1, 0, 7, 25, 1, 56, 2, 25, 1, 12, 1, 0, 32, 56, 1, 175, 1, 203, 1, 239, 1, 245, 3, 239, 1, 175, 1, 89, 1, 12, 1, 0, 47, 12, 1, 25, 1, 56, 3, 25, 1, 0, 32, 1, 1 }; +static const uint8_t image_data_FontT48_0x0043_mod[380] = { 1, 1, 0, 24, 5, 1, 11, 6, 5, 1, 0, 44, 11, 1, 35, 1, 98, 1, 141, 1, 176, 1, 219, 6, 176, 1, 141, 1, 60, 1, 35, 1, 0, 39, 11, 1, 98, 1, 219, 1, 235, 1, 255, 12, 235, 1, 141, 1, 60, 1, 5, 1, 0, 34, 5, 1, 98, 1, 219, 1, 255, 18, 176, 1, 35, 1, 0, 32, 11, 1, 176, 1, 255, 21, 235, 1, 98, 1, 0, 30, 11, 1, 219, 1, 255, 8, 245, 1, 239, 1, 203, 3, 239, 2, 245, 1, 255, 8, 141, 1, 0, 28, 5, 1, 219, 1, 255, 6, 239, 1, 128, 1, 89, 1, 56, 1, 25, 1, 12, 3, 25, 2, 56, 1, 128, 1, 175, 1, 239, 1, 255, 6, 141, 1, 0, 27, 176, 1, 255, 5, 239, 1, 89, 1, 25, 1, 0, 12, 25, 1, 128, 1, 245, 1, 255, 5, 60, 1, 0, 25, 60, 1, 255, 5, 175, 1, 25, 1, 0, 16, 56, 1, 203, 1, 255, 5, 0, 25, 255, 5, 175, 1, 0, 19, 12, 1, 175, 1, 255, 4, 141, 1, 0, 24, 255, 4, 203, 1, 0, 22, 203, 1, 255, 4, 0, 23, 141, 1, 255, 4, 12, 1, 0, 22, 12, 1, 255, 4, 35, 1, 0, 22, 255, 4, 203, 1, 0, 24, 203, 1, 255, 3, 235, 1, 0, 22, 255, 4, 12, 1, 0, 24, 12, 1, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 203, 1, 255, 3, 141, 1, 0, 24, 5, 1, 255, 4, 0, 22, 12, 1, 255, 4, 0, 24, 176, 1, 255, 3, 203, 1, 0, 23, 255, 4, 141, 1, 0, 23, 255, 4, 12, 1, 0, 23, 175, 1, 255, 4, 60, 1, 0, 21, 98, 1, 255, 4, 0, 25, 255, 5, 36, 1, 0, 20, 89, 1, 175, 1, 245, 1, 255, 1, 203, 1, 0, 25, 89, 1, 255, 2, 239, 1, 89, 1, 0, 23, 56, 1, 128, 1, 12, 1, 0, 12, 1, 3 }; +static const uint8_t image_data_FontT48_0x0044_mod[322] = { 1, 3, 0, 11, 141, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 4, 245, 26, 255, 4, 0, 22, 255, 4, 56, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 5, 1, 0, 25, 255, 4, 0, 22, 89, 1, 255, 3, 176, 1, 0, 24, 98, 1, 255, 4, 0, 23, 255, 4, 5, 1, 0, 23, 255, 4, 89, 1, 0, 23, 255, 4, 176, 1, 0, 22, 60, 1, 255, 4, 0, 24, 128, 1, 255, 4, 98, 1, 0, 20, 11, 1, 255, 4, 245, 1, 0, 25, 255, 5, 141, 1, 11, 1, 0, 17, 11, 1, 219, 1, 255, 4, 56, 1, 0, 25, 128, 1, 255, 5, 219, 1, 60, 1, 11, 1, 0, 13, 5, 1, 60, 1, 219, 1, 255, 4, 203, 1, 0, 27, 203, 1, 255, 6, 219, 1, 141, 1, 60, 1, 35, 1, 11, 1, 5, 6, 11, 1, 35, 1, 98, 1, 176, 1, 255, 5, 245, 1, 12, 1, 0, 27, 12, 1, 203, 1, 255, 8, 235, 1, 219, 1, 176, 6, 219, 1, 235, 1, 255, 6, 245, 1, 56, 1, 0, 29, 12, 1, 175, 1, 255, 22, 245, 1, 56, 1, 0, 32, 128, 1, 239, 1, 255, 19, 203, 1, 56, 1, 0, 34, 25, 1, 128, 1, 203, 1, 245, 1, 255, 13, 245, 1, 203, 1, 89, 1, 12, 1, 0, 37, 12, 1, 56, 1, 128, 1, 175, 1, 203, 1, 239, 1, 245, 5, 239, 2, 203, 1, 128, 1, 56, 1, 12, 1, 0, 43, 12, 1, 25, 1, 56, 5, 25, 2, 12, 1, 0, 22, 1, 1 }; +static const uint8_t image_data_FontT48_0x0045_mod[210] = { 1, 3, 0, 11, 98, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 4, 89, 12, 255, 4, 89, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 255, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 12, 175, 4, 0, 10, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 245, 4, 0, 26, 245, 4, 0, 22, 56, 4, 0, 26, 56, 4, 0, 11, 1, 1 }; +static const uint8_t image_data_FontT48_0x0046_mod[154] = { 1, 3, 0, 11, 98, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 245, 16, 255, 4, 245, 10, 255, 4, 0, 22, 56, 16, 255, 4, 56, 10, 255, 4, 0, 38, 255, 4, 0, 10, 255, 4, 0, 38, 255, 4, 0, 10, 255, 4, 0, 38, 255, 4, 0, 10, 255, 4, 0, 38, 255, 4, 0, 10, 255, 4, 0, 38, 255, 4, 0, 10, 255, 4, 0, 38, 255, 4, 0, 10, 255, 4, 0, 38, 255, 4, 0, 10, 255, 4, 0, 38, 255, 4, 0, 10, 255, 4, 0, 38, 255, 4, 0, 10, 255, 4, 0, 38, 255, 4, 0, 10, 255, 4, 0, 38, 255, 4, 0, 10, 255, 4, 0, 38, 89, 4, 0, 10, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 175, 4, 0, 11, 1, 1 }; +static const uint8_t image_data_FontT48_0x0047_mod[434] = { 1, 1, 0, 23, 5, 1, 11, 2, 35, 4, 11, 1, 5, 1, 0, 44, 11, 1, 60, 1, 141, 1, 176, 1, 219, 2, 235, 4, 219, 1, 176, 1, 141, 1, 98, 1, 35, 1, 5, 1, 0, 38, 35, 1, 141, 1, 219, 1, 255, 13, 235, 1, 176, 1, 60, 1, 5, 1, 0, 34, 5, 1, 98, 1, 235, 1, 255, 18, 176, 1, 35, 1, 0, 32, 11, 1, 176, 1, 255, 21, 235, 1, 60, 1, 0, 30, 11, 1, 219, 1, 255, 7, 245, 1, 239, 1, 203, 5, 239, 1, 245, 1, 255, 8, 98, 1, 0, 28, 5, 1, 219, 1, 255, 6, 203, 1, 128, 1, 56, 1, 25, 1, 12, 5, 25, 1, 56, 1, 89, 1, 175, 1, 239, 1, 255, 6, 60, 1, 0, 27, 176, 1, 255, 5, 239, 1, 89, 1, 12, 1, 0, 12, 25, 1, 128, 1, 245, 1, 255, 5, 11, 1, 0, 25, 35, 1, 255, 5, 203, 1, 25, 1, 0, 16, 56, 1, 239, 1, 255, 4, 219, 1, 0, 25, 235, 1, 255, 4, 175, 1, 12, 1, 0, 18, 25, 1, 239, 1, 255, 4, 35, 1, 0, 24, 255, 4, 245, 1, 0, 21, 25, 1, 255, 4, 235, 1, 0, 23, 60, 1, 255, 4, 56, 1, 0, 22, 89, 1, 255, 4, 0, 23, 255, 5, 0, 24, 255, 4, 60, 1, 0, 22, 255, 4, 89, 1, 0, 24, 175, 1, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 10, 5, 4, 0, 12, 255, 4, 0, 22, 255, 4, 0, 10, 176, 4, 0, 12, 255, 4, 0, 22, 255, 4, 5, 1, 0, 9, 255, 4, 0, 11, 11, 1, 255, 4, 0, 22, 175, 1, 255, 3, 176, 1, 0, 9, 255, 4, 0, 11, 219, 1, 255, 4, 0, 23, 255, 4, 5, 1, 0, 8, 255, 4, 0, 10, 5, 1, 255, 4, 89, 1, 0, 23, 255, 4, 176, 1, 11, 8, 255, 4, 0, 10, 176, 1, 255, 4, 0, 24, 245, 1, 255, 4, 219, 8, 255, 4, 0, 9, 53, 1, 255, 4, 203, 1, 0, 24, 56, 1, 255, 16, 0, 9, 56, 1, 175, 1, 245, 1, 255, 2, 12, 1, 0, 25, 255, 16, 0, 11, 56, 1, 203, 1, 89, 1, 0, 26, 89, 1, 255, 15, 0, 12, 12, 1, 0, 28, 175, 15, 0, 27, 1, 3 }; +static const uint8_t image_data_FontT48_0x0048_mod[122] = { 1, 3, 0, 11, 98, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 245, 16, 255, 4, 245, 14, 0, 22, 56, 16, 255, 4, 56, 14, 0, 38, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 36, 11, 16, 255, 4, 11, 14, 0, 22, 219, 16, 255, 4, 219, 14, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 175, 34, 0, 11, 1, 3 }; +static const uint8_t image_data_FontT48_0x0049_mod[34] = { 1, 3, 0, 11, 5, 34, 0, 22, 176, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 203, 34, 0, 22, 12, 34, 0, 11, 1, 3 }; +static const uint8_t image_data_FontT48_0x004a_mod[162] = { 1, 1, 0, 14, 5, 1, 60, 1, 98, 1, 176, 1, 0, 51, 11, 1, 176, 1, 255, 3, 0, 50, 11, 1, 219, 1, 255, 4, 0, 50, 219, 1, 255, 5, 0, 49, 11, 1, 255, 4, 203, 1, 128, 1, 0, 49, 219, 1, 255, 3, 203, 1, 12, 1, 0, 50, 255, 4, 12, 1, 0, 51, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 5, 1, 0, 51, 245, 1, 255, 3, 176, 1, 0, 51, 56, 1, 255, 4, 60, 1, 5, 1, 0, 50, 255, 5, 176, 1, 141, 1, 98, 1, 60, 2, 35, 23, 0, 23, 128, 1, 255, 9, 235, 23, 0, 24, 175, 1, 255, 31, 0, 25, 128, 1, 239, 1, 255, 29, 0, 26, 25, 1, 128, 1, 203, 1, 239, 1, 245, 1, 255, 25, 0, 28, 12, 1, 25, 1, 56, 1, 89, 2, 128, 23, 0, 11, 1, 3 }; +static const uint8_t image_data_FontT48_0x004b_mod[354] = { 1, 3, 0, 11, 98, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 89, 9, 128, 1, 245, 1, 255, 5, 94, 1, 89, 17, 0, 32, 56, 1, 203, 1, 255, 4, 176, 1, 35, 1, 0, 49, 12, 1, 175, 1, 255, 4, 235, 1, 98, 1, 5, 1, 0, 49, 89, 1, 239, 1, 255, 4, 176, 1, 35, 1, 0, 49, 25, 1, 216, 1, 255, 4, 235, 1, 98, 1, 0, 47, 5, 1, 98, 1, 235, 1, 255, 6, 141, 1, 11, 1, 0, 44, 35, 1, 176, 1, 255, 9, 219, 1, 60, 1, 0, 41, 5, 1, 98, 1, 235, 1, 255, 6, 245, 1, 255, 5, 141, 1, 11, 1, 0, 38, 60, 1, 176, 1, 255, 7, 175, 1, 56, 1, 175, 1, 255, 5, 219, 1, 60, 1, 0, 35, 11, 1, 141, 1, 255, 7, 239, 1, 89, 1, 0, 3, 89, 1, 245, 1, 255, 5, 98, 1, 5, 1, 0, 32, 60, 1, 219, 1, 255, 6, 245, 1, 128, 1, 25, 1, 0, 5, 56, 1, 203, 1, 255, 5, 176, 1, 35, 1, 0, 29, 35, 1, 141, 1, 255, 7, 203, 1, 56, 1, 0, 8, 12, 1, 128, 1, 255, 5, 235, 1, 98, 1, 5, 1, 0, 25, 5, 1, 98, 1, 235, 1, 255, 6, 239, 1, 89, 1, 12, 1, 0, 11, 89, 1, 239, 1, 255, 5, 176, 1, 35, 1, 0, 23, 35, 1, 176, 1, 255, 6, 245, 1, 175, 1, 25, 1, 0, 14, 25, 1, 203, 1, 255, 5, 235, 1, 0, 22, 98, 1, 235, 1, 255, 6, 203, 1, 56, 1, 0, 17, 12, 1, 128, 1, 245, 1, 255, 4, 0, 22, 255, 6, 239, 1, 89, 1, 12, 1, 0, 20, 56, 1, 239, 1, 255, 3, 0, 22, 255, 4, 245, 1, 175, 1, 25, 1, 0, 23, 25, 1, 175, 1, 255, 2, 0, 22, 255, 3, 203, 1, 56, 1, 0, 27, 89, 1, 255, 1, 0, 11, 1, 2 }; +static const uint8_t image_data_FontT48_0x004c_mod[92] = { 1, 3, 0, 11, 98, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 4, 245, 30, 0, 22, 255, 4, 56, 30, 0, 22, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 89, 4, 0, 41 }; +static const uint8_t image_data_FontT48_0x004d_mod[758] = { 1, 1, 0, 11, 255, 1, 235, 1, 219, 1, 176, 1, 141, 1, 98, 1, 60, 1, 35, 1, 5, 1, 0, 47, 255, 7, 235, 1, 176, 1, 141, 1, 98, 1, 60, 1, 35, 1, 11, 1, 5, 1, 0, 41, 255, 12, 235, 1, 219, 1, 176, 1, 98, 1, 60, 1, 35, 1, 11, 1, 5, 1, 0, 36, 239, 1, 245, 1, 255, 15, 235, 1, 219, 1, 176, 1, 141, 1, 98, 1, 60, 1, 11, 1, 5, 1, 0, 31, 25, 1, 56, 1, 89, 1, 128, 1, 203, 1, 239, 1, 245, 1, 255, 16, 219, 1, 176, 1, 141, 1, 98, 1, 60, 1, 35, 1, 11, 1, 5, 1, 0, 29, 12, 1, 25, 1, 56, 1, 89, 1, 128, 1, 175, 1, 203, 1, 239, 1, 245, 1, 255, 15, 235, 1, 219, 1, 176, 1, 98, 1, 60, 1, 35, 1, 0, 32, 12, 1, 25, 1, 56, 1, 89, 1, 128, 1, 203, 1, 239, 1, 245, 1, 255, 15, 235, 1, 0, 37, 12, 1, 25, 1, 56, 1, 89, 1, 128, 1, 175, 1, 216, 1, 255, 11, 245, 1, 0, 40, 11, 1, 60, 1, 141, 1, 235, 1, 255, 8, 245, 1, 203, 1, 128, 1, 56, 1, 0, 37, 5, 1, 60, 1, 141, 1, 219, 1, 255, 8, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 36, 5, 1, 35, 1, 98, 1, 176, 1, 255, 8, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 36, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 7, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 36, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 7, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 36, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 7, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 37, 35, 1, 98, 1, 176, 1, 235, 1, 255, 7, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 39, 141, 1, 235, 1, 255, 7, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 42, 245, 1, 255, 8, 206, 1, 72, 1, 35, 1, 5, 1, 0, 43, 56, 1, 128, 1, 203, 1, 245, 1, 255, 7, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 42, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 7, 235, 1, 176, 1, 141, 1, 60, 1, 11, 1, 0, 42, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 8, 219, 1, 141, 1, 60, 1, 11, 1, 5, 1, 0, 41, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 8, 219, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 41, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 8, 235, 1, 176, 1, 98, 1, 60, 1, 11, 1, 0, 41, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 9, 219, 1, 141, 1, 60, 1, 11, 1, 5, 1, 0, 40, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 9, 219, 1, 176, 1, 98, 1, 0, 38, 5, 1, 11, 1, 35, 1, 60, 1, 111, 1, 206, 1, 255, 12, 0, 33, 5, 1, 11, 1, 35, 1, 60, 1, 98, 1, 176, 1, 219, 1, 235, 1, 255, 13, 245, 1, 203, 1, 0, 28, 5, 1, 11, 1, 60, 1, 98, 1, 141, 1, 176, 1, 219, 1, 235, 1, 255, 13, 245, 1, 239, 1, 175, 1, 128, 1, 89, 1, 56, 1, 12, 1, 0, 22, 5, 1, 11, 1, 35, 1, 60, 1, 98, 1, 141, 1, 176, 1, 219, 1, 255, 14, 245, 1, 239, 1, 203, 1, 128, 1, 89, 1, 56, 1, 25, 1, 0, 27, 176, 1, 219, 1, 235, 1, 255, 14, 245, 1, 239, 1, 203, 1, 128, 1, 89, 1, 56, 1, 25, 1, 12, 1, 0, 31, 255, 12, 245, 1, 239, 1, 203, 1, 175, 1, 89, 1, 56, 1, 25, 1, 12, 1, 0, 36, 255, 7, 245, 1, 239, 1, 203, 1, 175, 1, 89, 1, 56, 1, 25, 1, 12, 1, 0, 41, 255, 2, 245, 1, 239, 1, 203, 1, 175, 1, 128, 1, 56, 1, 25, 1, 12, 1, 0, 46, 175, 1, 128, 1, 56, 1, 25, 1, 12, 1, 0, 40, 1, 2 }; +static const uint8_t image_data_FontT48_0x004e_mod[252] = { 1, 3, 0, 11, 98, 34, 0, 22, 255, 34, 0, 22, 255, 33, 203, 1, 0, 22, 255, 32, 128, 1, 12, 1, 0, 22, 239, 24, 255, 6, 239, 1, 89, 1, 0, 24, 25, 23, 85, 1, 255, 5, 203, 1, 25, 1, 0, 46, 5, 1, 141, 1, 255, 5, 128, 1, 12, 1, 0, 46, 35, 1, 176, 1, 255, 4, 239, 1, 89, 1, 0, 47, 60, 1, 235, 1, 255, 4, 203, 1, 25, 1, 0, 46, 5, 1, 141, 1, 255, 5, 128, 1, 12, 1, 0, 46, 35, 1, 176, 1, 255, 4, 239, 1, 89, 1, 0, 47, 98, 1, 235, 1, 255, 4, 203, 1, 25, 1, 0, 46, 11, 1, 141, 1, 255, 5, 128, 1, 12, 1, 0, 46, 35, 1, 219, 1, 255, 4, 239, 1, 89, 1, 0, 47, 98, 1, 235, 1, 255, 4, 175, 1, 25, 1, 0, 46, 11, 1, 141, 1, 255, 4, 245, 1, 128, 1, 0, 47, 60, 1, 219, 1, 255, 4, 239, 1, 56, 1, 0, 46, 5, 1, 98, 1, 255, 5, 175, 1, 25, 1, 0, 46, 11, 1, 176, 1, 255, 4, 245, 1, 128, 1, 0, 47, 60, 1, 219, 1, 255, 5, 67, 1, 11, 22, 0, 24, 5, 1, 98, 1, 255, 7, 219, 23, 0, 23, 35, 1, 176, 1, 255, 31, 0, 22, 60, 1, 235, 1, 255, 32, 0, 22, 255, 34, 0, 22, 128, 34, 0, 11, 1, 3 }; +static const uint8_t image_data_FontT48_0x004f_mod[492] = { 1, 1, 0, 23, 5, 1, 11, 2, 35, 4, 11, 2, 5, 1, 0, 43, 11, 1, 60, 1, 98, 1, 176, 1, 219, 2, 235, 4, 219, 2, 176, 1, 141, 1, 60, 1, 11, 1, 0, 38, 35, 1, 141, 1, 219, 1, 255, 14, 219, 1, 141, 1, 35, 1, 0, 34, 11, 1, 141, 1, 235, 1, 255, 18, 235, 1, 141, 1, 11, 1, 0, 31, 60, 1, 219, 1, 255, 22, 219, 1, 35, 1, 0, 29, 60, 1, 255, 8, 245, 1, 239, 2, 203, 5, 239, 1, 245, 1, 255, 7, 235, 1, 60, 1, 0, 27, 60, 1, 255, 6, 245, 1, 203, 1, 128, 1, 56, 1, 25, 2, 12, 5, 25, 1, 56, 1, 89, 1, 175, 1, 239, 1, 255, 6, 35, 1, 0, 25, 5, 1, 255, 6, 175, 1, 56, 1, 12, 1, 0, 13, 25, 1, 89, 1, 239, 1, 255, 4, 235, 1, 0, 25, 176, 1, 255, 4, 239, 1, 89, 1, 0, 18, 25, 1, 175, 1, 255, 4, 141, 1, 0, 24, 255, 4, 239, 1, 25, 1, 0, 21, 203, 1, 255, 4, 0, 23, 60, 1, 255, 4, 25, 1, 0, 22, 12, 1, 255, 4, 35, 1, 0, 22, 255, 4, 203, 1, 0, 24, 128, 1, 255, 3, 235, 1, 0, 22, 255, 4, 12, 1, 0, 25, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 35, 1, 0, 24, 11, 1, 255, 4, 0, 22, 203, 1, 255, 3, 235, 1, 0, 24, 219, 1, 255, 3, 203, 1, 0, 22, 12, 1, 255, 4, 35, 1, 0, 22, 11, 1, 255, 4, 12, 1, 0, 23, 255, 4, 235, 1, 11, 1, 0, 21, 219, 1, 255, 4, 0, 24, 128, 1, 255, 4, 219, 1, 35, 1, 0, 18, 11, 1, 141, 1, 255, 4, 175, 1, 0, 25, 245, 1, 255, 4, 235, 1, 98, 1, 35, 1, 0, 14, 5, 1, 60, 1, 219, 1, 255, 5, 0, 26, 56, 1, 255, 6, 235, 1, 141, 1, 60, 1, 35, 1, 11, 1, 5, 2, 0, 2, 5, 3, 11, 1, 60, 1, 98, 1, 176, 1, 255, 6, 89, 1, 0, 27, 89, 1, 255, 8, 235, 1, 219, 1, 176, 2, 141, 2, 176, 3, 219, 1, 255, 8, 128, 1, 0, 29, 89, 1, 245, 1, 255, 23, 128, 1, 0, 31, 56, 1, 175, 1, 255, 20, 203, 1, 89, 1, 0, 34, 89, 1, 175, 1, 239, 1, 255, 14, 245, 1, 203, 1, 89, 1, 12, 1, 0, 37, 25, 1, 89, 1, 175, 1, 203, 1, 239, 2, 245, 5, 239, 1, 203, 1, 175, 1, 128, 1, 56, 1, 12, 1, 0, 19, 1, 2 }; +static const uint8_t image_data_FontT48_0x0050_mod[238] = { 1, 3, 0, 11, 98, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 245, 13, 255, 4, 245, 13, 255, 4, 0, 22, 56, 13, 255, 4, 56, 13, 255, 4, 0, 35, 255, 4, 0, 13, 255, 4, 0, 35, 255, 4, 0, 13, 255, 4, 0, 35, 255, 4, 0, 13, 255, 4, 0, 35, 255, 4, 0, 13, 255, 4, 0, 35, 255, 4, 0, 13, 255, 4, 0, 35, 255, 4, 0, 13, 255, 4, 0, 35, 255, 4, 60, 1, 0, 11, 98, 1, 255, 3, 239, 1, 0, 35, 203, 1, 255, 4, 0, 11, 255, 4, 25, 1, 0, 35, 12, 1, 255, 4, 35, 1, 0, 9, 35, 1, 255, 4, 0, 37, 255, 4, 235, 1, 11, 1, 0, 7, 5, 1, 235, 1, 255, 4, 0, 37, 175, 1, 255, 4, 219, 1, 60, 1, 11, 1, 0, 3, 5, 1, 35, 1, 176, 1, 255, 4, 128, 1, 0, 38, 255, 6, 219, 1, 141, 3, 176, 1, 235, 1, 255, 5, 0, 39, 89, 1, 255, 15, 89, 1, 0, 40, 128, 1, 255, 13, 175, 1, 0, 42, 89, 1, 203, 1, 255, 9, 245, 1, 128, 1, 0, 44, 12, 1, 89, 1, 175, 1, 203, 1, 239, 4, 203, 1, 128, 1, 56, 1, 0, 48, 12, 1, 25, 4, 12, 1, 0, 18, 1, 1 }; +static const uint8_t image_data_FontT48_0x0051_mod[564] = { 1, 1, 0, 23, 5, 1, 11, 2, 35, 5, 11, 1, 5, 1, 0, 43, 11, 1, 60, 1, 98, 1, 176, 1, 219, 2, 235, 5, 219, 1, 176, 1, 141, 1, 60, 1, 11, 1, 0, 38, 35, 1, 141, 1, 219, 1, 255, 14, 219, 1, 141, 1, 35, 1, 0, 34, 11, 1, 141, 1, 235, 1, 255, 18, 235, 1, 141, 1, 11, 1, 0, 31, 60, 1, 219, 1, 255, 22, 219, 1, 60, 1, 0, 29, 60, 1, 255, 8, 245, 1, 239, 1, 203, 6, 239, 1, 245, 1, 255, 8, 60, 1, 0, 27, 60, 1, 255, 6, 245, 1, 203, 1, 128, 1, 56, 1, 25, 1, 12, 6, 25, 1, 56, 1, 89, 1, 128, 1, 203, 1, 255, 6, 35, 1, 0, 25, 5, 1, 255, 5, 245, 1, 175, 1, 56, 1, 12, 1, 0, 13, 12, 1, 89, 1, 239, 1, 255, 4, 235, 1, 0, 25, 176, 1, 255, 4, 239, 1, 56, 1, 0, 18, 25, 1, 175, 1, 255, 4, 141, 1, 0, 24, 255, 4, 239, 1, 25, 1, 0, 21, 175, 1, 255, 4, 0, 23, 60, 1, 255, 4, 25, 1, 0, 23, 255, 4, 60, 1, 0, 22, 255, 4, 175, 1, 0, 24, 128, 1, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 22, 255, 4, 0, 26, 255, 4, 0, 21, 11, 1, 255, 4, 60, 1, 0, 24, 11, 1, 255, 4, 0, 20, 60, 1, 219, 1, 255, 5, 0, 24, 219, 1, 255, 3, 203, 1, 0, 19, 60, 1, 255, 7, 60, 1, 0, 22, 11, 1, 255, 4, 12, 1, 0, 18, 60, 1, 255, 9, 35, 1, 0, 20, 5, 1, 219, 1, 255, 4, 0, 18, 5, 1, 255, 5, 245, 1, 255, 4, 235, 1, 60, 1, 0, 18, 11, 1, 176, 1, 255, 4, 128, 1, 0, 18, 176, 1, 255, 4, 203, 1, 56, 1, 255, 6, 141, 1, 35, 1, 5, 1, 0, 13, 11, 1, 98, 1, 219, 1, 255, 4, 245, 1, 0, 18, 5, 1, 255, 4, 175, 1, 12, 1, 0, 1, 89, 1, 255, 6, 235, 1, 176, 1, 98, 1, 60, 1, 35, 1, 11, 2, 5, 3, 11, 2, 35, 1, 60, 1, 141, 1, 219, 1, 255, 6, 56, 1, 0, 18, 176, 1, 255, 3, 239, 1, 0, 4, 89, 1, 255, 9, 235, 1, 219, 2, 176, 3, 219, 2, 235, 1, 255, 8, 128, 1, 0, 19, 255, 4, 25, 1, 0, 5, 89, 1, 245, 1, 255, 22, 245, 1, 89, 1, 0, 20, 255, 3, 239, 1, 0, 7, 56, 1, 175, 1, 245, 1, 255, 19, 203, 1, 56, 1, 0, 20, 60, 1, 255, 3, 25, 1, 0, 9, 56, 1, 175, 1, 239, 1, 255, 14, 239, 1, 175, 1, 89, 1, 12, 1, 0, 21, 255, 4, 0, 12, 25, 1, 89, 1, 128, 1, 175, 1, 203, 1, 239, 6, 203, 2, 128, 1, 89, 1, 25, 1, 0, 24, 255, 4, 0, 16, 12, 1, 25, 6, 12, 2, 0, 27, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 48 }; +static const uint8_t image_data_FontT48_0x0052_mod[344] = { 1, 3, 0, 11, 35, 34, 0, 22, 235, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 128, 15, 255, 4, 128, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 36, 60, 1, 255, 4, 0, 11, 255, 4, 0, 34, 11, 1, 141, 1, 255, 5, 0, 11, 255, 4, 0, 32, 5, 1, 98, 1, 219, 1, 255, 6, 11, 1, 0, 9, 11, 1, 255, 4, 0, 31, 35, 1, 176, 1, 255, 8, 219, 1, 0, 9, 219, 1, 255, 4, 0, 29, 11, 1, 141, 1, 235, 1, 255, 10, 5, 1, 0, 7, 5, 1, 255, 4, 89, 1, 0, 28, 60, 1, 219, 1, 255, 6, 239, 1, 89, 1, 255, 4, 176, 1, 11, 1, 0, 5, 5, 1, 176, 1, 255, 4, 0, 27, 35, 1, 141, 1, 255, 6, 245, 1, 175, 1, 25, 1, 0, 1, 89, 1, 255, 4, 219, 1, 98, 1, 60, 1, 35, 2, 98, 1, 176, 1, 255, 5, 0, 25, 5, 1, 98, 1, 235, 1, 255, 6, 203, 1, 56, 1, 0, 4, 245, 1, 255, 6, 235, 2, 255, 6, 89, 1, 0, 24, 60, 1, 176, 1, 255, 6, 239, 1, 128, 1, 12, 1, 0, 5, 56, 1, 245, 1, 255, 12, 203, 1, 0, 24, 141, 1, 255, 7, 175, 1, 25, 1, 0, 8, 56, 1, 239, 1, 255, 10, 203, 1, 12, 1, 0, 24, 255, 6, 239, 1, 89, 1, 0, 11, 25, 1, 175, 1, 245, 1, 255, 6, 239, 1, 128, 1, 12, 1, 0, 25, 255, 4, 245, 1, 128, 1, 25, 1, 0, 14, 56, 1, 128, 1, 175, 4, 89, 1, 25, 1, 0, 27, 255, 3, 203, 1, 56, 1, 0, 51, 255, 1, 239, 1, 128, 1, 12, 1, 0, 52, 203, 1, 25, 1, 0, 43 }; +static const uint8_t image_data_FontT48_0x0053_mod[414] = { 1, 1, 0, 13, 5, 1, 0, 19, 5, 1, 11, 1, 35, 3, 5, 1, 0, 29, 35, 1, 176, 1, 60, 1, 11, 1, 0, 15, 5, 1, 60, 1, 176, 1, 219, 1, 235, 3, 176, 1, 141, 1, 35, 1, 0, 27, 235, 1, 255, 2, 219, 1, 98, 1, 0, 13, 35, 1, 176, 1, 255, 8, 235, 1, 98, 1, 0, 26, 255, 4, 128, 1, 0, 12, 35, 1, 235, 1, 255, 11, 98, 1, 0, 24, 98, 1, 255, 4, 0, 13, 235, 1, 255, 13, 35, 1, 0, 23, 255, 4, 245, 1, 0, 12, 141, 1, 255, 5, 203, 1, 175, 1, 128, 1, 175, 1, 239, 1, 255, 4, 235, 1, 0, 23, 255, 4, 56, 1, 0, 12, 255, 5, 128, 1, 12, 1, 0, 3, 25, 1, 175, 1, 255, 4, 11, 1, 0, 22, 255, 4, 0, 12, 141, 1, 255, 4, 89, 1, 0, 7, 239, 1, 255, 3, 219, 1, 0, 22, 255, 4, 0, 12, 255, 4, 239, 1, 0, 8, 25, 1, 255, 4, 0, 22, 255, 4, 0, 11, 98, 1, 255, 4, 25, 1, 0, 9, 255, 4, 0, 22, 255, 4, 0, 11, 255, 4, 245, 1, 0, 10, 255, 4, 0, 22, 255, 4, 5, 1, 0, 9, 98, 1, 255, 4, 56, 1, 0, 10, 255, 4, 0, 22, 203, 1, 255, 3, 176, 1, 0, 8, 5, 1, 255, 5, 0, 11, 255, 4, 0, 22, 12, 1, 255, 4, 35, 1, 0, 7, 176, 1, 255, 4, 89, 1, 0, 10, 35, 1, 255, 4, 0, 23, 255, 4, 235, 1, 60, 1, 5, 1, 0, 3, 35, 1, 141, 1, 255, 5, 0, 11, 235, 1, 255, 4, 0, 23, 89, 1, 255, 5, 176, 1, 141, 3, 235, 1, 255, 5, 89, 1, 0, 10, 5, 1, 255, 4, 128, 1, 0, 24, 203, 1, 255, 13, 203, 1, 0, 11, 167, 1, 255, 4, 0, 25, 12, 1, 239, 1, 255, 11, 239, 1, 12, 1, 0, 11, 56, 1, 128, 1, 203, 1, 255, 1, 203, 1, 0, 26, 25, 1, 203, 1, 255, 8, 245, 1, 175, 1, 25, 1, 0, 14, 12, 1, 89, 1, 12, 1, 0, 27, 12, 1, 89, 1, 203, 1, 239, 1, 245, 2, 239, 1, 203, 1, 175, 1, 56, 1, 0, 48, 12, 1, 25, 1, 56, 2, 25, 1, 12, 1, 0, 33, 1, 1 }; +static const uint8_t image_data_FontT48_0x0054_mod[120] = { 0, 41, 98, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 22, 98, 30, 255, 4, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 255, 34, 0, 22, 245, 30, 255, 4, 0, 22, 56, 30, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 128, 4, 0, 11 }; +static const uint8_t image_data_FontT48_0x0055_mod[202] = { 1, 3, 0, 17, 5, 1, 35, 1, 60, 1, 98, 25, 0, 26, 5, 1, 98, 1, 176, 1, 235, 1, 255, 26, 0, 25, 35, 1, 176, 1, 255, 29, 0, 24, 35, 1, 235, 1, 255, 30, 0, 24, 235, 1, 255, 7, 245, 24, 0, 23, 141, 1, 255, 5, 239, 1, 128, 1, 89, 1, 56, 24, 0, 23, 255, 5, 175, 1, 25, 1, 0, 48, 11, 1, 255, 4, 175, 1, 0, 50, 219, 1, 255, 4, 0, 51, 255, 4, 128, 1, 0, 51, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 98, 1, 0, 51, 203, 1, 255, 4, 0, 51, 12, 1, 255, 4, 141, 1, 0, 51, 255, 5, 141, 1, 11, 1, 0, 49, 89, 1, 255, 5, 219, 1, 98, 1, 60, 1, 35, 24, 0, 24, 203, 1, 255, 7, 235, 24, 0, 24, 12, 1, 239, 1, 255, 30, 0, 25, 25, 1, 203, 1, 255, 29, 0, 26, 12, 1, 89, 1, 203, 1, 245, 1, 255, 26, 0, 28, 12, 1, 56, 1, 89, 1, 128, 25, 0, 11, 1, 3 }; +static const uint8_t image_data_FontT48_0x0056_mod[448] = { 0, 42, 5, 1, 35, 1, 98, 1, 0, 51, 11, 1, 60, 1, 176, 1, 235, 1, 255, 1, 0, 48, 5, 1, 60, 1, 141, 1, 219, 1, 255, 4, 0, 45, 5, 1, 35, 1, 98, 1, 176, 1, 255, 7, 0, 43, 11, 1, 60, 1, 176, 1, 235, 1, 255, 9, 0, 40, 5, 1, 60, 1, 141, 1, 219, 1, 255, 10, 239, 1, 175, 1, 0, 37, 5, 1, 35, 1, 98, 1, 176, 1, 255, 10, 245, 1, 203, 1, 128, 1, 25, 1, 0, 36, 11, 1, 60, 1, 176, 1, 235, 1, 255, 10, 239, 1, 175, 1, 56, 1, 12, 1, 0, 35, 5, 1, 60, 1, 141, 1, 219, 1, 255, 10, 245, 1, 175, 1, 89, 1, 25, 1, 0, 35, 5, 1, 35, 1, 98, 1, 176, 1, 255, 11, 203, 1, 128, 1, 56, 1, 0, 36, 11, 1, 60, 1, 176, 1, 235, 1, 255, 10, 239, 1, 175, 1, 89, 1, 12, 1, 0, 35, 11, 1, 60, 1, 141, 1, 219, 1, 255, 10, 245, 1, 203, 1, 128, 1, 25, 1, 0, 36, 35, 1, 98, 1, 219, 1, 255, 11, 239, 1, 128, 1, 56, 1, 12, 1, 0, 38, 235, 1, 255, 10, 245, 1, 175, 1, 89, 1, 25, 1, 0, 41, 255, 11, 159, 1, 35, 1, 5, 1, 0, 42, 128, 1, 239, 1, 255, 10, 235, 1, 176, 1, 60, 1, 11, 1, 0, 41, 25, 1, 89, 1, 175, 1, 239, 1, 255, 10, 219, 1, 141, 1, 60, 1, 11, 1, 0, 41, 25, 1, 89, 1, 203, 1, 245, 1, 255, 10, 219, 1, 98, 1, 35, 1, 5, 1, 0, 40, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 9, 235, 1, 176, 1, 98, 1, 11, 1, 0, 41, 12, 1, 56, 1, 175, 1, 239, 1, 255, 10, 219, 1, 141, 1, 60, 1, 11, 1, 0, 41, 25, 1, 89, 1, 175, 1, 239, 1, 255, 10, 219, 1, 141, 1, 35, 1, 5, 1, 0, 41, 25, 1, 128, 1, 203, 1, 245, 1, 255, 9, 235, 1, 176, 1, 98, 1, 35, 1, 0, 41, 12, 1, 56, 1, 128, 1, 239, 1, 255, 10, 235, 1, 141, 1, 60, 1, 0, 42, 25, 1, 89, 1, 175, 1, 239, 1, 255, 10, 0, 45, 25, 1, 89, 1, 203, 1, 245, 1, 255, 7, 0, 47, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 4, 0, 50, 12, 1, 56, 1, 175, 1, 239, 1, 255, 2, 0, 53, 25, 1, 89, 1, 175, 1, 0, 11 }; +static const uint8_t image_data_FontT48_0x0057_mod[776] = { 0, 42, 5, 1, 35, 1, 98, 1, 0, 50, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 1, 0, 47, 11, 1, 60, 1, 141, 1, 176, 1, 235, 1, 255, 4, 0, 44, 11, 1, 60, 1, 141, 1, 219, 1, 255, 8, 0, 41, 11, 1, 60, 1, 141, 1, 219, 1, 255, 11, 0, 37, 5, 1, 11, 1, 60, 1, 141, 1, 219, 1, 255, 10, 245, 1, 239, 1, 175, 1, 89, 1, 0, 34, 5, 1, 35, 1, 98, 1, 176, 1, 219, 1, 255, 10, 245, 1, 203, 1, 128, 1, 56, 1, 25, 1, 0, 33, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 10, 239, 1, 175, 1, 128, 1, 56, 1, 12, 1, 0, 33, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 9, 245, 1, 203, 1, 175, 1, 89, 1, 25, 1, 0, 34, 11, 1, 60, 1, 98, 1, 176, 1, 235, 1, 255, 9, 239, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 34, 11, 1, 60, 1, 141, 1, 219, 1, 255, 9, 245, 1, 239, 1, 175, 1, 89, 1, 25, 1, 12, 1, 0, 37, 219, 1, 255, 10, 203, 1, 128, 1, 56, 1, 25, 1, 0, 41, 203, 1, 245, 1, 255, 9, 154, 1, 60, 1, 11, 1, 0, 42, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 8, 219, 1, 141, 1, 60, 1, 11, 1, 0, 42, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 8, 219, 1, 141, 1, 60, 1, 11, 1, 0, 42, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 8, 219, 1, 141, 1, 60, 1, 11, 1, 0, 42, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 8, 219, 1, 141, 1, 60, 1, 35, 1, 5, 1, 0, 41, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 8, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 41, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 8, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 41, 12, 1, 56, 1, 89, 1, 175, 1, 239, 1, 255, 8, 235, 1, 176, 1, 98, 1, 0, 42, 5, 1, 35, 1, 124, 1, 255, 11, 0, 40, 11, 1, 98, 1, 176, 1, 235, 1, 255, 9, 245, 1, 203, 1, 128, 1, 0, 37, 11, 1, 60, 1, 141, 1, 219, 1, 255, 9, 239, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 35, 11, 1, 60, 1, 141, 1, 219, 1, 255, 9, 239, 1, 175, 1, 89, 1, 25, 1, 12, 1, 0, 35, 5, 1, 35, 1, 141, 1, 219, 1, 255, 9, 239, 1, 175, 1, 89, 1, 25, 1, 0, 36, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 8, 239, 1, 175, 1, 89, 1, 25, 1, 0, 36, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 7, 245, 1, 203, 1, 175, 1, 89, 1, 25, 1, 0, 37, 11, 1, 60, 1, 176, 1, 235, 1, 255, 7, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 39, 141, 1, 219, 1, 255, 9, 140, 1, 56, 1, 12, 1, 0, 42, 245, 1, 255, 10, 219, 1, 141, 1, 60, 1, 11, 1, 5, 1, 0, 40, 56, 1, 128, 1, 175, 1, 239, 1, 255, 10, 219, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 40, 25, 1, 89, 1, 175, 1, 239, 1, 255, 10, 235, 1, 176, 1, 98, 1, 60, 1, 11, 1, 0, 40, 25, 1, 89, 1, 175, 1, 239, 1, 255, 11, 219, 1, 141, 1, 60, 1, 11, 1, 5, 1, 0, 39, 25, 1, 89, 1, 128, 1, 203, 1, 245, 1, 255, 10, 219, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 39, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 10, 235, 1, 176, 1, 98, 1, 60, 1, 11, 1, 0, 39, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 11, 219, 1, 141, 1, 60, 1, 0, 40, 12, 1, 56, 1, 89, 1, 175, 1, 239, 1, 255, 11, 0, 44, 25, 1, 89, 1, 175, 1, 239, 1, 255, 8, 0, 47, 25, 1, 89, 1, 175, 1, 239, 1, 245, 1, 255, 4, 0, 50, 25, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 1, 0, 53, 12, 1, 56, 1, 128, 1, 0, 11 }; +static const uint8_t image_data_FontT48_0x0058_mod[532] = { 0, 11, 98, 1, 0, 55, 255, 1, 141, 1, 35, 1, 0, 29, 11, 1, 141, 1, 0, 22, 255, 2, 235, 1, 98, 1, 5, 1, 0, 26, 60, 1, 219, 1, 255, 1, 0, 22, 255, 4, 176, 1, 60, 1, 0, 23, 35, 1, 141, 1, 255, 3, 0, 22, 255, 6, 141, 1, 11, 1, 0, 19, 11, 1, 98, 1, 235, 1, 255, 4, 0, 22, 89, 1, 239, 1, 255, 5, 219, 1, 98, 1, 5, 1, 0, 16, 60, 1, 219, 1, 255, 5, 245, 1, 0, 23, 25, 1, 175, 1, 245, 1, 255, 5, 176, 1, 35, 1, 0, 13, 35, 1, 141, 1, 255, 6, 203, 1, 56, 1, 0, 25, 56, 1, 203, 1, 255, 5, 235, 1, 141, 1, 11, 1, 0, 9, 5, 1, 98, 1, 235, 1, 255, 5, 239, 1, 89, 1, 12, 1, 0, 27, 12, 1, 128, 1, 239, 1, 255, 5, 219, 1, 60, 1, 5, 1, 0, 6, 60, 1, 176, 1, 255, 6, 175, 1, 25, 1, 0, 31, 25, 1, 175, 1, 255, 6, 176, 1, 35, 1, 0, 3, 35, 1, 141, 1, 255, 6, 203, 1, 89, 1, 0, 35, 89, 1, 239, 1, 255, 5, 235, 1, 98, 1, 11, 1, 98, 1, 235, 1, 255, 5, 245, 1, 128, 1, 12, 1, 0, 37, 25, 1, 128, 1, 245, 1, 255, 5, 219, 1, 255, 6, 203, 1, 56, 1, 0, 41, 56, 1, 203, 1, 255, 9, 239, 1, 89, 1, 12, 1, 0, 43, 18, 1, 255, 9, 30, 1, 0, 44, 60, 1, 176, 1, 255, 9, 176, 1, 60, 1, 0, 41, 11, 1, 141, 1, 255, 6, 239, 1, 255, 6, 141, 1, 11, 1, 0, 37, 5, 1, 98, 1, 219, 1, 255, 6, 175, 1, 25, 1, 128, 1, 245, 1, 255, 5, 219, 1, 60, 1, 0, 35, 35, 1, 176, 1, 255, 6, 203, 1, 89, 1, 0, 3, 56, 1, 175, 1, 255, 6, 141, 1, 11, 1, 0, 31, 11, 1, 141, 1, 235, 1, 255, 5, 245, 1, 128, 1, 12, 1, 0, 6, 89, 1, 239, 1, 255, 5, 219, 1, 98, 1, 5, 1, 0, 27, 5, 1, 98, 1, 219, 1, 255, 6, 175, 1, 56, 1, 0, 9, 25, 1, 175, 1, 245, 1, 255, 5, 176, 1, 35, 1, 0, 25, 35, 1, 176, 1, 255, 6, 239, 1, 89, 1, 0, 13, 56, 1, 203, 1, 255, 5, 235, 1, 98, 1, 5, 1, 0, 22, 141, 1, 235, 1, 255, 5, 245, 1, 128, 1, 25, 1, 0, 15, 12, 1, 128, 1, 245, 1, 255, 5, 176, 1, 0, 22, 255, 6, 175, 1, 56, 1, 0, 19, 56, 1, 175, 1, 255, 5, 0, 22, 255, 4, 239, 1, 89, 1, 0, 23, 89, 1, 239, 1, 255, 3, 0, 22, 255, 2, 245, 1, 128, 1, 25, 1, 0, 25, 25, 1, 128, 1, 245, 1, 255, 1, 0, 22, 255, 1, 203, 1, 56, 1, 0, 29, 56, 1, 239, 1, 0, 22, 128, 1, 12, 1, 0, 31, 25, 1, 0, 11 }; +static const uint8_t image_data_FontT48_0x0059_mod[312] = { 0, 43, 5, 1, 98, 1, 0, 53, 35, 1, 176, 1, 255, 1, 0, 51, 11, 1, 141, 1, 235, 1, 255, 2, 0, 49, 5, 1, 98, 1, 219, 1, 255, 4, 0, 48, 60, 1, 176, 1, 255, 6, 0, 46, 35, 1, 141, 1, 255, 6, 203, 1, 89, 1, 0, 44, 11, 1, 141, 1, 235, 1, 255, 5, 239, 1, 128, 1, 12, 1, 0, 43, 5, 1, 98, 1, 219, 1, 255, 5, 245, 1, 175, 1, 25, 1, 0, 44, 60, 1, 176, 1, 255, 6, 175, 1, 56, 1, 0, 44, 35, 1, 141, 1, 255, 6, 203, 1, 89, 1, 0, 29, 5, 15, 11, 1, 98, 1, 235, 1, 255, 5, 239, 1, 128, 1, 12, 1, 0, 30, 176, 15, 219, 1, 255, 5, 245, 1, 175, 1, 25, 1, 0, 32, 255, 20, 203, 1, 56, 1, 0, 34, 255, 19, 153, 1, 12, 1, 0, 35, 255, 20, 141, 1, 35, 1, 0, 34, 203, 15, 239, 1, 255, 5, 235, 1, 98, 1, 11, 1, 0, 32, 12, 15, 25, 1, 175, 1, 245, 1, 255, 5, 219, 1, 60, 1, 5, 1, 0, 47, 56, 1, 203, 1, 255, 6, 176, 1, 60, 1, 0, 47, 12, 1, 89, 1, 239, 1, 255, 6, 141, 1, 35, 1, 0, 47, 25, 1, 128, 1, 239, 1, 255, 5, 235, 1, 98, 1, 11, 1, 0, 47, 25, 1, 175, 1, 245, 1, 255, 5, 219, 1, 60, 1, 5, 1, 0, 47, 56, 1, 203, 1, 255, 6, 176, 1, 60, 1, 0, 47, 12, 1, 89, 1, 239, 1, 255, 6, 0, 49, 25, 1, 128, 1, 245, 1, 255, 4, 0, 51, 56, 1, 175, 1, 255, 3, 0, 53, 89, 1, 203, 1, 255, 1, 0, 54, 12, 1, 128, 1, 0, 11 }; +static const uint8_t image_data_FontT48_0x005a_mod[386] = { 1, 2, 0, 11, 141, 1, 98, 1, 11, 1, 0, 27, 141, 4, 0, 22, 255, 2, 219, 1, 98, 1, 11, 1, 0, 25, 255, 4, 0, 22, 255, 4, 219, 1, 98, 1, 11, 1, 0, 23, 255, 4, 0, 22, 255, 6, 219, 1, 98, 1, 11, 1, 0, 21, 255, 4, 0, 22, 255, 8, 219, 1, 98, 1, 11, 1, 0, 19, 255, 4, 0, 22, 255, 10, 219, 1, 98, 1, 11, 1, 0, 17, 255, 4, 0, 22, 255, 4, 239, 1, 255, 7, 219, 1, 98, 1, 11, 1, 0, 15, 255, 4, 0, 22, 255, 4, 25, 1, 128, 1, 239, 1, 255, 7, 219, 1, 98, 1, 11, 1, 0, 13, 255, 4, 0, 22, 255, 4, 0, 2, 25, 1, 128, 1, 239, 1, 255, 7, 219, 1, 98, 1, 11, 1, 0, 11, 255, 4, 0, 22, 255, 4, 0, 4, 25, 1, 128, 1, 239, 1, 255, 7, 219, 1, 98, 1, 11, 1, 0, 9, 255, 4, 0, 22, 255, 4, 0, 6, 25, 1, 128, 1, 239, 1, 255, 7, 219, 1, 98, 1, 11, 1, 0, 7, 255, 4, 0, 22, 255, 4, 0, 8, 25, 1, 128, 1, 239, 1, 255, 7, 219, 1, 98, 1, 11, 1, 0, 5, 255, 4, 0, 22, 255, 4, 0, 10, 25, 1, 128, 1, 239, 1, 255, 7, 219, 1, 98, 1, 11, 1, 0, 3, 255, 4, 0, 22, 255, 4, 0, 12, 25, 1, 128, 1, 239, 1, 255, 7, 219, 1, 98, 1, 11, 1, 0, 1, 255, 4, 0, 22, 255, 4, 0, 14, 25, 1, 128, 1, 239, 1, 255, 7, 219, 1, 98, 1, 255, 4, 0, 22, 255, 4, 0, 16, 25, 1, 128, 1, 239, 1, 255, 11, 0, 22, 255, 4, 0, 18, 25, 1, 128, 1, 239, 1, 255, 9, 0, 22, 255, 4, 0, 20, 25, 1, 128, 1, 239, 1, 255, 7, 0, 22, 255, 4, 0, 22, 25, 1, 128, 1, 239, 1, 255, 5, 0, 22, 255, 4, 0, 24, 25, 1, 128, 1, 239, 1, 255, 3, 0, 22, 255, 4, 0, 26, 25, 1, 128, 1, 239, 1, 245, 1, 0, 22, 175, 4, 0, 28, 25, 1, 56, 1, 0, 11, 1, 2 }; +static const uint8_t image_data_FontT48_0x005b_mod[90] = { 1, 4, 0, 1, 35, 45, 0, 11, 235, 45, 0, 11, 255, 45, 0, 11, 255, 45, 0, 11, 255, 45, 0, 11, 255, 4, 128, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 239, 4, 0, 37, 239, 4, 0, 11, 25, 4, 0, 37, 25, 4, 0, 10, 1, 1 }; +static const uint8_t image_data_FontT48_0x005c_mod[256] = { 1, 1, 0, 38, 11, 1, 60, 1, 141, 1, 219, 1, 255, 3, 0, 46, 5, 1, 35, 1, 141, 1, 219, 1, 255, 6, 0, 43, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 5, 245, 1, 203, 1, 128, 1, 0, 41, 11, 1, 98, 1, 176, 1, 235, 1, 255, 5, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 39, 11, 1, 60, 1, 141, 1, 219, 1, 255, 6, 203, 1, 128, 1, 56, 1, 12, 1, 0, 39, 5, 1, 60, 1, 141, 1, 219, 1, 255, 6, 239, 1, 175, 1, 89, 1, 12, 1, 0, 39, 5, 1, 35, 1, 98, 1, 176, 1, 255, 6, 239, 1, 175, 1, 89, 1, 25, 1, 0, 40, 35, 1, 98, 1, 176, 1, 235, 1, 255, 5, 245, 1, 203, 1, 89, 1, 25, 1, 0, 40, 11, 1, 60, 1, 141, 1, 235, 1, 255, 5, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 39, 11, 1, 60, 1, 141, 1, 219, 1, 255, 5, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 40, 35, 1, 141, 1, 219, 1, 255, 6, 239, 1, 175, 1, 56, 1, 12, 1, 0, 43, 235, 1, 255, 5, 239, 1, 175, 1, 89, 1, 25, 1, 0, 46, 255, 3, 245, 1, 175, 1, 89, 1, 25, 1, 0, 49, 245, 1, 203, 1, 128, 1, 56, 1, 0, 52, 56, 1, 12, 1, 0, 43, 1, 1 }; +static const uint8_t image_data_FontT48_0x005d_mod[90] = { 1, 1, 0, 1, 11, 4, 0, 37, 11, 4, 0, 11, 219, 4, 0, 37, 219, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 0, 37, 255, 4, 0, 11, 255, 4, 98, 37, 255, 4, 0, 11, 255, 45, 0, 11, 255, 45, 0, 11, 255, 45, 0, 11, 245, 45, 0, 11, 56, 45, 0, 10, 1, 4 }; +static const uint8_t image_data_FontT48_0x005e_mod[210] = { 1, 3, 0, 33, 60, 1, 0, 55, 255, 1, 141, 1, 35, 1, 0, 53, 255, 2, 235, 1, 98, 1, 11, 1, 0, 51, 175, 1, 245, 1, 255, 2, 219, 1, 60, 1, 5, 1, 0, 50, 56, 1, 203, 1, 255, 3, 176, 1, 60, 1, 0, 50, 12, 1, 89, 1, 239, 1, 255, 3, 141, 1, 35, 1, 0, 50, 25, 1, 128, 1, 239, 1, 255, 2, 235, 1, 98, 1, 11, 1, 0, 50, 25, 1, 175, 1, 245, 1, 255, 2, 219, 1, 98, 1, 0, 51, 56, 1, 203, 1, 255, 3, 0, 51, 11, 1, 154, 1, 255, 3, 0, 49, 11, 1, 98, 1, 219, 1, 255, 2, 245, 1, 175, 1, 0, 47, 5, 1, 60, 1, 219, 1, 255, 3, 203, 1, 56, 1, 0, 47, 35, 1, 176, 1, 255, 3, 239, 1, 89, 1, 12, 1, 0, 46, 35, 1, 141, 1, 235, 1, 255, 2, 239, 1, 128, 1, 25, 1, 0, 47, 98, 1, 235, 1, 255, 2, 245, 1, 175, 1, 25, 1, 0, 49, 255, 3, 203, 1, 56, 1, 0, 51, 255, 1, 203, 1, 89, 1, 12, 1, 0, 52, 175, 1, 12, 1, 0, 21, 1, 4 }; +static const uint8_t image_data_FontT48_0x005f_mod[102] = { 0, 5, 235, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 53, 239, 3, 0, 48 }; +static const uint8_t image_data_FontT48_0x0060_mod[88] = { 1, 7, 0, 48, 11, 1, 0, 54, 35, 1, 219, 1, 0, 52, 5, 1, 98, 1, 235, 1, 255, 1, 0, 51, 35, 1, 176, 1, 255, 3, 0, 49, 11, 1, 98, 1, 235, 1, 255, 4, 0, 48, 60, 1, 219, 1, 255, 4, 245, 1, 175, 1, 0, 48, 255, 4, 245, 1, 175, 1, 56, 1, 0, 49, 255, 2, 245, 1, 175, 1, 56, 1, 0, 51, 245, 1, 175, 1, 56, 1, 0, 53, 56, 1, 0, 250, 0, 212 }; +static const uint8_t image_data_FontT48_0x0061_mod[366] = { 1, 1, 0, 16, 11, 1, 35, 2, 11, 1, 5, 1, 0, 49, 35, 1, 141, 1, 219, 1, 235, 2, 219, 1, 176, 1, 60, 1, 5, 1, 0, 46, 60, 1, 235, 1, 255, 7, 176, 1, 11, 1, 0, 7, 35, 1, 141, 1, 60, 1, 0, 34, 60, 1, 255, 10, 219, 1, 5, 1, 0, 4, 35, 1, 141, 1, 235, 1, 255, 2, 0, 34, 255, 12, 176, 1, 0, 4, 113, 1, 255, 4, 141, 1, 0, 32, 141, 1, 255, 4, 175, 1, 89, 2, 128, 1, 245, 1, 255, 4, 35, 1, 0, 4, 128, 1, 255, 4, 0, 32, 255, 4, 239, 1, 0, 4, 56, 1, 255, 4, 235, 1, 0, 5, 255, 4, 60, 1, 0, 31, 255, 4, 25, 1, 0, 5, 89, 1, 255, 4, 0, 5, 89, 1, 255, 4, 0, 31, 255, 4, 0, 7, 255, 4, 98, 1, 0, 5, 255, 4, 0, 31, 255, 4, 0, 7, 89, 1, 255, 4, 0, 5, 255, 4, 0, 31, 255, 4, 0, 8, 255, 4, 0, 5, 255, 4, 0, 31, 239, 1, 255, 3, 0, 8, 255, 4, 0, 5, 255, 4, 0, 31, 25, 1, 255, 3, 11, 1, 0, 7, 255, 4, 0, 4, 11, 1, 255, 4, 0, 32, 255, 3, 219, 1, 0, 7, 255, 4, 0, 4, 219, 1, 255, 3, 245, 1, 0, 32, 89, 1, 255, 3, 11, 1, 0, 5, 60, 1, 255, 3, 203, 1, 0, 2, 5, 1, 98, 1, 255, 4, 56, 1, 0, 33, 175, 1, 255, 2, 219, 1, 35, 5, 255, 4, 47, 1, 60, 1, 98, 1, 176, 1, 255, 5, 0, 33, 11, 1, 141, 1, 255, 3, 235, 5, 255, 4, 235, 1, 255, 7, 175, 1, 0, 33, 219, 1, 255, 20, 203, 1, 0, 33, 60, 1, 255, 19, 245, 1, 175, 1, 12, 1, 0, 33, 255, 5, 245, 12, 239, 1, 203, 1, 175, 1, 56, 1, 0, 35, 255, 3, 203, 1, 89, 1, 56, 12, 25, 1, 12, 1, 0, 37, 245, 2, 128, 1, 12, 1, 0, 52, 56, 2, 0, 43, 1, 1 }; +static const uint8_t image_data_FontT48_0x0062_mod[302] = { 1, 2, 0, 11, 5, 35, 0, 21, 176, 35, 0, 21, 255, 35, 0, 21, 203, 1, 255, 34, 0, 21, 12, 1, 128, 1, 255, 33, 0, 22, 11, 1, 255, 3, 239, 1, 175, 13, 239, 1, 255, 3, 175, 12, 0, 22, 219, 1, 255, 3, 25, 1, 0, 13, 25, 1, 255, 3, 98, 1, 0, 32, 5, 1, 255, 3, 239, 1, 0, 15, 239, 1, 255, 3, 0, 32, 176, 1, 255, 3, 25, 1, 0, 15, 25, 1, 255, 3, 60, 1, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 35, 1, 0, 15, 141, 1, 255, 4, 0, 31, 245, 1, 255, 3, 235, 1, 0, 15, 255, 4, 245, 1, 0, 31, 56, 1, 255, 4, 11, 1, 0, 13, 141, 1, 255, 4, 56, 1, 0, 32, 255, 4, 219, 1, 11, 1, 0, 11, 98, 1, 255, 5, 0, 33, 128, 1, 255, 4, 219, 1, 98, 1, 11, 1, 5, 1, 0, 5, 5, 1, 35, 1, 141, 1, 255, 5, 128, 1, 0, 34, 239, 1, 255, 5, 219, 1, 176, 1, 141, 1, 98, 3, 141, 1, 176, 1, 235, 1, 255, 5, 239, 1, 0, 35, 25, 1, 239, 1, 255, 17, 239, 1, 25, 1, 0, 36, 25, 1, 203, 1, 255, 15, 203, 1, 25, 1, 0, 38, 12, 1, 128, 1, 239, 1, 255, 11, 239, 1, 128, 1, 12, 1, 0, 41, 25, 1, 89, 1, 175, 1, 239, 2, 245, 4, 239, 1, 203, 1, 128, 1, 25, 1, 0, 46, 25, 2, 56, 4, 25, 1, 12, 1, 0, 28, 1, 1 }; +static const uint8_t image_data_FontT48_0x0063_mod[306] = { 1, 1, 0, 19, 11, 1, 35, 1, 60, 5, 35, 1, 5, 1, 0, 44, 5, 1, 60, 1, 141, 1, 219, 1, 235, 1, 255, 5, 235, 1, 176, 1, 98, 1, 11, 1, 0, 41, 35, 1, 176, 1, 255, 12, 219, 1, 98, 1, 5, 1, 0, 38, 35, 1, 235, 1, 255, 15, 176, 1, 5, 1, 0, 36, 35, 1, 235, 1, 255, 17, 176, 1, 5, 1, 0, 35, 235, 1, 255, 5, 203, 1, 175, 1, 89, 4, 128, 1, 175, 1, 239, 1, 255, 5, 176, 1, 0, 34, 141, 1, 255, 4, 245, 1, 89, 1, 12, 1, 0, 7, 25, 1, 128, 1, 255, 5, 35, 1, 0, 33, 255, 4, 245, 1, 56, 1, 0, 11, 89, 1, 255, 4, 235, 1, 0, 32, 60, 1, 255, 4, 56, 1, 0, 13, 89, 1, 255, 4, 0, 32, 255, 4, 245, 1, 0, 15, 245, 1, 255, 3, 98, 1, 0, 31, 255, 4, 56, 1, 0, 15, 56, 1, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 16, 60, 1, 255, 4, 0, 31, 255, 4, 98, 1, 0, 15, 255, 4, 175, 1, 0, 31, 89, 1, 255, 4, 0, 14, 98, 1, 255, 4, 0, 33, 255, 4, 35, 1, 0, 12, 60, 1, 255, 4, 239, 1, 0, 33, 255, 3, 245, 1, 183, 1, 0, 12, 89, 1, 239, 1, 255, 3, 25, 1, 0, 33, 89, 1, 245, 1, 175, 1, 56, 1, 12, 1, 0, 13, 25, 1, 128, 1, 245, 1, 175, 1, 0, 35, 56, 1, 0, 18, 56, 1, 0, 23, 1, 1 }; +static const uint8_t image_data_FontT48_0x0064_mod[294] = { 1, 1, 0, 19, 5, 1, 11, 1, 35, 4, 11, 1, 5, 1, 0, 45, 5, 1, 60, 1, 141, 1, 176, 1, 219, 1, 235, 4, 219, 1, 176, 1, 98, 1, 35, 1, 0, 42, 35, 1, 176, 1, 255, 11, 235, 1, 141, 1, 11, 1, 0, 39, 98, 1, 235, 1, 255, 14, 219, 1, 60, 1, 0, 37, 98, 1, 255, 18, 98, 1, 0, 35, 35, 1, 255, 6, 239, 1, 203, 1, 128, 4, 175, 1, 239, 1, 255, 6, 98, 1, 0, 34, 235, 1, 255, 4, 245, 1, 128, 1, 25, 1, 12, 1, 0, 5, 25, 1, 89, 1, 203, 1, 255, 5, 11, 1, 0, 32, 11, 1, 255, 5, 56, 1, 0, 10, 12, 1, 175, 1, 255, 4, 219, 1, 0, 32, 219, 1, 255, 4, 89, 1, 0, 13, 203, 1, 255, 4, 5, 1, 0, 31, 255, 5, 0, 14, 12, 1, 255, 4, 176, 1, 0, 31, 255, 4, 89, 1, 0, 15, 175, 1, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 175, 1, 255, 3, 5, 1, 0, 15, 5, 1, 255, 3, 239, 1, 0, 32, 255, 3, 176, 1, 0, 15, 176, 1, 255, 3, 25, 1, 0, 32, 203, 1, 255, 3, 11, 1, 0, 13, 60, 1, 255, 3, 203, 1, 0, 32, 141, 1, 154, 1, 255, 3, 219, 1, 141, 13, 255, 4, 154, 1, 141, 11, 0, 21, 255, 35, 0, 21, 255, 35, 0, 21, 255, 35, 0, 21, 203, 35, 0, 21, 12, 35, 0, 10, 1, 2 }; +static const uint8_t image_data_FontT48_0x0065_mod[406] = { 1, 1, 0, 19, 11, 1, 35, 1, 60, 1, 98, 3, 60, 1, 35, 1, 5, 1, 0, 44, 5, 1, 60, 1, 141, 1, 219, 1, 235, 1, 255, 5, 235, 1, 176, 1, 98, 1, 35, 1, 0, 41, 35, 1, 176, 1, 255, 12, 235, 1, 98, 1, 5, 1, 0, 38, 60, 1, 235, 1, 255, 15, 176, 1, 11, 1, 0, 36, 35, 1, 255, 8, 245, 1, 255, 9, 219, 1, 5, 1, 0, 35, 235, 1, 255, 5, 203, 1, 128, 1, 89, 1, 56, 1, 255, 3, 89, 1, 128, 1, 239, 1, 255, 4, 176, 1, 0, 34, 141, 1, 255, 4, 239, 1, 89, 1, 12, 1, 0, 3, 255, 3, 0, 2, 25, 1, 175, 1, 255, 4, 98, 1, 0, 33, 255, 4, 239, 1, 25, 1, 0, 5, 255, 3, 0, 4, 175, 1, 255, 4, 0, 32, 60, 1, 255, 4, 25, 1, 0, 6, 255, 3, 0, 5, 255, 4, 35, 1, 0, 31, 255, 4, 239, 1, 0, 7, 255, 3, 0, 5, 128, 1, 255, 3, 235, 1, 0, 31, 255, 4, 25, 1, 0, 7, 255, 3, 0, 6, 255, 4, 0, 31, 255, 4, 0, 8, 255, 3, 0, 6, 255, 4, 0, 31, 255, 4, 0, 8, 255, 3, 0, 6, 255, 4, 0, 31, 255, 4, 0, 8, 255, 3, 0, 6, 255, 4, 0, 31, 255, 4, 0, 8, 255, 3, 0, 6, 255, 4, 0, 31, 255, 4, 11, 1, 0, 7, 255, 3, 0, 5, 141, 1, 255, 3, 245, 1, 0, 31, 89, 1, 255, 3, 219, 1, 0, 7, 255, 3, 0, 4, 11, 1, 255, 4, 56, 1, 0, 32, 255, 4, 35, 1, 0, 6, 255, 3, 0, 3, 11, 1, 219, 1, 255, 4, 0, 33, 245, 1, 255, 3, 235, 1, 35, 1, 0, 5, 255, 3, 11, 2, 98, 1, 219, 1, 255, 4, 175, 1, 0, 33, 56, 1, 255, 3, 239, 1, 155, 1, 0, 5, 255, 3, 219, 2, 255, 5, 245, 1, 0, 35, 175, 1, 239, 1, 128, 1, 25, 1, 0, 6, 255, 9, 245, 1, 56, 1, 0, 36, 25, 1, 0, 8, 255, 8, 239, 1, 56, 1, 0, 46, 255, 5, 245, 1, 203, 1, 128, 1, 25, 1, 0, 47, 89, 1, 128, 3, 89, 1, 56, 1, 12, 1, 0, 26, 1, 1 }; +static const uint8_t image_data_FontT48_0x0066_mod[142] = { 1, 1, 0, 32, 60, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 31, 141, 21, 255, 4, 141, 2, 98, 1, 60, 1, 11, 1, 0, 26, 255, 29, 219, 1, 141, 1, 11, 1, 0, 24, 255, 31, 219, 1, 35, 1, 0, 23, 255, 32, 235, 1, 11, 1, 0, 22, 175, 21, 255, 4, 175, 2, 203, 1, 245, 1, 255, 4, 219, 1, 0, 43, 255, 4, 0, 2, 12, 1, 56, 1, 203, 1, 255, 4, 35, 1, 0, 42, 255, 4, 0, 4, 12, 1, 245, 1, 255, 3, 235, 1, 0, 42, 255, 4, 0, 5, 56, 1, 255, 4, 0, 42, 255, 4, 0, 6, 255, 4, 0, 42, 203, 4, 0, 6, 255, 4, 0, 42, 12, 4, 0, 6, 255, 4, 0, 10, 1, 2 }; +static const uint8_t image_data_FontT48_0x0067_mod[588] = { 1, 1, 0, 25, 11, 1, 35, 2, 11, 1, 5, 1, 0, 29, 41, 1, 98, 1, 11, 1, 0, 7, 5, 1, 35, 2, 11, 1, 0, 5, 5, 1, 60, 1, 141, 1, 219, 1, 235, 2, 219, 1, 176, 1, 98, 1, 35, 1, 0, 27, 176, 1, 255, 1, 219, 1, 60, 1, 0, 5, 60, 1, 176, 1, 235, 2, 219, 1, 35, 1, 0, 3, 11, 1, 176, 1, 255, 8, 235, 1, 60, 1, 0, 25, 5, 1, 255, 4, 141, 1, 0, 3, 5, 1, 255, 5, 235, 1, 11, 1, 0, 1, 5, 1, 219, 1, 255, 11, 98, 1, 0, 24, 176, 1, 255, 4, 89, 1, 0, 3, 176, 1, 255, 6, 219, 1, 0, 1, 176, 1, 255, 13, 35, 1, 0, 23, 255, 4, 203, 1, 0, 4, 255, 4, 128, 1, 89, 1, 255, 2, 35, 1, 255, 4, 245, 1, 203, 1, 128, 2, 175, 1, 245, 1, 255, 4, 235, 1, 0, 22, 11, 1, 255, 4, 12, 1, 0, 4, 255, 4, 0, 2, 128, 1, 255, 1, 235, 1, 255, 3, 239, 1, 56, 1, 12, 1, 0, 3, 56, 1, 203, 1, 255, 4, 11, 1, 0, 21, 219, 1, 255, 3, 239, 1, 0, 5, 255, 4, 0, 3, 255, 5, 25, 1, 0, 6, 12, 1, 255, 4, 219, 1, 0, 21, 255, 4, 25, 1, 0, 5, 255, 4, 0, 3, 255, 4, 89, 1, 0, 8, 89, 1, 255, 4, 0, 21, 255, 4, 0, 6, 245, 1, 255, 3, 0, 3, 255, 4, 0, 10, 255, 4, 0, 21, 255, 4, 0, 6, 56, 1, 255, 3, 60, 1, 0, 2, 255, 4, 0, 10, 255, 4, 0, 21, 255, 4, 0, 7, 255, 4, 0, 2, 255, 4, 0, 10, 255, 4, 0, 21, 255, 4, 0, 7, 255, 4, 0, 2, 255, 4, 11, 1, 0, 8, 11, 1, 255, 4, 0, 21, 255, 4, 0, 7, 255, 4, 0, 2, 245, 1, 255, 3, 219, 1, 0, 8, 219, 1, 255, 3, 245, 1, 0, 21, 203, 1, 255, 3, 141, 1, 0, 6, 255, 4, 0, 2, 56, 1, 255, 4, 141, 1, 11, 1, 0, 4, 11, 1, 141, 1, 255, 4, 56, 1, 0, 21, 12, 1, 255, 4, 5, 1, 0, 4, 35, 1, 255, 4, 0, 3, 255, 5, 219, 1, 141, 1, 98, 1, 60, 1, 98, 1, 219, 1, 255, 5, 0, 23, 255, 4, 176, 1, 11, 1, 0, 2, 11, 1, 235, 1, 255, 3, 245, 1, 0, 3, 89, 1, 255, 15, 11, 1, 0, 22, 128, 1, 255, 4, 219, 1, 141, 2, 219, 1, 255, 4, 56, 1, 0, 4, 175, 1, 255, 14, 219, 1, 11, 1, 0, 22, 239, 1, 255, 10, 245, 1, 0, 6, 128, 1, 245, 1, 255, 9, 175, 1, 255, 3, 204, 1, 0, 22, 25, 1, 239, 1, 255, 8, 245, 1, 56, 1, 0, 7, 56, 1, 175, 1, 239, 1, 245, 1, 255, 2, 245, 1, 239, 1, 175, 1, 89, 1, 0, 1, 239, 1, 255, 1, 239, 1, 25, 1, 0, 23, 25, 1, 175, 1, 245, 1, 255, 5, 203, 1, 56, 1, 0, 10, 25, 1, 56, 1, 89, 2, 56, 1, 25, 1, 0, 3, 25, 1, 245, 1, 25, 1, 0, 26, 56, 1, 128, 1, 175, 2, 128, 1, 89, 1, 12, 1, 0, 21, 56, 1, 0, 21, 1, 1 }; +static const uint8_t image_data_FontT48_0x0068_mod[156] = { 1, 2, 0, 11, 5, 35, 0, 21, 176, 35, 0, 21, 255, 35, 0, 21, 255, 35, 0, 21, 255, 35, 0, 21, 128, 18, 239, 1, 255, 3, 134, 1, 128, 12, 0, 39, 25, 1, 245, 1, 255, 2, 176, 1, 0, 52, 56, 1, 255, 3, 141, 1, 0, 52, 203, 1, 255, 3, 0, 52, 12, 1, 255, 3, 98, 1, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 51, 60, 1, 255, 4, 0, 50, 5, 1, 255, 5, 0, 48, 5, 1, 35, 1, 176, 1, 255, 4, 175, 1, 0, 31, 98, 16, 141, 1, 176, 1, 235, 1, 255, 5, 0, 32, 255, 23, 128, 1, 0, 32, 255, 22, 175, 1, 0, 33, 255, 20, 239, 1, 89, 1, 0, 34, 239, 16, 203, 2, 175, 1, 89, 1, 25, 1, 0, 35, 25, 16, 12, 2, 0, 27, 1, 2 }; +static const uint8_t image_data_FontT48_0x0069_mod[92] = { 1, 1, 0, 32, 11, 4, 0, 52, 219, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 6, 5, 2, 0, 23, 98, 21, 255, 4, 0, 5, 98, 1, 176, 2, 98, 1, 0, 22, 255, 25, 0, 4, 141, 1, 255, 4, 141, 1, 0, 21, 255, 25, 0, 4, 255, 6, 0, 21, 255, 25, 0, 4, 255, 6, 0, 21, 239, 25, 0, 4, 128, 1, 255, 4, 128, 1, 0, 21, 25, 25, 0, 5, 89, 1, 175, 2, 89, 1, 0, 11, 1, 3 }; +static const uint8_t image_data_FontT48_0x006a_mod[180] = { 0, 1, 98, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 27, 60, 4, 0, 21, 255, 4, 11, 1, 0, 26, 255, 4, 0, 21, 175, 1, 255, 3, 219, 1, 0, 26, 255, 4, 0, 22, 255, 4, 11, 1, 0, 25, 255, 4, 0, 22, 255, 4, 219, 1, 35, 1, 0, 24, 255, 4, 0, 5, 35, 1, 98, 2, 35, 1, 0, 13, 128, 1, 255, 4, 235, 1, 141, 1, 98, 1, 60, 22, 255, 4, 0, 4, 60, 1, 235, 1, 255, 2, 235, 1, 60, 1, 0, 13, 245, 1, 255, 32, 0, 4, 255, 6, 0, 13, 56, 1, 245, 1, 255, 31, 0, 4, 255, 6, 0, 14, 56, 1, 203, 1, 255, 30, 0, 4, 203, 1, 255, 4, 203, 1, 0, 15, 12, 1, 89, 1, 175, 1, 203, 1, 239, 1, 245, 26, 0, 4, 12, 1, 175, 1, 239, 2, 175, 1, 12, 1, 0, 18, 12, 1, 25, 1, 56, 26, 0, 6, 25, 2, 0, 12, 1, 4 }; +static const uint8_t image_data_FontT48_0x006b_mod[284] = { 1, 2, 0, 11, 5, 35, 0, 21, 176, 35, 0, 21, 255, 35, 0, 21, 255, 35, 0, 21, 255, 35, 0, 21, 128, 9, 255, 5, 128, 21, 0, 30, 128, 1, 255, 4, 141, 1, 5, 1, 0, 50, 128, 1, 255, 4, 176, 1, 11, 1, 0, 50, 128, 1, 255, 4, 219, 1, 35, 1, 0, 49, 11, 1, 255, 5, 235, 1, 60, 1, 0, 47, 60, 1, 219, 1, 255, 7, 98, 1, 0, 44, 11, 1, 141, 1, 255, 10, 141, 1, 5, 1, 0, 40, 5, 1, 60, 1, 219, 1, 255, 5, 239, 1, 89, 1, 245, 1, 255, 4, 176, 1, 11, 1, 0, 38, 35, 1, 176, 1, 255, 5, 245, 1, 128, 1, 25, 1, 0, 1, 56, 1, 239, 1, 255, 4, 219, 1, 35, 1, 0, 35, 5, 1, 98, 1, 235, 1, 255, 5, 203, 1, 56, 1, 0, 4, 25, 1, 203, 1, 255, 4, 235, 1, 60, 1, 0, 33, 35, 1, 176, 1, 255, 5, 239, 1, 128, 1, 12, 1, 0, 6, 12, 1, 175, 1, 255, 5, 0, 31, 11, 1, 141, 1, 235, 1, 255, 5, 175, 1, 25, 1, 0, 10, 128, 1, 255, 4, 0, 31, 219, 1, 255, 5, 239, 1, 89, 1, 0, 13, 89, 1, 245, 1, 255, 2, 0, 31, 255, 4, 245, 1, 175, 1, 25, 1, 0, 15, 56, 1, 239, 1, 255, 1, 0, 31, 255, 3, 203, 1, 56, 1, 0, 18, 25, 1, 245, 1, 0, 31, 255, 1, 245, 1, 128, 1, 12, 1, 0, 20, 56, 1, 0, 31, 203, 1, 56, 1, 0, 54, 12, 1, 0, 44 }; +static const uint8_t image_data_FontT48_0x006c_mod[84] = { 1, 3, 0, 15, 35, 1, 60, 1, 98, 29, 0, 23, 11, 1, 141, 1, 235, 1, 255, 30, 0, 22, 11, 1, 219, 1, 255, 32, 0, 22, 219, 1, 255, 33, 0, 21, 5, 1, 255, 5, 245, 1, 239, 1, 203, 27, 0, 21, 176, 1, 255, 4, 175, 1, 56, 1, 25, 1, 12, 27, 0, 21, 255, 4, 203, 1, 0, 51, 255, 4, 12, 1, 0, 51, 239, 4, 0, 52, 25, 4, 0, 41, 1, 1 }; +static const uint8_t image_data_FontT48_0x006d_mod[262] = { 1, 2, 0, 11, 5, 25, 0, 31, 176, 25, 0, 31, 255, 25, 0, 31, 255, 25, 0, 31, 255, 23, 203, 1, 89, 1, 0, 31, 175, 18, 239, 1, 255, 3, 100, 1, 12, 1, 0, 50, 25, 1, 239, 1, 255, 2, 219, 1, 5, 1, 0, 51, 25, 1, 255, 3, 176, 1, 0, 52, 175, 1, 255, 3, 5, 1, 0, 52, 255, 3, 176, 1, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 51, 98, 1, 255, 4, 0, 50, 11, 1, 255, 5, 0, 31, 35, 18, 60, 1, 219, 1, 255, 4, 239, 1, 0, 31, 235, 18, 255, 6, 25, 1, 0, 31, 255, 23, 245, 1, 0, 32, 255, 23, 56, 1, 0, 32, 255, 22, 100, 1, 0, 33, 89, 18, 175, 1, 255, 3, 219, 1, 5, 1, 0, 51, 128, 1, 255, 3, 176, 1, 0, 52, 239, 1, 255, 3, 0, 52, 25, 1, 255, 3, 98, 1, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 51, 35, 1, 255, 4, 0, 50, 5, 1, 235, 1, 255, 4, 0, 48, 5, 1, 35, 1, 176, 1, 255, 4, 239, 1, 0, 31, 98, 16, 141, 1, 176, 1, 235, 1, 255, 5, 25, 1, 0, 31, 255, 23, 203, 1, 0, 32, 255, 22, 239, 1, 12, 1, 0, 32, 255, 20, 245, 1, 175, 1, 25, 1, 0, 33, 203, 18, 175, 1, 128, 1, 56, 1, 0, 35, 12, 18, 0, 27, 1, 2 }; +static const uint8_t image_data_FontT48_0x006e_mod[170] = { 1, 2, 0, 11, 5, 25, 0, 31, 176, 25, 0, 31, 255, 25, 0, 31, 255, 25, 0, 31, 255, 22, 245, 1, 203, 1, 89, 1, 0, 31, 128, 18, 239, 1, 255, 3, 61, 1, 12, 1, 0, 50, 25, 1, 245, 1, 255, 2, 176, 1, 5, 1, 0, 51, 56, 1, 255, 3, 176, 1, 0, 52, 203, 1, 255, 3, 5, 1, 0, 51, 12, 1, 255, 3, 176, 1, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 51, 35, 1, 255, 4, 0, 50, 5, 1, 235, 1, 255, 4, 0, 48, 5, 1, 35, 1, 176, 1, 255, 4, 239, 1, 0, 31, 98, 15, 141, 2, 176, 1, 235, 1, 255, 5, 25, 1, 0, 31, 255, 23, 203, 1, 0, 32, 255, 22, 203, 1, 12, 1, 0, 32, 255, 20, 239, 1, 128, 1, 12, 1, 0, 33, 203, 17, 175, 2, 89, 1, 25, 1, 0, 35, 12, 17, 0, 28, 1, 2 }; +static const uint8_t image_data_FontT48_0x006f_mod[354] = { 1, 1, 0, 19, 11, 1, 35, 1, 60, 5, 35, 1, 11, 1, 0, 44, 5, 1, 60, 1, 141, 1, 219, 1, 235, 1, 255, 5, 235, 1, 219, 1, 141, 1, 60, 1, 5, 1, 0, 40, 35, 1, 176, 1, 255, 13, 176, 1, 35, 1, 0, 38, 98, 1, 235, 1, 255, 15, 235, 1, 60, 1, 0, 36, 98, 1, 255, 19, 60, 1, 0, 34, 11, 1, 255, 5, 245, 1, 203, 1, 128, 1, 89, 5, 175, 1, 203, 1, 255, 6, 5, 1, 0, 33, 219, 1, 255, 4, 175, 1, 56, 1, 12, 1, 0, 7, 12, 1, 89, 1, 239, 1, 255, 4, 176, 1, 0, 33, 255, 4, 128, 1, 0, 12, 25, 1, 203, 1, 255, 4, 0, 32, 141, 1, 255, 3, 245, 1, 0, 14, 12, 1, 255, 4, 98, 1, 0, 31, 255, 4, 56, 1, 0, 15, 128, 1, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 60, 1, 0, 15, 11, 1, 255, 4, 0, 31, 203, 1, 255, 4, 0, 15, 219, 1, 255, 3, 239, 1, 0, 31, 12, 1, 255, 4, 141, 1, 5, 1, 0, 12, 98, 1, 255, 4, 25, 1, 0, 32, 245, 1, 255, 4, 176, 1, 35, 1, 5, 1, 0, 8, 11, 1, 98, 1, 255, 5, 0, 33, 56, 1, 255, 5, 235, 1, 176, 1, 98, 1, 60, 1, 35, 3, 60, 1, 98, 1, 141, 1, 219, 1, 255, 5, 89, 1, 0, 34, 128, 1, 255, 8, 235, 3, 255, 8, 175, 1, 0, 36, 128, 1, 255, 17, 175, 1, 0, 38, 89, 1, 239, 1, 255, 13, 239, 1, 128, 1, 0, 40, 25, 1, 128, 1, 203, 1, 239, 1, 255, 7, 245, 1, 203, 1, 128, 1, 25, 1, 0, 43, 12, 1, 25, 1, 89, 2, 128, 4, 89, 1, 56, 1, 12, 1, 0, 27, 1, 1 }; +static const uint8_t image_data_FontT48_0x0070_mod[296] = { 1, 2, 0, 1, 5, 35, 0, 21, 176, 35, 0, 21, 255, 35, 0, 21, 255, 35, 0, 21, 255, 35, 0, 21, 175, 11, 188, 1, 255, 3, 203, 1, 175, 13, 245, 1, 255, 3, 175, 2, 0, 32, 219, 1, 255, 3, 12, 1, 0, 13, 56, 1, 255, 3, 98, 1, 0, 32, 5, 1, 255, 3, 128, 1, 0, 15, 239, 1, 255, 3, 0, 32, 176, 1, 255, 3, 0, 16, 25, 1, 255, 3, 98, 1, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 60, 1, 0, 15, 11, 1, 255, 4, 0, 31, 255, 5, 0, 15, 219, 1, 255, 4, 0, 31, 128, 1, 255, 4, 60, 1, 0, 13, 11, 1, 255, 4, 203, 1, 0, 32, 255, 5, 35, 1, 0, 11, 11, 1, 219, 1, 255, 4, 12, 1, 0, 32, 203, 1, 255, 4, 235, 1, 98, 1, 11, 1, 0, 7, 11, 1, 60, 1, 219, 1, 255, 4, 245, 1, 0, 33, 12, 1, 255, 6, 219, 1, 141, 1, 98, 2, 60, 1, 98, 2, 141, 1, 219, 1, 255, 6, 56, 1, 0, 34, 89, 1, 255, 19, 128, 1, 0, 36, 89, 1, 239, 1, 255, 16, 128, 1, 0, 38, 25, 1, 175, 1, 245, 1, 255, 12, 203, 1, 89, 1, 0, 41, 56, 1, 128, 1, 203, 1, 239, 1, 245, 1, 255, 3, 245, 1, 239, 1, 203, 1, 175, 1, 89, 1, 12, 1, 0, 44, 12, 1, 25, 1, 56, 1, 89, 3, 56, 1, 25, 1, 12, 1, 0, 28, 1, 1 }; +static const uint8_t image_data_FontT48_0x0071_mod[290] = { 1, 1, 0, 19, 5, 1, 11, 1, 35, 5, 11, 1, 0, 45, 5, 1, 35, 1, 98, 1, 176, 1, 219, 1, 235, 5, 219, 1, 141, 1, 98, 1, 11, 1, 0, 41, 35, 1, 176, 1, 235, 1, 255, 11, 219, 1, 98, 1, 5, 1, 0, 38, 98, 1, 235, 1, 255, 15, 176, 1, 11, 1, 0, 36, 98, 1, 255, 18, 219, 1, 5, 1, 0, 34, 35, 1, 255, 6, 245, 1, 203, 1, 175, 1, 128, 3, 175, 1, 203, 1, 245, 1, 255, 5, 176, 1, 0, 34, 235, 1, 255, 5, 175, 1, 56, 1, 12, 1, 0, 5, 12, 1, 56, 1, 175, 1, 255, 5, 60, 1, 0, 32, 5, 1, 255, 5, 89, 1, 0, 11, 128, 1, 255, 5, 0, 32, 176, 1, 255, 4, 128, 1, 0, 13, 128, 1, 255, 4, 11, 1, 0, 31, 255, 5, 0, 15, 255, 4, 219, 1, 0, 31, 255, 4, 89, 1, 0, 15, 89, 1, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 203, 1, 255, 3, 0, 17, 255, 3, 245, 1, 0, 31, 12, 1, 255, 3, 60, 1, 0, 15, 141, 1, 255, 3, 56, 1, 0, 32, 203, 1, 255, 3, 0, 14, 5, 1, 255, 4, 0, 22, 98, 11, 111, 1, 255, 3, 98, 14, 176, 1, 255, 3, 89, 1, 0, 22, 255, 33, 141, 1, 35, 1, 0, 21, 255, 34, 235, 1, 0, 21, 255, 35, 0, 21, 203, 35, 0, 21, 12, 35, 0, 20, 1, 2 }; +static const uint8_t image_data_FontT48_0x0072_mod[120] = { 1, 3, 0, 11, 60, 25, 0, 31, 255, 25, 0, 31, 255, 25, 0, 31, 255, 25, 0, 31, 239, 15, 245, 1, 255, 5, 239, 4, 0, 31, 25, 15, 56, 1, 89, 1, 203, 1, 255, 3, 168, 1, 30, 1, 25, 2, 0, 48, 12, 1, 89, 1, 255, 3, 176, 1, 0, 52, 89, 1, 255, 3, 141, 1, 0, 52, 175, 1, 255, 3, 5, 1, 0, 52, 255, 3, 176, 1, 0, 52, 255, 4, 0, 52, 255, 4, 0, 51, 11, 1, 255, 4, 0, 51, 210, 1, 255, 4, 0, 51, 56, 1, 128, 1, 203, 1, 255, 2, 0, 53, 12, 1, 89, 1, 175, 1, 0, 20, 1, 1 }; +static const uint8_t image_data_FontT48_0x0073_mod[308] = { 1, 1, 0, 12, 41, 1, 60, 1, 11, 1, 0, 12, 11, 1, 60, 3, 35, 1, 5, 1, 0, 35, 176, 1, 255, 1, 219, 1, 141, 1, 35, 1, 0, 9, 98, 1, 219, 1, 255, 3, 235, 1, 176, 1, 35, 1, 0, 34, 255, 4, 183, 1, 0, 8, 141, 1, 255, 7, 235, 1, 11, 1, 0, 32, 35, 1, 255, 4, 12, 1, 0, 7, 98, 1, 255, 9, 219, 1, 0, 32, 235, 1, 255, 4, 0, 7, 11, 1, 255, 11, 5, 1, 0, 31, 255, 4, 89, 1, 0, 7, 219, 1, 255, 3, 239, 1, 128, 1, 89, 1, 128, 1, 255, 4, 176, 1, 0, 31, 255, 4, 0, 7, 5, 1, 255, 4, 25, 1, 0, 3, 175, 1, 255, 4, 0, 31, 255, 4, 0, 7, 176, 1, 255, 3, 89, 1, 0, 5, 255, 4, 0, 31, 255, 4, 0, 7, 255, 4, 0, 6, 255, 4, 0, 31, 255, 4, 0, 6, 141, 1, 255, 3, 175, 1, 0, 6, 255, 4, 0, 31, 255, 4, 98, 1, 0, 4, 60, 1, 255, 4, 0, 7, 255, 4, 0, 31, 175, 1, 255, 4, 98, 1, 35, 2, 98, 1, 255, 4, 239, 1, 0, 6, 98, 1, 255, 3, 203, 1, 0, 32, 255, 5, 235, 2, 255, 5, 25, 1, 0, 6, 255, 4, 12, 1, 0, 32, 203, 1, 255, 10, 175, 1, 0, 6, 98, 1, 255, 4, 0, 33, 12, 1, 239, 1, 255, 8, 203, 1, 0, 7, 89, 1, 175, 1, 203, 1, 245, 1, 175, 1, 0, 34, 25, 1, 175, 1, 245, 1, 255, 4, 245, 1, 175, 1, 12, 1, 0, 9, 12, 1, 56, 1, 0, 37, 56, 1, 128, 1, 175, 1, 128, 2, 56, 1, 0, 35, 1, 1 }; +static const uint8_t image_data_FontT48_0x0074_mod[170] = { 1, 1, 0, 32, 35, 4, 0, 52, 235, 4, 0, 52, 255, 4, 0, 35, 5, 1, 11, 1, 35, 1, 60, 14, 255, 4, 60, 5, 0, 29, 60, 1, 176, 1, 219, 1, 235, 1, 255, 23, 141, 1, 0, 27, 98, 1, 255, 28, 0, 26, 98, 1, 255, 29, 35, 1, 0, 24, 5, 1, 255, 7, 245, 13, 255, 4, 245, 6, 226, 1, 0, 24, 176, 1, 255, 4, 239, 1, 128, 1, 89, 1, 56, 13, 255, 4, 56, 7, 0, 24, 255, 4, 245, 1, 25, 1, 0, 15, 255, 4, 0, 31, 255, 4, 56, 1, 0, 16, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 0, 17, 255, 4, 0, 31, 255, 4, 5, 1, 0, 16, 239, 4, 0, 31, 203, 1, 255, 3, 176, 1, 0, 16, 25, 4, 0, 31, 12, 1, 175, 2, 128, 1, 89, 1, 0, 40, 1, 1 }; +static const uint8_t image_data_FontT48_0x0075_mod[160] = { 1, 2, 0, 17, 5, 1, 11, 1, 35, 17, 0, 34, 5, 1, 60, 1, 141, 1, 176, 1, 219, 1, 235, 17, 0, 33, 35, 1, 176, 1, 255, 21, 0, 32, 11, 1, 235, 1, 255, 22, 0, 32, 219, 1, 255, 23, 0, 31, 11, 1, 255, 5, 203, 1, 128, 1, 89, 17, 0, 31, 219, 1, 255, 4, 128, 1, 12, 1, 0, 49, 255, 4, 203, 1, 0, 51, 255, 4, 12, 1, 0, 51, 255, 4, 0, 52, 255, 4, 0, 52, 255, 4, 0, 52, 89, 1, 255, 3, 11, 1, 0, 52, 255, 3, 219, 1, 0, 52, 175, 1, 255, 3, 60, 1, 0, 52, 239, 1, 255, 3, 35, 1, 0, 49, 60, 2, 85, 1, 255, 3, 235, 1, 98, 1, 60, 17, 0, 31, 255, 25, 0, 31, 255, 25, 0, 31, 255, 25, 0, 31, 245, 25, 0, 31, 56, 25, 0, 20, 1, 2 }; +static const uint8_t image_data_FontT48_0x0076_mod[336] = { 1, 1, 0, 32, 11, 1, 60, 1, 176, 1, 255, 1, 0, 50, 11, 1, 98, 1, 219, 1, 255, 3, 0, 47, 5, 1, 35, 1, 141, 1, 219, 1, 255, 5, 0, 45, 11, 1, 60, 1, 176, 1, 235, 1, 255, 7, 0, 43, 11, 1, 98, 1, 219, 1, 255, 8, 239, 1, 175, 1, 0, 40, 5, 1, 35, 1, 141, 1, 219, 1, 255, 7, 245, 1, 203, 1, 89, 1, 25, 1, 0, 39, 5, 1, 60, 1, 176, 1, 235, 1, 255, 7, 239, 1, 128, 1, 56, 1, 12, 1, 0, 39, 11, 1, 98, 1, 176, 1, 255, 7, 245, 1, 175, 1, 89, 1, 25, 1, 0, 39, 5, 1, 35, 1, 141, 1, 219, 1, 255, 7, 203, 1, 128, 1, 56, 1, 0, 40, 5, 1, 60, 1, 176, 1, 235, 1, 255, 6, 239, 1, 175, 1, 89, 1, 12, 1, 0, 42, 176, 1, 255, 7, 203, 1, 89, 1, 25, 1, 0, 45, 175, 1, 245, 1, 255, 6, 154, 1, 60, 1, 5, 1, 0, 46, 56, 1, 175, 1, 239, 1, 255, 6, 176, 1, 98, 1, 35, 1, 0, 46, 25, 1, 128, 1, 239, 1, 255, 6, 235, 1, 141, 1, 60, 1, 5, 1, 0, 45, 25, 1, 89, 1, 203, 1, 255, 7, 176, 1, 98, 1, 35, 1, 0, 45, 12, 1, 89, 1, 175, 1, 245, 1, 255, 6, 235, 1, 141, 1, 60, 1, 11, 1, 0, 45, 56, 1, 128, 1, 239, 1, 255, 7, 219, 1, 98, 1, 35, 1, 0, 45, 25, 1, 128, 1, 203, 1, 255, 7, 235, 1, 141, 1, 60, 1, 0, 45, 12, 1, 89, 1, 203, 1, 245, 1, 255, 7, 0, 47, 12, 1, 56, 1, 175, 1, 245, 1, 255, 5, 0, 50, 56, 1, 128, 1, 239, 1, 255, 3, 0, 52, 25, 1, 128, 1, 203, 1, 255, 1, 0, 54, 12, 1, 89, 1, 0, 20 }; +static const uint8_t image_data_FontT48_0x0077_mod[580] = { 0, 34, 11, 1, 60, 1, 0, 51, 5, 1, 35, 1, 141, 1, 219, 1, 255, 1, 0, 48, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 3, 0, 46, 35, 1, 98, 1, 176, 1, 235, 1, 255, 6, 0, 43, 11, 1, 60, 1, 141, 1, 235, 1, 255, 9, 0, 40, 11, 1, 60, 1, 141, 1, 219, 1, 255, 9, 245, 1, 203, 1, 128, 1, 0, 37, 5, 1, 35, 1, 98, 1, 219, 1, 255, 9, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 35, 5, 1, 35, 1, 98, 1, 176, 1, 235, 1, 255, 8, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 36, 11, 1, 60, 1, 176, 1, 235, 1, 255, 8, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 38, 141, 1, 219, 1, 255, 8, 245, 1, 203, 1, 128, 1, 56, 1, 12, 1, 0, 41, 203, 1, 255, 8, 168, 1, 56, 1, 12, 1, 0, 44, 12, 1, 89, 1, 203, 1, 245, 1, 255, 5, 235, 1, 141, 1, 60, 1, 5, 1, 0, 45, 12, 1, 56, 1, 175, 1, 239, 1, 255, 6, 176, 1, 98, 1, 11, 1, 0, 46, 25, 1, 128, 1, 239, 1, 255, 6, 219, 1, 141, 1, 35, 1, 5, 1, 0, 45, 25, 1, 89, 1, 203, 1, 255, 6, 235, 1, 176, 1, 60, 1, 11, 1, 0, 45, 12, 1, 89, 1, 175, 1, 245, 1, 255, 6, 219, 1, 98, 1, 35, 1, 0, 46, 56, 1, 175, 1, 239, 1, 255, 6, 235, 1, 141, 1, 60, 1, 5, 1, 0, 45, 25, 1, 128, 1, 255, 8, 176, 1, 0, 45, 11, 1, 98, 1, 255, 7, 245, 1, 175, 1, 0, 43, 35, 1, 141, 1, 219, 1, 255, 6, 239, 1, 128, 1, 56, 1, 0, 41, 5, 1, 60, 1, 141, 1, 235, 1, 255, 6, 203, 1, 89, 1, 25, 1, 0, 41, 11, 1, 60, 1, 176, 1, 255, 6, 245, 1, 175, 1, 89, 1, 12, 1, 0, 41, 11, 1, 98, 1, 219, 1, 255, 6, 239, 1, 128, 1, 56, 1, 0, 41, 5, 1, 35, 1, 141, 1, 219, 1, 255, 6, 203, 1, 128, 1, 25, 1, 0, 41, 5, 1, 60, 1, 176, 1, 235, 1, 255, 5, 245, 1, 175, 1, 89, 1, 12, 1, 0, 43, 176, 1, 255, 8, 159, 1, 11, 1, 0, 45, 175, 1, 239, 1, 255, 8, 219, 1, 141, 1, 60, 1, 11, 1, 0, 43, 25, 1, 89, 1, 203, 1, 245, 1, 255, 8, 219, 1, 141, 1, 60, 1, 11, 1, 0, 42, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 8, 219, 1, 98, 1, 35, 1, 5, 1, 0, 42, 12, 1, 56, 1, 128, 1, 239, 1, 255, 8, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 42, 25, 1, 89, 1, 175, 1, 239, 1, 255, 8, 235, 1, 176, 1, 60, 1, 11, 1, 0, 43, 25, 1, 89, 1, 175, 1, 245, 1, 255, 8, 219, 1, 0, 46, 56, 1, 128, 1, 203, 1, 245, 1, 255, 6, 0, 48, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 3, 0, 51, 12, 1, 56, 1, 175, 1, 239, 1, 255, 1, 0, 54, 25, 1, 89, 1, 0, 20 }; +static const uint8_t image_data_FontT48_0x0078_mod[396] = { 0, 11, 98, 1, 0, 23, 5, 1, 0, 31, 255, 1, 141, 1, 11, 1, 0, 20, 5, 1, 176, 1, 0, 31, 255, 2, 219, 1, 35, 1, 0, 18, 35, 1, 176, 1, 255, 1, 0, 31, 255, 3, 235, 1, 98, 1, 5, 1, 0, 14, 5, 1, 98, 1, 235, 1, 255, 2, 0, 31, 255, 5, 176, 1, 35, 1, 0, 12, 35, 1, 176, 1, 255, 4, 0, 31, 203, 1, 255, 5, 235, 1, 98, 1, 0, 10, 98, 1, 235, 1, 255, 5, 0, 31, 12, 1, 128, 1, 245, 1, 255, 5, 141, 1, 11, 1, 0, 6, 11, 1, 141, 1, 255, 5, 245, 1, 128, 1, 0, 33, 56, 1, 239, 1, 255, 5, 219, 1, 60, 1, 0, 4, 60, 1, 219, 1, 255, 5, 203, 1, 56, 1, 0, 35, 25, 1, 175, 1, 255, 6, 141, 1, 11, 2, 141, 1, 255, 6, 128, 1, 12, 1, 0, 38, 89, 1, 239, 1, 255, 5, 219, 2, 255, 5, 239, 1, 89, 1, 0, 41, 25, 1, 175, 1, 255, 10, 175, 1, 25, 1, 0, 44, 89, 1, 255, 8, 89, 1, 0, 45, 5, 1, 98, 1, 255, 8, 60, 1, 0, 44, 35, 1, 176, 1, 255, 10, 141, 1, 11, 1, 0, 41, 60, 1, 235, 1, 255, 5, 239, 1, 203, 1, 255, 5, 219, 1, 60, 1, 0, 38, 11, 1, 141, 1, 255, 6, 175, 1, 25, 1, 12, 1, 128, 1, 245, 1, 255, 5, 141, 1, 5, 1, 0, 35, 60, 1, 219, 1, 255, 5, 239, 1, 89, 1, 0, 4, 56, 1, 239, 1, 255, 5, 176, 1, 35, 1, 0, 32, 11, 1, 141, 1, 255, 6, 175, 1, 25, 1, 0, 6, 25, 1, 175, 1, 255, 5, 235, 1, 98, 1, 0, 31, 219, 1, 255, 5, 245, 1, 128, 1, 0, 10, 89, 1, 239, 1, 255, 5, 0, 31, 255, 5, 203, 1, 56, 1, 0, 12, 25, 1, 175, 1, 255, 4, 0, 31, 255, 3, 245, 1, 128, 1, 12, 1, 0, 15, 89, 1, 245, 1, 255, 2, 0, 31, 255, 2, 239, 1, 56, 1, 0, 18, 56, 1, 203, 1, 255, 1, 0, 31, 255, 1, 175, 1, 25, 1, 0, 20, 12, 1, 175, 1, 0, 20, 1, 1 }; +static const uint8_t image_data_FontT48_0x0079_mod[432] = { 0, 34, 11, 1, 60, 1, 0, 51, 5, 1, 35, 1, 98, 1, 219, 1, 255, 1, 0, 21, 5, 4, 0, 24, 11, 1, 60, 1, 176, 1, 235, 1, 255, 3, 0, 21, 176, 4, 0, 21, 5, 1, 35, 1, 141, 1, 219, 1, 255, 6, 0, 21, 255, 4, 0, 19, 11, 1, 98, 1, 176, 1, 235, 1, 255, 7, 245, 1, 0, 21, 255, 4, 5, 1, 0, 15, 5, 1, 60, 1, 141, 1, 219, 1, 255, 8, 239, 1, 175, 1, 56, 1, 0, 21, 175, 1, 255, 3, 176, 1, 0, 13, 35, 1, 98, 1, 176, 1, 255, 8, 245, 1, 175, 1, 89, 1, 25, 1, 0, 24, 255, 4, 5, 1, 0, 9, 11, 1, 60, 1, 141, 1, 235, 1, 255, 8, 203, 1, 128, 1, 56, 1, 0, 27, 245, 1, 255, 3, 176, 1, 5, 1, 0, 5, 5, 1, 35, 1, 98, 1, 219, 1, 255, 8, 239, 1, 175, 1, 89, 1, 12, 1, 0, 29, 56, 1, 255, 4, 176, 1, 60, 1, 35, 2, 60, 1, 98, 1, 176, 1, 235, 1, 255, 7, 245, 1, 203, 1, 89, 1, 25, 1, 0, 33, 175, 1, 255, 5, 235, 2, 255, 9, 203, 1, 128, 1, 56, 1, 12, 1, 0, 36, 175, 1, 255, 12, 239, 1, 175, 1, 89, 1, 12, 1, 0, 40, 128, 1, 203, 1, 255, 10, 85, 1, 11, 1, 0, 43, 12, 1, 89, 1, 175, 1, 239, 1, 255, 8, 219, 1, 141, 1, 60, 1, 5, 1, 0, 43, 25, 1, 89, 1, 175, 1, 239, 1, 255, 8, 176, 1, 98, 1, 35, 1, 5, 1, 0, 43, 25, 1, 128, 1, 203, 1, 245, 1, 255, 7, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 42, 12, 1, 56, 1, 128, 1, 203, 1, 255, 8, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 42, 12, 1, 89, 1, 175, 1, 239, 1, 255, 8, 235, 1, 176, 1, 98, 1, 35, 1, 5, 1, 0, 42, 25, 1, 89, 1, 175, 1, 239, 1, 255, 8, 235, 1, 176, 1, 98, 1, 35, 1, 0, 43, 25, 1, 128, 1, 203, 1, 245, 1, 255, 8, 235, 1, 0, 45, 12, 1, 56, 1, 128, 1, 203, 1, 245, 1, 255, 6, 0, 48, 12, 1, 56, 1, 175, 1, 239, 1, 255, 4, 0, 51, 25, 1, 89, 1, 175, 1, 239, 1, 255, 1, 0, 54, 25, 1, 128, 1, 0, 20 }; +static const uint8_t image_data_FontT48_0x007a_mod[330] = { 0, 11, 11, 1, 5, 1, 0, 19, 5, 4, 0, 31, 219, 1, 176, 1, 35, 1, 0, 18, 176, 4, 0, 31, 255, 2, 235, 1, 60, 1, 0, 17, 255, 4, 0, 31, 255, 4, 141, 1, 11, 1, 0, 15, 255, 4, 0, 31, 255, 5, 219, 1, 35, 1, 0, 14, 255, 4, 0, 31, 255, 6, 235, 1, 98, 1, 5, 1, 0, 12, 255, 4, 0, 31, 255, 8, 176, 1, 11, 1, 0, 11, 255, 4, 0, 31, 255, 9, 219, 1, 60, 1, 0, 10, 255, 4, 0, 31, 255, 4, 89, 1, 239, 1, 255, 5, 141, 1, 11, 1, 0, 8, 255, 4, 0, 31, 255, 4, 0, 1, 25, 1, 175, 1, 255, 5, 219, 1, 35, 1, 0, 7, 255, 4, 0, 31, 255, 4, 0, 3, 89, 1, 239, 1, 255, 4, 235, 1, 98, 1, 5, 1, 0, 5, 255, 4, 0, 31, 255, 4, 0, 4, 25, 1, 203, 1, 255, 5, 176, 1, 11, 1, 0, 4, 255, 4, 0, 31, 255, 4, 0, 5, 12, 1, 128, 1, 245, 1, 255, 4, 219, 1, 60, 1, 0, 3, 255, 4, 0, 31, 255, 4, 0, 7, 56, 1, 203, 1, 255, 5, 141, 1, 5, 1, 0, 1, 255, 4, 0, 31, 255, 4, 0, 8, 12, 1, 128, 1, 255, 5, 176, 1, 35, 1, 255, 4, 0, 31, 255, 4, 0, 10, 89, 1, 239, 1, 255, 4, 235, 1, 255, 4, 0, 31, 255, 4, 0, 11, 25, 1, 175, 1, 255, 8, 0, 31, 255, 4, 0, 13, 89, 1, 239, 1, 255, 6, 0, 31, 255, 4, 0, 14, 25, 1, 175, 1, 255, 5, 0, 31, 255, 4, 0, 16, 128, 1, 245, 1, 255, 3, 0, 31, 255, 4, 0, 17, 56, 1, 203, 1, 255, 2, 0, 31, 203, 4, 0, 18, 12, 1, 128, 1, 175, 1, 0, 31, 12, 4, 0, 41 }; +static const uint8_t image_data_FontT48_0x007b_mod[356] = { 0, 23, 35, 2, 0, 54, 235, 2, 0, 53, 5, 1, 255, 2, 11, 1, 0, 36, 5, 1, 11, 2, 5, 1, 0, 12, 176, 1, 255, 2, 219, 1, 0, 11, 5, 1, 11, 2, 0, 20, 11, 1, 98, 1, 176, 1, 219, 2, 176, 1, 141, 1, 98, 1, 35, 1, 5, 1, 0, 7, 60, 1, 255, 2, 239, 1, 255, 1, 98, 1, 0, 7, 11, 1, 60, 1, 141, 1, 176, 1, 219, 2, 141, 1, 35, 1, 0, 17, 11, 1, 219, 1, 255, 7, 235, 1, 176, 1, 141, 1, 60, 1, 35, 4, 98, 1, 255, 3, 25, 1, 255, 2, 141, 1, 60, 1, 35, 3, 98, 1, 141, 1, 219, 1, 255, 6, 235, 1, 35, 1, 0, 16, 219, 1, 255, 12, 235, 4, 255, 3, 239, 1, 0, 1, 175, 1, 255, 3, 235, 3, 255, 10, 235, 1, 5, 1, 0, 14, 141, 1, 255, 20, 25, 1, 0, 2, 239, 1, 255, 16, 176, 1, 0, 14, 255, 6, 203, 1, 175, 2, 203, 1, 239, 1, 245, 1, 255, 7, 245, 1, 89, 1, 0, 3, 25, 1, 239, 1, 255, 6, 245, 1, 239, 1, 175, 2, 203, 1, 245, 1, 255, 4, 0, 13, 60, 1, 255, 4, 239, 1, 89, 1, 12, 1, 0, 2, 12, 1, 25, 1, 56, 1, 128, 1, 175, 1, 239, 1, 245, 3, 203, 1, 56, 1, 0, 5, 25, 1, 175, 1, 245, 3, 203, 1, 128, 1, 56, 1, 25, 1, 0, 2, 12, 1, 56, 1, 255, 4, 98, 1, 0, 12, 255, 5, 25, 1, 0, 9, 25, 1, 56, 3, 12, 1, 0, 8, 56, 3, 12, 1, 0, 7, 89, 1, 255, 4, 0, 12, 255, 4, 175, 1, 0, 35, 255, 4, 0, 12, 255, 4, 0, 36, 255, 4, 0, 12, 255, 4, 0, 36, 255, 4, 0, 12, 255, 4, 0, 36, 255, 4, 0, 12, 255, 4, 0, 36, 255, 4, 0, 12, 239, 4, 0, 36, 239, 4, 0, 12, 25, 4, 0, 36, 25, 4, 0, 11 }; +static const uint8_t image_data_FontT48_0x007c_mod[26] = { 1, 10, 0, 5, 60, 39, 0, 17, 255, 39, 0, 17, 255, 39, 0, 17, 245, 39, 0, 17, 56, 39, 0, 12, 1, 10 }; +static const uint8_t image_data_FontT48_0x007d_mod[376] = { 0, 1, 35, 4, 0, 36, 35, 4, 0, 12, 235, 4, 0, 36, 235, 4, 0, 12, 255, 4, 0, 36, 255, 4, 0, 12, 255, 4, 0, 36, 255, 4, 0, 12, 255, 4, 0, 36, 255, 4, 0, 12, 255, 4, 11, 1, 0, 35, 255, 4, 0, 12, 255, 4, 219, 1, 0, 35, 255, 4, 0, 12, 239, 1, 255, 4, 60, 1, 0, 8, 5, 1, 35, 1, 60, 1, 98, 1, 60, 1, 11, 1, 0, 7, 11, 1, 60, 1, 98, 1, 60, 1, 11, 1, 5, 1, 0, 6, 98, 1, 255, 4, 0, 12, 25, 1, 255, 5, 98, 1, 35, 1, 11, 1, 5, 1, 11, 1, 35, 1, 60, 1, 141, 1, 176, 1, 235, 1, 255, 3, 219, 1, 60, 1, 0, 5, 35, 1, 219, 1, 255, 3, 219, 1, 176, 1, 60, 1, 35, 1, 11, 1, 5, 1, 11, 1, 98, 1, 255, 4, 89, 1, 0, 13, 255, 6, 235, 1, 219, 1, 176, 1, 219, 1, 235, 1, 255, 9, 98, 1, 0, 3, 35, 1, 235, 1, 255, 7, 235, 1, 219, 1, 176, 1, 219, 1, 255, 5, 0, 14, 89, 1, 255, 20, 35, 1, 0, 1, 5, 1, 235, 1, 255, 16, 175, 1, 0, 15, 203, 1, 255, 11, 245, 1, 239, 1, 203, 2, 239, 1, 255, 3, 235, 1, 0, 1, 176, 1, 255, 2, 245, 1, 239, 1, 203, 1, 239, 1, 255, 10, 239, 1, 0, 16, 12, 1, 175, 1, 255, 6, 245, 1, 239, 1, 175, 1, 128, 1, 56, 1, 25, 1, 12, 2, 25, 1, 89, 1, 239, 1, 255, 2, 35, 1, 255, 2, 128, 1, 56, 1, 25, 1, 12, 1, 25, 1, 89, 1, 128, 1, 203, 1, 245, 1, 255, 5, 239, 1, 25, 1, 0, 18, 89, 1, 175, 1, 203, 2, 175, 1, 128, 1, 56, 1, 25, 1, 0, 8, 25, 1, 255, 2, 235, 1, 255, 1, 89, 1, 0, 7, 12, 1, 56, 1, 128, 1, 175, 1, 203, 1, 175, 1, 128, 1, 25, 1, 0, 21, 12, 2, 0, 13, 175, 1, 255, 2, 203, 1, 0, 12, 12, 1, 0, 17, 1, 3 }; +static const uint8_t image_data_FontT48_0x007e_mod[130] = { 1, 3, 0, 24, 35, 1, 11, 1, 0, 54, 235, 1, 219, 1, 98, 1, 5, 1, 0, 52, 239, 1, 255, 2, 176, 1, 5, 1, 0, 51, 25, 1, 203, 1, 255, 2, 176, 1, 0, 52, 12, 1, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 0, 52, 141, 1, 255, 2, 245, 1, 0, 52, 255, 3, 56, 1, 0, 52, 255, 3, 0, 52, 98, 1, 255, 2, 245, 1, 0, 52, 255, 3, 56, 1, 0, 52, 255, 3, 0, 53, 255, 3, 0, 53, 255, 3, 11, 1, 0, 52, 128, 1, 255, 2, 219, 1, 35, 1, 0, 52, 128, 1, 245, 1, 255, 1, 235, 1, 0, 53, 56, 1, 175, 1, 203, 1, 0, 27, 1, 4 }; + +static const tImageComp FontT48_0x00b0_mod = { image_data_FontT48_0x00b0, image_data_FontT48_0x00b0_mod, 146, 14, 56 }; +static const tImageComp FontT48_0x0020_mod = { image_data_FontT48_0x0020, image_data_FontT48_0x0020_mod, 2, 14, 56 }; +static const tImageComp FontT48_0x0021_mod = { image_data_FontT48_0x0021, image_data_FontT48_0x0021_mod, 154, 18, 56 }; +static const tImageComp FontT48_0x0022_mod = { image_data_FontT48_0x0022, image_data_FontT48_0x0022_mod, 94, 16, 56 }; +static const tImageComp FontT48_0x0023_mod = { image_data_FontT48_0x0023, image_data_FontT48_0x0023_mod, 546, 26, 56 }; +static const tImageComp FontT48_0x0024_mod = { image_data_FontT48_0x0024, image_data_FontT48_0x0024_mod, 400, 25, 56 }; +static const tImageComp FontT48_0x0025_mod = { image_data_FontT48_0x0025, image_data_FontT48_0x0025_mod, 726, 29, 56 }; +static const tImageComp FontT48_0x0026_mod = { image_data_FontT48_0x0026, image_data_FontT48_0x0026_mod, 492, 34, 56 }; +static const tImageComp FontT48_0x0027_mod = { image_data_FontT48_0x0027, image_data_FontT48_0x0027_mod, 52, 8, 56 }; +static const tImageComp FontT48_0x0028_mod = { image_data_FontT48_0x0028, image_data_FontT48_0x0028_mod, 294, 18, 56 }; +static const tImageComp FontT48_0x0029_mod = { image_data_FontT48_0x0029, image_data_FontT48_0x0029_mod, 272, 18, 56 }; +static const tImageComp FontT48_0x002a_mod = { image_data_FontT48_0x002a, image_data_FontT48_0x002a_mod, 224, 18, 56 }; +static const tImageComp FontT48_0x002b_mod = { image_data_FontT48_0x002b, image_data_FontT48_0x002b_mod, 102, 25, 56 }; +static const tImageComp FontT48_0x002c_mod = { image_data_FontT48_0x002c, image_data_FontT48_0x002c_mod, 140, 18, 56 }; +static const tImageComp FontT48_0x002d_mod = { image_data_FontT48_0x002d, image_data_FontT48_0x002d_mod, 54, 18, 56 }; +static const tImageComp FontT48_0x002e_mod = { image_data_FontT48_0x002e, image_data_FontT48_0x002e_mod, 74, 18, 56 }; +static const tImageComp FontT48_0x002f_mod = { image_data_FontT48_0x002f, image_data_FontT48_0x002f_mod, 274, 25, 56 }; +static const tImageComp FontT48_0x0030_mod = { image_data_FontT48_0x0030, image_data_FontT48_0x0030_mod, 426, 25, 56 }; +static const tImageComp FontT48_0x0031_mod = { image_data_FontT48_0x0031, image_data_FontT48_0x0031_mod, 96, 25, 56 }; +static const tImageComp FontT48_0x0032_mod = { image_data_FontT48_0x0032, image_data_FontT48_0x0032_mod, 386, 25, 56 }; +static const tImageComp FontT48_0x0033_mod = { image_data_FontT48_0x0033, image_data_FontT48_0x0033_mod, 378, 25, 56 }; +static const tImageComp FontT48_0x0034_mod = { image_data_FontT48_0x0034, image_data_FontT48_0x0034_mod, 254, 25, 56 }; +static const tImageComp FontT48_0x0035_mod = { image_data_FontT48_0x0035, image_data_FontT48_0x0035_mod, 334, 25, 56 }; +static const tImageComp FontT48_0x0036_mod = { image_data_FontT48_0x0036, image_data_FontT48_0x0036_mod, 446, 25, 56 }; +static const tImageComp FontT48_0x0037_mod = { image_data_FontT48_0x0037, image_data_FontT48_0x0037_mod, 336, 25, 56 }; +static const tImageComp FontT48_0x0038_mod = { image_data_FontT48_0x0038, image_data_FontT48_0x0038_mod, 486, 25, 56 }; +static const tImageComp FontT48_0x0039_mod = { image_data_FontT48_0x0039, image_data_FontT48_0x0039_mod, 446, 25, 56 }; +static const tImageComp FontT48_0x003a_mod = { image_data_FontT48_0x003a, image_data_FontT48_0x003a_mod, 142, 18, 56 }; +static const tImageComp FontT48_0x003b_mod = { image_data_FontT48_0x003b, image_data_FontT48_0x003b_mod, 200, 18, 56 }; +static const tImageComp FontT48_0x003c_mod = { image_data_FontT48_0x003c, image_data_FontT48_0x003c_mod, 214, 25, 56 }; +static const tImageComp FontT48_0x003d_mod = { image_data_FontT48_0x003d, image_data_FontT48_0x003d_mod, 174, 25, 56 }; +static const tImageComp FontT48_0x003e_mod = { image_data_FontT48_0x003e, image_data_FontT48_0x003e_mod, 216, 25, 56 }; +static const tImageComp FontT48_0x003f_mod = { image_data_FontT48_0x003f, image_data_FontT48_0x003f_mod, 312, 18, 56 }; +static const tImageComp FontT48_0x0040_mod = { image_data_FontT48_0x0040, image_data_FontT48_0x0040_mod, 774, 37, 56 }; +static const tImageComp FontT48_0x0041_mod = { image_data_FontT48_0x0041, image_data_FontT48_0x0041_mod, 472, 28, 56 }; +static const tImageComp FontT48_0x0042_mod = { image_data_FontT48_0x0042, image_data_FontT48_0x0042_mod, 378, 27, 56 }; +static const tImageComp FontT48_0x0043_mod = { image_data_FontT48_0x0043, image_data_FontT48_0x0043_mod, 380, 29, 56 }; +static const tImageComp FontT48_0x0044_mod = { image_data_FontT48_0x0044, image_data_FontT48_0x0044_mod, 322, 29, 56 }; +static const tImageComp FontT48_0x0045_mod = { image_data_FontT48_0x0045, image_data_FontT48_0x0045_mod, 210, 26, 56 }; +static const tImageComp FontT48_0x0046_mod = { image_data_FontT48_0x0046, image_data_FontT48_0x0046_mod, 154, 26, 56 }; +static const tImageComp FontT48_0x0047_mod = { image_data_FontT48_0x0047, image_data_FontT48_0x0047_mod, 434, 32, 56 }; +static const tImageComp FontT48_0x0048_mod = { image_data_FontT48_0x0048, image_data_FontT48_0x0048_mod, 122, 31, 56 }; +static const tImageComp FontT48_0x0049_mod = { image_data_FontT48_0x0049, image_data_FontT48_0x0049_mod, 34, 13, 56 }; +static const tImageComp FontT48_0x004a_mod = { image_data_FontT48_0x004a, image_data_FontT48_0x004a_mod, 162, 23, 56 }; +static const tImageComp FontT48_0x004b_mod = { image_data_FontT48_0x004b, image_data_FontT48_0x004b_mod, 354, 28, 56 }; +static const tImageComp FontT48_0x004c_mod = { image_data_FontT48_0x004c, image_data_FontT48_0x004c_mod, 92, 24, 56 }; +static const tImageComp FontT48_0x004d_mod = { image_data_FontT48_0x004d, image_data_FontT48_0x004d_mod, 758, 36, 56 }; +static const tImageComp FontT48_0x004e_mod = { image_data_FontT48_0x004e, image_data_FontT48_0x004e_mod, 252, 31, 56 }; +static const tImageComp FontT48_0x004f_mod = { image_data_FontT48_0x004f, image_data_FontT48_0x004f_mod, 492, 32, 56 }; +static const tImageComp FontT48_0x0050_mod = { image_data_FontT48_0x0050, image_data_FontT48_0x0050_mod, 238, 27, 56 }; +static const tImageComp FontT48_0x0051_mod = { image_data_FontT48_0x0051, image_data_FontT48_0x0051_mod, 564, 34, 56 }; +static const tImageComp FontT48_0x0052_mod = { image_data_FontT48_0x0052, image_data_FontT48_0x0052_mod, 344, 28, 56 }; +static const tImageComp FontT48_0x0053_mod = { image_data_FontT48_0x0053, image_data_FontT48_0x0053_mod, 414, 23, 56 }; +static const tImageComp FontT48_0x0054_mod = { image_data_FontT48_0x0054, image_data_FontT48_0x0054_mod, 120, 28, 56 }; +static const tImageComp FontT48_0x0055_mod = { image_data_FontT48_0x0055, image_data_FontT48_0x0055_mod, 202, 31, 56 }; +static const tImageComp FontT48_0x0056_mod = { image_data_FontT48_0x0056, image_data_FontT48_0x0056_mod, 448, 28, 56 }; +static const tImageComp FontT48_0x0057_mod = { image_data_FontT48_0x0057, image_data_FontT48_0x0057_mod, 776, 41, 56 }; +static const tImageComp FontT48_0x0058_mod = { image_data_FontT48_0x0058, image_data_FontT48_0x0058_mod, 532, 27, 56 }; +static const tImageComp FontT48_0x0059_mod = { image_data_FontT48_0x0059, image_data_FontT48_0x0059_mod, 312, 27, 56 }; +static const tImageComp FontT48_0x005a_mod = { image_data_FontT48_0x005a, image_data_FontT48_0x005a_mod, 386, 26, 56 }; +static const tImageComp FontT48_0x005b_mod = { image_data_FontT48_0x005b, image_data_FontT48_0x005b_mod, 90, 18, 56 }; +static const tImageComp FontT48_0x005c_mod = { image_data_FontT48_0x005c, image_data_FontT48_0x005c_mod, 256, 17, 56 }; +static const tImageComp FontT48_0x005d_mod = { image_data_FontT48_0x005d, image_data_FontT48_0x005d_mod, 90, 18, 56 }; +static const tImageComp FontT48_0x005e_mod = { image_data_FontT48_0x005e, image_data_FontT48_0x005e_mod, 210, 25, 56 }; +static const tImageComp FontT48_0x005f_mod = { image_data_FontT48_0x005f, image_data_FontT48_0x005f_mod, 102, 25, 56 }; +static const tImageComp FontT48_0x0061_mod = { image_data_FontT48_0x0061, image_data_FontT48_0x0061_mod, 366, 25, 56 }; +static const tImageComp FontT48_0x0062_mod = { image_data_FontT48_0x0062, image_data_FontT48_0x0062_mod, 302, 27, 56 }; +static const tImageComp FontT48_0x0063_mod = { image_data_FontT48_0x0063, image_data_FontT48_0x0063_mod, 306, 24, 56 }; +static const tImageComp FontT48_0x0064_mod = { image_data_FontT48_0x0064, image_data_FontT48_0x0064_mod, 294, 27, 56 }; +static const tImageComp FontT48_0x0065_mod = { image_data_FontT48_0x0065, image_data_FontT48_0x0065_mod, 406, 26, 56 }; +static const tImageComp FontT48_0x0066_mod = { image_data_FontT48_0x0066, image_data_FontT48_0x0066_mod, 142, 18, 56 }; +static const tImageComp FontT48_0x0067_mod = { image_data_FontT48_0x0067, image_data_FontT48_0x0067_mod, 588, 24, 56 }; +static const tImageComp FontT48_0x0068_mod = { image_data_FontT48_0x0068, image_data_FontT48_0x0068_mod, 156, 26, 56 }; +static const tImageComp FontT48_0x0069_mod = { image_data_FontT48_0x0069, image_data_FontT48_0x0069_mod, 92, 14, 56 }; +static const tImageComp FontT48_0x006a_mod = { image_data_FontT48_0x006a, image_data_FontT48_0x006a_mod, 180, 18, 56 }; +static const tImageComp FontT48_0x006b_mod = { image_data_FontT48_0x006b, image_data_FontT48_0x006b_mod, 284, 25, 56 }; +static const tImageComp FontT48_0x006c_mod = { image_data_FontT48_0x006c, image_data_FontT48_0x006c_mod, 84, 14, 56 }; +static const tImageComp FontT48_0x006d_mod = { image_data_FontT48_0x006d, image_data_FontT48_0x006d_mod, 262, 40, 56 }; +static const tImageComp FontT48_0x006e_mod = { image_data_FontT48_0x006e, image_data_FontT48_0x006e_mod, 170, 26, 56 }; +static const tImageComp FontT48_0x006f_mod = { image_data_FontT48_0x006f, image_data_FontT48_0x006f_mod, 354, 26, 56 }; +static const tImageComp FontT48_0x0070_mod = { image_data_FontT48_0x0070, image_data_FontT48_0x0070_mod, 296, 27, 56 }; +static const tImageComp FontT48_0x0071_mod = { image_data_FontT48_0x0071, image_data_FontT48_0x0071_mod, 290, 27, 56 }; +static const tImageComp FontT48_0x0072_mod = { image_data_FontT48_0x0072, image_data_FontT48_0x0072_mod, 120, 20, 56 }; +static const tImageComp FontT48_0x0073_mod = { image_data_FontT48_0x0073, image_data_FontT48_0x0073_mod, 308, 19, 56 }; +static const tImageComp FontT48_0x0074_mod = { image_data_FontT48_0x0074, image_data_FontT48_0x0074_mod, 170, 19, 56 }; +static const tImageComp FontT48_0x0075_mod = { image_data_FontT48_0x0075, image_data_FontT48_0x0075_mod, 160, 26, 56 }; +static const tImageComp FontT48_0x0076_mod = { image_data_FontT48_0x0076, image_data_FontT48_0x0076_mod, 336, 24, 56 }; +static const tImageComp FontT48_0x0077_mod = { image_data_FontT48_0x0077, image_data_FontT48_0x0077_mod, 580, 36, 56 }; +static const tImageComp FontT48_0x0078_mod = { image_data_FontT48_0x0078, image_data_FontT48_0x0078_mod, 396, 24, 56 }; +static const tImageComp FontT48_0x0079_mod = { image_data_FontT48_0x0079, image_data_FontT48_0x0079_mod, 432, 24, 56 }; +static const tImageComp FontT48_0x007a_mod = { image_data_FontT48_0x007a, image_data_FontT48_0x007a_mod, 330, 23, 56 }; +static const tImageComp FontT48_0x007b_mod = { image_data_FontT48_0x007b, image_data_FontT48_0x007b_mod, 356, 18, 56 }; +static const tImageComp FontT48_0x007c_mod = { image_data_FontT48_0x007c, image_data_FontT48_0x007c_mod, 26, 25, 56 }; +static const tImageComp FontT48_0x007d_mod = { image_data_FontT48_0x007d, image_data_FontT48_0x007d_mod, 376, 18, 56 }; +static const tImageComp FontT48_0x007e_mod = { image_data_FontT48_0x007e, image_data_FontT48_0x007e_mod, 130, 25, 56 }; + +static const tImageComp* FontT48_Comp[] = { + + &FontT48_0x0020_mod, + &FontT48_0x0021_mod, + &FontT48_0x0022_mod, + &FontT48_0x0023_mod, + &FontT48_0x0024_mod, + &FontT48_0x0025_mod, + &FontT48_0x0026_mod, + &FontT48_0x0027_mod, + &FontT48_0x0028_mod, + &FontT48_0x0029_mod, + &FontT48_0x002a_mod, + &FontT48_0x002b_mod, + &FontT48_0x002c_mod, + &FontT48_0x002d_mod, + &FontT48_0x002e_mod, + &FontT48_0x002f_mod, + &FontT48_0x0030_mod, + &FontT48_0x0031_mod, + &FontT48_0x0032_mod, + &FontT48_0x0033_mod, + &FontT48_0x0034_mod, + &FontT48_0x0035_mod, + &FontT48_0x0036_mod, + &FontT48_0x0037_mod, + &FontT48_0x0038_mod, + &FontT48_0x0039_mod, + &FontT48_0x003a_mod, + &FontT48_0x003b_mod, + &FontT48_0x003c_mod, + &FontT48_0x003d_mod, + &FontT48_0x003e_mod, + &FontT48_0x003f_mod, + &FontT48_0x0040_mod, + &FontT48_0x0041_mod, + &FontT48_0x0042_mod, + &FontT48_0x0043_mod, + &FontT48_0x0044_mod, + &FontT48_0x0045_mod, + &FontT48_0x0046_mod, + &FontT48_0x0047_mod, + &FontT48_0x0048_mod, + &FontT48_0x0049_mod, + &FontT48_0x004a_mod, + &FontT48_0x004b_mod, + &FontT48_0x004c_mod, + &FontT48_0x004d_mod, + &FontT48_0x004e_mod, + &FontT48_0x004f_mod, + &FontT48_0x0050_mod, + &FontT48_0x0051_mod, + &FontT48_0x0052_mod, + &FontT48_0x0053_mod, + &FontT48_0x0054_mod, + &FontT48_0x0055_mod, + &FontT48_0x0056_mod, + &FontT48_0x0057_mod, + &FontT48_0x0058_mod, + &FontT48_0x0059_mod, + &FontT48_0x005a_mod, + &FontT48_0x005b_mod, + &FontT48_0x005c_mod, + &FontT48_0x005d_mod, + &FontT48_0x005e_mod, + &FontT48_0x005f_mod, + &FontT48_0x00b0_mod, + &FontT48_0x0061_mod, + &FontT48_0x0062_mod, + &FontT48_0x0063_mod, + &FontT48_0x0064_mod, + &FontT48_0x0065_mod, + &FontT48_0x0066_mod, + &FontT48_0x0067_mod, + &FontT48_0x0068_mod, + &FontT48_0x0069_mod, + &FontT48_0x006a_mod, + &FontT48_0x006b_mod, + &FontT48_0x006c_mod, + &FontT48_0x006d_mod, + &FontT48_0x006e_mod, + &FontT48_0x006f_mod, + &FontT48_0x0070_mod, + &FontT48_0x0071_mod, + &FontT48_0x0072_mod, + &FontT48_0x0073_mod, + &FontT48_0x0074_mod, + &FontT48_0x0075_mod, + &FontT48_0x0076_mod, + &FontT48_0x0077_mod, + &FontT48_0x0078_mod, + &FontT48_0x0079_mod, + &FontT48_0x007a_mod, + &FontT48_0x007b_mod, + &FontT48_0x007c_mod, + &FontT48_0x007d_mod, + &FontT48_0x007e_mod +}; + +
--- a/BootLoader/Src/base_bootlader.c Sat Nov 15 15:16:14 2025 +0100 +++ b/BootLoader/Src/base_bootlader.c Sat Nov 15 19:29:44 2025 +0100 @@ -223,18 +223,9 @@ #include "stm32f4xx_hal_flash_ex.h" #include "stm32f4xx_hal_wwdg.h" -#ifdef BOOTLOADER_STANDALONE -#include "Fonts/Font_T144_plus.h" -#include "Fonts/Font_T84.h" -#include "Fonts/Font_T105.h" -#include "Fonts/Font_T54.h" -#include "Fonts/Font_T48_plus.h" -#include "Fonts/Font_T24.h" -#include "Fonts/Font_T42.h" -#include "Fonts/image_battery.h" +#include "font_T48_min.h" +#include "font_T24_min.h" #include "Fonts/image_heinrichs_weikamp.h" -#include "Fonts/image_ostc.h" -#endif // From Discovery/Inc (shall be shared...) #include "data_exchange_main.h" @@ -248,6 +239,9 @@ #include <stdio.h> #include <string.h> // for memcopy + +extern void decompressFont(const tFont* pFont, tImageComp** pFontComp); + /* Private define ------------------------------------------------------------*/ #define BUFFER_SIZE ((uint32_t)0x00177000) #define WRITE_READ_ADDR ((uint32_t)0x0000) @@ -268,8 +262,8 @@ .signature = "mh", .release_year = 25, - .release_month = 1, - .release_day = 13, + .release_month = 11, + .release_day = 15, .release_sub = 0, /* max 48 with trailing 0 */ @@ -286,7 +280,7 @@ { // first 52 bytes - .primarySerial = 0xFFFF, + .primarySerial = 0x06a4, .primaryLicence = 0x00, .revision8bit = 0x02, .production_year = 0x19, @@ -418,8 +412,7 @@ } } - -int main(void) +int __attribute__((optimize("O0"))) main(void) { /* @@ -449,7 +442,7 @@ /* button press is only 40 to 50 us low */ MX_GPIO_One_Button_only_Init(); - uint32_t i = 500000; + uint32_t i = 4000000; callForUpdate = __HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST); @@ -473,7 +466,7 @@ } if(i) { - i = 200000; + i = 4000000; while(!MX_GPIO_Read_The_One_Button() && i) { i--; @@ -481,30 +474,12 @@ } if(i) { - i = 200000; + i = 4000000; while(MX_GPIO_Read_The_One_Button() && i) { i--; __NOP(); } - if(i) - { - i = 200000; - while(!MX_GPIO_Read_The_One_Button() && i) - { - i--; - __NOP(); - } - if(i) - { - i = 200000; - while(MX_GPIO_Read_The_One_Button() && i) - { - i--; - __NOP(); - } - } - } } } } @@ -514,6 +489,10 @@ MX_SPI_Init(); SDRAM_Config(); + + decompressFont(&FontT24min, (tImageComp**)&FontT24_Comp); + decompressFont(&FontT48min, (tImageComp**)&FontT48_Comp); + HAL_Delay(100); GFX_init1_no_DMA(&pLayerInvisible, 2); @@ -709,21 +688,17 @@ tComm_init(); tInfo_button_text("exit","","sleep"); - tInfo_newpage("bootloader 250113"); + tInfo_newpage("bootloader 251115"); tInfo_write("start bluetooth"); - tInfo_write(""); tInfo_write(textVersion); +#if 0 if(tComm_Set_Bluetooth_Name(0) == 0xFF) +#else + if(hardwareDataGetPointer()->production_bluetooth_name_set == 0xFF) +#endif { tInfo_write("init bluetooth"); - if(isNewDisplay()) - { - tComm_StartBlueModBaseInit(); - } - else - { - tComm_StartBlueModConfig(); - } + tComm_StartBlueModBaseInit(); } else {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Src/display_mini.c Sat Nov 15 19:29:44 2025 +0100 @@ -0,0 +1,1163 @@ + +#include "stm32f4xx_hal.h" /* for HAL_Delay() */ +#include "ostc.h" +#include "display.h" + +#define TFT_ENABLE_EXTENDED_COMMANDS 0xB9 +#define TFT_SET_POWER 0xB1 +#define TFT_SLEEP_OUT 0x11 +#define TFT_DISPLAY_INVERSION_OFF 0x20 +#define TFT_MEMORY_ACCESS_ONTROL 0x36 +#define TFT_INTERFACE_PIXEL_FORMAT 0x3A +#define TFT_SET_RGB_INTERFACE_RELATED 0xB3 +#define TFT_SET_DISPLAY_WAVEFORM 0xB4 +#define TFT_SET_PANEL 0xCC +#define TFT_SET_GAMMA_CURVE_RELATED 0xE0 +#define TFT_DISPLAY_ON 0x29 +#define TFT_DISPLAY_OFF 0x28 +#define TFT_SLEEP_IN 0x10 + +#define OLED_SCTE_SET_31h 0x31 // 0x0008 +#define OLED_WCWE_SET_32h 0x32 // 0x0014 +#define OLED_GATELESS1_30h 0x30 // 0x0002 +#define OLED_GATELESS2_27h 0x27 // 0x0000 +#define OLED_OSCILLATOR 0x11 // 0x00A1 +#define OLED_VBP_SET_12h 0x12 // 0x0008 +#define OLED_VFP_SET_13h 0x13 // 0x0008 +#define OLED_DISPLAY_CON_15h 0x15 // 0x0000 +#define OLED_COLOR_DEPTH_SET_16h 0x16 // 0x0000 +#define OLED_PENTILE_KEY_EFh 0xEF // 0x00D0 or 0x00E8 +#define OLED_PENTILE1_A0h 0xA0 // 0x0063 +#define OLED_PENTILE2_A1h 0xA1 // 0x00C0 +#define OLED_PENTILE3_A2h 0xA2 // 0x0032 +#define OLED_PENTILE4_A3h 0xA3 // 0x0002 +#define OLED_BRIGHTNESS_CTRL_39h 0x39 // 0044h +// gamma table 0x40 - 0x66 +#define OLED_BOOSTING_FREQ 0x17 // 0x0022 +#define OLED_AMP_SET_18h 0x18 // 0x0033 +#define OLED_GAMMA_AMP_19h 0x19 // 0x0003 +#define OLED_POWER_CONTROL2_1Ah 0x1A // 0x0001 +#define OLED_POWER_CONTROL2_1Bh 0x1B // +#define OLED_POWER_CONTROL2_1Ch 0x1C // +#define OLED_INTERNAL_LOGIC_VOLTAGE 0x22 // VCC*0,65 = 3,3V * 0,55 = 0x00A2 +#define OLED_POWER_SET 0x23 // VC1OUT = VCI X 0.98 (default) = 0x00 +#define OLED_POWER_SET2 0x24 // VREG2OUT = 5,4V, VREG1OUT = 4,2V =0x77 +#define OLED_DISPLAY_CONDITION_SET_26h 0x26 // 0x00A0 +#define OLED_STB_BY_OFF_1Dh 0x1D // 00A0 + 300ms wait +#define OLED_DDISP_ON_14h 0x14 // 0003 + +static void Display_Error_Handler(void); +static void display_power_on__2_of_2__post_RGB_display1(void); +void display_1_brightness_max(void); +void display_1_brightness_high(void); +void display_1_brightness_std(void); +void display_1_brightness_eco(void); +void display_1_brightness_cave(void); + +uint8_t brightness_screen1; + +void display_power_on__1_of_2__pre_RGB(void) +{ + /* reset system */ + HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_SET); // chip select + + HAL_GPIO_WritePin(DISPLAY_RESETB_GPIO_PORT,DISPLAY_RESETB_PIN,GPIO_PIN_RESET); + HAL_Delay(10); + HAL_GPIO_WritePin(DISPLAY_RESETB_GPIO_PORT,DISPLAY_RESETB_PIN,GPIO_PIN_SET); + HAL_Delay(25); + + /* RGB signals should be now for 2 frames or more (datasheet) */ +} + + +static void send(uint8_t *pData, uint16_t inputlength) +{ + HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_RESET); // chip select + + if(HAL_SPI_Transmit(&hspiDisplay,(uint8_t*)pData, inputlength, 10000) != HAL_OK) + Display_Error_Handler(); + + while (HAL_SPI_GetState(&hspiDisplay) != HAL_SPI_STATE_READY) + { + } + HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_SET); // chip select +} + +void display_power_off(void) +{ + uint8_t aTxBuffer[3]; + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_DDISP_ON_14h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + HAL_Delay(25); + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_STB_BY_OFF_1Dh; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0xA1; + send((uint8_t*)aTxBuffer, 2); + HAL_Delay(200); + HAL_GPIO_WritePin(DISPLAY_RESETB_GPIO_PORT,DISPLAY_RESETB_PIN,GPIO_PIN_RESET); +} + + +void display_power_on__2_of_2__post_RGB(void) +{ + display_power_on__2_of_2__post_RGB_display1(); +} + +void display_power_on__2_of_2__post_RGB_display1(void) +{ + uint8_t aTxBuffer[3]; + + aTxBuffer[0] = 0x71; // Read chip Index & revision number + aTxBuffer[1] = 0x00; // Dummy write - reads out 0x27 + aTxBuffer[1] = 0x00; // Dummy write - reads out 0x96 + send((uint8_t*)aTxBuffer, 3); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_OSCILLATOR; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0xA4; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_SCTE_SET_31h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x08;//8 + send((uint8_t*)aTxBuffer, 2); + + /*//debug read + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_SCTE_SET_31h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x73; // Read internal register + aTxBuffer[1] = 0x00; // Dummy write - reads out 0x08 (The just-set OLED_SCTE_SET value) + send((uint8_t*)aTxBuffer, 2); + */ + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_WCWE_SET_32h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x14;//14 + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_GATELESS1_30h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x02; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_GATELESS2_27h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x01; + send((uint8_t*)aTxBuffer, 2); + + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_VBP_SET_12h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x08; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_VFP_SET_13h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x0C; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_DISPLAY_CON_15h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x01; //SS=0 + //aTxBuffer[1] = 0x11; //SS=1 + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_COLOR_DEPTH_SET_16h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_PENTILE_KEY_EFh; // write-only register... + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0xD0; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0xE8; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_PENTILE1_A0h; // write-only register... + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x63; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_PENTILE2_A1h; // write-only register... + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0xC0; // SID1&SID0=00 +// aTxBuffer[1] = 0xC4; // SID1&SID0=01 CC C8 C4 C0 + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_PENTILE3_A2h; // write-only register... + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x32; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_PENTILE4_A3h; // write-only register... + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x02; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_BRIGHTNESS_CTRL_39h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x44;//44 + send((uint8_t*)aTxBuffer, 2); + + + display_1_brightness_std(); // boot brightness + + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_BOOSTING_FREQ; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x22; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_AMP_SET_18h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x22; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_GAMMA_AMP_19h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x02; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_POWER_CONTROL2_1Ah; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + /* + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_POWER_CONTROL2_1Bh; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x4B; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_POWER_CONTROL2_1Ch; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x05; + send((uint8_t*)aTxBuffer, 2); + */ + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_INTERNAL_LOGIC_VOLTAGE; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0xA2; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_POWER_SET; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_POWER_SET2; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x77; + send((uint8_t*)aTxBuffer, 2); + + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_DISPLAY_CONDITION_SET_26h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0xA0; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_STB_BY_OFF_1Dh; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0xA0; + send((uint8_t*)aTxBuffer, 2); + + HAL_Delay(250); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = OLED_DDISP_ON_14h; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x03; + send((uint8_t*)aTxBuffer, 2); +} + +void display_1_brightness_max(void) +{ + uint8_t aTxBuffer[3]; + + if (brightness_screen1 == 4) + { + // do nothing + } + else + { + // GAMMA L=250 + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x40; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x41; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x42; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2A; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x43; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x27; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x44; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x27; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x45; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x1F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x46; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x44; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x50; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x51; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x52; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x17; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x53; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x24; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x54; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x26; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x55; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x1F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x56; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x43; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x60; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x61; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x62; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2A; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x63; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x25; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x64; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x24; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x65; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x1B; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x66; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x5C; + send((uint8_t*)aTxBuffer, 2); + + brightness_screen1=4; + } +} + +void display_1_brightness_high(void) +{ + uint8_t aTxBuffer[3]; + if (brightness_screen1 == 3) + { + // do nothing + } + else + { + // GAMMA L=200 + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x40; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x41; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x42; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2A; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x43; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x27; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x44; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x27; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x45; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x1F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x46; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x44; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x50; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x51; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x52; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x17; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x53; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x24; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x54; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x26; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x55; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x1F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x56; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x43; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x60; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x61; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x62; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2A; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x63; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x25; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x64; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x24; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x65; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x1B; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x66; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x5C; + send((uint8_t*)aTxBuffer, 2); + + brightness_screen1=3; + } +} + + +void display_1_brightness_std(void) +{ + uint8_t aTxBuffer[3]; + + if (brightness_screen1 == 2) + { + // do nothing + } + else + { + // GAMMA L=150 + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x40; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x41; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x42; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2D; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x43; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x29; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x44; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x28; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x45; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x23; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x46; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x37; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x50; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x51; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x52; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x0B; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x53; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x25; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x54; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x28; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x55; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x22; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x56; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x36; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x60; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x61; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x62; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2B; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x63; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x28; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x64; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x26; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x65; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x1F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x66; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x4A; + send((uint8_t*)aTxBuffer, 2); + + brightness_screen1=2; + } +} + +void display_1_brightness_eco(void) +{ + uint8_t aTxBuffer[3]; + + if (brightness_screen1 == 1) + { + // do nothing + } + else + { + // GAMMA L=100 + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x40; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x41; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x42; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x30; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x43; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2A; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x44; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2B; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x45; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x24; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x46; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x50; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x51; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x52; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x53; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x25; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x54; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x29; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x55; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x24; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x56; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2E; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x60; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x61; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x62; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x63; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x29; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x64; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x29; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x65; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x21; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x66; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3F; + send((uint8_t*)aTxBuffer, 2); + + brightness_screen1=1; + } +} + +void display_1_brightness_cave(void) +{ + uint8_t aTxBuffer[3]; + + if (brightness_screen1 == 0) + { + // do nothing + } + else + { + // GAMMA L=50 + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x40; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x41; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x42; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3C; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x43; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2C; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x44; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2D; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x45; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x27; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x46; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x24; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x50; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x51; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x52; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x53; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x22; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x54; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2A; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x55; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x27; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x56; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x23; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x60; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x00; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x61; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3F; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x62; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x3B; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x63; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2C; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x64; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x2B; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x65; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x24; + send((uint8_t*)aTxBuffer, 2); + + aTxBuffer[0] = 0x70; + aTxBuffer[1] = 0x66; + send((uint8_t*)aTxBuffer, 2); + aTxBuffer[0] = 0x72; + aTxBuffer[1] = 0x31; + send((uint8_t*)aTxBuffer, 2); + + brightness_screen1=0; + } +} + +static void Display_Error_Handler(void) +{ + //while(1) + { + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Src/externCPU2bootloader_mini.c Sat Nov 15 19:29:44 2025 +0100 @@ -0,0 +1,294 @@ +/** + ****************************************************************************** + * @file externCPU2bootloader.c Template + * @author heinrichs weikamp gmbh + * @version V0.0.1 + * @date 23-Oct-2014 + * @version V0.0.1 + * @since 23-Oct-2014 + * @brief Main Template to communicate with the second CPU in bootloader mode + * bootloader ROM build by ST and defined in AN4286 + * + @verbatim + ============================================================================== + ##### How to use ##### + ============================================================================== + @endverbatim + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2016 heinrichs weikamp</center></h2> + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" +#include "stdio.h" +#include "ostc.h" +#include "settings.h" +#include "externCPU2bootloader.h" +#include "externLogbookFlash.h" +#include "tComm.h" + + +/* Exported variables --------------------------------------------------------*/ + +/* Private types -------------------------------------------------------------*/ + +/* Private variables ---------------------------------------------------------*/ + +/* Private function prototypes -----------------------------------------------*/ + +static uint8_t boot_sync_frame(void); +static uint8_t boot_ack(void); +static uint8_t boot_get_id(uint8_t *RxBuffer); +static uint8_t boot_get_version(uint8_t *RxBuffer); +static uint8_t boot_write_memory(uint32_t address, uint8_t length_minus_1, uint8_t *data); +static uint8_t boot_erase_memory(void); +static void Bootloader_send_command(uint8_t command); +static void Bootloader_spi_single(uint8_t TxByte); +static void Bootloader_spi(uint16_t lengthData, uint8_t *aTxBuffer, uint8_t *aRxBuffer); + + +/* Exported functions --------------------------------------------------------*/ + +uint8_t extCPU2bootloader_start(uint8_t *version, uint16_t *chipID) +{ + uint8_t aRxBuffer[256] = { 0 }; + + HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_RESET); + + boot_sync_frame(); + boot_get_version(aRxBuffer); + *version = aRxBuffer[1]; + HAL_Delay(10); + boot_get_id(aRxBuffer); + *chipID = ((uint16_t)aRxBuffer[2]) << 8; + *chipID += (uint16_t)aRxBuffer[3]; + HAL_Delay(10); + if((*chipID == 0x431) && (*version > 10) && (*version < 32)) + return 1; + else + return 0; +} + + +uint8_t extCPU2bootloader_internal(uint8_t* buffer, uint32_t length, char* display_text) +{ + uint8_t version = 0; + uint16_t chipID = 0; + + if(!extCPU2bootloader_start(&version,&chipID)) + return 0; + if(!boot_erase_memory()) + return 0; + HAL_Delay(100); + uint16_t i=0; + uint32_t lengthsave = length; + uint8_t percent = 0; + + while(length) + { + percent = (100 * (i * 256)) /lengthsave; + tComm_verlauf(percent); + + if(length > 256) + { + if( !boot_write_memory(0x08000000 + (i * 256), 255, &buffer[i * 256]) ) + return 0;; + length -= 256; + + } + else + { + if(!boot_write_memory(0x08000000 + (i * 256), length - 1, &buffer[i * 256])) + return 0; + length = 0; + } + i++; + } + return 2; +} + + +uint8_t extCPU2bootloader(uint8_t* buffer, uint32_t length, char* display_text) +{ + uint8_t result = 0; + + MX_SmallCPU_Reset_To_Boot(); + result = extCPU2bootloader_internal(buffer,length,display_text); + MX_SmallCPU_Reset_To_Standard(); + return result; +} + +/* Private functions --------------------------------------------------------*/ + +static uint8_t boot_sync_frame(void) +{ + Bootloader_spi_single(0x5a); + return boot_ack(); +} + +static uint8_t boot_get_version(uint8_t *RxBuffer) +{ + Bootloader_spi_single(0x5a); + Bootloader_send_command(0x01); + if(!boot_ack()) + return 0; + Bootloader_spi(3, NULL, RxBuffer); + return boot_ack(); +} + + +static uint8_t boot_get_id(uint8_t *RxBuffer) +{ + Bootloader_spi_single(0x5a); + Bootloader_send_command(0x02); + if(!boot_ack()) + return 0; + Bootloader_spi(5, NULL, RxBuffer); + return boot_ack(); +} + + +uint8_t boot_write_memory(uint32_t address, uint8_t length_minus_1, uint8_t *data) +{ + uint8_t addressNew[4]; + uint8_t checksum = 0; + uint16_t length; + + Bootloader_spi_single(0x5a); + Bootloader_send_command(0x31); + if(!boot_ack()) + return 1; + HAL_Delay(5); + addressNew[0] = (uint8_t)((address >> 24) & 0xFF); + addressNew[1] = (uint8_t)((address >> 16) & 0xFF); + addressNew[2] = (uint8_t)((address >> 8) & 0xFF); + addressNew[3] = (uint8_t)((address >> 0) & 0xFF); + Bootloader_spi(4, addressNew, NULL); + checksum = 0; + checksum ^= addressNew[0]; + checksum ^= addressNew[1]; + checksum ^= addressNew[2]; + checksum ^= addressNew[3]; + Bootloader_spi_single(checksum); + if(!boot_ack()) + return 0; + HAL_Delay(1); + Bootloader_spi_single(length_minus_1); + length = ((uint16_t)length_minus_1) + 1; + Bootloader_spi(length, data, NULL); + HAL_Delay(26); + checksum = 0; + checksum ^= length_minus_1; + for(int i=0;i<length;i++) + checksum ^= data[i]; + Bootloader_spi_single(checksum); + + if(!boot_ack()) + return 0; + HAL_Delay(1); + return 1; +} + +static uint8_t boot_erase_memory(void) +{ + uint8_t special_erase_with_checksum[3] = {0xFF, 0xFF, 0x00}; + + Bootloader_spi_single(0x5a); + Bootloader_send_command(0x44); + if(!boot_ack()) + return 0; + Bootloader_spi(3, special_erase_with_checksum, NULL); + HAL_Delay(11000); /* 5.5 to 11 seconds */ + if(!boot_ack()) + return 0; + return 1; +} + +/* write unprotect does reset the system !! */ +uint8_t boot_write_unprotect(void) +{ + Bootloader_spi_single(0x5a); + Bootloader_send_command(0x73); + if(!boot_ack()) + return 0; + return boot_ack(); +} + +static uint8_t boot_ack(void) +{ + uint8_t answer = 0; + + Bootloader_spi_single(0x00); + for(int i=0; i< 1000; i++) + { + Bootloader_spi(1, NULL, &answer); + if((answer == 0x79) || (answer == 0x1F)) + { + Bootloader_spi_single(0x79); + break; + } + HAL_Delay(10); + } + if(answer == 0x79) + return 1; + else + return 0; +} + +static void Bootloader_send_command(uint8_t command) +{ + uint8_t send[2]; + uint8_t receive[2]; + + send[0] = command; + send[1] = 0xFF ^ command; + Bootloader_spi(2, send, receive); +} + +static void Bootloader_spi_single(uint8_t TxByte) +{ + Bootloader_spi(1,&TxByte, 0); +} + + +static void Bootloader_spi(uint16_t lengthData, uint8_t *aTxBuffer, uint8_t *aRxBuffer) +{ + uint8_t dummy[256] = { 0 }; + uint8_t *tx_data; + uint8_t *rx_data; + + tx_data = aTxBuffer; + rx_data = aRxBuffer; + + if(aTxBuffer == NULL) + tx_data = dummy; + if(aRxBuffer == NULL) + rx_data = dummy; + + //HAL_GPIO_WritePin(OSCILLOSCOPE_GPIO_PORT,OSCILLOSCOPE_PIN,GPIO_PIN_RESET); // only for testing with Oscilloscope + + + HAL_SPI_TransmitReceive(&cpu2DmaSpi, (uint8_t *)tx_data, (uint8_t *)rx_data, (uint16_t)lengthData,1000); +/* + if(HAL_SPI_TransmitReceive_DMA(&cpu2DmaSpi, (uint8_t *)tx_data, (uint8_t *)rx_data, (uint16_t)lengthData) != HAL_OK) + if(HAL_SPI_TransmitReceive_DMA(&cpu2DmaSpi, (uint8_t *)tx_data, (uint8_t *)rx_data, (uint16_t)lengthData) != HAL_OK) + Bootloader_Error_Handler(); + + while (HAL_SPI_GetState(&cpu2DmaSpi) != HAL_SPI_STATE_READY)// only for testing with Oscilloscope + { + } + HAL_GPIO_WritePin(OSCILLOSCOPE_GPIO_PORT,OSCILLOSCOPE_PIN,GPIO_PIN_SET); // only for testing with Oscilloscope +*/ +} + + +/* +static void Bootloader_Error_Handler(void) +{ + while(1); +} +*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Src/externLogbookFlash_mini.c Sat Nov 15 19:29:44 2025 +0100 @@ -0,0 +1,865 @@ +/** + ****************************************************************************** + * @copyright heinrichs weikamp + * @file externLogbookFlash.c + * @author heinrichs weikamp gmbh + * @date 07-Aug-2014 + * @version V0.0.4 + * @since 29-Sept-2015 + * @brief Main File to access the new 1.8 Volt Spansion S25FS256S 256 Mbit (32 Mbyte) + * @bug + * @warning + * + @verbatim + ============================================================================== + ##### Logbook Header (TOC) ##### + ============================================================================== + [..] Memory useage: + NEW: Spansion S25FS-S256S + + only 8x 4KB and 1x 32KB, remaining is 64KB or 256KB + Sector Size (kbyte) Sector Count Sector Range Address Range (Byte Address) Notes + 4 8 SA00 00000000h-00000FFFh + : : + SA07 00007000h-00007FFFh + + 32 1 SA08 00008000h-0000FFFFh + + 64 511 SA09 00010000h-0001FFFFh + : : + SA519 01FF0000h-01FFFFFFh + OLD: + 1kB each header + with predive header at beginning + and postdive header with 0x400 HEADER2OFFSET + 4kB (one erase) has two dives with 4 headers total + total of 512 kB (with 256 header ids (8 bit)) + Size is 280 Byte (as of 25.Nov. 2014) + + [..] Output to PC / UART is postdive header + + [..] Block Protection Lock-Down is to erase logbook only + + [..] Timing (see page 137 of LOGBOOK_V3_S25FS-S_00-271247.pdf + bulk erase is 2 minutes typ., 6 minutes max. + + ============================================================================== + ##### DEMOMODE ##### + ============================================================================== + 151215: ext_flash_write_settings() is DISABLED! + + ============================================================================== + ##### bug fixes ##### + ============================================================================== + 150917: end in header and length of sample was one byte too long + as stated by Jef Driesen email 15.09.2015 + + @endverbatim + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2> + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" +#include "externLogbookFlash.h" +#include "ostc.h" +#include "settings.h" +#include "gfx_engine.h" + +/* Private types -------------------------------------------------------------*/ +#define FLASHSTART 0x000000 +//#define FLASHSTOP 0x01FFFFFF all 32 MB with 4byte addressing +#define FLASHSTOP 0x00FFFFFF +//#define FLASHSTOP 0x3FFFFF +#define RELEASE 1 +#define HOLDCS 0 + +#define HEADER2OFFSET 0x400 + +typedef struct{ +uint8_t IsBusy:1; +uint8_t IsWriteEnabled:1; +uint8_t BlockProtect0:1; +uint8_t BlockProtect1:1; +uint8_t BlockProtect2:1; +uint8_t BlockProtect3:1; +uint8_t IsAutoAddressIncMode:1; +uint8_t BlockProtectL:1; +} extFlashStatusUbit8_t; + +typedef union{ +extFlashStatusUbit8_t ub; +uint8_t uw; +} extFlashStatusBit8_Type; + + +/* Exported variables --------------------------------------------------------*/ + +/* Private variables ---------------------------------------------------------*/ + +static uint32_t actualAddress = 0; +static uint32_t preparedPageAddress = 0; +static uint32_t closeSectorAddress = 0; +static uint32_t actualPointerHeader = 0; +static uint32_t actualPointerSample = 0; +static uint32_t actualPointerDevicedata = DDSTART; +static uint32_t actualPointerVPM = 0; +static uint32_t actualPointerSettings = SETTINGSSTART; +static uint32_t actualPointerFirmware = 0; +static uint32_t actualPointerFirmware2 = 0; + +/* Private function prototypes -----------------------------------------------*/ +static void chip_unselect(void); +static void chip_select(void); +static void write_spi(uint8_t data, uint8_t unselect_CS_afterwards); +static uint8_t read_spi(uint8_t unselect_CS_afterwards); +static void write_address(uint8_t unselect_CS_afterwards); +static void Error_Handler_extflash(void); +static void wait_chip_not_busy(void); +static void ext_flash_incf_address(uint8_t type); +//void ext_flash_incf_address_ring(void); + +static void ext_flash_erase4kB(void); +static void ext_flash_erase32kB(void); +static void ext_flash_erase64kB(void); +static uint8_t ext_flash_erase_if_on_page_start(void); + +static void ef_write_block(uint8_t * sendByte, uint32_t length, uint8_t type, uint8_t do_not_erase); + +static void ext_flash_read_block(uint8_t *getByte, uint8_t type); +static void ext_flash_read_block_multi(void *getByte, uint32_t size, uint8_t type); +static void ext_flash_read_block_stop(void); + +static void ef_hw_rough_delay_us(uint32_t delayUs); +static void ef_erase_64K(uint32_t blocks); + + +/* Exported functions --------------------------------------------------------*/ + +void ext_flash_write_firmware(uint8_t *pSample1, uint32_t length1)//, uint8_t *pSample2, uint32_t length2) +{ + general32to8_Type lengthTransform; + + lengthTransform.u32 = length1; + + actualPointerFirmware = FWSTART; + ef_write_block(lengthTransform.u8,4, EF_FIRMWARE, 1); + ef_write_block(pSample1,length1, EF_FIRMWARE, 1); + +// if(length2) +// ef_write_block(pSample2,length2, EF_FIRMWARE, 1); +} + +uint8_t ext_flash_read_firmware_version(char *text) +{ + uint32_t backup = actualAddress; + uint8_t buffer[4]; + + // + 4 for length data, see ext_flash_write_firmware + actualAddress = FWSTART + 4 + 0x10000; + ext_flash_read_block_start(); + ext_flash_read_block(&buffer[0], EF_FIRMWARE); + ext_flash_read_block(&buffer[1], EF_FIRMWARE); + ext_flash_read_block(&buffer[2], EF_FIRMWARE); + ext_flash_read_block(&buffer[3], EF_FIRMWARE); + + ext_flash_read_block_stop(); + actualAddress = backup; + + uint8_t ptr = 0; + text[ptr++] = 'V'; + ptr += gfx_number_to_string(2,0,&text[ptr],buffer[0] & 0x3F); + text[ptr++] = '.'; + ptr += gfx_number_to_string(2,0,&text[ptr],buffer[1] & 0x3F); + text[ptr++] = '.'; + ptr += gfx_number_to_string(2,0,&text[ptr],buffer[2] & 0x3F); + text[ptr++] = ' '; + if(buffer[3]) + { + text[ptr++] = 'b'; + text[ptr++] = 'e'; + text[ptr++] = 't'; + text[ptr++] = 'a'; + text[ptr++] = ' '; + } + return ptr; +} + + +uint32_t ext_flash_read_firmware(uint8_t *pSample1, uint32_t max_length, uint8_t *magicByte) +{ + uint32_t backup = actualAddress; + general32to8_Type lengthTransform; + + actualAddress = FWSTART; + ext_flash_read_block_start(); + + ext_flash_read_block(&lengthTransform.u8[0], EF_FIRMWARE); + ext_flash_read_block(&lengthTransform.u8[1], EF_FIRMWARE); + ext_flash_read_block(&lengthTransform.u8[2], EF_FIRMWARE); + ext_flash_read_block(&lengthTransform.u8[3], EF_FIRMWARE); + + + if(lengthTransform.u32 == 0xFFFFFFFF) + { + lengthTransform.u32 = 0xFFFFFFFF; + } + else + if(lengthTransform.u32 > max_length) + { + lengthTransform.u32 = 0xFF000000; + } + else + { + for(uint32_t i = 0; i<lengthTransform.u32; i++) + { + ext_flash_read_block(&pSample1[i], EF_FIRMWARE); + } + + } + + ext_flash_read_block_stop(); + + if(magicByte) + { + *magicByte = pSample1[0x10000 + 0x3E]; // 0x3E == 62 + } + + actualAddress = backup; + return lengthTransform.u32; +} + + +void ext_flash_write_firmware2(uint32_t offset, uint8_t *pSample1, uint32_t length1, uint8_t *pSample2, uint32_t length2) +{ + general32to8_Type lengthTransform, offsetTransform; + + lengthTransform.u32 = length1 + length2; + offsetTransform.u32 = offset; + + actualPointerFirmware2 = FWSTART2; + ef_write_block(lengthTransform.u8,4, EF_FIRMWARE2, 1); + ef_write_block(offsetTransform.u8,4, EF_FIRMWARE2, 1); + ef_write_block(pSample1,length1, EF_FIRMWARE2, 1); + if(length2) + ef_write_block(pSample2,length2, EF_FIRMWARE2, 1); +} + + +uint32_t ext_flash_read_firmware2(uint32_t *offset, uint8_t *pSample1, uint32_t max_length1, uint8_t *pSample2, uint32_t max_length2) +{ + uint32_t backup = actualAddress; + uint32_t length1, length2; + general32to8_Type lengthTransform, offsetTransform; + + actualAddress = FWSTART2; + ext_flash_read_block_start(); + + ext_flash_read_block(&lengthTransform.u8[0], EF_FIRMWARE2); + ext_flash_read_block(&lengthTransform.u8[1], EF_FIRMWARE2); + ext_flash_read_block(&lengthTransform.u8[2], EF_FIRMWARE2); + ext_flash_read_block(&lengthTransform.u8[3], EF_FIRMWARE2); + + ext_flash_read_block(&offsetTransform.u8[0], EF_FIRMWARE2); + ext_flash_read_block(&offsetTransform.u8[1], EF_FIRMWARE2); + ext_flash_read_block(&offsetTransform.u8[2], EF_FIRMWARE2); + ext_flash_read_block(&offsetTransform.u8[3], EF_FIRMWARE2); + + *offset = offsetTransform.u32; + + if(lengthTransform.u32 == 0xFFFFFFFF) + { + lengthTransform.u32 = 0xFFFFFFFF; + } + else + if(lengthTransform.u32 > max_length1 + max_length2) + { + lengthTransform.u32 = 0xFF000000; + } + else + { + if(lengthTransform.u32 < max_length1) + { + length1 = lengthTransform.u32; + length2 = 0; + } + else + { + length1 = max_length1; + length2 = lengthTransform.u32 - max_length1; + } + + if(pSample1) + { + for(uint32_t i = 0; i<length1; i++) + { + ext_flash_read_block(&pSample1[i], EF_FIRMWARE2); + } + if(pSample2) + { + for(uint32_t i = 0; i<length2; i++) + { + ext_flash_read_block(&pSample2[i], EF_FIRMWARE2); + } + } + } + else if(pSample2) + { + /* actualAddress += length1; do dummy read to get EEPROM to the correct address */ + for(uint32_t i = 0; i<length1; i++) + { + ext_flash_read_block(&pSample2[0], EF_FIRMWARE2); + } + for(uint32_t i = 0; i<length2; i++) + { + ext_flash_read_block(&pSample2[i], EF_FIRMWARE2); + } + } + } + ext_flash_read_block_stop(); + actualAddress = backup; + return lengthTransform.u32; +} + + +void ext_flash_read_fixed_16_devicedata_blocks_formated_128byte_total(uint8_t *buffer) +{ + SDeviceLine data[16]; + uint8_t tempLengthIngnore; + uint16_t count; + uint8_t transfer; + + RTC_DateTypeDef Sdate; + RTC_TimeTypeDef Stime; + + actualAddress = DDSTART; + + ext_flash_read_block_start(); + ext_flash_read_block(&tempLengthIngnore, EF_DEVICEDATA); + ext_flash_read_block(&tempLengthIngnore, EF_DEVICEDATA); + + ext_flash_read_block_multi((uint8_t *)data,16*3*4, EF_DEVICEDATA); + ext_flash_read_block_stop(); + + count = 0; + for(int i=0;i<16;i++) + { + transfer = (data[i].value_int32 >> 24) & 0xFF; + buffer[count++] = transfer; + transfer = (data[i].value_int32 >> 16) & 0xFF; + buffer[count++] = transfer; + transfer = (data[i].value_int32 >> 8) & 0xFF; + buffer[count++] = transfer; + transfer = (data[i].value_int32) & 0xFF; + buffer[count++] = transfer; + + translateDate(data[i].date_rtc_dr, &Sdate); + translateTime(data[i].time_rtc_tr, &Stime); + buffer[count++] = Sdate.Year; + buffer[count++] = Sdate.Month; + buffer[count++] = Sdate.Date; + buffer[count++] = Stime.Hours; + } +} + +void ext_flash_erase_firmware(void) +{ + uint32_t size, blocks_64k; + + actualAddress = FWSTART; + size = 1 + FWSTOP - FWSTART; + blocks_64k = size / 0x10000; + ef_erase_64K(blocks_64k); +} + +void ext_flash_erase_firmware2(void) +{ + uint32_t size, blocks_64k; + + actualAddress = FWSTART2; + size = 1 + FWSTOP2 - FWSTART2; + blocks_64k = size / 0x10000; + ef_erase_64K(blocks_64k); +} + + + +static void ext_flash_erase4kB(void) +{ + wait_chip_not_busy(); + write_spi(0x06,RELEASE);/* WREN */ + write_spi(0x20,HOLDCS);/* sector erase cmd */ + write_address(RELEASE); +} + +/* be careful - might not work with entire family and other products + * see page 14 of LOGBOOK_V3_S25FS-S_00-271247.pdf + */ +static void ext_flash_erase32kB(void) +{ + uint32_t actualAddress_backup; + + actualAddress_backup = actualAddress; + actualAddress = 0; + wait_chip_not_busy(); + write_spi(0x06,RELEASE);/* WREN */ + write_spi(0xD8,HOLDCS);/* sector erase cmd */ + write_address(RELEASE); + actualAddress = actualAddress_backup; +} + + +static void ext_flash_erase64kB(void) +{ + wait_chip_not_busy(); + write_spi(0x06,RELEASE);/* WREN */ + write_spi(0xD8,HOLDCS);/* sector erase cmd */ + write_address(RELEASE); +} + + +void ext_flash_read_block_start(void) +{ + wait_chip_not_busy(); + write_spi(0x03,HOLDCS); /* WREN */ + write_address(HOLDCS); +} + +/* 4KB, 32KB, 64 KB, not the upper 16 MB with 4 Byte address at the moment */ +static uint8_t ext_flash_erase_if_on_page_start(void) +{ + if(actualAddress < 0x00008000) + { + /* 4K Byte is 0x1000 */ + if((actualAddress & 0xFFF) == 0) + { + ext_flash_erase4kB(); + return 1; + } + } + else + if(actualAddress < 0x00010000) + { + /* 32K Byte is only one page */ + if(actualAddress == 0x00010000) + { + ext_flash_erase32kB(); + return 1; + } + } + else + { + /* 64K Byte is 0x10000 */ + if((actualAddress & 0xFFFF) == 0) + { + if(preparedPageAddress == actualAddress) /* has page already been prepared before? (at the moment for samples only) */ + { + preparedPageAddress = 0; + + } + else + { + ext_flash_erase64kB(); + } + return 1; + } + } + + return 0; +} + + +static void ext_flash_read_block(uint8_t *getByte, uint8_t type) +{ + *getByte = read_spi(HOLDCS);/* read data */ + ext_flash_incf_address(type); +} + + +static void ext_flash_read_block_multi(void *getByte, uint32_t size, uint8_t type) +{ + uint8_t *data; + data = getByte; + + for(uint32_t i=0;i<size;i++) + { + data[i] = read_spi(HOLDCS);/* read data */ + ext_flash_incf_address(type); + } +} + + +static void ext_flash_read_block_stop(void) +{ + chip_unselect(); +} + + +/* Private functions ---------------------------------------------------------*/ + +static void ef_write_block(uint8_t * sendByte, uint32_t length, uint8_t type, uint8_t do_not_erase) +{ + uint32_t remaining_page_size, remaining_length, remaining_space_to_ring_end; + uint32_t i=0; + + if(!length) + return; + + uint32_t ringStart, ringStop; + + switch(type) + { + case EF_HEADER: + actualAddress = actualPointerHeader; + ringStart = HEADERSTART; + ringStop = HEADERSTOP; + break; + case EF_SAMPLE: + actualAddress = actualPointerSample; + ringStart = SAMPLESTART; + ringStop = SAMPLESTOP; + break; + case EF_DEVICEDATA: + actualAddress = actualPointerDevicedata; + ringStart = DDSTART; + ringStop = DDSTOP; + break; + case EF_VPMDATA: + actualAddress = actualPointerVPM; + ringStart = VPMSTART; + ringStop = VPMSTOP; + break; + case EF_SETTINGS: + actualAddress = actualPointerSettings; + ringStart = SETTINGSSTART; + ringStop = SETTINGSSTOP; + break; + case EF_FIRMWARE: + actualAddress = actualPointerFirmware; + ringStart = FWSTART; + ringStop = FWSTOP; + break; + case EF_FIRMWARE2: + actualAddress = actualPointerFirmware2; + ringStart = FWSTART2; + ringStop = FWSTOP2; + break; + default: + ringStart = FLASHSTART; + ringStop = FLASHSTOP; + break; + } + /* safety */ + if(actualAddress < ringStart) + actualAddress = ringStart; + + if(do_not_erase == 0) + { + ext_flash_erase_if_on_page_start(); + } + + while( i<length) + { + ef_hw_rough_delay_us(5); + wait_chip_not_busy(); + write_spi(0x06,RELEASE); /* WREN */ + write_spi(0x02,HOLDCS); /* write cmd */ + write_address(HOLDCS); + + remaining_length = length - i; + remaining_page_size = 0xFF - (uint8_t)(actualAddress & 0xFF) +1; + remaining_space_to_ring_end = ringStop - actualAddress; + + if(remaining_length >= 256) + { + remaining_length = 255; /* up to 256 bytes may be written in one burst. Last byte is written with release */ + } + else + { + remaining_length--; /* last byte needed for release */ + } + if(remaining_length >= (remaining_page_size) ) /* use 256 byte page and calculate number of bytes left */ + { + remaining_length = remaining_page_size - 1; + } + if( (remaining_space_to_ring_end >= 256)) + { + for(int j=0; j<remaining_length; j++) + { + write_spi(sendByte[i],HOLDCS);/* write data */ + actualAddress++; + i++; + } + } + /* byte with RELEASE */ + write_spi(sendByte[i],RELEASE);/* write data */ + actualAddress++; + i++; + + if(actualAddress > ringStop) + actualAddress = ringStart; + + if(do_not_erase == 0) + ext_flash_erase_if_on_page_start(); + } + switch(type) + { + case EF_HEADER: + actualPointerHeader = actualAddress; + break; + case EF_SAMPLE: + actualPointerSample = actualAddress; + break; + case EF_DEVICEDATA: + actualPointerDevicedata = actualAddress; + break; + case EF_VPMDATA: + actualPointerVPM = actualAddress; + break; + case EF_SETTINGS: + actualPointerSettings = actualAddress; + break; + case EF_FIRMWARE: + actualPointerFirmware = actualAddress; + break; + case EF_FIRMWARE2: + actualPointerFirmware2 = actualAddress; + break; + default: + break; + } +} + + +static void ef_erase_64K(uint32_t blocks) +{ + for(uint32_t i = 0; i < blocks; i++) + { + wait_chip_not_busy(); + write_spi(0x06,RELEASE);/* WREN */ + write_spi(0xD8,HOLDCS);/* 64k erase cmd */ + write_address(RELEASE); + actualAddress += 0x10000; + HAL_Delay(25); + } +} + +static void chip_unselect(void) +{ + HAL_GPIO_WritePin(EXTFLASH_CSB_GPIO_PORT,EXTFLASH_CSB_PIN,GPIO_PIN_SET); // chip select +} + +static void chip_select(void) +{ + HAL_GPIO_WritePin(EXTFLASH_CSB_GPIO_PORT,EXTFLASH_CSB_PIN,GPIO_PIN_RESET); // chip select +} + +static uint8_t read_spi(uint8_t unselect_CS_afterwards) +{ + uint8_t byte; + + chip_select(); + + if(HAL_SPI_Receive(&hspiDisplay, &byte, 1, 10000) != HAL_OK) + Error_Handler_extflash(); + + while (HAL_SPI_GetState(&hspiDisplay) != HAL_SPI_STATE_READY) + { + } + if(unselect_CS_afterwards) + chip_unselect(); + + return byte; +} + + +static void write_spi(uint8_t data, uint8_t unselect_CS_afterwards) +{ + chip_select(); + + if(HAL_SPI_Transmit(&hspiDisplay, &data, 1, 10000) != HAL_OK) + Error_Handler_extflash(); + + while (HAL_SPI_GetState(&hspiDisplay) != HAL_SPI_STATE_READY) + { + } + if(unselect_CS_afterwards) + chip_unselect(); +} + + +static void write_address(uint8_t unselect_CS_afterwards) +{ + uint8_t hi, med ,lo; + + hi = (actualAddress >> 16) & 0xFF; + med = (actualAddress >> 8) & 0xFF; + lo = actualAddress & 0xFF; + + write_spi(hi, HOLDCS); + write_spi(med, HOLDCS); + write_spi(lo, unselect_CS_afterwards); +} + + +static void wait_chip_not_busy(void) +{ + uint8_t status; + + chip_unselect(); + + write_spi(0x05,HOLDCS); /* RDSR */ + status = read_spi(HOLDCS);/* read status */ + while(status & 0x01) + { + HAL_Delay(1); + status = read_spi(HOLDCS);/* read status */ + } + chip_unselect(); +} + + +static void ext_flash_incf_address(uint8_t type) +{ + uint32_t ringStart, ringStop; + + actualAddress += 1; + + switch(type) + { + case EF_HEADER: + ringStart = HEADERSTART; + ringStop = HEADERSTOP; + break; + case EF_SAMPLE: + ringStart = SAMPLESTART; + ringStop = SAMPLESTOP; + break; + case EF_DEVICEDATA: + ringStart = DDSTART; + ringStop = DDSTOP; + break; + case EF_VPMDATA: + ringStart = VPMSTART; + ringStop = VPMSTOP; + break; + case EF_SETTINGS: + ringStart = SETTINGSSTART; + ringStop = SETTINGSSTOP; + break; + case EF_FIRMWARE: + ringStart = FWSTART; + ringStop = FWSTOP; + break; + case EF_FIRMWARE2: + ringStart = FWSTART2; + ringStop = FWSTOP2; + break; + default: + ringStart = FLASHSTART; + ringStop = FLASHSTOP; + break; + } + + if((actualAddress < ringStart) || (actualAddress > ringStop)) + actualAddress = ringStart; +} + +static void ef_hw_rough_delay_us(uint32_t delayUs) +{ + if(!delayUs) + return; + delayUs*= 12; + while(delayUs--); + return; +} + +static void Error_Handler_extflash(void) +{ + while(1) + { + } +} + +void ext_flash_CloseSector(void) +{ + uint32_t actualAddressBackup = actualAddress; + int i=0; + + if(closeSectorAddress != 0) + { + /* write some dummy bytes to the sector which is currently used for storing samples. This is done to "hide" problem if function is calles again */ + actualAddress = closeSectorAddress; + + wait_chip_not_busy(); + write_spi(0x06,RELEASE); /* WREN */ + write_spi(0x02,HOLDCS); /* write cmd */ + write_address(HOLDCS); + for(i = 0; i<8; i++) + { + write_spi(0xA5,HOLDCS);/* write data */ + actualAddress++; + } + /* byte with RELEASE */ + write_spi(0xA5,RELEASE);/* write data */ + actualAddress = actualAddressBackup; + closeSectorAddress = 0; + } +} + + +uint8_t ext_flash_erase_firmware_if_not_empty(void) +{ + const uint8_t TESTSIZE_FW = 4; + + uint8_t data[TESTSIZE_FW]; + uint8_t notEmpty = 0; + + actualAddress = FWSTART; + ext_flash_read_block_start(); + for(int i = 0; i < TESTSIZE_FW; i++) + { + ext_flash_read_block(&data[i], EF_FIRMWARE); + if(data[i] != 0xFF) + notEmpty = 1; + } + ext_flash_read_block_stop(); + + if(notEmpty) + { + ext_flash_erase_firmware(); + return 1; + } + else + return 0; +} + +uint8_t ext_flash_erase_firmware2_if_not_empty(void) +{ + const uint8_t TESTSIZE_FW = 4; + + uint8_t data[TESTSIZE_FW]; + uint8_t notEmpty = 0; + + actualAddress = FWSTART2; + ext_flash_read_block_start(); + for(int i = 0; i < TESTSIZE_FW; i++) + { + ext_flash_read_block(&data[i], EF_FIRMWARE2); + if(data[i] != 0xFF) + notEmpty = 1; + } + ext_flash_read_block_stop(); + + if(notEmpty) + { + ext_flash_erase_firmware2(); + return 1; + } + else + return 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Src/gfx_engine_mini.c Sat Nov 15 19:29:44 2025 +0100 @@ -0,0 +1,3126 @@ +/** + ****************************************************************************** + * @file gfx_engine.c + * @author heinrichs weikamp gmbh + * @version V0.0.2 + * @date 30-April-2014 + * @brief Main source file of GFX Graphic Engine + * This file provides firmware functions to manage the following + * functions to draw on the screen: + * + write string to display + * + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2014 heinrichs weikamp</center></h2> + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ + +#include <stdlib.h> +#include <stdint.h> + +#include "stm32f4xx_hal.h" + +#include "gfx.h" +#include "gfx_engine.h" +#include "gfx_fonts.h" +#include "gfx_colors.h" +#include "ostc.h" +#include "settings.h" +#include "text_multilanguage.h" + +/* Exported variables --------------------------------------------------------*/ + +/* Private types -------------------------------------------------------------*/ + +#define RING_BUF_SIZE (5u) +#define MAX_COLOR_STRING_LENGTH (100u) + +typedef struct +{ + uint32_t Xdelta; + uint32_t Ydelta; + uint8_t invert; + uint8_t color; + uint8_t dualFont; + uint8_t resize; + uint32_t font; + uint8_t spaceMode; + uint8_t singleSpaceWithSizeOfNextChar; + uint8_t useTinyFont; + uint32_t TinyFont; + int8_t TinyFontExtraYdelta; + tFont *actualFont; + uint8_t doubleSize; +} GFX_CfgWriteString; + +typedef struct +{ + uint32_t pBuffer; + uint32_t height; + uint32_t width; + uint32_t leftStart; + uint32_t bottomStart; +} GFX_layerSingle; +/* +typedef struct +{ + GFX_layerSingle top; + GFX_layerSingle bottom; +} GFX_layersTopBottom; +*/ +typedef struct +{ + uint32_t pActualTopBuffer; + uint32_t pNextTopBuffer[RING_BUF_SIZE]; + GFX_layerSingle actualBottom; + GFX_layerSingle nextBottom[RING_BUF_SIZE]; + uint8_t NextTopWrite; + uint8_t NextBottomWrite; + uint8_t NextTopRead; + uint8_t NextBottomRead; +} GFX_layerControl; + +typedef struct +{ + uint32_t StartAddress; + int8_t status; + uint8_t caller; +} SFrameList; + +enum FRAMESTATE +{ + CLEAR = 0, + BLOCKED, + RELEASED +}; + +enum LOGOSTATE +{ + LOGOOFF = 0, + LOGOSTART = 1, + LOGOSTOP = 255 +}; + +// should be 43 +#define MAXFRAMES 39 + +#define SDRAM_BANK_ADDR ((uint32_t)0xD0000000) +#define FBGlobalStart SDRAM_BANK_ADDR +#define FBOffsetEachIndex (800*480*2) + +#define SDRAM_DOUBLE_BUFFER_ONE ((uint32_t)(FBGlobalStart + (MAXFRAMES * FBOffsetEachIndex))) +#define SDRAM_DOUBLE_BUFFER_TWO ((uint32_t)(SDRAM_DOUBLE_BUFFER_ONE + (2 * FBOffsetEachIndex))) +#define SDRAM_DOUBLE_BUFFER_END ((uint32_t)(SDRAM_DOUBLE_BUFFER_TWO + (2 * FBOffsetEachIndex))) + +/* Semi Private variables ---------------------------------------------------------*/ + +DMA2D_HandleTypeDef Dma2dHandle; +static LTDC_HandleTypeDef LtdcHandle; + +/* Private variables ---------------------------------------------------------*/ + +static uint8_t DMA2D_at_work = 0; + +static GFX_layerControl FrameHandler = { 0 }; + +static uint32_t pInvisibleFrame = 0; +static uint32_t pLogoFrame = 0; +static uint8_t logoStatus; +static uint32_t pBackgroundHwFrame = 0; +static uint8_t backgroundHwStatus; + +static SFrameList frame[MAXFRAMES]; + +static void GFX_clear_frame_immediately(uint32_t pDestination); +static void GFX_draw_image_color(GFX_DrawCfgScreen *hgfx, SWindowGimpStyle window, const tImage *image); +/* ITM Trace-----------------------------------------------------------------*/ + +#include "stdio.h" + +#define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) +#define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) +#define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) + +#define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) +#define TRCENA 0x01000000 + +struct __FILE { int handle; /* Add whatever needed */ }; +FILE __stdout; +FILE __stdin; + +int fputc(int ch, FILE *f) { + if (DEMCR & TRCENA) { + while (ITM_Port32(0) == 0); + ITM_Port8(0) = ch; + } + return(ch); +} + +uint32_t MinU32GFX(uint32_t a, uint32_t b) +{ + return ((a<b)?a:b); +} + + +uint32_t MaxU32GFX(uint32_t a, uint32_t b) +{ + return((a>b)?a:b); +} + +/* Private function prototypes -----------------------------------------------*/ + +static uint32_t GFX_write_char(GFX_DrawCfgWindow* hgfx, GFX_CfgWriteString* cfg, uint8_t character, tFont *Font); +static uint32_t GFX_write_substring(GFX_CfgWriteString* cfg, GFX_DrawCfgWindow* hgfx, uint8_t textId, int8_t nextCharFor2Byte); +static void GFX_Error_Handler(void); +static void GFX_Dma2d_TransferComplete(DMA2D_HandleTypeDef* Dma2dHandle); +static void GFX_Dma2d_TransferError(DMA2D_HandleTypeDef* Dma2dHandle); +static void GFX_clear_frame_dma2d(uint8_t frameId); + +static uint32_t GFX_doubleBufferOne(void); +static uint32_t GFX_doubleBufferTwo(void); + +static void GFX_LTDC_Init_display1(void); + + +/* Exported functions --------------------------------------------------------*/ + +uint8_t GFX_logoStatus(void) +{ + return logoStatus; +} + +void GFX_SetWindowLayer0(uint32_t pDestination, int16_t XleftGimpStyle, int16_t XrightGimpStyle, int16_t YtopGimpStyle, int16_t YbottomGimpStyle) +{ + int16_t XSize, YSize, X0, Y0; + + if(XleftGimpStyle < 0) XleftGimpStyle = 0; + if(XrightGimpStyle < 0) XrightGimpStyle = 0; + if(XleftGimpStyle > 799) XleftGimpStyle = 800; + if(XrightGimpStyle > 799) XrightGimpStyle = 800; + + if(YtopGimpStyle < 0) YtopGimpStyle = 0; + if(YbottomGimpStyle < 0) YbottomGimpStyle = 0; + if(YtopGimpStyle > 479) YtopGimpStyle = 480; + if(YbottomGimpStyle > 479) YbottomGimpStyle = 480; + +/* + XSize = YbottomGimpStyle - YtopGimpStyle; + YSize = XrightGimpStyle - XleftGimpStyle; + if((XSize <= 0) || (YSize <= 0)) + return; + X0 = 479 - YbottomGimpStyle; + Y0 = XleftGimpStyle; + while((LTDC->CPSR & LTDC_CPSR_CYPOS) <= (uint32_t)800); + HAL_LTDC_SetWindowSize(&LtdcHandle, XSize, YSize, LayerIdx); + HAL_LTDC_SetWindowPosition(&LtdcHandle, X0, Y0,LayerIdx); + HAL_LTDC_SetAddress(&LtdcHandle, pDestination, LayerIdx); +*/ + + XSize = XrightGimpStyle - XleftGimpStyle; + YSize = YbottomGimpStyle - YtopGimpStyle; + if((XSize <= 0) || (YSize <= 0)) + return; + Y0 = 479 - YbottomGimpStyle; + X0 = XleftGimpStyle; + + GFX_SetFrameBottom(pDestination, X0, Y0, XSize, YSize); +} + + +void GFX_logoAutoOff(void) +{ + if(logoStatus == LOGOOFF) + logoStatus = LOGOSTART; +} + + +void GFX_hwBackgroundOn(void) +{ + backgroundHwStatus = LOGOSTART; +} + + +void GFX_hwBackgroundOff(void) +{ + backgroundHwStatus = LOGOSTOP; +} + +void GFX_build_hw_background_frame(void) +{ + GFX_DrawCfgScreen tLogoTemp; + SWindowGimpStyle windowGimp; + + pBackgroundHwFrame = getFrame(1); + backgroundHwStatus = 0; + + tLogoTemp.FBStartAdress = pBackgroundHwFrame; + tLogoTemp.ImageHeight = 480; + tLogoTemp.ImageWidth = 800; + tLogoTemp.LayerIndex = 1; + + windowGimp.left = (800 - 400) / 2; + windowGimp.top = 0;//(480 - 46) / 2; + + GFX_draw_image_color(&tLogoTemp, windowGimp, &ImgHWcolor); +/* + char localtext[256]; + uint8_t ptr = 0; + + localtext[ptr++] = ' '; + localtext[ptr++] = ' '; + localtext[ptr++] = 'O'; + localtext[ptr++] = 'S'; + localtext[ptr++] = ' '; + ptr += GFX_printf_firmware(&localtext[ptr]); + localtext[ptr] = 0; + + write_content_simple(&tLogoTemp, 0, 800, 240-24, &FontT24,localtext,CLUT_Font020); +*/ +} + +void decompressFont(const tFont* pFont, const tImageComp** pFontComp) +{ + uint16_t indexFont = 0; + uint16_t indexData = 0; + uint8_t data = 0; + uint8_t count = 0; + uint8_t targetIndex = 0; + uint8_t* pPixel; + + for (indexFont = 0; indexFont < pFont->length; indexFont++) + { + pPixel = (uint8_t*)pFont->chars[indexFont].image->data; + for(indexData = 0; indexData < pFontComp[indexFont]->sizeComp; indexData += 2) + { + data = pFontComp[indexFont]->dataComp[indexData]; + count = pFontComp[indexFont]->dataComp[indexData + 1]; + for (targetIndex = 0; targetIndex < count; targetIndex++) + { + *pPixel++ = data; + } + } + } +} + +void GFX_build_logo_frame(void) +{ + GFX_DrawCfgScreen tLogoTemp; + SWindowGimpStyle windowGimp; + + pLogoFrame = getFrame(1); + logoStatus = LOGOOFF; + + tLogoTemp.FBStartAdress = pLogoFrame; + tLogoTemp.ImageHeight = 480; + tLogoTemp.ImageWidth = 800; + tLogoTemp.LayerIndex = 1; + + windowGimp.left = (800 - 400) / 2; + windowGimp.top = (480 - 46) / 2; + + GFX_draw_image_color(&tLogoTemp, windowGimp, &ImgHWcolor); +/* + char localtext[256]; + uint8_t ptr = 0; + + localtext[ptr++] = ' '; + localtext[ptr++] = ' '; + localtext[ptr++] = 'O'; + localtext[ptr++] = 'S'; + localtext[ptr++] = ' '; + ptr += GFX_printf_firmware(&localtext[ptr]); + localtext[ptr] = 0; + + write_content_simple(&tLogoTemp, 0, 800, 240-24, &FontT24,localtext,CLUT_Font020); +*/ +} + +void GFX_init(uint32_t * pDestinationOut) +{ + frame[0].StartAddress = FBGlobalStart; + GFX_clear_frame_immediately(frame[0].StartAddress); + frame[0].status = CLEAR; + frame[0].caller = 0; + + for(int i=1;i<MAXFRAMES;i++) + { + frame[i].StartAddress = frame[i-1].StartAddress + FBOffsetEachIndex; + GFX_clear_frame_immediately(frame[i].StartAddress); + frame[i].status = CLEAR; + frame[i].caller = 0; + } + + pInvisibleFrame = getFrame(2); + *pDestinationOut = pInvisibleFrame; + + GFX_build_logo_frame(); + GFX_build_hw_background_frame(); + + /* Register to memory mode with ARGB8888 as color Mode */ + Dma2dHandle.Init.Mode = DMA2D_R2M; + Dma2dHandle.Init.ColorMode = DMA2D_ARGB4444;//to fake AL88, before: DMA2D_ARGB8888; + Dma2dHandle.Init.OutputOffset = 0; + + /* DMA2D Callbacks Configuration */ + Dma2dHandle.XferCpltCallback = GFX_Dma2d_TransferComplete; + Dma2dHandle.XferErrorCallback = GFX_Dma2d_TransferError; + + Dma2dHandle.Instance = DMA2D; + + /* DMA2D Initialisation */ + if(HAL_DMA2D_Init(&Dma2dHandle) != HAL_OK) + GFX_Error_Handler(); + + if(HAL_DMA2D_ConfigLayer(&Dma2dHandle, 1) != HAL_OK) + GFX_Error_Handler(); + + DMA2D_at_work = 255; +} +void GFX_init1_no_DMA(uint32_t * pDestinationOut, uint8_t blockFrames) +{ + frame[0].StartAddress = FBGlobalStart; + GFX_clear_frame_immediately(frame[0].StartAddress); + frame[0].status = CLEAR; + frame[0].caller = 0; + + for(int i=1;i<MAXFRAMES;i++) + { + frame[i].StartAddress = frame[i-1].StartAddress + FBOffsetEachIndex; + GFX_clear_frame_immediately(frame[i].StartAddress); + frame[i].status = CLEAR; + frame[i].caller = 0; + } + + for(int i=0;i<blockFrames;i++) + { + frame[i].status = BLOCKED; + frame[i].caller = 1; + } + + pInvisibleFrame = getFrame(2); + *pDestinationOut = pInvisibleFrame; + + GFX_build_logo_frame(); + GFX_build_hw_background_frame(); +} + + +void GFX_init2_DMA(void) +{ + /* Register to memory mode with ARGB8888 as color Mode */ + Dma2dHandle.Init.Mode = DMA2D_R2M; + Dma2dHandle.Init.ColorMode = DMA2D_ARGB4444;//to fake AL88, before: DMA2D_ARGB8888; + Dma2dHandle.Init.OutputOffset = 0; + + /* DMA2D Callbacks Configuration */ + Dma2dHandle.XferCpltCallback = GFX_Dma2d_TransferComplete; + Dma2dHandle.XferErrorCallback = GFX_Dma2d_TransferError; + + Dma2dHandle.Instance = DMA2D; + + /* DMA2D Initialisation */ + if(HAL_DMA2D_Init(&Dma2dHandle) != HAL_OK) + GFX_Error_Handler(); + + if(HAL_DMA2D_ConfigLayer(&Dma2dHandle, 1) != HAL_OK) + GFX_Error_Handler(); + + DMA2D_at_work = 255; +} + + +void GFX_SetFrameTop(uint32_t pDestination) +{ + uint8_t NextTopWork = FrameHandler.NextTopWrite + 1; + + if(NextTopWork == RING_BUF_SIZE) + { + NextTopWork = 0; + } + + if(pDestination == 0) + pDestination = pInvisibleFrame; + + FrameHandler.pNextTopBuffer[NextTopWork] = pDestination; + FrameHandler.NextTopWrite = NextTopWork; +} + + +void GFX_SetFrameBottom(uint32_t pDestination, uint32_t x0, uint32_t y0, uint32_t width, uint32_t height) +{ + uint8_t NextBottomWork = FrameHandler.NextBottomWrite + 1; + + if(NextBottomWork == RING_BUF_SIZE) + { + NextBottomWork = 0; + } + + if(pDestination == 0) + pDestination = pInvisibleFrame; + + FrameHandler.nextBottom[NextBottomWork].pBuffer = pDestination; + FrameHandler.nextBottom[NextBottomWork].height = height; + FrameHandler.nextBottom[NextBottomWork].width = width; + FrameHandler.nextBottom[NextBottomWork].leftStart = x0; + FrameHandler.nextBottom[NextBottomWork].bottomStart = y0; + FrameHandler.NextBottomWrite = NextBottomWork; +} + + +void GFX_SetFramesTopBottom(uint32_t pTop, uint32_t pBottom, uint32_t heightBottom) +{ + GFX_SetFrameTop(pTop); + GFX_SetFrameBottom(pBottom, 0, 0, 800, heightBottom); +} + + +static uint32_t GFX_get_pActualFrameTop(void) +{ + return FrameHandler.pActualTopBuffer; +} + + +static uint32_t GFX_get_pActualFrameBottom(void) +{ + return FrameHandler.actualBottom.pBuffer; +} + + +void GFX_start_VSYNC_IRQ(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStructure.Pull = GPIO_NOPULL; + GPIO_InitStructure.Speed = GPIO_SPEED_LOW; + GPIO_InitStructure.Pin = VSYNC_IRQ_PIN; + HAL_GPIO_Init(VSYNC_IRQ_GPIO_PORT, &GPIO_InitStructure); + + HAL_NVIC_SetPriority(VSYNC_IRQ_EXTI_IRQn, 1, 0); + HAL_NVIC_EnableIRQ(VSYNC_IRQ_EXTI_IRQn); +} + + +void GFX_change_LTDC(void) +{ + uint32_t pTop = 0; + uint32_t pBot = 0; + uint32_t heightBot = 0; + uint32_t widthBot = 0; + uint32_t leftStartBot = 0; + uint32_t bottomStartBot = 0; + uint8_t change_position = 0; + uint8_t change_size = 0; + uint8_t nextBottomBackup = FrameHandler.NextBottomRead; /* Restore entry value in case off logo handling */ + + // Top Frame + if(FrameHandler.NextTopRead != FrameHandler.NextTopWrite) + { + FrameHandler.NextTopRead++; + if(FrameHandler.NextTopRead == RING_BUF_SIZE) + { + FrameHandler.NextTopRead = 0; + } + } + pTop = FrameHandler.pNextTopBuffer[FrameHandler.NextTopRead]; + + if(FrameHandler.pActualTopBuffer != pTop) + { + HAL_LTDC_SetAddress(&LtdcHandle, pTop, 1); + FrameHandler.pActualTopBuffer = pTop; + } + + // Bottom Frame + if(FrameHandler.NextBottomRead != FrameHandler.NextBottomWrite) + { + FrameHandler.NextBottomRead++; + if(FrameHandler.NextBottomRead == RING_BUF_SIZE) + { + FrameHandler.NextBottomRead = 0; + } + } + if(logoStatus != LOGOOFF) + { + switch(logoStatus) + { + case LOGOSTART: + HAL_LTDC_SetAlpha(&LtdcHandle, 0, 1); + HAL_LTDC_SetAlpha(&LtdcHandle, 34, 0); + HAL_LTDC_ConfigCLUT(&LtdcHandle, (uint32_t *)indexHWcolor, indexHWcolorSIZE, 0); + HAL_LTDC_SetAddress(&LtdcHandle, pLogoFrame, 0); + HAL_LTDC_SetWindowSize(&LtdcHandle, 480, 800, 0); + HAL_LTDC_SetWindowPosition(&LtdcHandle, 0, 0, 0); + logoStatus = 2; + FrameHandler.NextBottomRead = nextBottomBackup; + break; + + case LOGOSTOP: + HAL_LTDC_SetAlpha(&LtdcHandle, 255, 1); + HAL_LTDC_ConfigCLUT(&LtdcHandle, ColorLUT, CLUT_END, 0); + + pBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].pBuffer; + heightBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].height; + widthBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].width; + leftStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].leftStart; + bottomStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].bottomStart; + HAL_LTDC_SetWindowSize(&LtdcHandle, heightBot, widthBot, 0); + HAL_LTDC_SetWindowPosition(&LtdcHandle, bottomStartBot, leftStartBot, 0); + HAL_LTDC_SetAddress(&LtdcHandle, pBot, 0); + HAL_LTDC_SetAlpha(&LtdcHandle, 255, 0); + FrameHandler.actualBottom.height = heightBot; + FrameHandler.actualBottom.width = widthBot; + FrameHandler.actualBottom.leftStart = leftStartBot; + FrameHandler.actualBottom.bottomStart = bottomStartBot; + FrameHandler.actualBottom.pBuffer = pBot; + + logoStatus = LOGOOFF; + if(backgroundHwStatus == 2) + { + backgroundHwStatus = LOGOSTART; + } + break; + default: + if(logoStatus < 35) + { + logoStatus++; + if(logoStatus <= 15) + HAL_LTDC_SetAlpha(&LtdcHandle, 17*logoStatus, 0); + } + else + { + logoStatus +=20; + HAL_LTDC_SetAlpha(&LtdcHandle, logoStatus-55, 1); + HAL_LTDC_SetAlpha(&LtdcHandle, 255+55-logoStatus, 0); + } + FrameHandler.NextBottomRead = nextBottomBackup; + break; + } + return; + } + else if (backgroundHwStatus != LOGOOFF) + { + + switch(backgroundHwStatus) + { + case LOGOSTART: + HAL_LTDC_ConfigCLUT(&LtdcHandle, (uint32_t *)indexHWcolor, indexHWcolorSIZE, 0); + HAL_LTDC_SetAddress(&LtdcHandle, pBackgroundHwFrame, 0); + HAL_LTDC_SetWindowSize(&LtdcHandle, 480, 800, 0); + HAL_LTDC_SetWindowPosition(&LtdcHandle, 0, 0, 0); + backgroundHwStatus = 2; + FrameHandler.NextBottomRead = nextBottomBackup; + break; + + case LOGOSTOP: + HAL_LTDC_ConfigCLUT(&LtdcHandle, ColorLUT, CLUT_END, 0); + pBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].pBuffer; + heightBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].height; + widthBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].width; + leftStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].leftStart; + bottomStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].bottomStart; + HAL_LTDC_SetWindowSize(&LtdcHandle, heightBot, widthBot, 0); + HAL_LTDC_SetWindowPosition(&LtdcHandle, bottomStartBot, leftStartBot, 0); + HAL_LTDC_SetAddress(&LtdcHandle, pBot, 0); + HAL_LTDC_SetAlpha(&LtdcHandle, 255, 0); + FrameHandler.actualBottom.height = heightBot; + FrameHandler.actualBottom.width = widthBot; + FrameHandler.actualBottom.leftStart = leftStartBot; + FrameHandler.actualBottom.bottomStart = bottomStartBot; + FrameHandler.actualBottom.pBuffer = pBot; + backgroundHwStatus = LOGOOFF; + break; + + default: + FrameHandler.NextBottomRead = nextBottomBackup; + break; + } + + return; + } + else + { + pBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].pBuffer; + heightBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].height; + widthBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].width; + leftStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].leftStart; + bottomStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].bottomStart; + + if(FrameHandler.actualBottom.pBuffer == pBot) + pBot = 0; + + if((FrameHandler.actualBottom.height != heightBot) || (FrameHandler.actualBottom.width != widthBot)) + change_size = 1; + + if((FrameHandler.actualBottom.leftStart != leftStartBot) || (FrameHandler.actualBottom.bottomStart != bottomStartBot)) + change_position = 1; + + if(pBot || change_size || change_position) + { + if(heightBot && widthBot) + HAL_LTDC_SetWindowSize(&LtdcHandle, heightBot, widthBot, 0); + + if(change_position || leftStartBot || bottomStartBot) + HAL_LTDC_SetWindowPosition(&LtdcHandle, bottomStartBot, leftStartBot, 0); + + if(pBot) + HAL_LTDC_SetAddress(&LtdcHandle, pBot, 0); + + if(change_size) + { + FrameHandler.actualBottom.height = heightBot; + FrameHandler.actualBottom.width = widthBot; + } + if(change_position) + { + FrameHandler.actualBottom.leftStart = leftStartBot; + FrameHandler.actualBottom.bottomStart = bottomStartBot; + } + if(pBot) + FrameHandler.actualBottom.pBuffer = pBot; + } + } +} + +uint8_t GFX_is_colorschemeDiveStandard(void) +{ + return (ColorLUT[CLUT_Font027] == 0x00FFFFFF); +} + + +void change_CLUT_entry(uint8_t entryToChange, uint8_t entryUsedForChange) +{ +/* bug fix + static uint8_t counter = 0; + + if(entryToChange == 0x1C) + counter++; +*/ + ColorLUT[entryToChange] = ColorLUT[entryUsedForChange]; + HAL_LTDC_ConfigCLUT(&LtdcHandle, ColorLUT, CLUT_END, 1); + if(logoStatus == LOGOOFF) + HAL_LTDC_ConfigCLUT(&LtdcHandle, ColorLUT, CLUT_END, 0); +} + + +void GFX_use_colorscheme(uint8_t colorscheme) +{ + uint8_t ColorSchemeStart; + + if(colorscheme > 3) + colorscheme = 0; + + ColorSchemeStart = CLUT_Colorscheme0 + (8 * colorscheme); + for(int i=1; i<8; i++) + { + ColorLUT[CLUT_Font027 + i] = ColorLUT[ColorSchemeStart + i]; + } + change_CLUT_entry(CLUT_Font027, ColorSchemeStart); +} + + +void GFX_VGA_transform(uint32_t pSource, uint32_t pDestination) +{ + int h, v; + uint32_t offsetSource, offsetSourceStartOfLine; + + offsetSourceStartOfLine = 480 + 480 - 2; + for(v=0;v<480;v++) + { + offsetSource = offsetSourceStartOfLine; + for(h=0;h<640;h++) + { + *(__IO uint8_t*)pDestination = *(uint8_t*)(pSource + offsetSource); + pDestination++; + offsetSource += 1; + *(__IO uint8_t*)pDestination = *(uint8_t*)(pSource + offsetSource); + pDestination++; + offsetSource += 480 + 479; + } + offsetSourceStartOfLine -= 2; + } +} + + +static void GFX_clear_frame_immediately(uint32_t pDestination) +{ + uint32_t i; + uint32_t* pfill = (uint32_t*) pDestination; + + + for(i = 200*480; i > 0; i--) + { + *pfill++ = 0; + *pfill++ = 0; + } +} + + +void GFX_clear_window_immediately(GFX_DrawCfgWindow* hgfx) +{ + uint32_t pDestination, i, j; + uint16_t left, width, bottom, height, nextlineStep; + + pDestination = (uint32_t)hgfx->Image->FBStartAdress; + + left = hgfx->WindowX0; + width = 1 + hgfx->WindowX1 - left; + bottom = hgfx->WindowY0; + height = 1 + hgfx->WindowY1 - bottom; + nextlineStep = hgfx->Image->ImageHeight - height; + nextlineStep *= 2; + + pDestination += 2 * bottom; + pDestination += 2 * hgfx->Image->ImageHeight * left; + + for(j = width; j > 0; j--) + { + for(i = height; i > 0; i--) + { + *(__IO uint16_t*)pDestination = 0; + pDestination += 2; + } + pDestination += nextlineStep; + } +} + + +static void GFX_clear_frame_dma2d(uint8_t frameId) +{ + if(frameId >= MAXFRAMES) + return; + + DMA2D_at_work = frameId; + + if (HAL_DMA2D_Start_IT(&Dma2dHandle, 0x0000000000, frame[frameId].StartAddress, 480, 800) != HAL_OK) + GFX_Error_Handler(); +} + + +void GFX_fill_buffer(uint32_t pDestination, uint8_t alpha, uint8_t color) +{ + + union al88_u + { + uint8_t al8[2]; + uint16_t al88; + }; + union al88_u colorcombination; + uint32_t i; + uint32_t* pfill = (uint32_t*) pDestination; + uint32_t fillpattern; + + colorcombination.al8[0] = color; + colorcombination.al8[1] = alpha; + + fillpattern = (colorcombination.al88 << 16) | colorcombination.al88; + for(i = 800*480/2; i > 0; i--) + { + *pfill++ = fillpattern; + } +} + +static void GFX_draw_image_color(GFX_DrawCfgScreen *hgfx, SWindowGimpStyle window, const tImage *image) +{ + uint16_t* pDestination; + + uint32_t j; + point_t start, stop; + + start.x = window.left; + start.y = (hgfx->ImageHeight - image->height - window.top); + stop.y = start.y + image->height; + stop.x = start.x + image->width; + j = 0; + + for(int xx = start.x; xx < stop.x; xx++) + { + pDestination = (uint16_t*)hgfx->FBStartAdress; + pDestination += xx * hgfx->ImageHeight; + pDestination += start.y; + for(int yy = start.y; yy < stop.y; yy++) + { + *(__IO uint16_t*)pDestination++ = 0xFF << 8 | image->data[j++]; + } + } +} + + +/* this is NOT fast nor optimized */ +void GFX_draw_pixel(GFX_DrawCfgScreen *hgfx, int16_t x, int16_t y, uint8_t color) +{ + uint16_t* pDestination; + + pDestination = (uint16_t*)hgfx->FBStartAdress; + pDestination += x * hgfx->ImageHeight; + pDestination += y; + + *(__IO uint16_t*)pDestination = 0xFF << 8 | color; +} + +/* this is NOT fast nor optimized */ +void GFX_draw_circle(GFX_DrawCfgScreen *hgfx, point_t center, uint8_t radius, int8_t color) +{ + int x, y; + int l; + int r2, y2; + int y2_new; + int ty; + + /* cos pi/4 = 185363 / 2^18 (approx) */ + l = (radius * 185363) >> 18; + + /* hw */ + l += 1; + + /* At x=0, y=radius */ + y = radius; + + r2 = y2 = y * y; + ty = (2 * y) - 1; + y2_new = r2 + 3; + + for (x = 0; x <= l; x++) { + y2_new -= (2 * x) - 3; + + if ((y2 - y2_new) >= ty) { + y2 -= ty; + y -= 1; + ty -= 2; + } + + GFX_draw_pixel (hgfx, x + center.x, y + center.y, color); + GFX_draw_pixel (hgfx, x + center.x, -y + center.y, color); + GFX_draw_pixel (hgfx, -x + center.x, y + center.y, color); + GFX_draw_pixel (hgfx, -x + center.x, -y + center.y, color); + + GFX_draw_pixel (hgfx, y + center.x, x + center.y, color); + GFX_draw_pixel (hgfx, y + center.x, -x + center.y, color); + GFX_draw_pixel (hgfx, -y + center.x, x + center.y, color); + GFX_draw_pixel (hgfx, -y + center.x, -x + center.y, color); + } +} + + +void GFX_draw_colorline(GFX_DrawCfgScreen *hgfx, point_t start, point_t stop, uint8_t color) +{ + uint32_t pDestination; + uint32_t j; + uint32_t temp; + + if(start.x == stop.x) + { + if(stop.y < start.y) + { + temp = stop.y; + stop.y = start.y; + start.y = temp; + } + pDestination = (uint32_t)hgfx->FBStartAdress; + pDestination += start.x * hgfx->ImageHeight * 2; + pDestination += start.y * 2; + for (j = stop.y - start.y; j > 0; j--) + { + *(__IO uint8_t*)pDestination = color; + pDestination += 1; + *(__IO uint8_t*)pDestination = 0xFF; + pDestination += 1; + } + } + else + if(start.y == stop.y) + { + if(stop.x < start.x) + { + temp = stop.x; + stop.x = start.x; + start.x = temp; + } + pDestination = (uint32_t)hgfx->FBStartAdress; + pDestination += start.x * hgfx->ImageHeight * 2; + pDestination += start.y * 2; + for (j = stop.x - start.x; j > 0; j--) + { + *(__IO uint8_t*)pDestination = color; + pDestination += 1; + *(__IO uint8_t*)pDestination = 0xFF; + pDestination -= 1; + pDestination += hgfx->ImageHeight * 2; + } + } + else // diagonal Bresenham's_line_algorithm + { + int x0 = start.x; + int y0 = start.y; + int x1 = stop.x; + int y1 = stop.y; + int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1; + int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1; + int err = (dx>dy ? dx : -dy)/2, e2; + + for(;;) + { + pDestination = (uint32_t)hgfx->FBStartAdress; + pDestination += ((x0 * hgfx->ImageHeight) + y0) * 2; + *(__IO uint8_t*)pDestination = color; + pDestination += 1; + *(__IO uint8_t*)pDestination = 0xFF; + if (x0==x1 && y0==y1) break; + e2 = err; + if (e2 >-dx) { err -= dy; x0 += sx; } + if (e2 < dy) { err += dx; y0 += sy; } + } + } +} + +// =============================================================================== +// GFX_graph_print +/// @brief Print all those nice curves, especially in logbook und miniLiveLogGraph +/// @version 0.0.2 hw 160519 +/// +/// 151022 hw -bug fix +/// - die aktuelle Version macht keine Linien mehr �ber die gesamte Bildschirmh�he. +/// - daf�r sind L�cher in der Kurve (z.B. Temperaturgraph Tauchgang Matthias 17.10.15 15:19) +/// +/// more details about range can be found in show_logbook_logbook_show_log_page2() - temperature graph +/// +/// @param window: top and bottom is only the range used by the data of the graph, not the entire screen / scale +/// @param drawVeilUntil: ist auff�llen des Bereichs unter der Kurve mit etwas hellerer Farbe +/// @param Xdivide: wird bisher nichr benutzt. +// =============================================================================== + + +void GFX_graph_print(GFX_DrawCfgScreen *hgfx, const SWindowGimpStyle *window, const int16_t drawVeilUntil, uint8_t Xdivide, uint16_t dataMin, uint16_t dataMax, uint16_t *data, uint16_t datalength, uint8_t color, uint8_t *colour_data) +{ + uint16_t* pDestination_tmp; + uint16_t* pDestination_start; + uint16_t* pDestination_end; + uint16_t* pDestination_zero_veil; + + uint32_t max = 0; + int windowheight = -1; + int windowwidth = -1; + int i = -1; + int w1 = -1; + int w2 = -1; + + uint32_t h_ulong = 0; + uint32_t h_ulong_old = 0; + _Bool invert = 0; + + uint16_t dataDelta = 0; + uint16_t dataDeltaHalve = 0; + uint16_t dataTemp = 0; + + uint8_t colorDataTemp; + uint8_t colormask = 0; + + pDestination_zero_veil = 0; + + if(dataMin > dataMax) + { + uint16_t dataFlip; + dataFlip = dataMin; + dataMin = dataMax; + dataMax = dataFlip; + invert = 1; + } + else + invert = 0; + + colormask = color; + + if(window->bottom > 479) + return; + if(window->top > 479) + return; + if(window->right > 799) + return; + if(window->left > 799) + return; + if(window->bottom < 0) + return; + if(window->top < 0) + return; + if(window->right < 0) + return; + if(window->left < 0) + return; + if(window->bottom <= window->top) + return; + if(window->right <= window->left) + return; + + windowheight = window->bottom - window->top ; + windowwidth = window->right - window->left; + w1 = 0; + w2 = 0; + if(dataMax == dataMin) + dataMax++; + dataDelta = (unsigned long)(dataMax - dataMin); + dataDeltaHalve = dataDelta / 2; + while((w1 <= windowwidth) && (w2 < datalength)) + { + int tmp = (10 * w1 * (long)datalength)/windowwidth; + w2 = tmp/10; + int rest = tmp - w2*10; + if(rest >= 5) + w2++; + + if((datalength - 1) < w2) + w2 = datalength-1; + + if(colour_data != NULL) + { + colorDataTemp = colour_data[w2]; + colormask = color + colorDataTemp; + } + + dataTemp = data[w2]; + if(Xdivide > 1) + { + w2++; + for(i=1;i<Xdivide;i++) + { + if(data[w2]>dataTemp) + dataTemp = data[w2]; + w2++; + } + } + + if(dataTemp > dataMin) + dataTemp -= dataMin; + else + dataTemp = 0; + + if(invert) + { + if(dataTemp < dataDelta) + dataTemp = dataDelta - dataTemp; + else + dataTemp = 0; + } + + h_ulong = (unsigned long)dataTemp; + h_ulong *= windowheight; + h_ulong += dataDeltaHalve; + h_ulong /= dataDelta; + + if(h_ulong > (window->bottom - window->top)) + h_ulong = (window->bottom - window->top); + + if(drawVeilUntil > 0) + { + pDestination_zero_veil = (uint16_t*)hgfx->FBStartAdress; + pDestination_zero_veil += ((479 - (drawVeilUntil - 2) ) + ((w1 + window->left) * hgfx->ImageHeight) ); + } + else if(drawVeilUntil < 0 ) + { + pDestination_zero_veil = (uint16_t*)hgfx->FBStartAdress; + pDestination_zero_veil += ((479 + (drawVeilUntil)) + ((w1 + window->left) * hgfx->ImageHeight) ); + } + + if(h_ulong + window->top > max) + { + max = h_ulong + window->top; + } + +// hw 160519 wof�r ist das? Damit funktioniert Temperatur 25,5�C nicht! +// if((dataMax == 255) || (data[w2] != 255)) +// { + //output_content[pointer] = colormask; + //output_mask[pointer] = true; + if(dataTemp != 0xFFFF) /* do not draw invalid data pixels */ + { + if(w1 > 0) + { + pDestination_start = (uint16_t*)hgfx->FBStartAdress; + pDestination_start += (((479 - (window->top)) + ((w1 + window->left) * hgfx->ImageHeight))); + pDestination_end = pDestination_start; + + if(h_ulong >= h_ulong_old) + { + pDestination_start -= h_ulong_old; + pDestination_end -= h_ulong; + + } + else + { + if(h_ulong < h_ulong_old) + { + pDestination_start += h_ulong_old; + pDestination_end += h_ulong; + } + else + { + pDestination_start += h_ulong; + pDestination_end += h_ulong_old; + } + } + + + // deco stops + if(drawVeilUntil < 0) + { + pDestination_tmp = pDestination_end; + while(pDestination_tmp <= pDestination_zero_veil) + { + *(__IO uint16_t*)pDestination_tmp = (0x80 << 8) | colormask; + pDestination_tmp++; + } + } + else + { + // regular graph with veil underneath if requested + // von oben nach unten + // von grossen pDestination Werten zu kleinen pDestination Werten + { + pDestination_tmp = pDestination_start; + while(pDestination_tmp >= pDestination_end) + { + *(__IO uint16_t*)pDestination_tmp = (0xFF << 8) | colormask ; + pDestination_tmp--; + } + } + + while((drawVeilUntil > 0) && (pDestination_tmp >= pDestination_zero_veil)) + { + *(__IO uint16_t*)pDestination_tmp = (0x20 << 8) | colormask ; + pDestination_tmp--; + } + } + } + h_ulong_old = h_ulong; + } + w1++; + w2++; + } +} + + +void GFX_draw_header(GFX_DrawCfgScreen *hgfx, uint8_t colorId) +{ + uint32_t pDestination; + point_t start, stop, now; + uint8_t alpha; + + /* display coordinate system */ + start.y = 400; + stop.y = 479; + + start.x = 0; + stop.x = 799; + + now.y = start.y; + now.x = start.x; + + while (now.x <= stop.x) + { + now.y = start.y; + pDestination = (uint32_t)hgfx->FBStartAdress; + pDestination += now.x * hgfx->ImageHeight * 2; + pDestination += now.y * 2; + now.x += 1; + + alpha = 27; + while(alpha < 246) + { + alpha += 9; + *(__IO uint8_t*)pDestination = colorId; + pDestination += 1; + *(__IO uint8_t*)pDestination = alpha; + pDestination += 1; + now.y += 1; + } + + while(now.y <= stop.y) + { + *(__IO uint8_t*)pDestination = colorId; + pDestination += 1; + *(__IO uint8_t*)pDestination = 0xFF; + pDestination += 1; + now.y += 1; + } + } +} + +void GFX_draw_box2(GFX_DrawCfgScreen *hgfx, point_t start, point_t stop, uint8_t color, uint8_t roundCorners) +{ + point_t point2, point4; + + if(roundCorners) + { + point2.x = stop.x - start.x; + point2.y = stop.y - start.y; + GFX_draw_box(hgfx,start,point2,1,color); + } + else + { + point2.x = stop.x; + point2.y = start.y; + + point4.x = start.x; + point4.y = stop.y; + + GFX_draw_line(hgfx,start,point2,color); + GFX_draw_line(hgfx,point2,stop,color); + GFX_draw_line(hgfx,stop,point4,color); + GFX_draw_line(hgfx,point4,start,color); + } +} + +void GFX_draw_box(GFX_DrawCfgScreen *hgfx, point_t LeftLow, point_t WidthHeight, uint8_t Style, uint8_t color) +{ + uint16_t* pDestination; + uint16_t* pStart; + uint32_t j; + uint32_t lineWidth, lineHeight; + int x, y; + uint8_t intensity; + int stepdir; + + typedef struct { + int x; + int y; + uint8_t intensity; + } corner_t; + const corner_t corner[16] = { + {3,3,255}, // nur einmal + {9,0,242}, + {8,0,194}, + {7,0,115}, + {6,0,36}, + {9,1,33}, + {8,1,84}, + {7,1,161}, + {6,1,255}, + {5,1,242}, + {4,1,36}, + {6,2,33}, + {5,2,84}, + {4,2,255}, + {3,2,84}, + {4,3,110} + }; + + lineWidth = WidthHeight.x; + lineHeight = WidthHeight.y; + pStart = (uint16_t*)hgfx->FBStartAdress; + + pStart += LeftLow.x * hgfx->ImageHeight; + pStart += LeftLow.y; + stepdir = 1; + + // Untere Linie + pDestination = pStart; + if(Style) + { + pDestination += stepdir * 10 * hgfx->ImageHeight; + lineWidth -= 18; + } + for (j = lineWidth; j > 0; j--) + { + + *(__IO uint16_t*)pDestination = 0xFF00 + color; + pDestination += stepdir * hgfx->ImageHeight; + } + + // Obere Linie + + pDestination = pStart + stepdir * WidthHeight.y; + if(Style) + { + pDestination += stepdir * 10 * hgfx->ImageHeight; + } + + for (j = lineWidth; j > 0; j--) + { + *(__IO uint16_t*)pDestination = 0xFF00 + color; + pDestination += stepdir * hgfx->ImageHeight; + } + + // Linke Linie + pDestination = pStart; + + if(Style) + { + pDestination += stepdir * 10; + lineHeight -= 18; + } + + for (j = lineHeight; j > 0; j--) + { + *(__IO uint16_t*)pDestination = 0xFF00 + color; + pDestination += stepdir; + } + + + // Rechte Linie + + pDestination = pStart + stepdir * WidthHeight.x * hgfx->ImageHeight; + if(Style) + { + pDestination += stepdir * 10; + } + + for (j = lineHeight; j > 0; j--) + { + *(__IO uint16_t*)pDestination = 0xFF00 + color; + pDestination += stepdir; + } + + + // Ecken wenn notwendig == Style + if(Style) + { + // links unten + pDestination = pStart; + x = corner[0].x; + y = corner[0].y; + intensity = corner[0].intensity; + + *(__IO uint16_t*)(pDestination + stepdir * (y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; + + for(j = 15; j > 0; j--) + { + x = corner[j].x; + y = corner[j].y; + intensity = corner[j].intensity; + *(__IO uint16_t*)(pDestination + stepdir * (y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; + *(__IO uint16_t*)(pDestination + stepdir * (x + (y * hgfx->ImageHeight))) = (intensity << 8) + color; + } + // links oben + pDestination = pStart + stepdir * WidthHeight.y; + x = corner[0].x; + y = corner[0].y; + intensity = corner[0].intensity; + *(__IO uint16_t*)(pDestination + stepdir * (-y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; + + for(j = 15; j > 0; j--) + { + x = corner[j].x; + y = corner[j].y; + intensity = corner[j].intensity; + *(__IO uint16_t*)(pDestination + stepdir * (-y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; + *(__IO uint16_t*)(pDestination + stepdir * (-x + (y * hgfx->ImageHeight))) = (intensity << 8) + color; + } + // rechts unten + pDestination = pStart + stepdir * WidthHeight.x * hgfx->ImageHeight; + x = corner[0].x; + y = corner[0].y; + intensity = corner[0].intensity; + *(__IO uint16_t*)(pDestination + stepdir * (y - (x * hgfx->ImageHeight))) = (intensity << 8) + color; + + for(j = 15; j > 0; j--) + { + x = corner[j].x; + y = corner[j].y; + intensity = corner[j].intensity; + *(__IO uint16_t*)(pDestination + stepdir * (y - (x * hgfx->ImageHeight))) = (intensity << 8) + color; + *(__IO uint16_t*)(pDestination + stepdir * (x - (y * hgfx->ImageHeight))) = (intensity << 8) + color; + } + // rechts oben + pDestination = pStart + stepdir * WidthHeight.y + stepdir * WidthHeight.x * hgfx->ImageHeight; + x = corner[0].x; + y = corner[0].y; + intensity = corner[0].intensity; + *(__IO uint16_t*)(pDestination + stepdir * -1 * (y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; + + for(j = 15; j > 0; j--) + { + x = corner[j].x; + y = corner[j].y; + intensity = corner[j].intensity; + *(__IO uint16_t*)(pDestination + stepdir * -1 * (y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; + *(__IO uint16_t*)(pDestination + stepdir * -1 * (x + (y * hgfx->ImageHeight))) = (intensity << 8) + color; + } + } +} + + +/** + ****************************************************************************** + * @brief GFX write label. / Write string with defined color + * @author heinrichs weikamp gmbh + * @version V0.0.1 + * @date 07-July-2014 + ****************************************************************************** + * + * @param hgfx: check gfx_engine.h. + * @param color: 16bit Alpha+CLUT. + * @retval None + */ + +uint32_t GFX_write_label(const tFont *Font, GFX_DrawCfgWindow* hgfx, const char *pText, uint8_t color) +{ + return GFX_write_string_color(Font, hgfx, pText, 0, color); +} + + +/** + ****************************************************************************** + * @brief GFX writeGfx_write_label_varstring. / Write string with all parameters and font color options + heinrichs weikamp gmbh + * @version V0.0.1 + * @date 22-April-2014 + ****************************************************************************** + * + * @param XleftGimpStyle: + * @param XrightGimpStyle: + * @param YtopGimpStyle: + * @param color: + * @param tFont: + * @param text: text to be printed + * @retval None + */ + +void Gfx_write_label_var(GFX_DrawCfgScreen *screenInput, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const uint8_t color, const char *text) +{ + + GFX_DrawCfgWindow hgfx; + + if(XrightGimpStyle > 799) + XrightGimpStyle = 799; + if(XleftGimpStyle >= XrightGimpStyle) + XleftGimpStyle = 0; + if(YtopGimpStyle > 479) + YtopGimpStyle = 479; + hgfx.Image = screenInput; + hgfx.WindowNumberOfTextLines = 1; + hgfx.WindowLineSpacing = 0; + hgfx.WindowTab = 0; + + hgfx.WindowX0 = XleftGimpStyle; + hgfx.WindowX1 = XrightGimpStyle; + hgfx.WindowY1 = 479 - YtopGimpStyle; + if(hgfx.WindowY1 < Font->height) + hgfx.WindowY0 = 0; + else + hgfx.WindowY0 = hgfx.WindowY1 - Font->height; + GFX_write_label(Font, &hgfx, text, color); +} + +/** + ****************************************************************************** + * @brief GFX write string. / Write string with all parameters and font options + * @author heinrichs weikamp gmbh + * @version V0.0.1 + * @date 22-April-2014 + ****************************************************************************** + * + * @param hgfx: check gfx_engine.h. + * @param color: 32bit ARGB8888. + * @retval None + */ + +uint16_t GFX_return_offset(const tFont *Font, char *pText, uint8_t position) +{ + char character; + uint16_t digit, i; + uint8_t found; + uint16_t distance; + + if(position == 0) + return 0; + + distance = 0; + for(digit = 0; digit < position; digit++) + { + character = pText[digit]; + if(character == 0) + return 0; + + found = 0; + for(i=0;i<Font->length;i++) + { + if(Font->chars[i].code == character) + { + found = 1; + break; + } + } + if(found) + { + distance += (uint16_t)(Font->chars[i].image->width); + } + } + return distance; + + /* FEHLT: + if(*pText < ' ') + if((*pText) & 0x80) + + */ +} + +void GFX_clean_line(GFX_DrawCfgWindow* hgfx, uint32_t line_number) +{ + uint16_t height; + uint32_t pDestination, i, j; + uint16_t left, width, bottom, nextlineStep; + + bottom = hgfx->WindowY0; + + if(hgfx->WindowNumberOfTextLines && line_number && (line_number <= hgfx->WindowNumberOfTextLines)) + { + bottom += hgfx->WindowLineSpacing * (hgfx->WindowNumberOfTextLines - line_number); + height = hgfx->WindowLineSpacing; + } + else + { + height = 1 + hgfx->WindowY1 - bottom; + } + + pDestination = (uint32_t)hgfx->Image->FBStartAdress; + + left = hgfx->WindowX0; + width = 1 + hgfx->WindowX1 - left; + nextlineStep = hgfx->Image->ImageHeight - height; + nextlineStep *= 2; + pDestination += 2 * bottom; + pDestination += 2 * hgfx->Image->ImageHeight * left; + + for(j = width; j > 0; j--) + { + for(i = height; i > 0; i--) + { + *(__IO uint16_t*)pDestination = 0; + pDestination += 2; + } + pDestination += nextlineStep; + } +} + + +void GFX_clean_area(GFX_DrawCfgScreen *tMscreen, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, uint16_t YBottomGimpStyle) +{ + uint16_t height; + uint32_t pDestination, i, j; + int32_t left, width, bottom, nextlineStep; + + bottom = tMscreen->ImageHeight - YBottomGimpStyle; + height = 1 + YBottomGimpStyle - YtopGimpStyle; + + if(bottom < 0) + bottom = 0; + if(height > tMscreen->ImageHeight) + height = tMscreen->ImageHeight; + + pDestination = tMscreen->FBStartAdress; + + left = XleftGimpStyle; + width = 1 + XrightGimpStyle - left; + if(width < 1) + width = 1; + + if(width > tMscreen->ImageWidth) + width = tMscreen->ImageWidth; + + nextlineStep = tMscreen->ImageHeight - height; + nextlineStep *= 2; + pDestination += 2 * bottom; + pDestination += 2 * tMscreen->ImageHeight * left; + + for(j = width; j > 0; j--) + { + for(i = height; i > 0; i--) + { + *(__IO uint16_t*)pDestination = 0; + pDestination += 2; + } + pDestination += nextlineStep; + } +} + + +uint32_t GFX_write_string(const tFont *Font, GFX_DrawCfgWindow* hgfx, const char *pText, uint32_t line_number) +{ + return GFX_write_string_color(Font, hgfx, pText, line_number, 0); +} + +uint32_t GFX_write_string_color(const tFont *Font, GFX_DrawCfgWindow* hgfx, const char *pText, uint32_t line_number, uint8_t color) +{ + if(hgfx->Image->FBStartAdress < FBGlobalStart) + return 0; + + GFX_CfgWriteString settings; + uint32_t newXdelta; + uint8_t minimal = 0; +// uint32_t try_again; + + if(hgfx->WindowNumberOfTextLines && line_number && (line_number <= hgfx->WindowNumberOfTextLines)) + { + settings.Ydelta = hgfx->WindowLineSpacing * (hgfx->WindowNumberOfTextLines - line_number); + } + else + { + settings.Ydelta = 0; + } + settings.font = (uint32_t)Font; + settings.Xdelta = 0; + settings.color = color; + settings.invert = 0; + settings.resize = 0; + settings.dualFont = 0; + settings.spaceMode = 0; + settings.singleSpaceWithSizeOfNextChar = 0; + settings.useTinyFont = 0; + settings.TinyFontExtraYdelta = 0; + settings.TinyFont = (uint32_t)Font; + settings.doubleSize = 0; + + if((*pText) == TXT_MINIMAL) // for customtext and anything with Sonderzeichen + minimal = 1; + else + minimal = 0; + + if(Font == &FontT48min) + { + settings.TinyFont = (uint32_t)&FontT24min; + settings.TinyFontExtraYdelta = 6; + } + + settings.actualFont = (tFont *)settings.font; + + while ((*pText != 0) && (settings.Xdelta != 0x0000FFFF))// und fehlend: Abfrage window / image size + { +// try_again = 0; + + if((*pText == '\177') && !minimal) + { + if(settings.singleSpaceWithSizeOfNextChar) + { + settings.singleSpaceWithSizeOfNextChar = 0; + pText++; + settings.Xdelta += *pText; + } + else + settings.singleSpaceWithSizeOfNextChar = 1; + } + else + if(*pText < ' ') + { + /* Xdelta -inline- changes */ + if((*pText == '\t') && !minimal) + settings.Xdelta = hgfx->WindowTab - hgfx->WindowX0; + else + if(*pText == '\r') // carriage return, no newline + settings.Xdelta = 0; + else + if((*pText == '\003') && !minimal) // doubleSize + settings.doubleSize = 1; + else + /* Xdelta -up/down changes */ + if((*pText == '\f') && !minimal) // form feed = top align + { + if((hgfx->WindowY1 - hgfx->WindowY0) >= ((tFont *)settings.font)->height) + { + settings.Ydelta = hgfx->WindowY1 - hgfx->WindowY0; + settings.Ydelta -= ((tFont *)settings.font)->height; + } + } + else + if(*pText == '\n') // newline, no carriage return + { + if(hgfx->WindowNumberOfTextLines && (line_number < hgfx->WindowNumberOfTextLines)) + { + line_number++; + settings.Ydelta = hgfx->WindowLineSpacing * (hgfx->WindowNumberOfTextLines - line_number); + } + } + else + /* Font style changes */ + if(*pText == '\a') + settings.invert = settings.invert ? 0 : 1; + else + if((*pText == '\016') && !minimal) + { + if(settings.dualFont == 0) + settings.dualFont = 1; + else + settings.actualFont = (tFont *)settings.TinyFont; + } + else + if((*pText == '\017') && !minimal) + { + settings.dualFont = 0; + settings.actualFont = (tFont *)settings.font; + } + else + if((*pText >= '\020') && (*pText <= '\032') && !minimal) + settings.color = *pText - '\020'; + else + if((*pText == '\034') && !minimal) + settings.spaceMode = 1; + else + if((*pText == '\035') && !minimal) + settings.spaceMode = 0; + } + else + if(((*pText) == TXT_2BYTE) && !minimal) + { + pText++; + settings.Xdelta = GFX_write_substring(&settings, hgfx, (uint8_t)TXT_2BYTE, (int8_t)*pText); + } + else + if(((*pText) & 0x80) && !minimal) + settings.Xdelta = GFX_write_substring(&settings, hgfx, (uint8_t)*pText, 0); + else + if(!settings.invert && (*pText == ' ')) + { + if(settings.spaceMode == 0) + settings.Xdelta += ((tFont *)settings.font)->spacesize; + else + settings.Xdelta += ((tFont *)settings.font)->spacesize2Monospaced; + } + else + if((settings.spaceMode == 1) && (*pText == ' ')) + settings.Xdelta += ((tFont *)settings.font)->spacesize2Monospaced; + else + { + if(settings.actualFont == (tFont *)settings.TinyFont) + settings.Ydelta += settings.TinyFontExtraYdelta; + + newXdelta = GFX_write_char(hgfx, &settings, *(uint8_t *)pText, settings.actualFont); + settings.Xdelta = newXdelta; + + if(settings.actualFont == (tFont *)settings.TinyFont) + settings.Ydelta -= settings.TinyFontExtraYdelta; + } + if(pText != 0) /* for TXT_2BYTE */ + pText++; + } + return settings.Ydelta; +} + +/* Private functions ---------------------------------------------------------*/ +/****************************************************************************** + Static Function +*******************************************************************************/ + +/** + ****************************************************************************** + * @brief GFX write substring. / Write string without parameters + * @author heinrichs weikamp gmbh + * @version V0.0.1 + * @date 22-April-2014 + ****************************************************************************** + * + * @param hgfx: check gfx_engine.h. + * @param color: 32bit ARGB8888. + * @retval None + */ + +static uint32_t GFX_write_substring(GFX_CfgWriteString* cfg, GFX_DrawCfgWindow* hgfx, uint8_t textId, int8_t nextCharFor2Byte) +{ + uint8_t i, j; + uint32_t found; + uint32_t pText; + uint16_t decodeUTF8; + +// ----------------------------- + if(textId != (uint8_t)TXT_2BYTE) + { + found = 0; + j = 0; + for(i=(uint8_t)TXT_Language;i<(uint8_t)TXT_END;i++) + { + j++; + } + if(!found) + return cfg->Xdelta; + + } +// ----------------------------- + else + { + if(!nextCharFor2Byte) + return cfg->Xdelta; + + found = 0; + + if(!found) + return cfg->Xdelta; + } +// ----------------------------- + + if(cfg->actualFont == (tFont *)cfg->TinyFont) + cfg->Ydelta += cfg->TinyFontExtraYdelta; + + while (*(char*)pText != 0)// und fehlend: Abfrage window / image size + { + if(*(char*)pText == '\t') + cfg->Xdelta = hgfx->WindowTab - hgfx->WindowX0; + else + if((*(char*)pText == ' ') && (cfg->invert == 0)) /* bypass drawing of white space only for not inverted mode */ + { + cfg->Xdelta += ((tFont *)cfg->actualFont)->spacesize; + } + else + if((*(char*)pText) & 0x80) /* Identify a UNICODE character other than standard ASCII using the highest bit */ + { + decodeUTF8 = ((*(char*)pText) & 0x1F) << 6; /* use 5bits of first byte for upper part of unicode */ + pText++; + decodeUTF8 |= (*(char*)pText) & 0x3F; /* add lower 6bits as second part of the unicode */ + if (decodeUTF8 <= 0xff) /* The following function has a uint8 input parameter ==> no UNICODEs > 0xff supported */ + { + cfg->Xdelta = GFX_write_char(hgfx, cfg, (uint8_t)decodeUTF8, (tFont *)cfg->actualFont); + } + } + else + cfg->Xdelta = GFX_write_char(hgfx, cfg, *(uint8_t *)pText, (tFont *)cfg->actualFont); + + pText++; + } + + if(cfg->actualFont == (tFont *)cfg->TinyFont) + cfg->Ydelta -= cfg->TinyFontExtraYdelta; + + return cfg->Xdelta; +} + + +/** + ****************************************************************************** + * @brief GFX write char. / Write non-inverted, non-colored with entire 8 bit range + * @author heinrichs weikamp gmbh + * @version V0.0.1 + * @date 22-April-2014 + ****************************************************************************** + * + * @param hgfx: check gfx_engine.h. + * @param Ydelta: input + * @param character: character + * @param *Font: pointer to font to be used for this char + * @retval Ydelta: 0x0000FFFF if not successful or char_truncated + */ + +static uint32_t GFX_write_char_doubleSize(GFX_DrawCfgWindow* hgfx, GFX_CfgWriteString* cfg, uint8_t character, tFont *Font) +{ + uint32_t i, j; + uint32_t width, height; + uint32_t found; + uint16_t* pDestination; + uint32_t pSource; + uint32_t OffsetDestination; + uint32_t width_left; + uint32_t height_left; + uint32_t char_truncated_WidthFlag; + uint32_t char_truncated_Height; + uint8_t fill; + uint32_t widthFont, heightFont; + uint32_t nextLine; + int32_t stepdir; + + stepdir = 1; + + if(hgfx->Image->ImageWidth <= (hgfx->WindowX0 + cfg->Xdelta)) + return 0x0000FFFF; + + // ----------------------------- + found = 0; + for(i=0;i<Font->length;i++) + { + if(Font->chars[i].code == character) + { + found = 1; + break; + } + } + if(!found) + return cfg->Xdelta; + + pSource = ((uint32_t)Font->chars[i].image->data); + pDestination = (uint16_t*)(hgfx->Image->FBStartAdress); + + heightFont = Font->chars[i].image->height; + widthFont = Font->chars[i].image->width; + + height = heightFont*2; + width = widthFont*2; + + + pDestination += (uint32_t)(hgfx->WindowX0 + cfg->Xdelta) * hgfx->Image->ImageHeight; /* set pointer to delta row */ + pDestination += (hgfx->WindowY0 + cfg->Ydelta); /* set pointer to delta colum */ + + OffsetDestination = (hgfx->Image->ImageHeight - height); + nextLine = hgfx->Image->ImageHeight; + +// ----------------------------- + char_truncated_WidthFlag = 0; + width_left = hgfx->Image->ImageWidth - (hgfx->WindowX0 + cfg->Xdelta); + if(width_left < width) + { + char_truncated_WidthFlag = 1; + width = width_left; + widthFont = width/2; + } +// ----------------------------- + + char_truncated_Height = 0; + height_left = hgfx->Image->ImageHeight - (hgfx->WindowY0 + cfg->Ydelta); + if(height_left < height) + { + char_truncated_Height = height - height_left; + if((char_truncated_Height & 1) != 0) + { + height_left -= 1; + char_truncated_Height += 1; + } + height = height_left; + heightFont = height/2; + } + + OffsetDestination += char_truncated_Height; +// ----------------------------- + if(height == 0) + return 0x0000FFFF; +// ----------------------------- + + if(cfg->singleSpaceWithSizeOfNextChar) + { + cfg->singleSpaceWithSizeOfNextChar = 0; + + if(cfg->invert) + fill = 0xFF; + else + fill = 0; + + height /= 2; + for(i = width; i > 0; i--) + { + for (j = height; j > 0; j--) + { + *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; + pDestination += stepdir; + } + pDestination += stepdir * OffsetDestination; + } + } + else + if(cfg->invert) + { + if((heightFont & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ + { + heightFont /= 4; + for(i = widthFont; i > 0; i--) + { + if(*(uint8_t*)pSource != 0x01) + { + for (j = heightFont; j > 0; j--) + { + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + pSource++; + + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + pSource++; + + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + pSource++; + + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + pSource++; + } + pSource += char_truncated_Height; + } + else + { + pSource++; + for (j = heightFont; j > 0; j--) + { + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + } + } + pDestination += (OffsetDestination + nextLine) * stepdir; + } + } + else + { + heightFont /= 2; + for(i = widthFont; i > 0; i--) + { + if(*(uint8_t*)pSource != 0x01) + { + for (j = heightFont; j > 0; j--) + { + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + pSource++; + + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; + pDestination += stepdir; + pSource++; + } + pSource += char_truncated_Height; + } + else + { + pSource++; + for (j = heightFont; j > 0; j--) + { + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; + pDestination += stepdir; + } + } + pDestination += (OffsetDestination + nextLine) * stepdir; + } + } + } /* inverted */ + else + { + if((heightFont & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ + { + heightFont /= 4; + for(i = widthFont; i > 0; i--) + { + if(*(uint8_t*)pSource != 0x01) + { + for (j = heightFont; j > 0; j--) + { + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + pSource++; + + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + pSource++; + + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + pSource++; + + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + pSource++; + } + pSource += char_truncated_Height; + } + else + { + pSource++; + pDestination += stepdir * height; + } + pDestination += stepdir * (OffsetDestination + nextLine); + } + } + else + { + heightFont /= 2; + for(i = widthFont; i > 0; i--) + { + if(*(uint8_t*)pSource != 0x01) + { + for (j = heightFont; j > 0; j--) + { + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + pSource++; + + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; + *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; + pDestination += stepdir; + pSource++; + } + pSource += char_truncated_Height; + } + else + { + pSource++; + pDestination += stepdir * height; + } + pDestination += stepdir * (OffsetDestination + nextLine); + } + } + } + + +// ----------------------------- + + if(char_truncated_WidthFlag) + return 0x0000FFFF; + else + return cfg->Xdelta + width; + +} + + +/** + ****************************************************************************** + * @brief GFX write char. / Write non-inverted, non-colored with entire 8 bit range + * @author heinrichs weikamp gmbh + * @version V0.0.1 + * @date 22-April-2014 + ****************************************************************************** + * + * @param hgfx: check gfx_engine.h. + * @param Ydelta: input + * @param character: character + * @param *Font: pointer to font to be used for this char + * @retval Ydelta: 0x0000FFFF if not successful or char_truncated + */ + +static uint32_t GFX_write_char(GFX_DrawCfgWindow* hgfx, GFX_CfgWriteString* cfg, uint8_t character, tFont *Font) +{ + if(cfg->doubleSize) + { + return GFX_write_char_doubleSize(hgfx, cfg, character, Font); + } + + uint32_t i, j; + uint32_t width, height; + uint32_t found; + uint16_t* pDestination; + uint32_t pSource; + uint32_t OffsetDestination; + uint32_t width_left; + uint32_t height_left; + uint32_t char_truncated_WidthFlag; + uint32_t char_truncated_Height; + uint8_t fill; + uint32_t fillpattern; + int16_t stepdir; + + stepdir = 1; + + if(hgfx->Image->ImageWidth <= (hgfx->WindowX0 + cfg->Xdelta)) + return 0x0000FFFF; + + // ----------------------------- + found = 0; + for(i=0;i<Font->length;i++) + { + if(Font->chars[i].code == character) + { + found = 1; + break; + } + } + if(!found) + return cfg->Xdelta; +// ----------------------------- +/* + if(Font == &Font144) + cfg->Xdelta += 3; + else + if(Font == &Font84) + cfg->Xdelta += 2; +*/ +// ----------------------------- + + + pSource = ((uint32_t)Font->chars[i].image->data); + pDestination = (uint16_t*)(hgfx->Image->FBStartAdress); + + + height = Font->chars[i].image->height; + width = Font->chars[i].image->width; + + OffsetDestination = hgfx->Image->ImageHeight - height; + + + /* Xyyyyy y= height */ + /* Xyyyyy x= width */ + /* Xyyyyy */ + + pDestination += (hgfx->WindowX0 + cfg->Xdelta) * hgfx->Image->ImageHeight; /* set pointer to delta row */ + pDestination += (hgfx->WindowY0 + cfg->Ydelta); /* set pointer to delta colum */ + +// ----------------------------- + char_truncated_WidthFlag = 0; + width_left = hgfx->Image->ImageWidth - (hgfx->WindowX0 + cfg->Xdelta); + if(width_left < width) + { + char_truncated_WidthFlag = 1; + width = width_left; + } +// ----------------------------- + char_truncated_Height = 0; + height_left = hgfx->Image->ImageHeight - (hgfx->WindowY0 + cfg->Ydelta); + if(height_left < height) + { + char_truncated_Height = height - height_left; + if((char_truncated_Height & 1) != 0) + { + height_left -= 1; + char_truncated_Height += 1; + } + height = height_left; + } + OffsetDestination += char_truncated_Height; +// ----------------------------- + if(height == 0) + return 0x0000FFFF; +// ----------------------------- + + if(cfg->singleSpaceWithSizeOfNextChar) + { + cfg->singleSpaceWithSizeOfNextChar = 0; + + if(cfg->invert) + fill = 0xFF; + else + fill = 0; + + height /= 2; + for(i = width; i > 0; i--) + { + for (j = height; j > 0; j--) + { + *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; + pDestination += stepdir; + } + pDestination += stepdir * OffsetDestination; + } + } + else + if(cfg->invert) + { + if((height & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ + { + height /= 4; + for(i = width; i > 0; i--) + { + if(*(uint8_t*)pSource != 0x01) + { + + for (j = height; j > 0; j--) + { + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; + pDestination += stepdir; + } + pSource += char_truncated_Height; + } + else /* empty line => fast fill */ + { + pSource++; + fillpattern = (( 0xFF << 8 | cfg->color) << 16) | ( 0xFF << 8 | cfg->color); + for (j = height; j > 0; j--) + { + *(__IO uint32_t*)pDestination = fillpattern; + pDestination += stepdir; + pDestination += stepdir; + *(__IO uint32_t*)pDestination = fillpattern; + pDestination += stepdir; + pDestination += stepdir; + } + } + pDestination += stepdir * OffsetDestination; + } + } + else + { + height /= 2; + for(i = width; i > 0; i--) + { + if(*(uint8_t*)pSource != 0x01) + { + for (j = height; j > 0; j--) + { + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; + pDestination += stepdir; + } + pSource += char_truncated_Height; + } + else + { + pSource++; + for (j = height; j > 0; j--) + { + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; + pDestination += stepdir; + } + } + pDestination += stepdir * OffsetDestination; + } + } + } + else /* not inverted */ + { + if((height & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ + { + + height /= 4; + + for(i = width; i > 0; i--) + { + if(*(uint8_t*)pSource != 0x01) + { + for (j = height; j > 0; j--) + { + *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); + pDestination += stepdir; + *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); + pDestination += stepdir; + *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); + pDestination += stepdir; + *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); + pDestination += stepdir; + } + + pSource += char_truncated_Height; + } + else /* clear line */ + { + pSource++; + fillpattern = (cfg->color << 16) | cfg->color; + + for (j = height; j > 0; j--) + { + *(__IO uint32_t*)pDestination = fillpattern; + pDestination += stepdir; + pDestination += stepdir; + *(__IO uint32_t*)pDestination = fillpattern; + pDestination += stepdir; + pDestination += stepdir; + } + } + pDestination += stepdir * OffsetDestination; + } + } + else + { + height /= 2; + for(i = width; i > 0; i--) + { + if(*(uint8_t*)pSource != 0x01) + { + for (j = height; j > 0; j--) + { + *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); + pDestination += stepdir; + *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); + pDestination += stepdir; + } + pSource += char_truncated_Height; + } + else /* clear line */ + { + pSource++; + for (j = height; j > 0; j--) + { + *(__IO uint16_t*)pDestination = cfg->color; + pDestination += stepdir; + *(__IO uint16_t*)pDestination = cfg->color; + pDestination += stepdir; + } + } + pDestination += stepdir * OffsetDestination; + } + } + } + + +/* + else + if(Font == &Font144) + width += 3; + else + if(Font == &Font84) + width += 1; +*/ +// ----------------------------- + + if(char_truncated_WidthFlag) + return 0x0000FFFF; + else + return cfg->Xdelta + width; +} + +void GFX_LTDC_Init(void) +{ + GFX_LTDC_Init_display1(); +} + +void GFX_LTDC_Init_display1(void) +{ + /* Timing configuration */ +#define ActiveH_d1 800 +#define ActiveW_d1 480 + +#define Hsync_d1 2 +#define HFP_d1 8 +#define HBP_d1 8 + +#define Vsync_d1 2 +#define VFP_d1 4 // make sure this value * VSYNC is also set in display.c for OLED_VFP_SET +#define VBP_d1 6 // make sure this value * VSYNC is also set in display.c for OLED_VBP_SET + + /* Horizontal synchronization width = Hsync - 1 */ + LtdcHandle.Init.HorizontalSync = Hsync_d1 - 1; + /* Vertical synchronization height = Vsync - 1 */ + LtdcHandle.Init.VerticalSync = Vsync_d1 -1; + /* Accumulated horizontal back porch = Hsync + HBP - 1 */ + LtdcHandle.Init.AccumulatedHBP = Hsync_d1 + HBP_d1 - 1; + /* Accumulated vertical back porch = Vsync + VBP - 1 */ + LtdcHandle.Init.AccumulatedVBP = Vsync_d1 + VBP_d1 - 1; + /* Accumulated active width = Hsync + HBP + Active Width - 1 */ + LtdcHandle.Init.AccumulatedActiveW = Hsync_d1 + HBP_d1 + ActiveW_d1 - 1; + /* Accumulated active height = Vsync + VBP + Active Heigh - 1 */ + LtdcHandle.Init.AccumulatedActiveH = Vsync_d1 + VBP_d1 + ActiveH_d1 - 1; + /* Total width = Hsync + HBP + Active Width + HFP - 1 */ + LtdcHandle.Init.TotalWidth = Hsync_d1 + HBP_d1 + ActiveW_d1 + HFP_d1 - 1; + /* Total height = Vsync + VBP + Active Heigh + VFP - 1 */ + LtdcHandle.Init.TotalHeigh = Vsync_d1 + VBP_d1 + ActiveH_d1 + VFP_d1 - 1; + + /* Configure R,G,B component values for LCD background color */ + LtdcHandle.Init.Backcolor.Red= 0; + LtdcHandle.Init.Backcolor.Blue= 0; + LtdcHandle.Init.Backcolor.Green= 0; + + /* LCD clock configuration */ + /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ + /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/4 = 48 Mhz */ + /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_8 = 48/4 = 6Mhz */ + +/* done in base.c SystemClockConfig + + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; + PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; + PeriphClkInitStruct.PLLSAI.PLLSAIR = 4; + PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_8; + HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); +*/ + /* Polarity */ + LtdcHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL; + LtdcHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL; + LtdcHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL; + LtdcHandle.Init.PCPolarity = LTDC_PCPOLARITY_IIPC;//LTDC_PCPOLARITY_IPC; + + LtdcHandle.Instance = LTDC; + + /* Configure the LTDC */ + if(HAL_LTDC_Init(&LtdcHandle) != HAL_OK) // initialize GPIO Pins, too + { + /* Initialization Error */ + GFX_Error_Handler(); + } +} + +void GFX_LTDC_LayerDefaultInit(uint16_t LayerIndex, uint32_t FB_Address) +{ + LTDC_LayerCfgTypeDef Layercfg; + + /* Layer Init */ + Layercfg.WindowX0 = 0; + Layercfg.WindowX1 = 480; + Layercfg.WindowY0 = 0; + Layercfg.WindowY1 = 800; + Layercfg.PixelFormat = LTDC_PIXEL_FORMAT_AL88;//LTDC_PIXEL_FORMAT_ARGB8888; + Layercfg.FBStartAdress = FB_Address; + Layercfg.Alpha = 255; + Layercfg.Alpha0 = 0; + Layercfg.Backcolor.Blue = 0; + Layercfg.Backcolor.Green = 0; + Layercfg.Backcolor.Red = 0; + Layercfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; + Layercfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; + Layercfg.ImageWidth = 480; + Layercfg.ImageHeight = 800; + + HAL_LTDC_ConfigCLUT(&LtdcHandle, ColorLUT, CLUT_END, LayerIndex); + HAL_LTDC_ConfigLayer(&LtdcHandle, &Layercfg, LayerIndex); + HAL_LTDC_EnableCLUT(&LtdcHandle, LayerIndex); +} + +static uint32_t GFX_doubleBufferOne(void) +{ + return SDRAM_DOUBLE_BUFFER_ONE; +} + + +static uint32_t GFX_doubleBufferTwo(void) +{ + return SDRAM_DOUBLE_BUFFER_TWO; +} + +uint32_t getFrame(uint8_t callerId) +{ + static uint8_t lastFrameProvided = 0; + uint8_t i; + +/* first iteration: look for a clear frame */ + i = lastFrameProvided; + do + { + i++; + if(i == MAXFRAMES) + { + i = 0; + } + } while((i != lastFrameProvided) && (frame[i].status != CLEAR)); + + if((i < MAXFRAMES) && (frame[i].status == CLEAR)) + { + frame[i].status = BLOCKED; + frame[i].caller = callerId; + lastFrameProvided = i; + return frame[i].StartAddress; + } + +/* second iteration: look for a frame which may be reused after clearing */ + i = lastFrameProvided; + do + { + i++; + if(i == MAXFRAMES) + { + i = 0; + } + }while((i != lastFrameProvided) && (frame[i].status != RELEASED)); + + + if((i < MAXFRAMES) && (frame[i].status == RELEASED)) + { + GFX_clear_frame_immediately(frame[i].StartAddress); + frame[i].status = BLOCKED; + lastFrameProvided = i; + return frame[i].StartAddress; + } + return 0; +} + + +void GFX_forceReleaseFramesWithId(uint8_t callerId) +{ + for(int i=0; i<MAXFRAMES; i++) + if((frame[i].caller == callerId) && (frame[i].status == BLOCKED)) + frame[i].status = RELEASED; +} + + +void releaseAllFramesExcept(uint8_t callerId, uint32_t frameStartAddress) +{ + for(int i=0; i<MAXFRAMES; i++) + if((frame[i].caller == callerId) && (frame[i].status == BLOCKED) && (frame[i].StartAddress != frameStartAddress)) + frame[i].status = RELEASED; +} + + +uint8_t releaseFrame(uint8_t callerId, uint32_t frameStartAddress) +{ + static uint8_t countErrorCalls = 0; + + if(frameStartAddress < FBGlobalStart) + return 2; + + + uint8_t i; + + i = 0; + while((i < MAXFRAMES) && (frame[i].StartAddress != frameStartAddress)) + i++; + + if((i < MAXFRAMES) && (frame[i].StartAddress == frameStartAddress)) + { + if(frame[i].caller == callerId) + { + frame[i].status = RELEASED; + return 1; + } + else + countErrorCalls++; + } + return 0; +} + + +uint16_t blockedFramesCount(void) +{ + uint16_t count = MAXFRAMES; + + for(int i = 0;i<MAXFRAMES;i++) + if(frame[i].status == BLOCKED) + count--; + + return count; +} + + +uint8_t housekeepingFrame(void) +{ + static uint8_t countLogClear = 0; + uint8_t i; + uint8_t retVal = 1; + + if(DMA2D_at_work == 255) + { + i = 0; + /* skip frame cleaning for actual frames which have not yet been replaced by new top/bottom frames */ + while((i < MAXFRAMES) && ((frame[i].status != RELEASED) || (frame[i].StartAddress == GFX_get_pActualFrameTop()) || (frame[i].StartAddress == GFX_get_pActualFrameBottom()))) + i++; + + if((i < MAXFRAMES) && (frame[i].status == RELEASED)) + { + if(frame[i].caller == 15) + countLogClear++; + GFX_clear_frame_dma2d(i); + } + else + { + retVal = 0; /* no more frame to be cleaned found */ + } + } + return retVal; +} + + +static void GFX_Dma2d_TransferComplete(DMA2D_HandleTypeDef* Dma2dHandle) +{ + if(DMA2D_at_work < MAXFRAMES) + frame[DMA2D_at_work].status = CLEAR; + + DMA2D_at_work = 255; +} + + +static void GFX_Dma2d_TransferError(DMA2D_HandleTypeDef* Dma2dHandle) +{ + +} + +static void GFX_Error_Handler(void) +{ + /* Turn LED3 on */ +// BSP_LED_On(LED3); + while(1) + { + } +} + +void write_content_simple(GFX_DrawCfgScreen *tMscreen, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t color) +{ + GFX_DrawCfgWindow hgfx; + + + if(XrightGimpStyle > 799) + XrightGimpStyle = 799; + if(XleftGimpStyle >= XrightGimpStyle) + XleftGimpStyle = 0; + if(YtopGimpStyle > 479) + YtopGimpStyle = 479; + + hgfx.Image = tMscreen; + hgfx.WindowNumberOfTextLines = 1; + hgfx.WindowLineSpacing = 0; + hgfx.WindowTab = 0; + + hgfx.WindowX0 = XleftGimpStyle; + hgfx.WindowX1 = XrightGimpStyle; + hgfx.WindowY1 = 479 - YtopGimpStyle; + if(hgfx.WindowY1 < Font->height) + hgfx.WindowY0 = 0; + else + hgfx.WindowY0 = hgfx.WindowY1 - Font->height; + GFX_write_string_color(Font, &hgfx, text, 0, color); +} + + +void gfx_write_topline_simple(GFX_DrawCfgScreen *tMscreen, const char *text, uint8_t color) +{ + GFX_DrawCfgWindow hgfx; + const tFont *Font = &FontT48min; + + hgfx.Image = tMscreen; + hgfx.WindowNumberOfTextLines = 1; + hgfx.WindowLineSpacing = 0; + + hgfx.WindowTab = 0; + hgfx.WindowX0 = 20; + hgfx.WindowX1 = 779; + + hgfx.WindowY1 = 479; + hgfx.WindowY0 = hgfx.WindowY1 - Font->height; + GFX_write_label(Font, &hgfx, text, color); +} + + +void gfx_write_page_number(GFX_DrawCfgScreen *tMscreen, uint8_t page, uint8_t total, uint8_t color) +{ + GFX_DrawCfgWindow hgfx; + const tFont *Font = &FontT48min; + char text[7]; + uint8_t i, secondDigitPage, secondDigitTotal; + + if(total > 8) + { + Font = &FontT24min; + } + + hgfx.Image = tMscreen; + hgfx.WindowNumberOfTextLines = 1; + hgfx.WindowLineSpacing = 0; + hgfx.WindowTab = 0; + + hgfx.WindowX1 = 779; + if(Font == &FontT24min) + { + hgfx.WindowX0 = hgfx.WindowX1 - (Font->spacesize*3); + } + else + { + hgfx.WindowX0 = hgfx.WindowX1 - (Font->spacesize2Monospaced*3); + } + hgfx.WindowY1 = 479; + hgfx.WindowY0 = hgfx.WindowY1 - Font->height; + if(page > 99) + page = 99; + if(total > 99) + total = 99; + + i = 0; + text[i++] = '\002'; + + secondDigitPage = page / 10; + page -= secondDigitPage * 10; + + secondDigitTotal = total / 10; + total -= secondDigitTotal * 10; + + if(secondDigitPage) + text[i++] = '0' + secondDigitPage; + text[i++] = '0' + page; + + text[i++] = '/'; + + if(secondDigitTotal) + text[i++] = '0' + secondDigitTotal; + text[i++] = '0' + total; + + text[i] = 0; + + GFX_clear_window_immediately(&hgfx); + GFX_write_label(Font, &hgfx, text, color); +} + + +uint8_t gfx_number_to_string(uint8_t max_digits, _Bool fill, char *pText, uint32_t input) +{ + uint8_t digits[10]; + uint32_t number, divider; + int first; + uint8_t out; + + number = input; + first = 0; + divider = 1000000000; + for(int i=9;i>=0;i--) + { + digits[i] = (uint8_t)(number / divider); + number -= digits[i] * divider; + divider /= 10; + if((first == 0) && (digits[i] != 0)) + first = i; + } + + if((first + 1) > max_digits) + { + for(int i = 0; i<max_digits; i++) + pText[i] = '9'; + out = max_digits; + } + else if(fill) + { + int i = 0; + for(int k = max_digits; k>0; k--) + pText[i++] = digits[k -1] + '0'; + out = max_digits; + } + else + { + int i = 0; + for(int k = first; k>=0; k--) + pText[i++] = digits[k] + '0'; + out = i; + } + + return out; +} + + + /* output is + * 0-> + * | + * v + * + * input is + * + * -> + * A + * | + * 0 + */ +void GFX_screenshot(void) +{ + uint32_t pSource = GFX_get_pActualFrameTop(); + uint32_t pSourceBottom =GFX_get_pActualFrameBottom(); + uint32_t pBottomNew = getFrame(99); + uint32_t pDestination = GFX_doubleBufferOne(); + uint32_t sourceNow; + + + uint32_t bot_leftStart = FrameHandler.actualBottom.leftStart; // x0 z.B. 0 + uint32_t bot_bottomStart = FrameHandler.actualBottom.bottomStart; // y0 z.B. 25 + uint32_t bot_width = FrameHandler.actualBottom.width; // 800 + uint32_t bot_height = FrameHandler.actualBottom.height; // 390 + + struct split + { + uint8_t blue; + uint8_t green; + uint8_t red; + uint8_t alpha; + }; + + union inout_u + { + uint32_t in; + struct split out; + }; + + union inout_u value; + +/* test + uint32_t pSourceTemp = pSource + (2*479); + for (int j = 0xFFFF; j > 0x00FF; j -= 0x0100) + { + *(__IO uint16_t*)pSourceTemp = j; + pSourceTemp += 480*2; + } +*/ + // Top Layer + const unsigned width = 800, height = 480; + const uint32_t heightX2 = height*2; + + for(unsigned y = 0; y < height; y++) + { + sourceNow = pSource + 2 * ((height - 1) - y); + for(unsigned x = 0; x < width; x++) + { +// sourceNow += 2 * height * x + 2 * (height - 1 - y); + value.in = ColorLUT[*(__IO uint8_t*)(sourceNow)]; + value.out.alpha = *(__IO uint8_t*)(sourceNow + 1); + + *(__IO uint8_t*)(pDestination++) = value.out.red; + *(__IO uint8_t*)(pDestination++) = value.out.green; + *(__IO uint8_t*)(pDestination++) = value.out.blue; + *(__IO uint8_t*)(pDestination++) = value.out.alpha; + sourceNow += heightX2; + } + } + + // Bottom Layer + // build newBottom + pSource = pSourceBottom; + for(unsigned x = bot_leftStart; x < bot_leftStart+bot_width; x++) + { + for(unsigned y = bot_bottomStart; y < bot_bottomStart+bot_height; y++) + { + pDestination = pBottomNew + (2 * y); + pDestination += heightX2 * x; + *(__IO uint16_t*)(pDestination) = *(__IO uint16_t*)(pSource); + pSource += 2; + } + } + + // output Bottom Layer + pSource = pBottomNew; + pDestination = GFX_doubleBufferTwo(); + + for(unsigned y = 0; y < height; y++) + { + sourceNow = pSource + 2 * ((height - 1) - y); + for(unsigned x = 0; x < width; x++) + { +// sourceNow = pSource + 2 * height * x + 2 * (height - 1 - y); + value.in = ColorLUT[*(__IO uint8_t*)(sourceNow)]; + value.out.alpha = *(__IO uint8_t*)(sourceNow + 1); + + *(__IO uint8_t*)(pDestination++) = value.out.red; + *(__IO uint8_t*)(pDestination++) = value.out.green; + *(__IO uint8_t*)(pDestination++) = value.out.blue; + *(__IO uint8_t*)(pDestination++) = value.out.alpha; + sourceNow += heightX2; + } + } + releaseFrame(99,pBottomNew); +/* + // das kommt dazu! + unsigned yEnd = 480 - FrameHandler.actualBottom.bottomStart; + unsigned yStart = yEnd - FrameHandler.actualBottom.height; + + if(yStart > 0) + { + for(unsigned y = 0; y < yStart; y++) + for(unsigned x = 0; x < width; x++) + { + *(__IO uint8_t*)(pDestination++) = 0; + *(__IO uint8_t*)(pDestination++) = 0; + *(__IO uint8_t*)(pDestination++) = 0; + *(__IO uint8_t*)(pDestination++) = 0; + } + } + for(unsigned y = yStart; y < yEnd; y++) + for(unsigned x = 0; x < width; x++) + { + sourceNow = pSource + 2 * height * x + 2 * (height - 1 - y); + value.in = ColorLUT[*(__IO uint8_t*)(sourceNow)]; + value.out.alpha = *(__IO uint8_t*)(sourceNow + 1); + + *(__IO uint8_t*)(pDestination++) = value.out.red; + *(__IO uint8_t*)(pDestination++) = value.out.green; + *(__IO uint8_t*)(pDestination++) = value.out.blue; + *(__IO uint8_t*)(pDestination++) = value.out.alpha; + } + if(yEnd < 480) + { + for(unsigned y = yEnd; y < 480; y++) + for(unsigned x = 0; x < width; x++) + { + *(__IO uint8_t*)(pDestination++) = 0; + *(__IO uint8_t*)(pDestination++) = 0; + *(__IO uint8_t*)(pDestination++) = 0; + *(__IO uint8_t*)(pDestination++) = 0; + } + } +*/ +} + +uint32_t GFX_Character_Width(uint8_t character, tFont *Font) +{ + uint32_t i; + for(i=0;i<Font->length;i++) + { + if(Font->chars[i].code == character) + { + return Font->chars[i].image->width; + } + } + + return 0; +} + +void Gfx_colorsscheme_mod(char *text, uint8_t alternativeColor) +{ + char *p = text; + uint8_t index = 0; + + while ((*p) && (index < MAX_COLOR_STRING_LENGTH)) + { + if (*p == '\020') + { + if(!GFX_is_colorschemeDiveStandard()) + { + *p = '\027'; + } + else if(alternativeColor != 0) + { + *p += alternativeColor; + } + } + p++; + index++; + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Src/ostc_mini.c Sat Nov 15 19:29:44 2025 +0100 @@ -0,0 +1,418 @@ +/////////////////////////////////////////////////////////////////////////////// +/// -*- coding: UTF-8 -*- +/// +/// \file Discovery/Src/ostc.c +/// \brief Hardware specific configuration +/// \author Heinrichs Weikamp gmbh +/// \date 05-Dec-2014 +/// +/// \details +/// +/// $Id$ +/////////////////////////////////////////////////////////////////////////////// +/// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program. If not, see <http://www.gnu.org/licenses/>. +////////////////////////////////////////////////////////////////////////////// + +/* Includes ------------------------------------------------------------------*/ +#include "ostc.h" +#include "stm32f4xx_hal.h" + + +/* Exported variables --------------------------------------------------------*/ +SPI_HandleTypeDef hspiDisplay; +SPI_HandleTypeDef cpu2DmaSpi; + + +UART_HandleTypeDef UartHandle; +#ifdef USART_PIEZO +UART_HandleTypeDef UartPiezoTxHandle; +#endif +UART_HandleTypeDef UartIR_HUD_Handle; + +__IO ITStatus UartReady = RESET; +__IO ITStatus UartReadyHUD = RESET; + +/* Private types -------------------------------------------------------------*/ + +/* Private variables ---------------------------------------------------------*/ + +/* Private variables with external access via get_xxx() function -------------*/ + +/* Exported functions --------------------------------------------------------*/ + +/** SPI init function + * called from HAL + */ +void MX_SPI_Init(void) +{ + hspiDisplay.Instance = SPI5; + hspiDisplay.Init.Mode = SPI_MODE_MASTER; + hspiDisplay.Init.Direction = SPI_DIRECTION_2LINES; + hspiDisplay.Init.DataSize = SPI_DATASIZE_8BIT; + hspiDisplay.Init.CLKPolarity = SPI_POLARITY_LOW; + hspiDisplay.Init.CLKPhase = SPI_PHASE_1EDGE; + hspiDisplay.Init.NSS = SPI_NSS_SOFT; + hspiDisplay.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;//SPI_BAUDRATEPRESCALER_4;//SPI_BAUDRATEPRESCALER_256; + hspiDisplay.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspiDisplay.Init.TIMode = SPI_TIMODE_DISABLED; + hspiDisplay.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; + HAL_SPI_Init(&hspiDisplay); + + cpu2DmaSpi.Instance = SPI1; + cpu2DmaSpi.Init.Mode = SPI_MODE_MASTER; + cpu2DmaSpi.Init.Direction = SPI_DIRECTION_2LINES; + cpu2DmaSpi.Init.DataSize = SPI_DATASIZE_8BIT; + cpu2DmaSpi.Init.CLKPolarity = SPI_POLARITY_LOW; + cpu2DmaSpi.Init.CLKPhase = SPI_PHASE_1EDGE; + cpu2DmaSpi.Init.NSS = SPI_NSS_SOFT;//SPI_NSS_HARD_OUTPUT;//SPI_NSS_SOFT; + cpu2DmaSpi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + cpu2DmaSpi.Init.FirstBit = SPI_FIRSTBIT_MSB; + cpu2DmaSpi.Init.TIMode = SPI_TIMODE_DISABLED; + cpu2DmaSpi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; + cpu2DmaSpi.Init.CRCPolynomial = 7; + + HAL_SPI_Init(&cpu2DmaSpi); +} + + +void MX_GPIO_Backlight_max_static_only_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + TIM_BACKLIGHT_GPIO_ENABLE(); + + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL;//GPIO_PULLUP; /* should be normally high */ + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + + GPIO_InitStruct.Pin = TIM_BACKLIGHT_PIN; + HAL_GPIO_Init(TIM_BACKLIGHT_GPIO_PORT, &GPIO_InitStruct); + + HAL_GPIO_WritePin(TIM_BACKLIGHT_GPIO_PORT,TIM_BACKLIGHT_PIN,GPIO_PIN_SET); +} + + +void MX_GPIO_One_Button_only_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + BUTTON_NEXT_GPIO_ENABLE(); + + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL;//GPIO_PULLUP; /* should be normally high */ + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + + GPIO_InitStruct.Pin = BUTTON_NEXT_PIN; + HAL_GPIO_Init(BUTTON_NEXT_GPIO_PORT, &GPIO_InitStruct); +} + + +GPIO_PinState MX_GPIO_Read_The_One_Button(void) +{ + return HAL_GPIO_ReadPin(BUTTON_NEXT_GPIO_PORT, BUTTON_NEXT_PIN); +} + +void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + DISPLAY_CSB_GPIO_ENABLE(); + DISPLAY_RESETB_GPIO_ENABLE(); + EXTFLASH_CSB_GPIO_ENABLE(); + SMALLCPU_CSB_GPIO_ENABLE(); + OSCILLOSCOPE_GPIO_ENABLE(); + OSCILLOSCOPE2_GPIO_ENABLE(); + BLE_UBLOX_DSR_GPIO_ENABLE(); + + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + + GPIO_InitStruct.Pin = DISPLAY_CSB_PIN; + HAL_GPIO_Init(DISPLAY_CSB_GPIO_PORT, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = DISPLAY_RESETB_PIN; + HAL_GPIO_Init(DISPLAY_RESETB_GPIO_PORT, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = EXTFLASH_CSB_PIN; + HAL_GPIO_Init(EXTFLASH_CSB_GPIO_PORT, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = OSCILLOSCOPE_PIN; + HAL_GPIO_Init(OSCILLOSCOPE_GPIO_PORT, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = OSCILLOSCOPE2_PIN; + HAL_GPIO_Init(OSCILLOSCOPE2_GPIO_PORT, &GPIO_InitStruct); + +#ifdef DISPLAY_BACKLIGHT_PIN + DISPLAY_BACKLIGHT_GPIO_ENABLE(); + GPIO_InitStruct.Pin = DISPLAY_BACKLIGHT_PIN; + HAL_GPIO_Init(DISPLAY_BACKLIGHT_GPIO_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(DISPLAY_BACKLIGHT_GPIO_PORT,DISPLAY_BACKLIGHT_PIN,GPIO_PIN_SET); +#endif + +#ifdef SMALLCPU_CSB_PIN + SMALLCPU_CSB_GPIO_ENABLE(); + GPIO_InitStruct.Pin = SMALLCPU_CSB_PIN; + HAL_GPIO_Init(SMALLCPU_CSB_GPIO_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_SET); +#endif + +#ifdef SMALLCPU_BOOT0_PIN + GPIO_InitStruct.Pull = GPIO_NOPULL; + SMALLCPU_BOOT0_GPIO_ENABLE(); + GPIO_InitStruct.Pin = SMALLCPU_BOOT0_PIN; + HAL_GPIO_Init(SMALLCPU_BOOT0_GPIO_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(SMALLCPU_BOOT0_GPIO_PORT,SMALLCPU_BOOT0_PIN,GPIO_PIN_RESET); + GPIO_InitStruct.Pull = GPIO_PULLUP; +#endif + +#ifdef IR_HUD_ENABLE_PIN + IR_HUD_ENABLE_GPIO_ENABLE(); + GPIO_InitStruct.Pin = IR_HUD_ENABLE_PIN; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(IR_HUD_ENABLE_GPIO_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(IR_HUD_ENABLE_GPIO_PORT,IR_HUD_ENABLE_PIN,GPIO_PIN_SET); + GPIO_InitStruct.Pull = GPIO_PULLUP; +#endif + +#ifdef BLE_NENABLE_PIN + BLE_NENABLE_GPIO_ENABLE(); + MX_Bluetooth_PowerOff(); +#endif + +#ifdef TESTPIN + GPIO_InitStruct.Pull = GPIO_PULLUP; + TEST_GPIO_ENABLE(); + GPIO_InitStruct.Pin = TEST_PIN; + HAL_GPIO_Init(TEST_GPIO_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(TEST_GPIO_PORT,TEST_PIN,GPIO_PIN_SET); + GPIO_InitStruct.Pull = GPIO_PULLUP; +#endif +} + + +void MX_TestPin_High(void) +{ +#ifdef TESTPIN + HAL_GPIO_WritePin(TEST_GPIO_PORT,TEST_PIN,GPIO_PIN_SET); +#endif +} + + +void MX_TestPin_Low(void) +{ +#ifdef TESTPIN + HAL_GPIO_WritePin(TEST_GPIO_PORT,TEST_PIN,GPIO_PIN_RESET); +#endif +} + +void MX_Bluetooth_PowerOn(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Pin = BLE_NENABLE_PIN; + HAL_GPIO_Init(BLE_NENABLE_GPIO_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(BLE_NENABLE_GPIO_PORT,BLE_NENABLE_PIN,GPIO_PIN_RESET); + + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Pin = BLE_UBLOX_DSR_PIN; + HAL_GPIO_Init(BLE_UBLOX_DSR_GPIO_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(BLE_UBLOX_DSR_GPIO_PORT,BLE_UBLOX_DSR_PIN,GPIO_PIN_RESET); +} + + +void MX_Bluetooth_PowerOff(void) +{ + HAL_GPIO_WritePin(BLE_NENABLE_GPIO_PORT,BLE_NENABLE_PIN,GPIO_PIN_SET); + HAL_Delay(10); + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pin = BLE_NENABLE_PIN; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(BLE_NENABLE_GPIO_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(BLE_UBLOX_DSR_GPIO_PORT,BLE_UBLOX_DSR_PIN,GPIO_PIN_RESET); +} + + +void MX_SmallCPU_Reset_To_Boot(void) +{ +#ifdef SMALLCPU_NRESET_PIN + GPIO_InitTypeDef GPIO_InitStruct; + + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + + SMALLCPU_NRESET_GPIO_ENABLE(); + GPIO_InitStruct.Pin = SMALLCPU_NRESET_PIN; + HAL_GPIO_Init(SMALLCPU_NRESET_GPIO_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(SMALLCPU_NRESET_GPIO_PORT,SMALLCPU_NRESET_PIN,GPIO_PIN_RESET); + HAL_GPIO_WritePin(SMALLCPU_BOOT0_GPIO_PORT,SMALLCPU_BOOT0_PIN,GPIO_PIN_SET); + HAL_Delay(2); + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + HAL_GPIO_Init(SMALLCPU_NRESET_GPIO_PORT, &GPIO_InitStruct); + HAL_Delay(100); + HAL_GPIO_WritePin(SMALLCPU_BOOT0_GPIO_PORT,SMALLCPU_BOOT0_PIN,GPIO_PIN_RESET); +#endif +} + + +void MX_SmallCPU_NO_Reset_Helper(void) +{ +#ifdef SMALLCPU_NRESET_PIN + GPIO_InitTypeDef GPIO_InitStruct; + + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + + SMALLCPU_NRESET_GPIO_ENABLE(); + HAL_GPIO_Init(SMALLCPU_NRESET_GPIO_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(SMALLCPU_NRESET_GPIO_PORT,SMALLCPU_NRESET_PIN,GPIO_PIN_SET); +// HAL_Delay(100); +// GPIO_InitStruct.Mode = GPIO_MODE_INPUT; +// HAL_GPIO_Init(SMALLCPU_NRESET_GPIO_PORT, &GPIO_InitStruct); +#endif +} + + +void MX_SmallCPU_Reset_To_Standard(void) +{ +#ifdef SMALLCPU_NRESET_PIN + GPIO_InitTypeDef GPIO_InitStruct; + + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + + SMALLCPU_NRESET_GPIO_ENABLE(); + GPIO_InitStruct.Pin = SMALLCPU_NRESET_PIN; + HAL_GPIO_Init(SMALLCPU_NRESET_GPIO_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(SMALLCPU_NRESET_GPIO_PORT,SMALLCPU_NRESET_PIN,GPIO_PIN_RESET); + HAL_GPIO_WritePin(SMALLCPU_BOOT0_GPIO_PORT,SMALLCPU_BOOT0_PIN,GPIO_PIN_RESET); + HAL_Delay(2); + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + HAL_GPIO_Init(SMALLCPU_NRESET_GPIO_PORT, &GPIO_InitStruct); +#endif +} + + +uint8_t MX_UART_ButtonAdjust(uint8_t *array) +{ +#ifdef USART_PIEZO + uint8_t answer[4]; + HAL_UART_Transmit(&UartPiezoTxHandle,array,4,1000); + HAL_UART_Receive(&UartPiezoTxHandle,answer,4,2000); + if( (answer[0] == array[0]) + &&(answer[1] == array[1]) + &&(answer[2] == array[2]) + &&(answer[3] == array[3])) + return 1; +#endif + return 0; +} + + +void MX_UART_Init(void) +{ + /*##-1- Configure the UART peripheral ######################################*/ + /* Put the USART peripheral in the Asynchronous mode (UART Mode) */ + /* UART1 configured as follow: + - Word Length = 8 Bits + - Stop Bit = One Stop bit + - Parity = None + - BaudRate = 9600 baud + - Hardware flow control disabled (RTS and CTS signals) */ + +#ifdef USARTx_CTS_PIN + UartHandle.Init.HwFlowCtl = UART_HWCONTROL_RTS_CTS; +#else + UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; +#endif + UartHandle.Instance = USARTx; + UartHandle.Init.BaudRate = 115200; + UartHandle.Init.WordLength = UART_WORDLENGTH_8B; + UartHandle.Init.StopBits = UART_STOPBITS_1; + UartHandle.Init.Parity = UART_PARITY_NONE; + UartHandle.Init.Mode = UART_MODE_TX_RX; + /* HAL_UART_Init(&UartHandle); moved final init step into BT config function to avoid problems while module power is off */ + +#ifdef USART_PIEZO + UartPiezoTxHandle.Instance = USART_PIEZO; + UartPiezoTxHandle.Init.BaudRate = 1200; + UartPiezoTxHandle.Init.WordLength = UART_WORDLENGTH_8B; + UartPiezoTxHandle.Init.StopBits = UART_STOPBITS_1; + UartPiezoTxHandle.Init.Parity = UART_PARITY_NONE; + UartPiezoTxHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; + UartPiezoTxHandle.Init.Mode = UART_MODE_TX_RX; + + HAL_UART_Init(&UartPiezoTxHandle); +#endif + +#ifdef USART_IR_HUD + UartIR_HUD_Handle.Instance = USART_IR_HUD; + UartIR_HUD_Handle.Init.BaudRate = 2400; + UartIR_HUD_Handle.Init.WordLength = UART_WORDLENGTH_8B; + UartIR_HUD_Handle.Init.StopBits = UART_STOPBITS_1; + UartIR_HUD_Handle.Init.Parity = UART_PARITY_NONE; + UartIR_HUD_Handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; + UartIR_HUD_Handle.Init.Mode = UART_MODE_TX_RX; + + HAL_UART_Init(&UartIR_HUD_Handle); +#endif +} + +void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) +{ + if(huart == &UartHandle) + UartReady = SET; +} + + +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + if(huart == &UartHandle) + UartReady = SET; + else + if(huart == &UartIR_HUD_Handle) + { + UartReadyHUD = SET; + } +} + +void MX_tell_reset_logik_alles_ok(void) +{ +#ifdef RESET_LOGIC_ALLES_OK_PIN + GPIO_InitTypeDef GPIO_InitStruct; + + RESET_LOGIC_ALLES_OK_GPIO_ENABLE(); + + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Pin = RESET_LOGIC_ALLES_OK_PIN; + HAL_GPIO_Init(RESET_LOGIC_ALLES_OK_GPIO_PORT, &GPIO_InitStruct); + + HAL_GPIO_WritePin(RESET_LOGIC_ALLES_OK_GPIO_PORT,RESET_LOGIC_ALLES_OK_PIN,GPIO_PIN_RESET); + HAL_Delay(1); + HAL_GPIO_WritePin(RESET_LOGIC_ALLES_OK_GPIO_PORT,RESET_LOGIC_ALLES_OK_PIN,GPIO_PIN_SET); + + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + HAL_GPIO_Init(RESET_LOGIC_ALLES_OK_GPIO_PORT, &GPIO_InitStruct); +#endif +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Src/tComm_mini.c Sat Nov 15 19:29:44 2025 +0100 @@ -0,0 +1,2037 @@ +/////////////////////////////////////////////////////////////////////////////// +/// -*- coding: UTF-8 -*- +/// +/// \file Discovery/Src/tComm.c +/// \brief Main file for communication reduced to needs of the bootloader +/// \author heinrichs weikamp gmbh +/// \date 29-Mar-2025 +/// +/// \details +/// +/// $Id$ +/////////////////////////////////////////////////////////////////////////////// +/// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program. If not, see <http://www.gnu.org/licenses/>. +////////////////////////////////////////////////////////////////////////////// + +/** + ============================================================================== + ##### How to use ##### + ============================================================================== + ============================================================================== + ##### History ##### + ============================================================================== + 160211 added 4 bytes Serial in update Files after checksum prior to binary + 160211 0x6B changed to version only + 160623 fixed 0x72 (in V1.0.9) + 160623 fixed rebuild menu (before update) for V1.0.10 + + ============================================================================== + ##### CTS / RTS ##### + ============================================================================== + RTS is Output, CTS is Input + + BlueMod Pin D7 UART-RTS# is Output + connected to STM32F429 PA11 CTS (Input) + also STM32 PA12 RTS is connected to BlueMod UART-CTS# F3 + + see BlueMod_SR_HWreference_r06.pdf, page 156 + and MAIN_CPU STM32F4 Reference manual DM00031020.pdf, page 990 + + + ============================================================================== + ##### Codes ##### + ============================================================================== + [0x73] upload CPU2 firmware in SDRAM and update CPU2 + + [0x74] upload MainCPU firmware in EEPROM and start bootloader + + */ + +/* Includes ------------------------------------------------------------------*/ + +#include "tComm.h" + +#include "externCPU2bootloader.h" +#include "externLogbookFlash.h" +#include "gfx_colors.h" +#include "gfx_engine.h" +#include "gfx_fonts.h" +#include "ostc.h" + +#include "base_bootloader.h" +#include "firmwareEraseProgram.h" +#include "text_multilanguage.h" +#include "tInfoBootloader.h" + +#ifdef SPECIALPROGRAMM +# include "firmwareEraseProgram.h" +#endif +#include <stdlib.h> +#include <string.h> + + +/* Private variables ---------------------------------------------------------*/ +GFX_DrawCfgScreen tCscreen; +GFX_DrawCfgWindow tCwindow; + +uint8_t receiveStartByteUart = 0; +uint8_t bluetoothActiveLastTime = 0; + +uint8_t StartListeningToUART = 0; +char display_text[256] = { 0 }; + +uint8_t setForcedBluetoothName = 0; + +uint8_t updateSettingsAndMenuOnExit = 0; + +/* Private types -------------------------------------------------------------*/ +#define BYTE_DOWNLOAD_MODE (0xBB) +#define BYTE_SERVICE_MODE (0xAA) + +#define UART_OPERATION_TIMEOUT (500u) /* Timeout for common read / write operations (ms) */ +#define UART_TIMEOUT_SECONDS (120u) /* Timeout for keeping connection open and waiting for data */ +#define UART_TIMEOUT_LARGE_BLOCK (6000u) /* Timeout (ms) for reception of an 16K data block (typical RX time ~4,5seconds) */ + +#define UART_CMD_BUF_SIZE (30u) /* size of buffer for command exchange */ + +const uint8_t id_Region1_firmware = 0xFF; +const uint8_t id_RTE = 0xFE; +const uint8_t id_FONT = 0x10; +const uint8_t id_FONT_OLD = 0x00; + +static BlueModTmpConfig_t BmTmpConfig = BM_CONFIG_OFF; /* Config BlueMod without storing the changes */ +static uint8_t EvaluateBluetoothSignalStrength = 0; + +/* Private function prototypes -----------------------------------------------*/ +static void tComm_Error_Handler(void); +static uint8_t select_mode(uint8_t aRxByte); +static uint8_t tComm_CheckAnswerOK(void); +static uint8_t tComm_HandleBlueModConfig(void); +static void tComm_EvaluateBluetoothStrength(void); +uint8_t receive_update_flex(uint8_t isRTEupdateALLOWED); +uint8_t receive_update_data_flex(uint8_t* pBuffer1, uint8_t* pBuffer2, uint8_t RTEupdateALLOWED); +uint8_t receive_update_data_mainCPU_firmware(void); +uint8_t receive_update_data_mainCPU_variable_firmware(void); +uint8_t receive_update_data_mainCPU_firmware_subroutine(uint8_t region, uint8_t* pBuffer1, uint8_t* pBuffer2); +HAL_StatusTypeDef receive_uart_large_size(UART_HandleTypeDef *huart, uint8_t *pData, uint32_t Size); +static uint8_t openComm(uint8_t aRxByte); +uint8_t HW_Set_Bluetooth_Name(uint16_t serial, uint8_t withEscapeSequence); +uint8_t prompt4D4C(uint8_t mode); +uint8_t tComm_GetBTCmdStr(BTCmd cmdId, char* pCmdStr); + + +static uint8_t receive_update_data_cpu2(void); +uint8_t receive_update_data_cpu2_sub(uint8_t* pBuffer); + + +/* #define OSTC4_HW */ +/* Exported functions --------------------------------------------------------*/ + +void tComm_init(void) +{ + tCscreen.FBStartAdress = 0; + tCscreen.ImageHeight = 480; + tCscreen.ImageWidth = 800; + tCscreen.LayerIndex = 1; + + tCwindow.Image = &tCscreen; + tCwindow.WindowNumberOfTextLines = 6; + tCwindow.WindowLineSpacing = 65; + tCwindow.WindowTab = 400; + tCwindow.WindowX0 = 20; + tCwindow.WindowX1 = 779; + + tCwindow.WindowY0 = 0; + tCwindow.WindowY1 = 479; + + StartListeningToUART = 1; +} + +uint8_t tComm_control(void) +{ + uint8_t answer = 0; + + if(BmTmpConfig != BM_CONFIG_DONE) + { + tComm_HandleBlueModConfig(); + } + else + { + /*##-2- Put UART peripheral in reception process ###########################*/ + + if((UartReady == RESET) && StartListeningToUART) + { + StartListeningToUART = 0; + if(HAL_UART_Receive_IT(&UartHandle, &receiveStartByteUart, 1) != HAL_OK) + tComm_Error_Handler(); + } + /* Reset transmission flag */ + if(UartReady == SET) + { + UartReady = RESET; + if((receiveStartByteUart == BYTE_DOWNLOAD_MODE) || (receiveStartByteUart == BYTE_SERVICE_MODE)) + answer = openComm(receiveStartByteUart); + StartListeningToUART = 1; + return answer; + } + } + return 0; +} + + +void tComm_refresh(void) +{ + char localString[255]; + + if(tCscreen.FBStartAdress == 0) + { + GFX_hwBackgroundOn(); + tCscreen.FBStartAdress = getFrame(18); + write_content_simple(&tCscreen, 0, 800, 480-24, &FontT24min,"Exit",CLUT_ButtonSurfaceScreen); + write_content_simple(&tCscreen, 800 - 70, 800, 480-24, &FontT24min,"Signal",CLUT_ButtonSurfaceScreen); + + if(receiveStartByteUart == BYTE_SERVICE_MODE) + GFX_write_string(&FontT48min, &tCwindow, "Service mode enabled",2); + else + GFX_write_string(&FontT48min, &tCwindow, "Download mode enabled",2); + GFX_SetFramesTopBottom(tCscreen.FBStartAdress, 0,480); + display_text[0] = 0; + display_text[255] = 0; + } + else if(display_text[255]) + { + display_text[(uint8_t)display_text[255]] = 0; + localString[0] = TXT_MINIMAL; + strcpy (&localString[1],display_text); + releaseFrame(18,tCscreen.FBStartAdress); + tCscreen.FBStartAdress = getFrame(18); + write_content_simple(&tCscreen, 0, 800, 480-24, &FontT24min,"Exit",CLUT_ButtonSurfaceScreen); + write_content_simple(&tCscreen, 800 - 70, 800, 480-24, &FontT24min,"Signal",CLUT_ButtonSurfaceScreen); + GFX_write_string(&FontT48min, &tCwindow, localString,2); + GFX_SetFrameTop(tCscreen.FBStartAdress); + display_text[0] = 0; + display_text[255] = 0; + } +} + + +void tComm_verlauf(uint8_t percentage_complete) +{ + uint32_t pDestination; + + pDestination = (uint32_t)tCscreen.FBStartAdress; + pDestination += 150 * tCscreen.ImageHeight * 2; + pDestination += 100 * 2; + + if(percentage_complete > 100) + percentage_complete = 100; + + int i = 1; + while(i<=percentage_complete) + { + i += 1; + for(int y=0;y<4;y++) + { + for(int x=0;x<40;x++) + { + *(__IO uint16_t*)pDestination = 0xFF00 + 00; + pDestination += 2; + } + pDestination += (tCscreen.ImageHeight - 40 )* 2; + } + pDestination += tCscreen.ImageHeight * 2; // one spare line + } +} + + +void tComm_exit(void) +{ + SStateList status; + get_globalStateList(&status); + + releaseFrame(18,tCscreen.FBStartAdress); + tCscreen.FBStartAdress = 0; + GFX_hwBackgroundOff(); + + if(setForcedBluetoothName) + { + setForcedBluetoothName = 0; + MX_Bluetooth_PowerOff(); + HAL_Delay(1000); + MX_Bluetooth_PowerOn(); + tComm_Set_Bluetooth_Name(1); + tComm_StartBlueModConfig(); + } + + updateSettingsAndMenuOnExit = 0; + + if(status.base == BaseComm) + { + set_globalState_Base(); + } + MX_Bluetooth_PowerOff(); // Power down Bluetooth on the way out +} + + +uint8_t tComm_Set_Bluetooth_Name(uint8_t force) +{ + uint8_t answer = 0; + + if(hardwareDataGetPointer()->secondarySerial != 0xFFFF) + { + if(force || (hardwareDataGetPointer()->secondary_bluetooth_name_set == 0xFF)) + answer = HW_Set_Bluetooth_Name(hardwareDataGetPointer()->secondarySerial, 0); + if(answer == HAL_OK) + hardware_programmSecondaryBluetoothNameSet(); + } + else + if(hardwareDataGetPointer()->primarySerial != 0xFFFF) + { + if(force || (hardwareDataGetPointer()->production_bluetooth_name_set == 0xFF)) + answer = HW_Set_Bluetooth_Name(hardwareDataGetPointer()->primarySerial, 0); + + if(answer == HAL_OK) + hardware_programmPrimaryBluetoothNameSet(); + + } + else /* no serial set at all => do default configuration of the module */ + { +#define NINAB22103B00 +#ifdef NINAB22103B00 + answer = 0xFF; +#endif + } + return answer; +} + + +uint8_t HW_Set_Bluetooth_Name(uint16_t serial, uint8_t withEscapeSequence) +{ + uint8_t answer = HAL_OK; + uint8_t aRxBuffer[50]; + char aTxBufferName[50]; + +// char aTxFactoryDefaults[50] = "AT&F1\r"; + + char aTxBufferEscapeSequence[50] = "+++"; /* factory default */ + // limit is 19 chars, with 7 chars shown in BLE advertising mode + //________________________123456789012345678901 + + tComm_GetBTCmdStr(BT_CMD_NAME, aTxBufferName); + + char answerOkay[6] = "\r\nOK\r\n"; + + gfx_number_to_string(5,1,&aTxBufferName[15],serial); + + // store active configuration in non-volatile memory + char aTxBufferWrite[50] = "AT&W\r"; + +// char aTxBufferReset[50] = "AT+RESET\r"; + + + HAL_Delay(1010); + if(withEscapeSequence) + { + aRxBuffer[0] = 0; + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBufferEscapeSequence, 3, 2000)!= HAL_OK) + answer = HAL_ERROR; + HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 3, 2000); + HAL_Delay(1010); + + for(int i=0;i<3;i++) + if(aRxBuffer[i] != '+') + answer = HAL_ERROR; + } + + aRxBuffer[0] = 0; + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBufferName, 21, 2000)!= HAL_OK) + answer = HAL_ERROR; + HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 21+6, 2000); + + for(int i=0;i<21;i++) + if(aRxBuffer[i] != aTxBufferName[i]) + answer = HAL_ERROR; + + for(int i=0;i<6;i++) + if(aRxBuffer[21+i] != answerOkay[i]) + answer = HAL_ERROR; + + HAL_Delay(200); + + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBufferWrite, 5, 2000)!= HAL_OK) + answer = HAL_ERROR; + HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 5+6, 2000); + + for(int i=0;i<5;i++) + if(aRxBuffer[i] != aTxBufferWrite[i]) + answer = HAL_ERROR; + + for(int i=0;i<6;i++) + if(aRxBuffer[5+i] != answerOkay[i]) + answer = HAL_ERROR; + + answer = HAL_OK; + return answer; +} + +uint8_t openComm(uint8_t aRxByte) +{ + SStateList status; + uint8_t localRx; + uint8_t timeoutCounter = 0; + uint8_t answer = 0; + uint8_t service_mode_last_three_bytes[3]; + uint8_t service_mode_response[5] = + { + 0x4B, + 0xAB, + 0xCD, + 0xEF, + 0x4C + }; + uint8_t download_mode_response[2] = + { + 0xBB, + 0x4D + }; + + if((aRxByte != BYTE_DOWNLOAD_MODE) && (aRxByte != BYTE_SERVICE_MODE)) + return 0; + + set_globalState(StUART_STANDARD); + + /* service mode is four bytes + 0xAA 0xAB 0xCD 0xEF + answer is + */ + localRx = aRxByte; + + if(aRxByte == BYTE_SERVICE_MODE) + { + if((HAL_UART_Receive(&UartHandle, (uint8_t*)service_mode_last_three_bytes, 3, 2000)!= HAL_OK)) + answer = 0x00; + else + { + if((service_mode_last_three_bytes[0] != 0xAB) || (service_mode_last_three_bytes[1] != 0xCD) || (service_mode_last_three_bytes[2] != 0xEF)) + answer = 0x00; + else + { + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)service_mode_response, 5, 2000)!= HAL_OK) + answer = 0x00; + else + answer = prompt4D4C(receiveStartByteUart); + } + } + } + else //if(aRxByte == BYTE_SERVICE_MODE) + { + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)download_mode_response, 2, 2000)!= HAL_OK) + answer = 0x00; + else + answer = prompt4D4C(receiveStartByteUart); + } + + while((answer == prompt4D4C(receiveStartByteUart)) && (timeoutCounter < UART_TIMEOUT_SECONDS)) /* try receive once a second */ + { + if(HAL_UART_Receive(&UartHandle, (uint8_t*)&localRx, 1, UART_OPERATION_TIMEOUT)!= HAL_OK) + { + timeoutCounter++; + get_globalStateList(&status); + if (status.base != BaseComm) + { + timeoutCounter = UART_TIMEOUT_SECONDS; /* Abort action triggered outside main loop => exit */ + } + if(EvaluateBluetoothSignalStrength) + { + tComm_EvaluateBluetoothStrength(); + } + } + else + { + answer = select_mode(localRx); + timeoutCounter = 0; + } + } + set_returnFromComm(); + return 1; +} + + +uint8_t prompt4D4C(uint8_t mode) +{ + if(mode == BYTE_SERVICE_MODE) + return 0x4C; + else + return 0x4D; +} + + +uint8_t select_mode(uint8_t type) +{ + uint8_t dummyForBootloader[256] = {0}; + uint8_t count; + uint8_t aTxBuffer[128]; + uint8_t aRxBuffer[68]; + uint8_t answer; + aTxBuffer[0] = type; + aTxBuffer[1] = prompt4D4C(receiveStartByteUart); + uint8_t tempHigh, tempLow; + count = 0; + + // service mode only commands + if(receiveStartByteUart == BYTE_SERVICE_MODE) + { + // first part + switch(type) + { + // start communication (again) + case 0xAA: + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, 2, 1000)!= HAL_OK) + return 0; + else + return prompt4D4C(receiveStartByteUart); + default: + break; + } + + + // Exit communication on Text like RING, CONNECT, ... or 0xFF command + if((type < 0x60) || (type == 0xFF)) + return 0; + + // return of command for (almost) all commands + switch(type) + { + // not supported yet case 0x20: // send hi:lo:temp1 bytes starting from ext_flash_address:3 + // not supported yet case 0x22: // Resets all logbook pointers and the logbook (!) + // not supported yet case 0x23: // Resets battery gauge registers + // not supported yet case 0x30: // write bytes starting from ext_flash_address:3 (Stop when timeout) + // not supported yet case 0x40: // erases 4kB block from ext_flash_address:3 (Warning: No confirmation or built-in security here...) + // not supported yet case 0x42: // erases range in 4kB steps (Get 3 bytes address and 1byte amount of 4kB blocks) + // not supported yet case 0x50: // sends firmware from external flash from 0x3E0000 to 0x3FD000 (118784bytes) via comm + case 0xFE: // hw unit_tests + case 0x71: // hw read manufacturing data + case 0x73: // hw update FLEX + case 0x79: // hw read device data + case 0x74: // hw update Firmware + case 0x75: // hw update RTE + case 0x76: // hw update Fonts + case 0x80: // hw write manufacturing data + case 0x81: // hw write second serial + case 0x82: // hw set bluetooth name + case 0xC1: // Start low-level bootloader + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, 1, UART_OPERATION_TIMEOUT)!= HAL_OK) + return 0; + break; + default: + break; + } + + // now send content or update firmware + switch(type) + { + case 0xFE: + // work to do :-) 12. Oct. 2015 + // 256 bytes output + memset(aTxBuffer,0,128); + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, 128,5000)!= HAL_OK) + return 0; + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, 128,5000)!= HAL_OK) + return 0; + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + + case 0x71: + memcpy(aTxBuffer,hardwareDataGetPointer(),64); + count += 64; + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + + case 0x73: + answer = receive_update_flex(1); + if(answer == 0) + return 0; + else if(answer == 2) // 2 = RTE without bootToBootloader + { + aTxBuffer[0] = 0xFF; + HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, 1,10000); + return 0; + } + else + { + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + if(answer == 1) /* 0xFF is checksum error, 2 = RTE without bootToBootloader */ + { + extern uint8_t bootToBootloader; + bootToBootloader = 1; + } + } + break; + + case 0x79: + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, 1,10000)!= HAL_OK) + return 0; + ext_flash_read_fixed_16_devicedata_blocks_formated_128byte_total(aTxBuffer); + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, 128,5000)!= HAL_OK) + return 0; + aTxBuffer[0] = prompt4D4C(receiveStartByteUart); + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, 1,10000)!= HAL_OK) + return 0; + else + return prompt4D4C(receiveStartByteUart); + + case 0x82: + setForcedBluetoothName = 1; + return 0; + + case 0x74: + answer = receive_update_data_mainCPU_firmware(); + if(answer != 0) + { + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + if(answer == 1) // 0xFF is checksum error + { + extern uint8_t bootToBootloader; + bootToBootloader = 1; + } + } + else + return 0; + break; + + case 0x75: + receive_update_data_cpu2(); + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + + case 0x76: + answer = receive_update_data_mainCPU_variable_firmware(); + if(answer != 0) + { + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + if(answer == 1) // 0xFF is checksum error + { + extern uint8_t bootToBootloader; + bootToBootloader = 1; + } + } + else + return 0; + break; + + case 0x80: + if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 52, 5000)!= HAL_OK) + return 0; + if(hardware_programmProductionData(aRxBuffer) == HAL_OK) + { + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + } + else + return 0; + break; + + case 0x81: + if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 12, 1000)!= HAL_OK) + return 0; + if(hardware_programmSecondarySerial(aRxBuffer) == HAL_OK) + { + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + } + else + return 0; + break; + + } + + // was service command? Yes, finish and exit + if(count) + { + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, count,10000)!= HAL_OK) + return 0; + else + return prompt4D4C(receiveStartByteUart); + } + } + + + // download mode commands + switch(type) + { + // return of command for almost all commands + case 0x60: // get model + features + case 0x61: // get all headers full (256 bytes) + case 0x62: // set clock + case 0x63: // set custom text + case 0x66: // get dive profile + case 0x69: // get serial, old version numbering, custom text + case 0x6A: // get model + case 0x6B: // get specific firmware version + case 0x6C: /* Display Bluetooth signal strength */ + case 0x6D: // get all compact headers (16 byte) + case 0x6E: // display text + case 0x70: // read min, default, max setting + case 0x72: // read setting + case 0x77: // write setting + case 0x78: // reset all settings + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, 1, 1000)!= HAL_OK) + return 0; + break; + + // start communication (again) + case 0xBB: + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, 2, 1000)!= HAL_OK) + return 0; + else + return prompt4D4C(receiveStartByteUart); + + // stop communication + case 0xFF: + HAL_UART_Transmit(&UartHandle, (uint8_t*)&aTxBuffer, 1, 1000); + return 0; + + default: + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + } + + switch(type) + { + case 0x62: + if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 6, 2000)!= HAL_OK) + return 0; + break; + case 0x63: + if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 60, 5000)!= HAL_OK) + return 0; + break; + case 0x66: + if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 1, 1000)!= HAL_OK) + return 0; + break; + case 0x6B: + if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 1, 1000)!= HAL_OK) + return 0; + break; + case 0x6E: + if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 16, 5000)!= HAL_OK) + return 0; + break; + case 0x77: + if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 5, 5000)!= HAL_OK) + return 0; + break; + case 0x72: + if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 1, 5000)!= HAL_OK) + return 0; + break; + case 0x70: + if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, 1, 5000)!= HAL_OK) + return 0; + break; + } + + switch(type) + { + /* common to standard and bootloader */ + + // get model + features + case 0x60: + aTxBuffer[count++] = 0x00; // hardware descriptor HIGH byte + aTxBuffer[count++] = 0x3B; // hardware descriptor LOW byte // 0x3B is OSTC 4/5 // 0x1A is OTSC3 + aTxBuffer[count++] = 0x00; // feature descriptor HIGH byte + aTxBuffer[count++] = 0x00; // feature descriptor LOW byte + aTxBuffer[count++] = 0x44; // model id OSTC5 + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + + // get model + case 0x6A: + aTxBuffer[count++] = 0x3B; // 0x3B is OSTC 4/5 // 0x1A is OTSC3 + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + + // get all firmware version and status (OSTC4 only) + case 0x6B: + switch(*aRxBuffer) + { + case 0xFF: + // firmware + aTxBuffer[count++] = firmwareDataGetPointer()->versionFirst; + aTxBuffer[count++] = firmwareDataGetPointer()->versionSecond; + aTxBuffer[count++] = firmwareDataGetPointer()->versionThird; + aTxBuffer[count++] = firmwareDataGetPointer()->versionBeta; + break; + case 0xFE: + // RTE + getActualRTEandFONTversion(&tempHigh, &tempLow, 0, 0); // RTE + aTxBuffer[count++] = tempHigh; + aTxBuffer[count++] = tempLow; + aTxBuffer[count++] = 0; + aTxBuffer[count++] = 0; + break; + case 0x10: + getActualRTEandFONTversion( 0, 0, &tempHigh, &tempLow); // font + aTxBuffer[count++] = tempHigh; + aTxBuffer[count++] = tempLow; + aTxBuffer[count++] = 0; + aTxBuffer[count++] = 0; + break; + default: + // not supported + aTxBuffer[count++] = 0xFF; + aTxBuffer[count++] = 0xFF; + aTxBuffer[count++] = 0xFF; + aTxBuffer[count++] = 0xFF; + break; +/* Jef Driesen Test + default: + // not supported + aTxBuffer[count++] = 0x1; + aTxBuffer[count++] = 0x1; + aTxBuffer[count++] = 0x1; + aTxBuffer[count++] = 0x1; + break; +*/ + } +/* + // serial + aTxBuffer[count++] = pSettings->serialLow; + aTxBuffer[count++] = pSettings->serialHigh; + // batch code (date) + hardwareBatchCode(&tempHigh, &tempLow); + aTxBuffer[count++] = tempLow; + aTxBuffer[count++] = tempHigh; + // status and status detail (future feature) + aTxBuffer[count++] = 0; + aTxBuffer[count++] = 0; + aTxBuffer[count++] = 0; + aTxBuffer[count++] = 0; +*/ + // prompt + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + + /* Trigger Bluetooth signal strength evaluation */ + case 0x6C: tComm_EvaluateBluetoothStrength(); + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + // display text + case 0x6E: + for(int i=0;i<16;i++) + display_text[i] = aRxBuffer[i]; + display_text[15] = 0; + display_text[255] = 16; + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + + // version / identify + case 0x69: + aTxBuffer[count++] = 0;//pSettings->serialLow; + aTxBuffer[count++] = 0;//pSettings->serialHigh; + aTxBuffer[count++] = 0;//firmwareVersion_16bit_low(); + aTxBuffer[count++] = 0;//firmwareVersion_16bit_high(); + memset(&aTxBuffer[count], 0, 60); + count += 60; + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + + /* bootloader dummies */ + // full headers (256 byte) + case 0x61: + for(int StepBackwards = 0;StepBackwards<256;StepBackwards++) + { + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)dummyForBootloader, 256,5000)!= HAL_OK) + return 0; + } + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + // compact headers (16 byte) + case 0x6D: + for(int StepBackwards = 0;StepBackwards<256;StepBackwards++) + { + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)dummyForBootloader, 16,5000)!= HAL_OK) + return 0; + } + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + // set clock & date + case 0x62: + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + // set custom text + case 0x63: + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + // get dive profile + case 0x66: + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)dummyForBootloader, 256,5000)!= HAL_OK) + return 0; + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + // read min,default,max setting + // read settings + + + case 0x72: + memcpy(&aTxBuffer[count], dummyForBootloader, 4); + count += 4; + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + // write settings + case 0x77: + aTxBuffer[count++] = prompt4D4C(receiveStartByteUart); + break; + } + + if(count) + { + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, count,10000)!= HAL_OK) + return 0; + else + return prompt4D4C(receiveStartByteUart); + } + return 0; +} + +#define BLOCKSIZE 0x1000 + +HAL_StatusTypeDef receive_uart_large_size(UART_HandleTypeDef *huart, uint8_t *pData, uint32_t Size) +{ + uint16_t length_4k_blocks; + uint16_t length_4k_remainder; + uint32_t temp; + HAL_StatusTypeDef result = HAL_OK; + uint32_t pDataLocal; + + length_4k_blocks = (uint16_t) (Size / BLOCKSIZE); + temp = length_4k_blocks; + temp *= BLOCKSIZE; + length_4k_remainder = (uint16_t) ( Size - temp); + + pDataLocal = (uint32_t)pData; + + + while((result == HAL_OK) && length_4k_blocks) + { + result = HAL_UART_Receive(&UartHandle, (uint8_t *)pDataLocal, BLOCKSIZE , UART_TIMEOUT_LARGE_BLOCK); + pDataLocal += BLOCKSIZE; + length_4k_blocks--; + } + + if((result == HAL_OK) && length_4k_remainder) + { + result = HAL_UART_Receive(&UartHandle, (uint8_t *)pDataLocal, length_4k_remainder , UART_TIMEOUT_LARGE_BLOCK); + } + return result; +} + + +/* for safety reason (memory blocking this code is main and sub */ + +uint8_t receive_update_data_cpu2(void) +{ + uint8_t answer; + + uint8_t* pBuffer = (uint8_t*)getFrame(20); + answer = receive_update_data_cpu2_sub(pBuffer); + releaseFrame(20,(uint32_t)pBuffer); + return answer; +} + + +uint8_t receive_update_data_cpu2_sub(uint8_t* pBuffer) +{ + uint8_t sBuffer[10]; + uint32_t length, offsetTotal, checksum, checksumCalc; + uint8_t id; + const uint8_t id_RTE = 0xFE; + + //Get length + if(HAL_UART_Receive(&UartHandle, pBuffer, 4,5000)!= HAL_OK) // 58000 + { + return 0; + } + length = 256 * 256 * 256 * (uint32_t)pBuffer[0] + 256 * 256 * (uint32_t)pBuffer[1] + 256 * (uint32_t)pBuffer[2] + pBuffer[3]; + + //Get id + if(HAL_UART_Receive(&UartHandle, pBuffer, 4,5000)!= HAL_OK) // 58000 + { + return 0; + } + id = pBuffer[0]; + offsetTotal = 256 * 256 * 256 * (uint32_t)pBuffer[0] + 256 * 256 * (uint32_t)pBuffer[1] + 256 * (uint32_t)pBuffer[2] + pBuffer[3]; + + // get checksum, bytes are in different order on Dev C++ code!!! + if(HAL_UART_Receive(&UartHandle, sBuffer, 4,5000)!= HAL_OK) // 58000 + { + return 0; + } + checksum = 256 * 256 * 256 * (uint32_t)sBuffer[3] + 256 * 256 * (uint32_t)sBuffer[2] + 256 * (uint32_t)sBuffer[1] + sBuffer[0]; + checksumCalc = length + offsetTotal; + + // no need to get code if checksum == length is wrong + if(checksumCalc != checksum) + { + return 0; + } + + //get Code + if(receive_uart_large_size(&UartHandle, pBuffer, length)!= HAL_OK) + { + return 0; + } + + //get Checksum + if(HAL_UART_Receive(&UartHandle, sBuffer, 4,5000)!= HAL_OK) // 580000 + { + return 0; + } + checksum = 256 * 256 * 256 *(uint32_t)sBuffer[0] + 256 * 256 * (uint32_t)sBuffer[1] + 256 * (uint32_t)sBuffer[2] + sBuffer[3]; +// uint32_t checksumCalc = crc32c_checksum(pBuffer, length,0,0); + checksumCalc = CRC_CalcBlockCRC((uint32_t*)pBuffer, length/4); + + if(checksum != checksumCalc) + { + return 0; + } + + if(id != id_RTE) + { + strcpy(display_text,"wrong data."); + display_text[255] = 32; + return 0; + } + + strcpy(display_text," RTE update."); + display_text[255] = 32; + + return extCPU2bootloader(pBuffer,length,display_text); +} + +uint8_t receive_update_flex(uint8_t isRTEupdateALLOWED) +{ + uint8_t answer; + + uint8_t* pBuffer1 = (uint8_t*)getFrame(20); + uint8_t* pBuffer2 = (uint8_t*)getFrame(20); + + answer = receive_update_data_flex(pBuffer1, pBuffer2, isRTEupdateALLOWED); + + releaseFrame(20,(uint32_t)pBuffer1); + releaseFrame(20,(uint32_t)pBuffer2); + + return answer; +} + +uint8_t receive_update_data_mainCPU_firmware(void) +{ + uint8_t answer; + + uint8_t* pBuffer1 = (uint8_t*)getFrame(20); + + answer = receive_update_data_mainCPU_firmware_subroutine(1, pBuffer1, 0); + + releaseFrame(20,(uint32_t)pBuffer1); + + return answer; +} + +/* multi buffer (long data) not tested yet */ +uint8_t receive_update_data_mainCPU_variable_firmware(void) +{ + uint8_t answer; + + uint8_t* pBuffer1 = (uint8_t*)getFrame(20); + uint8_t* pBuffer2 = (uint8_t*)getFrame(20); + + answer = receive_update_data_mainCPU_firmware_subroutine(2, pBuffer1, pBuffer2); + + releaseFrame(20,(uint32_t)pBuffer1); + releaseFrame(20,(uint32_t)pBuffer2); + + return answer; +} + +uint8_t receive_update_data_flex(uint8_t* pBuffer1, uint8_t* pBuffer2, uint8_t RTEupdateALLOWED) +{ + uint8_t sBuffer[10]; + uint8_t serialBuffer[10]; + uint32_t length1, length2, lengthCompare, offsetCompare, ByteCompareStatus; + uint32_t lengthTotal, offsetTotal; + uint32_t checksum, checksumCalc = 0; + uint8_t id; + const uint8_t id_Region1_firmware = 0xFF; + const uint8_t id_RTE = 0xFE; + uint8_t textpointer = 0; + uint32_t index = 0; + + //Get length + if(HAL_UART_Receive(&UartHandle, sBuffer, 4,5000)!= HAL_OK) // 58000 + { + return 0; + } + lengthTotal = 256 * 256 * 256 * (uint32_t)sBuffer[0] + 256 * 256 * (uint32_t)sBuffer[1] + 256 * (uint32_t)sBuffer[2] + sBuffer[3]; + + //Get offset and/or id (id is 0xFF for RTE, 0xFE for firmware and offset if var) + if(HAL_UART_Receive(&UartHandle, sBuffer, 4,5000)!= HAL_OK) // 58000 + { + return 0; + } + id = sBuffer[0]; + + checksumCalc = 256 * 256 * 256 * (uint32_t)sBuffer[0] + 256 * 256 * (uint32_t)sBuffer[1] + 256 * (uint32_t)sBuffer[2] + sBuffer[3]; + checksumCalc += lengthTotal; + //old, does no longer work because of the fonts: checksumCalc = lengthTotal + offsetTotal; + + if((id != id_Region1_firmware) && (id != id_RTE) && (id != id_FONT) && (id != id_FONT_OLD)) + { + return 0; + } + + // neu 110212 + if(id == id_FONT) + offsetTotal = 256 * 256 * 256 * (uint32_t)sBuffer[1] + 256 * 256 * (uint32_t)sBuffer[2] + 256 * (uint32_t)sBuffer[3]; + else + offsetTotal = 256 * 256 * 256 * (uint32_t)sBuffer[0] + 256 * 256 * (uint32_t)sBuffer[1] + 256 * (uint32_t)sBuffer[2] + sBuffer[3]; + + // get checksum, bytes are in different order on Dev C++ code!!! + if(HAL_UART_Receive(&UartHandle, sBuffer, 4,5000)!= HAL_OK) // 58000 + { + return 0; + } + checksum = 256 * 256 * 256 * (uint32_t)sBuffer[3] + 256 * 256 * (uint32_t)sBuffer[2] + 256 * (uint32_t)sBuffer[1] + sBuffer[0]; + + + if(checksumCalc != checksum) + { + uint8_t ptr = 0; + strcpy(&display_text[ptr]," checksum error"); + ptr += 15; + strcpy(&display_text[ptr],"\n\r"); + ptr += 2; + ptr += gfx_number_to_string(10,0,&display_text[ptr],checksumCalc); + display_text[ptr] = 0; + display_text[255] = ptr + 1; + return 0xFF; + } + + //Get serial (new since 160211) + if(HAL_UART_Receive(&UartHandle, serialBuffer, 4,5000)!= HAL_OK) + { + return 0; + } + + if(lengthTotal > 768000) + { + length1 = 768000; + length2 = lengthTotal - length1; + } + else + { + length1 = lengthTotal; + length2 = 0; + } + + if((pBuffer2 == 0) && (length2 != 0)) + return 0; + + //get Code + if(receive_uart_large_size(&UartHandle, pBuffer1, length1)!= HAL_OK) + return 0; + + if(length2) + if(receive_uart_large_size(&UartHandle, pBuffer2, length2)!= HAL_OK) + return 0; + + //get Checksum + if(HAL_UART_Receive(&UartHandle, sBuffer, 4,5000)!= HAL_OK) // 58000 + return 0; + + checksum = 256 * 256 * 256 *(uint32_t)sBuffer[0] + 256 * 256 * (uint32_t)sBuffer[1] + 256 * (uint32_t)sBuffer[2] + sBuffer[3]; +// uint32_t checksumCalc = crc32c_checksum(pBuffer1, length1, pBuffer2, length2); + if(length2) + checksumCalc = CRC_CalcBlockCRC_moreThan768000((uint32_t*)pBuffer1, (uint32_t*)pBuffer2, lengthTotal/4); + else + checksumCalc = CRC_CalcBlockCRC((uint32_t*)pBuffer1, length1/4); + + /* check id now */ + /* + if(region == 2) + { + if((id == id_Region1_firmware) || (id == id_RTE)) + { + strcpy(display_text,"wrong data."); + display_text[255] = 32; + return 0; + } + } + else + { + if(id != id_Region1_firmware) + { + strcpy(display_text,"wrong data."); + display_text[255] = 32; + return 0; + } + } + */ + /* test checksum */ + if(checksum != checksumCalc) + { + uint8_t ptr = 0; + strcpy(&display_text[ptr]," checksum error"); + ptr += 15; + strcpy(&display_text[ptr],"\n\r"); + display_text[ptr] = 0; + display_text[255] = ptr + 1; + return 0xFF; + } + + if(id == id_Region1_firmware) + { + uint8_t ptr = 0; + display_text[ptr++] = 'V'; + ptr += gfx_number_to_string(2,0,&display_text[ptr],pBuffer1[0x10000] & 0x1F); + display_text[ptr++] = '.'; + ptr += gfx_number_to_string(2,0,&display_text[ptr],pBuffer1[0x10001] & 0x1F); + display_text[ptr++] = '.'; + ptr += gfx_number_to_string(2,0,&display_text[ptr],pBuffer1[0x10002] & 0x1F); + display_text[ptr++] = ' '; + if(pBuffer1[0x10003]) + { + strcpy(&display_text[ptr],"beta "); + ptr +=5; + } + strcpy(&display_text[ptr],"\n\rpreparing for install."); + ptr += 25; + display_text[255] = ptr + 1; + } + else if(id == id_RTE) + { + if(RTEupdateALLOWED) + { + strcpy(display_text," RTE update.\n\r"); + textpointer = 0; + while((display_text[textpointer] != 0) && (textpointer < 50)) + textpointer++; + display_text[255] = textpointer+1; + return extCPU2bootloader(pBuffer1,length1,display_text); + } + else + return 0xFF; + } + else + if(id == id_FONT) + { + uint8_t ptr = 0; + ptr += gfx_number_to_string(7,0,&display_text[ptr],lengthTotal); + strcpy(&display_text[ptr]," bytes with "); + ptr += 12; + ptr += gfx_number_to_string(7,0,&display_text[ptr],offsetTotal); + strcpy(&display_text[ptr]," offset"); + ptr += 7; + strcpy(&display_text[ptr],"\n\rpreparing for install."); + ptr += 25; + display_text[255] = ptr + 1; + } + + + /* only non RTE !! (at this point RTE path already performed a return some lines above */ + uint8_t* pBufferCompare = (uint8_t*)getFrame(20); + ByteCompareStatus = 0; + + if(id == id_Region1_firmware) + { + /* standard firmware limited to 768000 */ + if(ext_flash_read_firmware(pBufferCompare,4,0) != 0xFFFFFFFF) + ext_flash_erase_firmware(); + ext_flash_write_firmware(pBuffer1, length1); + lengthCompare = ext_flash_read_firmware(pBufferCompare,768000,0); + + if(lengthCompare != length1) + ByteCompareStatus = 10000; + for(index = 0; index < length1; index++) + { + if(pBuffer1[index] != pBufferCompare[index]) + ByteCompareStatus++; + } + } + else + if(id == id_FONT) + { + /* upper region firmware can be larger (1MB) */ + if(ext_flash_read_firmware2(0, pBufferCompare,4, 0,0) != 0xFFFFFFFF) + ext_flash_erase_firmware2(); + ext_flash_write_firmware2(offsetTotal, pBuffer1, length1, pBuffer2, length2); + lengthCompare = ext_flash_read_firmware2(&offsetCompare, pBufferCompare,768000, 0,768000); + + if(lengthCompare != length1 + length2) + ByteCompareStatus = 10000; + if(offsetTotal != offsetCompare) + ByteCompareStatus += 20000; + for(index = 0; index < length1; index++) + { + if(pBuffer1[index] != pBufferCompare[index]) + ByteCompareStatus++; + } + + lengthCompare = ext_flash_read_firmware2(0, 0,768000, pBufferCompare,768000); + for(index = 0; index < length2; index++) + { + if(pBuffer2[index] != pBufferCompare[index]) + ByteCompareStatus++; + } + } + + releaseFrame(20,(uint32_t)pBufferCompare); + + if(ByteCompareStatus != 0) + { + strcpy(&display_text[0],"\n\rcopy error."); + display_text[255] = 21; + return 0; + } + else + { + strcpy(&display_text[0],"\n\rready to install."); + display_text[255] = 21; + return 1; + } +} + + +uint8_t receive_update_data_mainCPU_firmware_subroutine(uint8_t region, uint8_t* pBuffer1, uint8_t* pBuffer2) +{ + uint8_t sBuffer[10]; + uint32_t length1, length2, lengthCompare, offsetCompare, ByteCompareStatus; + uint32_t lengthTotal, offsetTotal, checksum, checksumCalc = 0; + uint8_t id; + + //Get length + if(HAL_UART_Receive(&UartHandle, sBuffer, 4,5000)!= HAL_OK) // 58000 + return 0; + + lengthTotal = 256 * 256 * 256 * (uint32_t)sBuffer[0] + 256 * 256 * (uint32_t)sBuffer[1] + 256 * (uint32_t)sBuffer[2] + sBuffer[3]; + + //Get offset and/or id (id is 0xFF for RTE, 0xFE for firmware and offset if var) + if(HAL_UART_Receive(&UartHandle, sBuffer, 4,5000)!= HAL_OK) // 58000 + return 0; + + id = sBuffer[0]; + + checksumCalc = 256 * 256 * 256 * (uint32_t)sBuffer[0] + 256 * 256 * (uint32_t)sBuffer[1] + 256 * (uint32_t)sBuffer[2] + sBuffer[3]; + checksumCalc += lengthTotal; + + if((id != id_Region1_firmware) && (id != id_RTE) && (id != id_FONT) && (id != id_FONT_OLD)) + return 0; + + if(id == id_FONT) + offsetTotal = 256 * 256 * 256 * (uint32_t)sBuffer[1] + 256 * 256 * (uint32_t)sBuffer[2] + 256 * (uint32_t)sBuffer[3]; + // alt, prior to id for font + else + offsetTotal = 256 * 256 * 256 * (uint32_t)sBuffer[0] + 256 * 256 * (uint32_t)sBuffer[1] + 256 * (uint32_t)sBuffer[2] + sBuffer[3]; + + // get checksum, bytes are in different order on Dev C++ code!!! + if(HAL_UART_Receive(&UartHandle, sBuffer, 4,5000)!= HAL_OK) // 58000 + return 0; + + checksum = 256 * 256 * 256 * (uint32_t)sBuffer[3] + 256 * 256 * (uint32_t)sBuffer[2] + 256 * (uint32_t)sBuffer[1] + sBuffer[0]; + + //old: checksumCalc = lengthTotal + offsetTotal; + + if(checksumCalc != checksum) + { + uint8_t ptr = 0; + strcpy(&display_text[ptr]," checksum error"); + ptr += 15; + strcpy(&display_text[ptr],"\n\r"); + ptr += 2; + ptr += gfx_number_to_string(10,0,&display_text[ptr],checksumCalc); + display_text[ptr] = 0; + display_text[255] = ptr + 1; + return 0xFF; + } + + if(lengthTotal > 768000) + { + length1 = 768000; + length2 = lengthTotal - length1; + } + else + { + length1 = lengthTotal; + length2 = 0; + } + + if((pBuffer2 == 0) && (length2 != 0)) + return 0; + + //get Code + if(receive_uart_large_size(&UartHandle, pBuffer1, length1)!= HAL_OK) + return 0; + + if(length2) + if(receive_uart_large_size(&UartHandle, pBuffer2, length2)!= HAL_OK) + return 0; + + //get Checksum + if(HAL_UART_Receive(&UartHandle, sBuffer, 4,5000)!= HAL_OK) // 58000 + return 0; + + checksum = 256 * 256 * 256 *(uint32_t)sBuffer[0] + 256 * 256 * (uint32_t)sBuffer[1] + 256 * (uint32_t)sBuffer[2] + sBuffer[3]; +// uint32_t checksumCalc = crc32c_checksum(pBuffer1, length1, pBuffer2, length2); + if(length2) + checksumCalc = CRC_CalcBlockCRC_moreThan768000((uint32_t*)pBuffer1, (uint32_t*)pBuffer2, lengthTotal/4); + else + checksumCalc = CRC_CalcBlockCRC((uint32_t*)pBuffer1, length1/4); + + /* check id now */ + if(region == 2) + { + if((id == id_Region1_firmware) || (id == id_RTE)) + { + strcpy(display_text,"wrong data."); + display_text[255] = 32; + return 0; + } + } + else + { + if(id != id_Region1_firmware) + { + strcpy(display_text,"wrong data."); + display_text[255] = 32; + return 0; + } + } + + /* test checksum */ + if(checksum != checksumCalc) + { + uint8_t ptr = 0; + strcpy(&display_text[ptr]," pruefsummen error"); + ptr += 15; + strcpy(&display_text[ptr],"\n\r"); + display_text[ptr] = 0; + display_text[255] = ptr + 1; + return 0xFF; + } + + if(region == 2) + { + uint8_t ptr = 0; + ptr += gfx_number_to_string(7,0,&display_text[ptr],lengthTotal); + strcpy(&display_text[ptr]," bytes with "); + ptr += 12; + ptr += gfx_number_to_string(7,0,&display_text[ptr],offsetTotal); + strcpy(&display_text[ptr]," offset"); + ptr += 7; + strcpy(&display_text[ptr],"\n\rpreparing for install."); + ptr += 25; + display_text[255] = ptr + 1; + + } + else + { + uint8_t ptr = 0; + display_text[ptr++] = 'V'; + ptr += gfx_number_to_string(2,0,&display_text[ptr],pBuffer1[0x10000] & 0x1F); + display_text[ptr++] = '.'; + ptr += gfx_number_to_string(2,0,&display_text[ptr],pBuffer1[0x10001] & 0x1F); + display_text[ptr++] = '.'; + ptr += gfx_number_to_string(2,0,&display_text[ptr],pBuffer1[0x10002] & 0x1F); + display_text[ptr++] = ' '; + if(pBuffer1[0x10003]) + { + strcpy(&display_text[ptr],"beta "); + ptr +=5; + } + strcpy(&display_text[ptr],"\n\rpreparing for install."); + ptr += 25; + display_text[255] = ptr + 1; + } + + uint8_t* pBufferCompare = (uint8_t*)getFrame(20); + ByteCompareStatus = 0; + + if(region == 2) + { + /* upper region firmware can be larger (1MB) */ + if(ext_flash_read_firmware2(0, pBufferCompare,4, 0,0) != 0xFFFFFFFF) + ext_flash_erase_firmware2(); + ext_flash_write_firmware2(offsetTotal, pBuffer1, length1, pBuffer2, length2); + lengthCompare = ext_flash_read_firmware2(&offsetCompare, pBufferCompare,768000, 0,768000); + + if(lengthCompare != length1 + length2) + ByteCompareStatus = 10000; + if(offsetTotal != offsetCompare) + ByteCompareStatus += 20000; + for(int i = 0; i < length1; i++) + { + if(pBuffer1[0] != pBufferCompare[0]) + ByteCompareStatus++; + } + + lengthCompare = ext_flash_read_firmware2(0, 0,768000, pBufferCompare,768000); + for(int i = 0; i < length2; i++) + { + if(pBuffer2[0] != pBufferCompare[0]) + ByteCompareStatus++; + } + } + else + { + /* standard firmware limited to 768000 */ + if(ext_flash_read_firmware(pBufferCompare,4,0) != 0xFFFFFFFF) + ext_flash_erase_firmware(); + ext_flash_write_firmware(pBuffer1, length1); + lengthCompare = ext_flash_read_firmware(pBufferCompare,768000,0); + + if(lengthCompare != length1) + ByteCompareStatus = 10000; + for(int i = 0; i < length1; i++) + { + if(pBuffer1[0] != pBufferCompare[0]) + ByteCompareStatus++; + } + } + + releaseFrame(20,(uint32_t)pBufferCompare); + + if(ByteCompareStatus != 0) + { + strcpy(&display_text[0],"\n\rcopy error."); + display_text[255] = 21; + return 0; + } + else + { + strcpy(&display_text[0],"\n\rready to install."); + display_text[255] = 21; + return 1; + } +} + +void tComm_RequestBluetoothStrength(void) +{ + EvaluateBluetoothSignalStrength = 1; +} + +/* read, validate the modul answer and flush rx que if necessary */ +uint8_t tComm_CheckAnswerOK() +{ + char answerOkay[] = "\r\nOK\r\n"; + char aRxBuffer[UART_CMD_BUF_SIZE]; + uint8_t sizeAnswer = sizeof(answerOkay) -1; + uint8_t result = HAL_OK; + uint8_t indexRef = 0; + uint8_t indexBuf = 0; + uint8_t answer; + + memset(aRxBuffer,0,UART_CMD_BUF_SIZE); + if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, sizeAnswer, UART_OPERATION_TIMEOUT) == HAL_OK) + { + do + { + if(answerOkay[indexRef] == aRxBuffer[indexBuf]) + { + indexRef++; + } + else + { + if(indexRef != 0) + { + if((answerOkay[0] == aRxBuffer[indexBuf])) + { + indexRef = 1; + } + else + { + indexRef = 0; + } + } + } + indexBuf++; + }while(indexBuf < sizeAnswer); + + if(indexRef != sizeAnswer) /* unexpected answer => there might be characters left in RX que => read and check all rx bytes */ + { + do + { + answer = HAL_ERROR; + if (indexBuf < UART_CMD_BUF_SIZE) + { + answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&aRxBuffer[indexBuf], 1, 10); + + if(answerOkay[indexRef] == aRxBuffer[indexBuf]) + { + indexRef++; + } + else + { + if(indexRef != 0) + { + indexRef = 0; + } + } + indexBuf++; + } + }while((answer == HAL_OK) && (indexRef != sizeAnswer)); + if(indexRef != sizeAnswer) + { + result = HAL_ERROR; + } + } + } + else + { + result = HAL_ERROR; + } + return result; + +} + + +void tComm_EvaluateBluetoothStrength(void) +{ + char aTxBufferBarSSI[] = "AT+BARSSI\r"; + char aTxBufferEscapeSequence[] = "+++"; + char aTxBufferEnd[] = "ATO\r"; + uint8_t sizeRequest = sizeof(aTxBufferBarSSI) -1; + + uint8_t answer = HAL_OK; + char aRxBuffer[UART_CMD_BUF_SIZE]; + char SignalStr[UART_CMD_BUF_SIZE]; + uint8_t index = 0; + uint8_t strindex = 0; + int8_t sigqual = 0; + + HAL_Delay(200); + if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBufferEscapeSequence, 3, 2000)== HAL_OK) + { + if(tComm_CheckAnswerOK() == HAL_OK) + { + HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBufferBarSSI,sizeRequest , 2000); + { + index = 0; + do /* Answer is not the common one. Instead the signal strength is received => read all available bytes one by one*/ + { + answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&aRxBuffer[index], 1, 100); + if(index < UART_CMD_BUF_SIZE) + { + index++; + } + }while(answer == HAL_OK); + + if((aRxBuffer[index] != 'E') && (aRxBuffer[index] != 0)) /* E represents the first letter of the string ERROR */ + { + index = 0; + strindex = 0; + do + { + SignalStr[strindex++] = aRxBuffer[index++]; + }while ((index < UART_CMD_BUF_SIZE - 1) && (aRxBuffer[index] != '\r')); + SignalStr[strindex] = 0; /* terminate String */ + sigqual = strtol(SignalStr,NULL,0); + /* Map db to abstract Bargraph */ + if(sigqual > 0) + { + sprintf(SignalStr,"Bluetooth ||||||||"); + } + else + { + sprintf(SignalStr,"Bluetooth |"); + strindex = strlen(SignalStr); + sigqual *=-1; + sigqual = 100 - sigqual; /* invert because of negative db value */ + while(sigqual / 10 > 0 ) + { + SignalStr[strindex++] = '|'; + sigqual -= 10; + } + SignalStr[strindex] = 0; + } + strcpy(display_text,SignalStr); + display_text[255] = strlen(SignalStr); + EvaluateBluetoothSignalStrength = 0; + } + } + HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBufferEnd, 4, 2000); /* exit terminal mode */ + index = 0; + do /* module will answer with current connection state */ + { + answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&aRxBuffer[index], 1, 100); + if(index < UART_CMD_BUF_SIZE) + { + index++; + } + }while(answer == HAL_OK); + } + } +} + + +void tComm_StartBlueModBaseInit() +{ + BmTmpConfig = BM_INIT_POWEROFF; +} + + +uint8_t tComm_GetBTCmdStr(BTCmd cmdId, char* pCmdStr) +{ + uint8_t ret = 0; +#ifndef OSTC4_HW + switch (cmdId) + { + case BT_CMD_ECHO: sprintf(pCmdStr,"ATE0\r"); + ret = 1; + break; + case BT_CMD_BAUDRATE_115: strcpy(pCmdStr,"AT+UMRS=115200,1,8,1,1,1\r"); + ret = 1; + break; + + case BT_CMD_BAUDRATE_460: strcpy(pCmdStr,"AT+UMRS=460800,1,8,1,1,1\r"); + ret = 1; + break; + case BT_CMD_NAME: strcpy(pCmdStr,"AT+UBTLN=OSTC5-12345\r"); + ret = 1; + break; + case BT_CMD_EXIT_CMD: strcpy(pCmdStr,"ATO1\r"); + ret = 1; + break; + default: + break; + } +#else + switch (cmdId) + { + case BT_CMD_ECHO: sprintf(pCmdStr,"ATE0\r"); + ret = 1; + break; + case BT_CMD_SILENCE: strcpy(pCmdStr,"ATS30=0\r"); + ret = 1; + + break; + case BT_CMD_ESCAPE_DELAY: strcpy(pCmdStr,"ATS12=10\r"); + ret = 1; + + break; + case BT_CMD_SIGNAL_POLL: strcpy(pCmdStr,"AT+BSTPOLL=100\r"); + ret = 1; + + break; + case BT_CMD_BAUDRATE_115: strcpy(pCmdStr,"AT%B8\r"); + ret = 1; + break; + + case BT_CMD_BAUDRATE_460: strcpy(pCmdStr,"AT%B22\r"); + ret = 1; + break; + case BT_CMD_NAME: strcpy(pCmdStr,"AT+BNAME=OSTC4-12345\r"); + ret = 1; + break; + case BT_CMD_EXIT_CMD: strcpy(pCmdStr,"ATO\r"); + ret = 1; + break; + default: + break; + } +#endif + return ret; +} + +void tComm_StartBlueModConfig() +{ + HAL_UART_Init(&UartHandle); + +#ifdef OSTC4_HW + uint8_t answer = HAL_OK; + uint8_t RxBuffer[UART_CMD_BUF_SIZE]; + uint8_t index = 0; + + BmTmpConfig = BM_CONFIG_ECHO; + do /* flush RX buffer */ + { + answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&RxBuffer[index], 1, 10); + if(index < UART_CMD_BUF_SIZE) index++; + }while(answer == HAL_OK); +#else + BmTmpConfig = BM_CONFIG_DONE; +#endif +} + +uint32_t time_elapsed_ms(uint32_t ticksstart,uint32_t ticksnow) +{ + if(ticksstart <= ticksnow) + return ticksnow - ticksstart; + else + return 0xFFFFFFFF - ticksstart + ticksnow; +} + +uint8_t tComm_HandleBlueModConfig() +{ +#ifdef OSTC4_HW + static uint8_t RestartModule = 1; /* used to do power off / on cycle */ +#endif + static uint8_t ConfigRetryCnt = 0; /* Retry count without power cycle */ + static uint8_t lastConfigStep = BM_CONFIG_OFF; + static uint32_t cmdStartTick = 0; + + char TxBuffer[UART_CMD_BUF_SIZE]; + uint8_t CmdSize = 0; + + uint8_t result = HAL_OK; + + memset(TxBuffer, 0, sizeof(TxBuffer)); + + if(lastConfigStep != BmTmpConfig) + { + ConfigRetryCnt = 0; + lastConfigStep = BmTmpConfig; + } + + if(time_elapsed_ms(cmdStartTick, HAL_GetTick()) > 100) + { + cmdStartTick = HAL_GetTick(); + switch (BmTmpConfig) + { + case BM_CONFIG_ECHO: tComm_GetBTCmdStr (BT_CMD_ECHO, TxBuffer); + break; + case BM_CONFIG_SILENCE: tComm_GetBTCmdStr (BT_CMD_SILENCE, TxBuffer); + break; + case BM_CONFIG_ESCAPE_DELAY: tComm_GetBTCmdStr (BT_CMD_ESCAPE_DELAY, TxBuffer); + break; + case BM_CONFIG_SIGNAL_POLL: tComm_GetBTCmdStr(BT_CMD_SIGNAL_POLL, TxBuffer); + break; + case BM_CONFIG_BAUD: + #ifdef ENABLE_FAST_COMM + tComm_GetBTCmdStr(BT_CMD_BAUDRATE_460, TxBuffer); + #else + BmTmpConfig = BM_CONFIG_DONE; + #endif + break; + case BM_CONFIG_RETRY: ConfigRetryCnt--; + HAL_Delay(1); + if(ConfigRetryCnt == 0) + { + MX_Bluetooth_PowerOn(); + tComm_StartBlueModConfig(); + } + break; + case BM_CONFIG_DONE: + case BM_CONFIG_OFF: + ConfigRetryCnt = 0; +#ifdef OSTC4_HW + RestartModule = 1; +#endif + break; + + +#ifndef OSTC4_HW + /* the procedure below is just needed for the initial bluetooth module initialization */ + case BM_INIT_POWEROFF: MX_Bluetooth_PowerOff(); + HAL_Delay(1000); + BmTmpConfig++; + break; + case BM_INIT_POWERON: MX_Bluetooth_PowerOn(); + HAL_UART_Init(&UartHandle); + BmTmpConfig++; + break; + case BM_INIT_COMMAND_ON: HAL_Delay(2600); + HAL_GPIO_WritePin(BLE_UBLOX_DSR_GPIO_PORT,BLE_UBLOX_DSR_PIN,GPIO_PIN_SET); + BmTmpConfig++; + break; +#if 0 + case BM_INIT_TRIGGER_OFF: HAL_GPIO_WritePin(BLE_UBLOX_DSR_GPIO_PORT,BLE_UBLOX_DSR_PIN,GPIO_PIN_SET); + HAL_Delay(2000); + BmTmpConfig++; + break; +#endif + case BM_INIT_ECHO: + case BM_INIT_ECHO2: sprintf(TxBuffer,"ATE0\r"); + break; + case BM_INIT_FACTORY: sprintf(TxBuffer,"AT+UFACTORY\r"); /*Set to factory defined configuration */ + break; + case BM_INIT_MODE: sprintf(TxBuffer,"AT+UMSM=1\r"); /* start in Data mode */ + break; + case BM_INIT_BLE: sprintf(TxBuffer,"AT+UBTLE=2\r"); /* Bluetooth low energy Peripheral */ + break; + case BM_INIT_NAME: sprintf(TxBuffer,"AT+UBTLN=OSTC5-12345\r"); /* Bluetooth name */ + if(hardwareDataGetPointer()->primarySerial != 0xFFFF) /* module reinit? => restore old name */ + { + gfx_number_to_string(5,1,&TxBuffer[15],hardwareDataGetPointer()->primarySerial); + hardware_programmPrimaryBluetoothNameSet(); + } + break; + case BM_INIT_SSP_IDO_OFF: sprintf(TxBuffer,"AT+UDSC=0,0\r"); /* Disable SPP Server on ID0 */ + break; + case BM_INIT_SSP_IDO_ON: sprintf(TxBuffer,"AT+UDSC=0,3\r"); /* SPP Server on ID0 */ + break; + case BM_INIT_SSP_ID1_OFF: sprintf(TxBuffer,"AT+UDSC=1,0\r"); /* Disable SPS Server on ID1 */ + break; + case BM_INIT_SSP_ID1_ON: sprintf(TxBuffer,"AT+UDSC=1,6\r"); /* SPS Server on ID1 */ + break; + case BM_INIT_STORE: sprintf(TxBuffer,"AT&W0\r"); /* write settings into eeprom */ + break; + case BM_INIT_RESTART: sprintf(TxBuffer,"AT+CPWROFF\r"); /* reboot module */ + break; + case BM_INIT_DONE: tInfo_write("Done"); + BmTmpConfig = BM_CONFIG_DONE; + HAL_GPIO_WritePin(BLE_UBLOX_DSR_GPIO_PORT,BLE_UBLOX_DSR_PIN,GPIO_PIN_RESET); + break; + default: + break; + } +#else + case BM_INIT_TRIGGER_ON: HAL_Delay(2000); + BmTmpConfig++; + break; + case BM_INIT_TRIGGER_OFF: HAL_Delay(1); + HAL_Delay(2000); + BmTmpConfig++; + break; + case BM_INIT_ECHO: + case BM_INIT_ECHO2: sprintf(TxBuffer,"ATE0\r"); + break; + case BM_INIT_FACTORY: sprintf(TxBuffer,"AT&F1\r"); /*Set to factory defined configuration */ + break; + case BM_INIT_MODE: BmTmpConfig++; + break; + case BM_INIT_BLE: BmTmpConfig++; + break; + case BM_INIT_NAME: sprintf(TxBuffer,"AT+BNAME=OSTC4-12345\r"); /* Bluetooth name */ + if(hardwareDataGetPointer()->primarySerial != 0xFFFF) /* module reinit? => restore old name */ + { + gfx_number_to_string(5,1,&TxBuffer[15],hardwareDataGetPointer()->primarySerial); + hardware_programmPrimaryBluetoothNameSet(); + } + break; + case BM_INIT_SSP_IDO_OFF: BmTmpConfig++; + break; + case BM_INIT_SSP_IDO_ON: BmTmpConfig++; + break; + case BM_INIT_SSP_ID1_OFF: BmTmpConfig++; + break; + case BM_INIT_SSP_ID1_ON: BmTmpConfig++; + break; + case BM_INIT_STORE: sprintf(TxBuffer,"AT&W\r"); /* write settings into eeprom */ + break; + case BM_INIT_RESTART: sprintf(TxBuffer,"AT+RESET\r"); /* reboot module */ + break; + case BM_INIT_DONE: BmTmpConfig = BM_CONFIG_ECHO; + break; + default: + break; + } +#endif + + if(TxBuffer[0] != 0) /* forward command to module */ + { + CmdSize = strlen(TxBuffer); + result = HAL_UART_Transmit(&UartHandle, (uint8_t*)TxBuffer,CmdSize, 500); + if(result == HAL_OK) + { + result = tComm_CheckAnswerOK(); +#ifdef OSTC4_HW + if((BmTmpConfig == BM_CONFIG_BAUD) && (result == HAL_OK) && (UartHandle.Init.BaudRate != 460800)) /* is com already switched to fast speed? */ + { + HAL_UART_DeInit(&UartHandle); + HAL_Delay(1); + UartHandle.Init.BaudRate = 460800; + HAL_UART_Init(&UartHandle); + } + else if((BmTmpConfig == BM_CONFIG_BAUD) && (result == HAL_OK) && (UartHandle.Init.BaudRate == 460800)) /* This shut not happen because default speed is 115200 => update module configuration */ + { + tComm_GetBTCmdStr(BT_CMD_BAUDRATE_115, TxBuffer); + + CmdSize = strlen(TxBuffer); + HAL_UART_Transmit(&UartHandle, (uint8_t*)TxBuffer,CmdSize, 2000); + HAL_UART_DeInit(&UartHandle); + HAL_Delay(10); + UartHandle.Init.BaudRate = 115200; + HAL_UART_Init(&UartHandle); + sprintf(TxBuffer,"AT&W\r"); /* write configuration */ + CmdSize = strlen(TxBuffer); + HAL_UART_Transmit(&UartHandle, (uint8_t*)TxBuffer,CmdSize, 2000); + } +#endif + if(result == HAL_OK) + { + ConfigRetryCnt = 0; + BmTmpConfig++; + if(BmTmpConfig == BM_CONFIG_RETRY) + { + BmTmpConfig = BM_CONFIG_DONE; + } + } +#ifdef OSTC4_HW + if(BmTmpConfig == BM_CONFIG_ECHO) + { + BmTmpConfig = BM_CONFIG_DONE; + ConfigRetryCnt = 0; + RestartModule = 1; + } +#endif + } + } + else /* no command for the configuration step found => skip step */ + { + if((BmTmpConfig > BM_CONFIG_OFF) && (BmTmpConfig < BM_CONFIG_DONE)) + { + BmTmpConfig++; + } + } + if(result != HAL_OK) + { + ConfigRetryCnt++; + if(ConfigRetryCnt > 3) /* Configuration failed => switch off module */ + { + MX_Bluetooth_PowerOff(); + tInfo_write("Failed"); + BmTmpConfig = BM_CONFIG_OFF; + +#ifdef OSTC4_HW + if(RestartModule) + { + RestartModule = 0; /* only one try */ + ConfigRetryCnt = 200; /* used for delay to startup module again */ + + if((BmTmpConfig == BM_CONFIG_ECHO) || (BmTmpConfig == BM_INIT_ECHO)) /* the module did not answer even once => try again with alternative baud rate */ + { + HAL_UART_DeInit(&UartHandle); + HAL_Delay(1); + UartHandle.Init.BaudRate = 460800; + HAL_UART_Init(&UartHandle); + } + BmTmpConfig = BM_CONFIG_RETRY; + } + else /* even restarting module failed => switch bluetooth off */ + { + ConfigRetryCnt = 0; + BmTmpConfig = BM_CONFIG_OFF; + } +#endif + } + } + } + return result; +} + +static void tComm_Error_Handler(void) +{ + while(1) + {} +}
--- a/BootLoader/Src/tInfoBootloader.c Sat Nov 15 15:16:14 2025 +0100 +++ b/BootLoader/Src/tInfoBootloader.c Sat Nov 15 19:29:44 2025 +0100 @@ -96,15 +96,15 @@ tIBscreen.FBStartAdress = getFrame(18); line = 1; if(text) - GFX_write_string(&FontT48, &tIBwindow, text,line); + GFX_write_string(&FontT48min, &tIBwindow, text,line); line++; if(*textButtonLeft) - write_content_simple(&tIBscreen, 0, 800, 480-24, &FontT24,textButtonLeft,CLUT_ButtonSurfaceScreen); + write_content_simple(&tIBscreen, 0, 800, 480-24, &FontT24min,textButtonLeft,CLUT_ButtonSurfaceScreen); if(*textButtonMid) - write_content_simple(&tIBscreen, 0, 800, 480-24, &FontT24,textButtonMid,CLUT_ButtonSurfaceScreen); + write_content_simple(&tIBscreen, 0, 800, 480-24, &FontT24min,textButtonMid,CLUT_ButtonSurfaceScreen); if(*textButtonRight) - write_content_simple(&tIBscreen, 0, 800, 480-24, &FontT24,textButtonRight,CLUT_ButtonSurfaceScreen); + write_content_simple(&tIBscreen, 0, 800, 480-24, &FontT24min,textButtonRight,CLUT_ButtonSurfaceScreen); GFX_SetFrameTop(tIBscreen.FBStartAdress); GFX_change_LTDC(); @@ -121,7 +121,7 @@ else { if(text) - GFX_write_string(&FontT48, &tIBwindow, text,line); + GFX_write_string(&FontT48min, &tIBwindow, text,line); line++; }
--- a/Discovery/Inc/gfx.h Sat Nov 15 15:16:14 2025 +0100 +++ b/Discovery/Inc/gfx.h Sat Nov 15 19:29:44 2025 +0100 @@ -39,6 +39,13 @@ uint16_t width; uint16_t height; } tImage; +typedef struct { + uint8_t *data; + const uint8_t *dataComp; + uint16_t sizeComp; + uint16_t width; + uint16_t height; + } tImageComp; typedef struct { long int code; @@ -46,6 +53,12 @@ } tChar; typedef struct { + long int code; + const tImageComp *image; + } tCharComp; + + +typedef struct { uint32_t length; const tChar *chars; uint8_t spacesize; @@ -54,6 +67,15 @@ } tFont; typedef struct { + uint32_t length; + const tCharComp *chars; + uint8_t spacesize; + uint8_t spacesize2Monospaced; + uint8_t height; + } tFontComp; + + +typedef struct { uint32_t x; uint32_t y; } point_t;
--- a/Discovery/Inc/gfx_fonts.h Sat Nov 15 15:16:14 2025 +0100 +++ b/Discovery/Inc/gfx_fonts.h Sat Nov 15 19:29:44 2025 +0100 @@ -55,8 +55,10 @@ extern const tFont Awe48; extern const tFont FontT24; +extern const tFont FontT24min; extern const tFont FontT42; extern const tFont FontT48; +extern const tFont FontT48min; extern const tFont FontT54; extern const tFont FontT84; extern const tFont FontT105;
--- a/Discovery/Inc/tComm.h Sat Nov 15 15:16:14 2025 +0100 +++ b/Discovery/Inc/tComm.h Sat Nov 15 19:29:44 2025 +0100 @@ -47,10 +47,12 @@ BM_CONFIG5_ESCAPE2, BM_CONFIG5_BAUD, BM_CONFIG5_DATAMODE, - BM_INIT_TRIGGER_ON = 100, - BM_INIT_TRIGGER_OFF, + BM_INIT_POWEROFF = 100, + BM_INIT_POWERON, + BM_INIT_COMMAND_ON, BM_INIT_ECHO, BM_INIT_FACTORY, + BM_INIT_ECHO2, BM_INIT_MODE, BM_INIT_BLE, BM_INIT_NAME,
--- a/OtherSources/data_central_mini.c Sat Nov 15 15:16:14 2025 +0100 +++ b/OtherSources/data_central_mini.c Sat Nov 15 19:29:44 2025 +0100 @@ -111,10 +111,12 @@ uint32_t CRC_CalcBlockCRC_moreThan768000(uint32_t *buffer1, uint32_t *buffer2, uint32_t words) { - cm_t crc_model; - uint32_t word_to_do; - uint8_t byte_to_do; - int i; + cm_t crc_model; + uint32_t word_to_do; + uint8_t byte_to_do; + int i; + + uint32_t wordCnt = 0; // Values for the STM32F generator. @@ -127,10 +129,10 @@ cm_ini(&crc_model); - while (words--) + do { // The STM32F10x hardware does 32-bit words at a time!!! - if(words > (768000/4)) + if(wordCnt >= (768000/4)) word_to_do = *buffer2++; else word_to_do = *buffer1++; @@ -159,7 +161,8 @@ cm_nxt(&crc_model, byte_to_do); } - } + wordCnt++; + } while (wordCnt != words); // Return the final result.
