From dc0d85d0352e7ffa45e9dafc40d8ee47d24b343a Mon Sep 17 00:00:00 2001 From: philmoz Date: Fri, 23 May 2025 11:06:20 +1000 Subject: [PATCH] chore(radio): unify the bootloader UI code (#6189) Co-authored-by: Richard Li --- radio/src/CMakeLists.txt | 4 +- .../arm/stm32 => }/bootloader/CMakeLists.txt | 0 .../stm32 => }/bootloader/bin_fw_files.cpp | 11 +- .../common/arm/stm32 => }/bootloader/boot.cpp | 0 .../common/arm/stm32 => }/bootloader/boot.h | 0 radio/src/bootloader/boot_dfu.cpp | 52 ++ .../arm/stm32 => }/bootloader/boot_menu.cpp | 44 +- .../arm/stm32 => }/bootloader/boot_uf2.cpp | 49 +- .../stm32 => }/bootloader/firmware_files.h | 16 +- .../common/arm => bootloader}/loadboot.cpp | 0 radio/src/fonts/Roboto/Roboto-Regular-BL.ttf | Bin 0 -> 158604 bytes radio/src/fonts/lvgl/lrg/lv_font_bl.c | 854 +++++++++--------- radio/src/fonts/lvgl/make_fonts.sh | 6 +- radio/src/fonts/lvgl/sml/lv_font_bl.c | 672 +++++++------- radio/src/fonts/lvgl/std/lv_font_bl.c | 773 ++++++++-------- radio/src/gui/colorlcd/boot_menu.cpp | 448 +++++++++ .../common/stdlcd}/boot_menu.cpp | 24 +- radio/src/gui/common/stdlcd/fonts.cpp | 8 +- radio/src/gui/common/stdlcd/utf8.cpp | 14 +- radio/src/keys.cpp | 5 + .../common/arm/stm32/bootloader/boot_dfu.cpp | 31 - radio/src/targets/horus/CMakeLists.txt | 4 +- .../targets/horus/bootloader/boot_menu.cpp | 307 ------- radio/src/targets/nv14/CMakeLists.txt | 4 +- .../src/targets/nv14/bootloader/boot_menu.cpp | 309 ------- radio/src/targets/pl18/CMakeLists.txt | 4 +- .../src/targets/pl18/bootloader/boot_menu.cpp | 387 -------- radio/src/targets/simu/CMakeLists.txt | 7 +- radio/src/targets/st16/CMakeLists.txt | 4 +- .../src/targets/st16/bootloader/boot_menu.cpp | 122 --- .../src/targets/stm32h7s78-dk/CMakeLists.txt | 4 +- .../stm32h7s78-dk/bootloader/boot_menu.cpp | 119 --- radio/src/targets/taranis/CMakeLists.txt | 4 +- radio/src/translations/bl_translations.h | 425 +++++++++ radio/src/translations/cn.h | 74 -- radio/src/translations/cz.h | 74 -- radio/src/translations/da.h | 74 -- radio/src/translations/de.h | 74 -- radio/src/translations/en.h | 74 -- radio/src/translations/es.h | 74 -- radio/src/translations/fi.h | 74 -- radio/src/translations/fr.h | 74 -- radio/src/translations/he.h | 74 -- radio/src/translations/it.h | 73 -- radio/src/translations/jp.h | 74 -- radio/src/translations/ko.h | 74 -- radio/src/translations/nl.h | 74 -- radio/src/translations/pl.h | 74 -- radio/src/translations/pt.h | 74 -- radio/src/translations/ru.h | 74 -- radio/src/translations/se.h | 74 -- radio/src/translations/tw.h | 74 -- radio/src/translations/ua.h | 74 -- 53 files changed, 2159 insertions(+), 3957 deletions(-) rename radio/src/{targets/common/arm/stm32 => }/bootloader/CMakeLists.txt (100%) rename radio/src/{targets/common/arm/stm32 => }/bootloader/bin_fw_files.cpp (96%) rename radio/src/{targets/common/arm/stm32 => }/bootloader/boot.cpp (100%) rename radio/src/{targets/common/arm/stm32 => }/bootloader/boot.h (100%) create mode 100644 radio/src/bootloader/boot_dfu.cpp rename radio/src/{targets/common/arm/stm32 => }/bootloader/boot_menu.cpp (87%) rename radio/src/{targets/common/arm/stm32 => }/bootloader/boot_uf2.cpp (65%) rename radio/src/{targets/common/arm/stm32 => }/bootloader/firmware_files.h (88%) rename radio/src/{targets/common/arm => bootloader}/loadboot.cpp (100%) create mode 100644 radio/src/fonts/Roboto/Roboto-Regular-BL.ttf create mode 100644 radio/src/gui/colorlcd/boot_menu.cpp rename radio/src/{targets/taranis/bootloader => gui/common/stdlcd}/boot_menu.cpp (82%) delete mode 100644 radio/src/targets/common/arm/stm32/bootloader/boot_dfu.cpp delete mode 100644 radio/src/targets/horus/bootloader/boot_menu.cpp delete mode 100644 radio/src/targets/nv14/bootloader/boot_menu.cpp delete mode 100644 radio/src/targets/pl18/bootloader/boot_menu.cpp delete mode 100644 radio/src/targets/st16/bootloader/boot_menu.cpp delete mode 100644 radio/src/targets/stm32h7s78-dk/bootloader/boot_menu.cpp create mode 100644 radio/src/translations/bl_translations.h diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index dd8d56d7d..e7bcf42c9 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -556,8 +556,8 @@ endif() # Bootloader if(BOOTLOADER) - add_subdirectory(targets/common/arm/stm32/bootloader) - include_directories(${CMAKE_CURRENT_BINARY_DIR}/targets/common/arm/stm32/bootloader) + add_subdirectory(bootloader) + include_directories(${CMAKE_CURRENT_BINARY_DIR}/bootloader) set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} bootloader) endif() diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/bootloader/CMakeLists.txt similarity index 100% rename from radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt rename to radio/src/bootloader/CMakeLists.txt diff --git a/radio/src/targets/common/arm/stm32/bootloader/bin_fw_files.cpp b/radio/src/bootloader/bin_fw_files.cpp similarity index 96% rename from radio/src/targets/common/arm/stm32/bootloader/bin_fw_files.cpp rename to radio/src/bootloader/bin_fw_files.cpp index 1e01ca583..7580bcab7 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/bin_fw_files.cpp +++ b/radio/src/bootloader/bin_fw_files.cpp @@ -171,18 +171,13 @@ unsigned int fetchFirmwareFiles(unsigned int index) return 0; // skip 'index' .bin files - for (unsigned int i = 0; i <= index; i++) { - - if (findNextBinFile(&file_info) != FR_OK /*|| file_info.fname[0] == 0*/) + for (unsigned int i = 0; i < index; i++) { + if (findNextBinFile(&file_info) != FR_OK || file_info.fname[0] == 0) return 0; } - strAppend(fwFiles[0].name, file_info.fname); - fwFiles[0].size = file_info.fsize; - - unsigned int i = 1; + unsigned int i = 0; for (; i < MAX_NAMES_ON_SCREEN+1; i++) { - if (findNextBinFile(&file_info) != FR_OK || file_info.fname[0] == 0) return i; diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp similarity index 100% rename from radio/src/targets/common/arm/stm32/bootloader/boot.cpp rename to radio/src/bootloader/boot.cpp diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.h b/radio/src/bootloader/boot.h similarity index 100% rename from radio/src/targets/common/arm/stm32/bootloader/boot.h rename to radio/src/bootloader/boot.h diff --git a/radio/src/bootloader/boot_dfu.cpp b/radio/src/bootloader/boot_dfu.cpp new file mode 100644 index 000000000..0a4b53c0c --- /dev/null +++ b/radio/src/bootloader/boot_dfu.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#include "stm32_hal.h" + +#include "boot.h" +#include "hal/usb_driver.h" +#include "os/time.h" + +#include "lcd.h" + +#define FRAME_INTERVAL_MS 20 + +void bootloaderDFU() +{ + usbPlugged(); + usbStart(); + + bootloaderDrawDFUScreen(); + + uint32_t next_frame = time_get_ms(); + for (;;) { + if (time_get_ms() - next_frame >= FRAME_INTERVAL_MS) { + next_frame += FRAME_INTERVAL_MS; + + if (!usbPlugged()) break; + bootloaderDrawDFUScreen(); + lcdRefresh(); + } + } + + blExit(); + NVIC_SystemReset(); +} diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot_menu.cpp b/radio/src/bootloader/boot_menu.cpp similarity index 87% rename from radio/src/targets/common/arm/stm32/bootloader/boot_menu.cpp rename to radio/src/bootloader/boot_menu.cpp index c0c62ddf3..1d067df23 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot_menu.cpp +++ b/radio/src/bootloader/boot_menu.cpp @@ -1,3 +1,24 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + #include "boot.h" #include "firmware_files.h" @@ -127,6 +148,7 @@ void bootloaderMenu() #if defined(SPI_FLASH) case 1: state = ST_CLEAR_FLASH_CHECK; + vpos = 0; break; #endif default: @@ -145,15 +167,16 @@ void bootloaderMenu() } } else if (state == ST_DIR_CHECK) { + nameCount = 0; fr = openFirmwareDir(); + if (fr == FR_OK) + nameCount = fetchFirmwareFiles(index); - if (fr == FR_OK) { + if (nameCount > 0) { index = vpos = 0; state = ST_FILE_LIST; - nameCount = fetchFirmwareFiles(index); continue; - } - else { + } else { bootloaderDrawScreen(state, fr); if (event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER)) { @@ -229,19 +252,10 @@ void bootloaderMenu() #if defined(SPI_FLASH) } else if (state == ST_CLEAR_FLASH_CHECK) { bootloaderDrawScreen(state, vpos); - if (IS_NEXT_EVENT(event)) { - if (vpos < SEL_CLEAR_FLASH_STORAGE_MENU_LEN - 1) { vpos++; } - continue; - } - if (IS_PREVIOUS_EVENT(event)) { - if (vpos > 0) { vpos--; } - continue; - } - if (event == EVT_KEY_LONG(KEY_ENTER) && vpos == 0) + if (event == EVT_KEY_LONG(KEY_ENTER)) { state = ST_CLEAR_FLASH; - } else if (event == EVT_KEY_BREAK(KEY_EXIT) || - (event == EVT_KEY_BREAK(KEY_ENTER) && vpos == 1) ) { + } else if (event == EVT_KEY_BREAK(KEY_EXIT)) { vpos = 0; state = ST_START; continue; diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot_uf2.cpp b/radio/src/bootloader/boot_uf2.cpp similarity index 65% rename from radio/src/targets/common/arm/stm32/bootloader/boot_uf2.cpp rename to radio/src/bootloader/boot_uf2.cpp index 0d8ba7451..0d56b675f 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot_uf2.cpp +++ b/radio/src/bootloader/boot_uf2.cpp @@ -1,3 +1,24 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + #include "boot.h" #include "hal/usb_driver.h" @@ -30,6 +51,24 @@ void bootloaderUF2() if (time_get_ms() - next_frame >= FRAME_INTERVAL_MS) { next_frame += FRAME_INTERVAL_MS; + keysPollingCycle(); + event_t event = getEvent(); + + if (state != ST_FLASHING && event == EVT_KEY_LONG(KEY_EXIT)) { + // Start the main application + state = ST_REBOOT; + } + + if (state == ST_REBOOT) { + storageDeInit(); +#if !defined(SIMU) + blExit(); + NVIC_SystemReset(); +#else + exit(1); +#endif + } + if (state != ST_USB && state != ST_FLASHING && state != ST_FLASH_DONE) { if (usbPlugged()) { state = ST_USB; @@ -77,15 +116,5 @@ void bootloaderUF2() lcdRefresh(); } - - if (state == ST_REBOOT) { - storageDeInit(); -#if !defined(SIMU) - blExit(); - NVIC_SystemReset(); -#else - exit(1); -#endif - } } } diff --git a/radio/src/targets/common/arm/stm32/bootloader/firmware_files.h b/radio/src/bootloader/firmware_files.h similarity index 88% rename from radio/src/targets/common/arm/stm32/bootloader/firmware_files.h rename to radio/src/bootloader/firmware_files.h index 0b212e90c..4475b13d3 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/firmware_files.h +++ b/radio/src/bootloader/firmware_files.h @@ -23,22 +23,20 @@ #include #include "sdcard.h" -#if defined(COLORLCD) -#include "bitmaps.h" -#endif #include "boards/FirmwareVersionTag.h" #define getFirmwarePath() (FIRMWARES_PATH) -#if LCD_H == 480 -#define MAX_NAMES_ON_SCREEN 13 -#else -#define MAX_NAMES_ON_SCREEN 6 +#if LCD_W < 300 // B&W + constexpr int MAX_NAMES_ON_SCREEN = 6; +#elif LCD_W < LCD_H // Portrait + constexpr int MAX_NAMES_ON_SCREEN = (LCD_H - 143) / 25; +#else // Landscape + constexpr int MAX_NAMES_ON_SCREEN = (LCD_H - 119) / 25; #endif #define MAX_FW_FILES (MAX_NAMES_ON_SCREEN+1) - // Open directory for firmware files FRESULT openFirmwareDir(); @@ -53,8 +51,6 @@ const char* getFirmwareFileNameByIndex(unsigned int index); // Bootloader is skipped in firmware files FRESULT openFirmwareFile(unsigned int index); - - // Can be called right after openBinFile() to extract the version information // from a firmware file void getFileFirmwareVersion(VersionTag* tag); diff --git a/radio/src/targets/common/arm/loadboot.cpp b/radio/src/bootloader/loadboot.cpp similarity index 100% rename from radio/src/targets/common/arm/loadboot.cpp rename to radio/src/bootloader/loadboot.cpp diff --git a/radio/src/fonts/Roboto/Roboto-Regular-BL.ttf b/radio/src/fonts/Roboto/Roboto-Regular-BL.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7d9a6c4c32d7e920b549caf531e390733496b6e0 GIT binary patch literal 158604 zcmeF42VfLM-~VT3?=HQQ1PFu_Na!G;ix35oqKF;z5y1kepkP5%6h)c{s8~=?x?(}a zj);g#s0Jy5pg{tJO9E$d31EZV{y(#uOG3xz_3`!pyzb_EySHU_eszBHo4JjULWmeX z9HM!bE4p9AH!0NZW7!5?)aAmi)%#Z;z@ZL&?{-n|ORtD+*guNzoPT1@MOR#P!J4#n z4k4!06+%6K=@rddEScXRONb|zaee=rh7K4OwXRo7A)cxwglpSPBkoBGs8M6BPy_Nf zpEhvVprOyccIZl>ZVVM7sNSFfcMs!uB|G<@-Csr5Y`9nfpduZ@218%N1 z=e%kld{Uvydkflj{uRD0?JtObfK4LZByHHHa+i$t+j{61-c}OTVQi$f! zL+-q3faB%sCJNPJGR4;#I$-25=T*U+Z~q$iC*3h%=q+l&?6>*8MhK(husiR*XZzk8 zvxMpxC`9U(VRzj!Ed0ot+3*LN#3gV_2x@LEN(9Q+b_B7Kx&=_>?-=O#z_G{aaHcsgcHZS2>AKN1 z*frJlK|ox}(LB9sy7Mv5(E2MwOh>*!4 z^Fo${d>?W&G%++YbYSSj(6>Xs4gEbVDXeSQ#bK9+^$F`2<_!-IZyequd~o>q@CD&- zgf9;ND12G?j}amwC8A5jz=*LCvm%y7HjTVEa(QG_lfZKHcdUm1N{^swmh(UYU!j@}qu8dEK%bxfa_eld$;zONQot#!4VtBtSrTD5i6 zys^=-ZDX&EeI#~X?Bdwvv0ul16hEi>r0P#qf4=%l)#p`zt@_*5zpXK_#@L#1HQUy_ zw&tjsMG2t^(FtP{W+W_2__3Cw*7LOkYe(1Kp4cO?f8v*O`b8&aC5v`*=hvOmR}8lGA`^@7wssduG5mHK?@lGM$q+v|qctyZ^b z-QINv)*V&%je5iCO{@1oy`}YX(_Crw(?+DNOmnCANq-=HZ2cbfN7kQO-`l{|pnii9 z4PI!lv_Vco)v$iU_KoT`x~tK*jec%iy>XAm!x}%|cuwOt8n0=*r}3f2z9!Y0)NGQ} zq;-=%P3~&4xXFel1x<>Y1~yG>n%VTmrlXpUX*#j#)TS>qUD`CK>F>>wnqAQBgJ#>B z9c^B-d1mu|%}1Wo@tkfg!dnb$F`~uFjOdL18EsI|*jcOg#(@P<_^D}mv~;6^FBK7+m2m3-rR9p$3vY4b{gC1=gexE z<1-hWA9sGs^ItuGOc3ITr%PwoW{MaS$Lf3`$FYI;UunV8RaLI)~b`@RIx_0Y&N7tvie$;h)SKmcR z7hP~sw~KmRlzWk{+f&`%?w;AbUw3bh@E$FDwC|DGqic_gdtBb5Pmg{*#`c)n%uA+;eKr1z6LyBBcDYmPj$b64#i;;#zZ;ywEI?kC^-9 z7;}?+PDIIB<{G&IPr2R9l11h^b+I{H-DF;-ZZ;oOgZMt!+^HTjOVvB(z3N@Qe_~#$ zmYS1|`_03~7~nBi8$X#PMv<9q6q`GZ5_2VfDNclNr5pPVJ1hl=YJc5)-M# z{pLaWkm;4rnfv7mzHc{kxjxqzZvJF=&BMYex|>DRcR%HNDfcJJ_2M6{GTmIW0-v-( z#L8R|OI`D*>ptq5M;-T4$32vkcNSMjN;)87c*+-WBnwV_Aa|PI!G%v$nE9ScH#e(B z<{CIMhbLsgg*>&`{93&SmYVC;r)IHnuUP;m+;Ae__`%GF=hvDGjNu}NGY2_S!kJRe zl)$HR;nVlfb0zdV4LzOCqK;>#^X&K;B(4$RaDKL&Y95B`KgyZtzzXvfe+V6`#Zcc8@sL@c`z{f$nN!75b1s~En=;nQC(VcDGv**U!<;}_x4^ww za*lbMoNK-==b3lQ`DQ=Le?@K=5pXq6{%FqOS@+1j<|A7!4L3jF z-W}Y#gL`*y?+)v#2(Aj{ssmgV&QSzDlK8#HMR%UAD+F!inog^q0&9mhVQP}CJc)Kb?t%>0J>L}MxY zsnd2We7~-}7;3(a)UuJ<9HjOIQd>c-Hp$2_6T>*GxN}(Fs}ZI zs}FFshpRmz0BXHRxCH4Qgz6Hcb`Yr*Lgg0W;>r81r{+?-BJ%)OcsSz`l5dBFQ7)fo zi@Lz_tM_wmKV^C;vxGYiQ08Ilu2Yw1i0&c+ONhcdMu`Bvg<1A6LxjMA{c@HFMMu}5 zhb6>2`t$VH{PmvopC|q&+N=KyTs^TRK6xAaKRnOmv9%N3_@;ZEI_p8meS-lLvgKmMuD>G^YF>+tU#`7^!X z$y*}Z*8b{qXKp3_|GC0$3;s9zy??Bi{GYt~uaVl>S;d)Kguh!k$M&aA_wD~qPT?O) z|6B7!C&tiKkLWDYne#(`!>IeTS&+Y9eb1b2`ZKQhyTyxkKL4+;)ydCM4`HZiCylx#i z)3=X&X;(SN_Y)b`zH*+gOwRZ1ATxhCnRzFf=+DT^cbB<7ADQ_Wa;k&L%!iYik0CQ3 zKxRIi9BUN0&<^BT7m=BdB{ScF%zQXG*W1X!u_>xj1{|}96{rx;9a%IHoKR+@i8N(?(i!s%|C5ISyJ$*(^;m5TP_lV%~ zQ9L&zcn284E0ixV-Z+CX##!cGM({Q;4)-micR%3Yr#1VB_5xXPXK&dfbgMH%1sgXUwpOF+&ey zhCk^sL&j>ETfiu55#xy^+#{*sZe4fou}3jWp{7L6g}V8A6!MJqI(aK_@}nWlNcfi4 za4oIhK3cxLw00|*Yp|O+2H#pEjqfs6`w24ymYQqDe@DA~W)FSlE9@Ro5ZwC;?tKH- zHo&!fVuM|9ZWFUJJaBCeT-zkh?y5k_T1#2Gki<_&LXQsbqP)WL@!s4&c?L%evC-Sa zM$yDYxr_$CMO?Ivm}nRA&}QPHTw7om z7co!NS$L!WjkbEb>4u{l%cWC*Wb%>BPe{g%WHwfrzw_Ur*&)ojsHW!_F=Hskvf`VO z*#N-ayMQ7JVlrABAdp8dJ8-O2zouV&S0Xhd6qe+UvPXhlQfN zwX`rr#BRCxtRlSf#o%VJRL@xB$l>z2NlvaiK-_eIxT%o1=>T!lfwPE%PCcd@VdVnt z8BiY8h*@ZhnaBB_2sx_=?ey{Msh?`kv~rcx>y<}%?#0aOx*05G)~Du#ma&e(_HcAB zNB2T!k+~G!?SP{{a7NG3{E3*rOU|K`E0&(c6{o2aawzt5+v0hpWd4jNpPpA|r-^5- z$Nxrbai-qE+0C{*1AoeA1fG7z=IP5gwe0^pVxCHU{qLaXKi@Xle(2AQrvC4gcIKA- z|8ku6_scn*-aG#N>ibvO|C#mp?^BaA*Y(U-{Pi)y>1U$--Rg7l{NRZ*KL0AMIJ=(n znX{p1zT(so(x2PwJiRCSZ++H(M^siBWmfL}RhIB~^Auhu3s z>-Uem{*l+|f9w4ZfBxam|Kwc(r`Mm;Mc@Ao=gu56ocW4Bt4HupIr>-Vr=HjHcjM2Q zdvI0fr~myjI;ZdV{Zrrn>3bReyZC!{)>rktH>ckZV&t@xk<(H}PW2mFN_nTn3f|D- z;SDXTdAG%O-q7;7P<$)m8)L4Ffo>L#6UJMEdE-SCN4=C)L|Mg@<)y4o%gg$hySGx- z2f|4S2RTzjnfm=B9**v(L=U64y!C?XN;tC5I#Oy~!*e-OB!bRr{8iVm*m}z9a@xGq z$E)iD9mCBWJ)h2^!2fm*d&F3mzJfcBIm)#W%)N^=immx~k-A)F>e+NwmaCt+Rmf(S z>o;{Vw=YSIFh&}sjy{eV&Lyt5U0(-;2OJWyq8;xmY0tY#I*2$iTg1uMjOeyy+aBBs zMuTx8P9=$IDh2dq|2puMh*nu(wTLznM4V9@)B(wqvqD6eaUu%T26fFW(Z&2xbY%?u zBG3)=0GER+K_7VC*DMhK0%N%LF)$X41LMI2FpvA^g9YFf@G4jcUg!Qdz?)zZcnf?0 zJ_H|ukHHe~DbH92J_F0a=RE5R@Fit`ML8?kX0ctxb~W3z+_N5JgKxkluoZjd9h z0*vSUB+fswe()10<{mHGqo9l#dIAJ9 z4;r>ZX|Es-6YU13aR7 z3Cse>K_LhAHh}l)bM9Tiy=&R7W4oU1*KD)dZeaTj+l_2DvE9se3)^qmZe_cT?RRXq zv)#e=d$vEYg-*4T?T>7CvCU<>hiByhHz)w`KzV?EZw)+9KZ9Sv?*M)%AC?V23&OQe+}r%yvFOm4eWo# zT+J-78c&tLo4sm-Iv|PdO+j$;3kCRu0_?f~yDq@43$W_~ z?79G(EWjoUu*m{!vH+Vbz$Oc@$pUP$0GlkpCJV610&KDXn=HU43$R0NYX$N$=2VYo z`vgE&v7rKNr2sq8Hd26%6ksC-*od}=0_>pxdnmvj3b2O)biV-IFF^MT(0i@t1?YJJ zdR~B@7odLy=wAW)SAhN%pnnDEUjh18fc_PrV+H6~0XkNIeiaxk@!_pN8_*WC1LuPa z;K_M##RFG7aK!^xJaEMWS3GdV16Mq7#RFG7aK!^xJaEMWS3GdV16Mq7#RFG7aK!^x zJaEMWS3GdV16Mq7#RFG7aKr;gJaEJVM?7%E14le?!~;h>aKr;gJaEJVM?7%E14le? z!~;h>aKr;gJaEJVM?7%E14le?!~;h>aKr;gJaEJVM?7%E14le?!~;h>aKr;gJaB}! zQPFOUrQH}yyD=7<8jDSh#iqt$Q)4Zi^PqDcbk2j$dC)lzI_E*>Jm{PUo%5h`9(2xw z&Uw%|4?5>T=RD|~hqf-wJSZB17N8|~96Sr21J8r$-~})PtO4u5*I)zq5#)kBAdk1? zg@Z^C4XT08;9@Ws+zlQ8yiH3|hRo)zTA?5j)CJT-)d$o?H3nCJtH9IX89;s1$KWvd z1^fn%fHGhbt4Lq~CkOyRAOxgRH%+A*D&0`&hDtY7x}nkym2RkXL!}!k-B9U4r)-RJx(k4V7-FbVH>ZD&0`& zhDtY7x}nkym2RkXL!}!k-B9UmQSCWi)xdBXceG>&Q?<%#K4&A~f7b7SYl zRgY^JcV+ymH4175CnP1zN?0RW6QAUXbBQ23@W!(-?DIB3;*UJyk38a!JmQZ${OA_( zCEJx?74OVzYi_}pZjs&C=RJq`)Gf5#d9>YmwB335*DdlVFYlJS4qVUv5bz+!9|9BDUkE;De=S%KvcWfC6W9W_g73f%@B`o-ezbvk_~o@E%@jyA{}c=#F`SZrbMXBhPrI1%Z9pasLO`BY^ckIvTP{JhO%rZ%7&tBsL6(! zY^ceGf^2G@O)ayjWj3|TrgquXE}PnAQ@dD zPQ;oMvF1eaDjqHe50`_7%fZ9th~DV#W#Dpio4_9Mcsay|JBbZ<6C3Wv`{m&Ma`1jR zc)uLHUygX6>ptN655Y&^W3U8#%6-egXJ9$_ocq53Yq@7V$OhklO<*hd4(tFwfSq6$ z*bVlAef&Ddg$)OSV1S(w=WQd-+eVzX4NsawoVSxWZzplyPU5_s#Cbc3^L7&F?Z(UI z$gb>SzflKd_M&6AM#i5J2=YmGJyZUqvt4SQqZLE9mIsYRUO`In9Md6 z)Z=^u&;+#Rd{@v5AS1kg4&Fb9_;9znoA37m-Wp14kV9*bLu-(urt2Cixdq@=fGlY>a%eSjXf<-wmmJ%}HV?Q#0oV^bpa?)8vD`LdxoyO9+tg9u zGq(}TZ6lW3MyrxTtCC{`f?&RfvJEFXiUiT18i)hcK}}H0+)XUEn^1?WOI;g4$|}@O)t{)B26!n z^ddU1 z`RGSJ`jL-**_;>pg5%jgAKn&1*i+23((e7V_!a2KtF@k&33XJ%dz>C zLgc9PDTT=H*c{54a~p-ot`ON3BD+FlSBUHikzFCOtD4&=M0N*|RS2>QK~^EiDg;@D zAgd5$6=KP%6j_xbt5RfDimXbJRVlJ6MOLNAsuWq3BCAqlRVwP>Uk@SSQhe+o?mUQJ zJ%nF9g#SE5DF-R#Af+6{e;&er9m9qsYI*y?EheU5$3 z{ulIHT)c5T5Cnq|P?u;u4d^Jp9p`nVf0?fPvqJuoPU}veJZjko8`xV z-vbfxACeo`|Azfd>~A45+r@QzXn*tA?gMU601CkY-~q*yQ^GZ+>>mP$!LQ(VVDdX% z>PpnMiKuN8oO7!re)XKpHia$yBBHfT^e{9hi;3Dck-pxKj*g zis8g^IItZ3(iAU;f?{f4OwDyu|LQUPsrU2P!n=3&k1;|6&UI}t2LIy?fzX;wJz;A7jCGa{Q zKIg;ZeE6F$9^>8Qkz@r5$O;sY6(}GpPymIwP?!sKyTlmIKL&J`WgHj}CV?YA0znR%%s~N}g95m*OMJ;SE5RzThGXl%*I)zq5#$2$Vq_8u$RreyNhlzbP(UW3 z08Zw@$y_+O3r_BmojKNx9NooiZ(=)`?X4Ui!v3A$ZoZFT`vBX~93KbX=KjTe|B&M! zv%ie(YCt{6MijvPT+8zEId+g=7L#)%LqYzVE%{rdkc$*@RbBSskE##gk!lQja{LOm zSAlET@5`@{uLC!*udU@qw!b=k;0Lf1>;i|m{}=EZI0AIO(xfexzyMAV0D?dWNHBMy3A@mQ zU1-8CGA9N6&zCmnGM>5IPkNE07ip9rjS{5cMH*f>?}f`=^jiBmFPtusAMzgxK4!ZV zPpX!vvJP117>+###)5HRJeUAxbM8yFE5Rz> zK~ZV3+LOD{u?X}l0t(&eRs^~gfnG&Gty?}S!l71sayL2^Zd)>K{xZ&g$@kU3vS^NN zVt)(o*U#tNLFC}%e;h;uyc%3^tMf&86|2@B*R8JSm~GMf&>yUt@58`w?i;~xWbfnH zgX}*9CUE>k;<%aMWiXrbb2z_{tDG0{gckwq~ri1-$fB6YqL|2{n8>1-$fB55$4gXEOjJ=!R8dS+QA|`(EKS-#$|b5ORzaXOxB!bK zt3c#XOyp2ZOXQ{X@e&yn6B!f}6%^9~d5H*$i3p0-Jg@+~3SQ&*m(;m7aak#GSt%{| zVOs9PwA_bjxev>B;4<37DQu?$M$>7j57SZ~rlmftt_3r|OJElMpcY63NgxHZBnoT= z+JLs89iSa0Rw(6{+Xsn8ZUpy%IrJogsmEdJp`WSmJ1TMYOpZO~YiDs@MT2zq#vb4G($6?H zd!xs6PnNZ*nz6CRZN1jG?H|n6&__Jo7;0rE#~wrVil^wsg&~13W&n8MF5`Zn8|VS- z9(++n4}Kok%m)j=E8tbI5WLQ{Z-6(!BJdVCUC;h2?#TkH!CJ0e53&JqnAilig73f% z@B`Qhc7fesFW5)Cc5E-dsJxe7B)h}$%lPjk3-O@I9dZjIMhbS=TwdB62oG z$_)y@e!y%QayCWeY>Lj1IVd8ZQ$#+eh-|FR92A`-a}Y*vG>qP87`@RjdZS_VM#Jch zhViZdJ9hJ0vD=N*M#o$Cv7G~mqr`;3vMr z2RzT-V`WPVT@U^oFUuQg_xOKKP_g$IIcgcs;TSr8tlYTv3^JgXU&&{9T+t`@T7B}W z{qf2^xEJj_i1*d~aQI70bZlQ-XM1%I(f0k!k+OXLvHfvmK#O&JpIrOgZTQ@6_}p#y z+->;WZTQ@6_}p#y+->;WZTMWSIcx8%g7@eVzp#R8x6$&~W>!;_xxsu=M4Pl`=DX%0 z^HXy)UOd!%-JHj}zy8od`U^p=r@ zm@#$Nb;S=PdM{VA4{oiVqY^C{EfaXDX4!b!~ybH%Yd zHXqcFF+VrgnIqT^_x(f$Ntl`}~PIW6~$|Ei)Od^Ot~bp4CE* z`jm@ZhFvDvE*4ut_6_`ZIAPWSnt~s!v(`22MVY(Fctw#7U?Fnxe}?P5%EjW4|DN*0 zHowiij6uLB^gGJjLEOzh(bO04Kh46-Ci;w7Xnu_xyynN|Dt+y-izS=zs+y+t-W&&z z8k)sIMxlHum!YM-<+Zi6xBPUNy|vHy@6lVbMdUs41eWwI9kgo6DZ93>pnXHR2JJK- zH)rtqw9QBMO8h0+y6gY;N494xV}F_YdZJdAN}H~%hySXob@LyqqF2`a{^NgSOMLW) z7F{#@o=O`$Ss5qFML)*;&U#qH$>`(kbD+{zDr8~H&AKzP@~PJM@()Xgs%l5olm2V| zkTT~{)PXd$>Ot)m}^W%&on>% zPdl+?Gk5x}%DmrS#>uwF>86w~;+uoXt<)1~%oeFH8i+<@hnk3{q8a_qb3_aBpe;ok z(Uv(y?a8}zU<|Sg@m4q9Ms>NkLR>}UejQ_PW5~mdB?mK}{LABFl6XQ)7E{Dj@g(v8 z(_)%&u3+v1}@v%NDYwY%SZ$cCx)Z zSDq(3$!@Z{yiDFCZ;=D#AURmxDu>9S@(y{Y943d$yX4*S9(k`EA@7qT<^A#jIZ8ex zAC{x#Bl1x>Mvj%^DyMR(U=^;& zSgATHNhPZkm8#mSb5#d*o;qJ$pe|GwsqU($x5Cr@~RTWd^z>A`bGV!epA1zBkHIsQ$A%H!jOhCf{ieP z%$HHisBI(~b&Mn<*+?-`jh03$qm9wlXlI*g-G;V`V?&{}5;DAp0@p@_wOQ&hzAar2H`wU4bOGTC)1V zl2xwUi=2uq>HMyQYQkI19zD(?PqfDqt+6Zi*i-ZtmmOo1*Z&Dt`Fe$2zJCVGT#Ie4 z$2zmI&u>m+q4}q@Q5RMkh@A$@kUwav9kAAp*lXq=vRG}e+FBpAEOjE5`ZPAGE!4Km zs&?tON^O(cB2R6P+8T4PLT!WE0)HyEK->EM9oxJ580#DOr`X?@e`gECj+{nEtAA%V zV!EgI#~1xy>kX_)FBli2+Cj8+de6Xq?Zw5>F#0p$MDljDUw(o&7sv9u7(sqlFY(r= zy%#U4b54kw<;QBUO<>l2t@7`G_QnAX_Nwb{*I(1%U-k3!{0hC&A7P29vI?k(D_^aX z)`zCSzg8Xbto|cPVDvxM+33wtbebncUUGy3MqBTg^{co#Y zq5MK6kt3S_(N--gYp83W>lI{OscWl$Kjxr*x(5|*ozv&_{Th0)xfIA=9M*8`V%Jbx zlh&`wv-DHRQfXV#cWF!0_xqPRoU<1{<%tzX{MQ`6t&TOxylTZPszTZ1a^tGuRCQmUd<|5<-&daL2LINP#pzY}-DUHWcq0rq0^H5!Wj z(8o0`_7Zr~`^!(BViQAc;;jsiwhk-PQ&Bg69Z$bK-YXpc-A}RKl25ihwsJPTehWVK zoc+y~fwp8DT4PVY)VA6e{dv4S>mzmxWM!+YVk-Ay;Et{9CzgNgaowKSt&e|O*+S^! z8a42IF7!1B35HwkO=YRtr^Q<9vG%R~b|BDpqct_e(w{g!HHXf$RO;mEt|Y@#vHEL& z{Pq4;$)?2x9eTCBS4}*!fAv$LX{lT^4gOUh)iJeRZS9ESZaYT1WYK;L24UbhOG5B3qQ zFIwW2+Gw3P=|^QW<1CkneMEn1Pi$+Z|0?^NE=bGI%9C09nnF!^h{a1S8@<@Pu=n*b z+uzvo^+#6vYzSwnez)6r|FddgW%d!<&-m-2@ATI|w@G@j@6ovm?UD3Zf2*p`+KbI4 zUAI`PEwSSp2eq~B#kLq_owef#n-2YH-(^!<*+S`i^||VnR{HC$pH{W5`n!M8x)H|J z8n!OllGOK}OdstU`0w^_qpkYuZaz)q7 z*7oYhw7mYho$c0N_fv1}I#gP6Rjc;zSM@qJy?zVUnteQM8E8wkQB_;)r};nQX+g9X z)}tXY)~DXui;mpwGq!Cck#&<@x?X%GoYqnkrb+qQD%6l$2MrM6cMrX3m}Sq>vJ`!n zvb?a~lSoD1CFLsKUcXV~klVP&xR?CKePlT9Hy$t^G)7sOj?u=W#u!JimG3xkY{ui? zy5~D%o3YjS*4ScfHZ~gH7#oai<7;ERvCdd)tTA>NtBqAgma)?K%J|aw!dPJpF_s&j z8Douq@4kt~GS*L7m$H7sx`g#3)(=^~XZ?Wneb)C_-(_9Q`VQ;ctczIRWPOA6b=KEd z7qY%;yu!MGbw2An*14>6SZA}&VttwQCDxg&Ggx0_eSvj4>+`J7vEI)54C^%3r&+hN zKE?VZ>r~b$tdm)vV4cMJIO{}X0_%9zajct+O-OPK2m}t}W+Z$uh$e4)9@6b1uBU|< zL*}(5xz`uan3?2Odx*JYRWB8gyTu5RC-TYD?k7_^m0am> zWM+>@C1#Q<4Homszr={wWt_|u@93Ng8CI=d-Fcefcv0#(9S-LVX9lWO$KF!Mf&S)! zt5|Y{D()?ku46Yze;;=LU3ZI2G`P$qd_oKin4vf!XJ3k@I@&uIb4ik=+d6gwj)!@o zUTX1;J(VWNSn30OvCrr)_JTc>@AGskc3I}Pl@iJjFd-HNg`RKh}2_p<_%ApHE+c)OOMUfbrhZ8!1>|=(b>wPcjY(m zI+Nam?A^uU5;BRGR%G$6B)5LGxQ3aJeaSEC9Q*bBBH{+oUkrdGJJ0?EdG!~_q|Yal zzJM(HD@gox^5}0^ne=zW+hVbJSG-R~{R499OUSA(LlZs|%Z+ozUE*eOi@4P|kJwNL7h)FtVjq|r$Wk`^W{N_Hm4B*!JEB&Q`e zP41VXQd}t!DbXo4Qxa1erF2W_pK?pRbw7V~#Nji|GJLdNbe)pK9O^WO9KToouBuyg zT1DP_J9QEjbs9^Zrs88ZQ77S;NXNWm;vj zx~{xVQB~@6vsEWaosLo`=`fflvDf_4Tx`xapEs{Ddzr1x8ouXzlgnQ7jq(lhUFW;j zca^WV@4T{|WjSR(lzm^ey=-gQqOv#hKF@nBuXA35z1#NI-CKKat-T3*YwV5O8?iTd zZ_r+~XUm?odtTkMV9(q=-S>3Z(|%90-0Sz$-TmwCt9ISGyZi2LyU*XMp&M0dY77TCxQG-CLlFcPwt!NTx<*#H6;$ki)XFKjM`QEvy}#Dc z-owUg>VC>~(2h0D3=R$oaOr|8%8l2FNGW4^mQ}vNh-iR_H*}!^l*&h&s0?-gEdy5h z*55KfW;y2lt^$3fzk4Miyb@h$i|0{(0Zxq=j&FzcA#{*0^%ZqmBT@NoDdYCoX+65Fe(%%f8I!8kn7ya>_Q=34c)wbgPruv* ztM_#I;g{YoJj3iGIm0(l&X_F!HI;wD++Sm=Z^2~WK$Rx{rL{nc(Pnc;n(Jl8#IMT? zZ`2??Ejg)LbYw(Gu*)yC%+Mgnt0$d~lsd|A8nOHbCxCmi;L$=HCI4vYOAIUZ)H@A z%V^Qs7%=*obsLtyI&0x4D<8gd#E1uGeZ6YK2QM$maj4}l4SV!yIr7@kEzbM;jaN3t z?))*%{l(~658ggtWa|sEUSG66X2s{x-)(fxcGhHlYs5!Kh6FiOpr6k6=eAeMXxCP`0#vM4D2UWVIRxq!p!WIO&yXmtEYw z_hmhL_EyanJU;Q21ry2-UEaONWxj}^YV}aZ3!~qD>yb-FFIqIZ$Dn~dFX?gXtv!xr zkACZ|(Y+p7wCItZg9i2N)noAB9=~*U+|^k}nVIGR$3}RNjD*{XmouYNQ`)vpX`I?P zDKVjDY_;IPfU4Tup?RcXNM~BT>QN4dtc9Qvx6@fkwv-4u!H`&OoJ%@jQTaC&ACQpQ z{w!`Uw|VPsL$lB@!j1RzWAJ`^8MOf zMzt6|&DhiG?k+c^^=*A#zv1xVVdG=j1z+J5>6!R9C6!-)s&N)4WLXttRk|Qd7_ZjF zay*-SZW-j|%CWw4)XT1$iN%{`I>N(bg%slYWQK-1mDNoS74a$|GuZz%MOj>m6m9BA zmx_vwjD|63B5JJc_>L>>@%8H_rMcemeW@;$lT_2|ib>^^S$D$f6tKXRTKFH z&vo(KI@WVLWxB${@S|0q9HSqliGY+wP(lTagv_Ypj;0uvZ;BL%rFC>vt4NjJCWDvZ zsXD$d-gc!;$lmg3n(J-ZNppUm*E8gxnZVD zv&Ap7%y@nCiG^7$A2n5n%idGHRLvQ7Idi#oAhQ?@k$hY^;T4skyJ#^xS+~Rkv$EDv ze5Co95pT8Yb&k7_e7wZ5pzG4QD?U|bEO|}!U-*!#iGHRM{KCi)S?+_03H)BSqV29p z001Mjz2H?VJZ!kIV}fcbHAS_GY8jo;B04tRcBfHRE78gkdF0zIWkK)aEYb$ zut0M#IW@}Js-9Z4%J-Er9KRbcwB~|w#0rU&QBz!)8CtVObYxg)a3F&zelO5C91n?z z9J&pW4m@ZBNGo@AQ0UO$zn_32N)^~En^jnKN*FQ-M6*;Z4RxhmI~;_bl`$vLlx5U1LncS1 z2N(~nUAwaENp;J{vRQJLD@N|0;ae<1@^|z*(=Q?rGb%b)bqKKSeufyeZIh+lszRRIpI-Ky^zo14$OqFdRTuqR; z8>6Fa(>gj<+dx_sP7+cCymO`6QI_4T*H0g;^_YAI~CKwIg z@m-(VMDmV=+#h^DuUqN5@3F-%KC!5)&TlDx@qEBh-_qf9qQ1CV2~wmcC#2U(kBx~4 z3v`K^vSvk8)E3t9gEPgHC5K9c6bG6TAa&?hP6PFZ932x?B|_`AY!Me9(3E!DRT~|* zR0C2(4H+q7pn*o5Xb;s;k6!&+n}+QkzVh)m&s*4k*$;;|uJd_i>Z{j}OPzb~gX5lb zW~J1eUZc+b_lKX?^=Njk?=aE|mZa5Wud<6S?R?88-+lW0)Yoj;3_v&1kxi&*k{PHq z1LpfRzB(+IG}EX#8mtt2x9rez?}7$3wN+%a4z(TWKF^m~2i-@H8mpYKz9qh3-}}ER1l{ zadLNOF$}}krsKeLbg=9Xh78+1*wJy-{nAHn8}+>J$hvL5k{8De8*?~oY4J-l?;164 z?&!N-Z1C8C+b2!FeZZrR4tKrPsL`?q*XHD`eQ;UhhHu^V`MUK-XWTbq#(fVy`lPF^d^2%LGwK#cr>O0M!ylQi?@6+#Ppf7jt zC3CwbUNHLMK~s{ZjlKQJvEx>LFzTZ2(s1XG5d{5kc=txx^TY7=-8p{WQKmy4<)x!)UXhY}o?t zohYs`a*f?p>J_7F)T&;aR_POsK1W|uS6_9Nk@%Hw{Byo>D~qCBdWaNxx96!NEO{r2 zOEbwd>dr6Eu4%Vy75=PwI5M>YLpni51D7-c~T8{~|qhyCl`hx^`k*G>IhbH7~s z!K2%TwZ8f~-@uJ_o%{RFb!~M{7a5|nY>`?0g3Pw9TQqOnuwH7N+BM><#YBb&2Rc+p zMO<60Pv#}j%#Q8oQjXwsq*`Cnql<;j!OWP|9y!>df^ChZ)k_e8fdO$rbZ%g40#u7| z-QA-hOb`J9(E;&62|X9r?~~cLyv(3elo@nFnIb5tN|C25KO`aZn$wldP@M{-QLC+M zUjCG`D>=BY6}Y=}gJN~4(%RJ2emOoM!*FS5+$LHiC&3tz%zixPnIvMYL()E-*1AoM z<NR`?eCzVg5 zz#tua@&5rt{OwN>@z;TY4&~Gt49piOSV?O@Q>W83cC>F0%F0xkOh$c1SN`)RZ9)WqTk?|**r6xv6N)2C@zAr`{X)AUDYGvqV?R%Fhf?f zsEq@q;lPr}DH!yxZN1Za0RdKQg38gNT2;}WG9xOvg+qsgcFQ37svFJp)Oz+#YVsTM zhdin7>Hp+H-_aj^W96s`&%N+ym~X1=bjPIUCj0g~7iVSldoI1&#wlyIs5i@s$31ZW zv(6d!4;gW<=9v^DXv;pw2hF~smz?k7GD&u+E)`1uHF<$e_Y9=G4RmE#lT@NGZ%i*K!L^UE)? zu0wtH!Gc#-u6$*|2XeD3+vkz}WEct&CU5Zlw!`(}d%mBud`DLMet!2QYN{;Wd*FQ# z9p-a0qk|bg3yukn4h!K(pdl+-;#y8dNRH<+?UY~Oa5+iPr54GW!O^5{RO%c27NNGh zjt=x*-x29tS6H~tx!5*^8&2&uz# z9R%Rub?O6wSA-+vL7h5k!o}0ov|wbFy`h#J9c_##yHs7R=9m34!?}2-uK|UWKl5CR z_SPinD)N&ReG#3zvhM>Cf;W~3xp&4z$(2QEdy0&W2MRhe`*vd)BYc*%5QI2{pVx8l3 z!-Z~G&PX?PjxSpJ%KmErg$ ztL(h2EcI2EdaUdr=i;(E)HGWT%VE@5o?(a+`^Q$Q+bU0|Fz8Zd$g!(daWT*AL9Dfm z-AEk~gog$P>8@2p&o~)Bq3{#dTv|hm9MM%6S~%%stt=T)R>rZSd!T;F`Xy`aPfqpO z!}koGs=Ga&U(zRGfv4f!$rHy@bIuot*Nk-#1P$IqIsl>K-4Ds$2mGH zZG}v|=1GRkhz}ySE{h+@${M0-{iw(`jO2GJ)5`9EJ)_iEXW6A?AzI^Y`)I{;o#cB0 z@ft9>A}(h}rX7pZThmSi?bOV#r!_M}-lmimHNBv zJPX}f3T&V&9uUV9tMvL{TWVA~?ma*ofHBG?HyzG$`7V0g*WQ(dw~2Dh{=K)OvpllQ zF<2gXQ9t?^U22>e9Ab@cRFPL~5bY)c)5+0*I2|`sD3SG;49OsbR-(=>wCFQemZOh4 z@&*!mT{*6zd@EPtRM?u%SN|Ki5`0&=DdEY|@n0zwUe>96ANqbZeP750uLz2kBX9$yVv*ptF^IEX{1)mN_chE_r8`YEmc-Us<8=1v&WHY0o_4dqH(8 zTjE^oUAd}g#_ap=pJ(%Cxbs?g6GID|nHgNCcJ;WZ2;w|{->!lF{S!TFp07LnO!z)U zTFKwfB8RBEAGYr~3Bx*f+%e(Dt_%KkQl{OVec6^rw>D{dTE zYie?B9beaoiPqe!@SzQYi3*}H3R+hO(KXXx?8u* z6Ct{W6+r=vm8Hc;?;SSs*2H@2)8i)H<9kQeSoqA7(|udiePxe3-}!dkuvgDXf9KK1 zy9`OGo-(%UxDijy96jd236`!8#qZw-ztcsp%<#0jDanboq9en@s`PC$LTR~@hybYZ zaU((s1GM6qgHruvK+a!Z13x3d$-Al@4w&C;`iQ^Xz|GPIeW20P?37fGcrPtcm@VI9TobSSl&vK z&D0&hbQhG-An6t}(6B@1I#NH12gc~YIXyLi&kVVthATy?FQg;Im9TM}Z_Z-h&Nx@B zZwG-A_4{~84xb0rx{}1g#;%*eRuW~5m7R>HM-Cam zWzxuK5W#Bd46EZkV6- z^Ba0#R;8@*0E>QIQ>$(<)Th|vNyJzkI|KbZ^s#I-UN-#j)kqhwAynU$HIVbWG8sTiz+nzFX0!K) z#$22_H#7U_Eym0lI`+KWktg>%i?AHVg0w&PkK0%?2P(!+f*3ntl#d&%(T5akluxD_ zZ8GHkS-%@@N^$Tr93^feUOedNC6btpw=lD2O0p2?^^zNiFe4VsvJB?S!~$di*0WfW&)M-ZUnsZPcjlq6=%;V2~c3 zK}^~ZBXv4kvqJ}R5aUY7Y<~L7F3SMUl+J-iN7-{90-_T6M*p|b z?yMoRTP97<%9wu3n%u0%Ctvqay|f4WJuy)p+V9(a)fLaUs+Y~{b}=cHBTEnT?dfaO z``T6Wc>r}AfIjR%AFO`66xHK&?n{qDFr-tv!gIHbrq51DB%#qk?C-D?fCK533HwMZ zLyMv4OkOx+`P%PLyNvia<})ZF3p(p@<$ZUu`PJgodDl&R&v5*@An(`T_I{Y}Q13r_ zI4^0&^H?*G)H zRm)}%vWY_nugr|A9xp|$g!nqu>qJF_hLA^(lW`Rpp>txwl%cBG!Jj=+K(~ujx^5kG zO8~`o@2vEgormiLqw(C}-q|^0DH!2y88bxbdQU zrcMY z3lrPT?e)}St)3mQYFF0y$$dwrr#*1>lyY6WqSuroD>m+GRPV*adXJ5NuuE5TZvLvv zddSiXFSB$`GQXIn2K$PkZyc&;uG!qFh)RHcwsyt3{5o8I~&>+ZYyjH#cMWxU?&nvL7bu2rv%f8@fBN4N4s#e94rZ)Q)AZ!|ke zq|G({7>8$D{H*8~>a2)X4S91Gi=(}awZ=@$<-VTsF3OC6qRyGR-w928v+|ODPo9}Z zL#C%y7zWuc-IN8Pfl47TtVfbi&_5fp^iSHkl5%;pin0bF?ppL>os8Py;Vq-izvOfM z^dmzTei#%q(;3j`CdV_fMi%#@I#0pd5b6?Yk2s$sZ<4|g!ZCRhD7IRZV1Mq!;%`On zgb-COy(KH_CV8R9cb|N-P#*M!xvDef|AsHD>=T|@$kzyb|1_g4~B5xbDPO zQpMew`l3{ks{3y>s#lBFnLDT9p95goOG*+p>L4zl-)wuCKr+)>%jr(rIg^CUw2F%Y z>9cBz>`Qg)Sb3q-8eWLERLK5}tx%-OJsmZ73U4)k$dH-oEf)@ZWkuE&lxxQ_Q0~s)Z;Hq>CyS$Jf90{K4<6$Qpjn zb))N1=ebwkkiD(!Dz)&*k=-vix|3>R6SM)2hSc-a`5c>xkbq06NLY~C(?bw3+PTw` z>v2(W+>F8j(y?o|bo!3w=K79gJ^kdAY0pfZ^0Z3#$~L}rC2^&`uVt%}MY*|);@;S^ zhZF=ck*~j_0d>(a(S%dAy?D>&w7Vp3nbD$RiFbHmM~N*@xW%%* z6GJKJ^xtOr$@17pyBJGbPKb>ft!horYB}{fVvPxt zFS|QE{q9SrOtfQ-o)${z=QqJpItYZz!-qjn>8X*Q{25X=1B82z% zGi@6WqVr+*HE9oHG>2%db*9pClb8c@lhbrl>Az4<2+}9%0qJ(#3W)74sbv%Cgc%ib zi;GuJ-qP##+F6TZnoj5wS3k^{?7~=&INHy;vR?pRnK}+49$HHs|7ZCmtK}`PkdEOn zlZvUuRRYwCiN*HB8LRm<95+q+JbU;1OY%q_J=kyXpuSJ6-cY#gnUvkd^E12FZa8DqQy*=f?7DS8UubB~n}J6dd@d= zo$Pe+#p=kBRoc%=-sUEpIqb%Y+cTLiRW*NA8L9SMT&GVaBfrE1PAew>;SOeeL2}?HP zX`5&JR%OdcPduR(m-U`GQ!PHSNrwd|ywaz~WV>%+T0s{&>D3ModF* zdGSB}5uH=S)Qkpp9B&26XszOPYWC1mJOe=16dq>nr0D^>PLc!Pr@CbD559H{UK~@s zN409MD?&Q;PH5)4BS$_x(KzQw($IM!&Y99RtjlmmU1;xzUM!_Pe;`L@c_p;=b|cQ47%;MK?}aBf5*SBV)@q{ zzGvHb-^d>J&@&GX-|%K}n|o6~9J}GxIZc|*9h5!xeNF$Np=j7@qTU3^3 z*BE!pkXL7A`AS`S$Wg>X(+EFJ`sXT@GzI9o$3}!Rj~tpL;|>-vH8n3ZO`2qzCR$#L z7MnC38*5rJV)djwNQ)iX@7jL+4Q=q{EB}wW_W+No+Wv;mKIhDt6w*m2B$G-A&4dto zhR_MUh9bQS3W)SxEc7an00P35CIoDtsHjX7>=QeY`y-YmV&s_cFut4Na3eZEq>&zA4^(DPz~X#!FrSaNTw)=oH%ZTdcx?i z>huq+d!X>b!-@D2vJz!T^-+-YT>Zx*O9pN1*J5OL+hMB@Eh~DsU-RLO3r47)KXk63 zOQS{;3&S6LseOl>2GhEUxN;1R{-_4M3vXV>SFnCKd!)1Utgf>Nno0IZv?gkebBBS_ z&jJ_^Vqw9r5j$Ji3Wj&VA}yt+A1O6_h4vl`eG5-wRwF6`wTrfN$mL_4;Y_JrD=xNX zM1Vi+HYqH{(q)|;BEwai7GoN30{uX)p~qIS;2`}M5ExiKNNj?h$B~HuaxN|^{Uf4p zEK3fB*`y0&jts-8YR`F6)s8PMJK-vOrfk(gO?%R^=-8&0C4To+BCGRe-E*vt$8{1)Q-C z5EJ>kVDkXL3X`F*njqnZH_t!h6Nx0jfppkm3HgLJ#5UFws|@Kxdf{< zzTykpApIxoOG7#jgy@W_saKxdW^pm$p)e3S;zIy`(2`-sK@gV~85;)Dkz$vm1E(3s zm@KRE7+dxl$v6?WAW@xp2xgFa65<(T5LC3C5hf-)SGaEV&fQLq8FR95$;uVkxy_nv zSh=>#@!=zm7j9VfaN}mVjn=FxzxSuZ2Y>qM;NhPpwJvDWYT1faU7s2?_Eh)HD>vk| zYTb16s%_m*jv4tx*R?Cvxu^Iw=6~v004RUQsA^-sj)LYyVU{su)u|rj=Gm<*K{z7) zN%n(|h(iU#l!nkB8>!m~(0K`#0OPMsFa=^n@K@0PARfXTPXB|C1j$7|<3m|fzL+iK zi(UL7f>1$Ox%09Xt8Q^;&wXqTf0lKa^VnRKE{Wek6fO|IhI z%uB}J@x$ez1KPD?H9q?a8mo3{ z=c@G&-~ax9FS#!@?33EL^Mmg-?c(Uvb0a%CbXA?42S*-$<;_nFb?pN)2M->Tpa1N! z!K*W~SC06{*-Ph)89QeV9yO|Y`=|QUhz*Gt-G21A7GY5}YL03@_%2N9p#G&cSnwpf zl2M&5Izyp6(5gd$fLFx~&cSuG(Ulzh@yERG#~K6m8SEeJPpm`O zuhWUad8r42!NIzn7D^g6OiC%qiU#xqPyph;`T$ig-LdP`sa-pc>FS2TgNKeCJ9O|M zcMUe+w_jNi-~a1x{J?A^Kdr+u*iJrzU*sS0k!oLK%Z>|2WPihf3kL1_+&>55L@b&9RuTG`S z1`%SpQSe-=smx~J=plFm?iZLr0j{C*2v$TiRMW(Q;DQJfGEA_*t)>(?bE-UxXAsK> zwt?W)8}QKobnL44;XFNGY*%p{5Xz$fl>m)CLGcSU`WiT5DjgtabHBtCjL7trs?)t`jUHmW__+3c$J0 z+4C$)4>5Jo)(PV_ZyG;w%hJxdjXQSA$?dG4o>)>cank0^lkz%s%F8P(#Jfj9=((o< zf_I0&z75-~Z=AWuKa>hp6{ME94fYQXB0ITgiSofM91o%g|4P*mMFI?{>)BXde2gz; z^N+FS<L|~fQd0>qPkZ7+*StX{o{Wf%T`#LP~
v%Q*Qgy;tdJj4ZONjTx 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

sDMz7$^SDZV4x`K*fov0l~+M89O^^Om^v{t zqK(rvqoNG+rLY5Lj8g1aq5g(rkjMeqvgchi@0`0EHmtzE4eAHiuGOvP8(FYav38N; z7Vq1qRI|e?{&Ds@|77l*FmX?$@pQR;ShH91S<;IHEX!1uEtjO~AYZMF``QV%Nsw<; zggQ;`R2tLBt=ViuR)V!a;V?-wi=EBlhWc-bxy=p8TO`hDEJ=J14+}0wr+}CtD}3^M zo&#iSSO&Wx%1YhK3+sC5g`n>I!Cdgw6gE@?mdhlmqB3BJTh<_B)H9(Kx;iFoSK`CS zm=_`rqQ)167dW`a zpN*pOXLuFtzUJ$@p-^EN^yj1!@RZ))?Y2UhmeYqS`U z)I6zQtN5IMrtRA|t;N*+`=`45KJ`-K)5YlPFhm^a_(dHF`b$A8F->N?o%zHPnAszCS+bY*nM=lN(fG< zzuM79(H>kcP@upOA0PSoYnS&ejofG)=-qkQa`nSX%~}i@Y-CE?)gdHfumgIvu$+U> zS~O@15tA$-jvVx7g)QYA{uI9pRztF*vFXE~q)ZY0)HPanwDUr+WPt8sMIb%kcLWY2 zqK(2F*3=gr9)6=M&{TbO?0UV+s4e=|pjGeNdVq_{Mj0tj%{f>Oc zs3G5h@kJ49;rqV=YrFo~fk*gDGX5}Ll8ti)tqwBJyGy`wofXUdRS*rZ{i$wWz=I|6 z()+TUT_h}O-t9ztV`TXC7IS)Rza#uw5qJ8KcQM&%gZ3xFn0ee@_O~s%AO&bG4_nzdtZNvGb+%vo3)o z%+o4sbexVyuTvTV(&+JDs$EQsyQCQ zAOLtI<{0YzoYQKeGMD-ziAa}1+mF2RQ(o{aB%Kh8lYL}}3b|Awi|BrG$tC;ERgX@| zCbDgtHd<%w;2pJ|`m+8Q>z{-Snq&R^Hm}I&kkW+|6*yiHvzi9vMf`c3T_hncoHoVy z2T|AtG}~gdjWf=A^2xRBzqV@iVB33-A6?7(t#!-awqJSjIBn+Cc{fUxzA=Bw49lfi zljeV1w#>)#rp%I0zcoJmbbaP$vg)_>zmd_OWoCSCymzbqo~troaO6N4@cz!7?;H0A zM-DaaU)zncI!+nM$_l+Q_CBDjh2geQ(UNc~CxgGQ9KLT|U~HL!1?v^5)$rKX zpoWpfi&iSpzEcPHb}&on{ipMLFSF=FdOrCc?1YT z;)?~81qZE!NZGGC+uWy?al`m?Nt$zJ>eQXWuO{(f= zzUg4A_w3DpIt}nf9oV3SEFM#-MDvCR8a6LcDWJ7W_tt4U*7z_m^KwA6))Dq{6?-$BlcKhu1z2CvXkw%J=Z$*3c zW>!wtZ?%sAN-x-$(B3z~d+A3lS@grcs`lcPP1MLh+wJIhYM(;;iR7VEXu4#@vQKfh z;S3DY{y;p9erS_L#QPrKOftWD-}TKT^BeFOBT4lZWEQ()h{s+&a4aR-$@@G=;)F1j zW%!NNa=9^Ll`&NL#c=rQMV?5+xGe(jr3iZksa^N4Lik2)Ls{qpxrBtzb%k@pSAPyl))oVSGm796|qSFYWY?idJF@=H}I z0QU)u#%Z4<4+jddR}BqAF#)E{&NyCBM-W$b4?@@h3=2F35yv`HNCNa37x(PBaXN8E zYH-}Rx}*Dj`l*t1@uIqG`RHTs2A19IU$+0?(aUpE;h#cv0n4tYgU)c#6m(lfOJ%F; zxjy#UbG5g}^Ih)e5uzzQr|&Eca4#l08EMvEEe9~~D~)keEm03UcbkhgqKoJu`iKEy zh!`P8iz#A;n1j9Ri^X!WT14BbtXhEs5f;o#pFMN>)G?DrrVSf9Xkfp-y?S=*+O}iM z)`*f@AIBWTg$I@>h=|FkLw6V#(g!$<2Yop<&aua@Zv;11=U4@bgbf%W=9mftONr4Y z#FxTdA($}&y8DO0q=S&|@UHPMs#6eR(w@%C^S2*uj;9nB=a7u*Ak5>pT4Q?OzSE}l z?=wx7>pUPns(htkeNJsks#`xP$!1GdPb8F&iEpdu13I-H*!l5=5f?1w-x>C3h>W{n z`B}yf%lX1mH8w703XX~`X742Z?VX_>y`TL))um32+BLi6{62#JS%Zi1KczwUi4(gI z?>T;a&(B&mtK7(^&?^zi$@ZI{HEhwM;qV46TQE_Ocl3grlAd*$PBd2nh=eDuAi21^o~Xj)}+40CR{HC^2g?d51j${sAHWu_|Ph zF0HtFHm6=r1FcZW@=dz#UNLv4s=h62RgA9{8`-kf<;$0oF)v1cladpi6Rp1gdt9B8 z5i?s%TQg&Z9$T$$Tuk%Q2^~{A?Xfr0yccOC&s~hhny4y&KQa))osBx`e zzlOsaRu4gQG4s))^$(FxamvRxpQ)olNHgL8s?hty!~~YSLQ=6^M5K}37cT5kO33;N z$*<^B=Ox#WmivZ7KXF2zHCroLF1TFR_Q`c@);hrNc$Les7WfMg{`{EZdX~e2S^(Ye z?A&=#k>xfT=_{^$1Y$RA0I}_Pt^yjzY2RxjbT^KC`JH;y%?&j~uG=WfDHnI{d`D5k zuU}ok1QC`4Mh=$~mK|-rwg{RcKhZ%pJ)$EBpJEI_ceTBt_PZ)?oRA-1v40}d&%q1d z_)}Z-bfnxN{~%rs(Y7nU=)0iJixLjM!X_Q&+=K%@P&Gt^L?py22#b7R`HKCzvZ`g< zHZ7ZN_&~ubm_Bm(@{xMIl$3fE-@$;C^!a9Op`4%xnEIS1$`x^}8SLFP@%9=QJ zv7D@*z9I{J^zcJj;L1sT{Dc$p{#uD_`EESCF1;^p(EAKMzTnTr$0JKUfo0K*5!umQHX1LZ*QGH! zIZMZC9WUB1!!IKeOb}CgIF~=Xz26h*@`3%n|RZzso<30;oex=2+~X*mqi-{2v4y<`{>0NxYAhT@@dDmF%^s zD_1>PUd8W1Tpp8NP>iEY(V}_ws{EtNo_}ZS#*w+k0X^Hm(#HI!Bh?B@&JDGWl9Nq{ zq*#vmhhN_Lho60_GTk-*fIMj^uT!2(o|}2d1n_*!1^ZzgOmCrIP&+9(JHeUl3fxZc zPvJJy39{h>Ef3i)9FUK756|UH`4CX!m|?hLp2caMjQii*GVV$LTi?il?5xF$wr*Rz zc&ohjiSdZU;$xZ5_~&D}X5YRwe`f64NA_mqGZFK~s<1&kpAV)m3XVL&+{KlT^SJpq zt*UYJONVjurW6+!r>8GklAgX$Q63rJ%D_i*-`_IGxb?Sk=<=0=M#^hfuNG?m?H z+R4(Qze!<#R~bw^@V9f~X)7*bC7H{~%jWJeg5|g?4Mwdi(T8#xuiSXxx8cN-DwbkK z!)eHKgXw{_QT>q1`?Faubv(EZel<3N5tok2O7E>|FX?UUa@xIj5fY?9oojGVM;aQ_ zplnf(Hj-}k1-dNdTSc1aR zsvo`j(apmTEb{ckUSraR_37KIxO}9n$}%pO2vgL{Zyx?=%Lct*n|_mq4w_se?inrq zZdy`WMVhokf)+QeMV;@-N2e7=h|H647f+}yS7KTH(kxGH5APe`SZ4%lm6#{=o_Lav zc>*h~;o^yjgXE0UAfGUnRd~&~WtIBQPGs{{XAmCjCx@3iXn`L9QOosXrYYr4(-sj= z2T>Y%Xi%;+7Wg(W9$kzW%YI*`*AdZ6x{1p(o%3lU4&)wBI?Dw81st3PWty0$o=rSd zCQgGgt;y5=kVb`WMw%&{*Q+wxUcr~PBO4rgBI*R=YU9HhZugT~u3 z8tXkQ6K=oK#dy=7_0vTB(&eka=58moj8+n30^q=Vq09C#_#uDC2T;5bdVcdcaJO}| z6rD`motQ|ZS&K9SEN{5dAoc=9L+1R++rc>_zV4cy5#%K5*?^(yfM&bI7>w&&Q zKY`%?9;JMihIww{Zadn8<8B`iN@+L2c1D2fX;Bq9K0GZ-(i`fG^8`w_gEexi9;ECVuXCA=vfOEW?7Xr4U?NT>XNB! z8i@H&hqSZ~dTiagu{U9U=dzi7BlXYddoh0=BUiy{#dNuSET8L#MWVQwN8b^DJ8>P6 z?gi~_JT$Mf4m;^V$cNv{)R9$84puSw!{2lLneS7^@%NH7xBGjlKi2J_a~#(n>cHL4 zm^j?}A9S8E^}mV5CCkv=)b35)oeGQ8bM4--4Z5MNTQ?z=k@47U6N-E6@LS zu2B^$Q^-R0l%fdsXk|Ahr-8sV<8a#tI#r9>mcFz4?4~c8-gL;Uy=l~zvSnXB$ANs& z*bHS4p}ABLc~l`^TA*@SK`5(daRuDx*2u2e^4hg;dv)*MDZkH^0($?R@Eh{t?e&l3 zEh9)S_os4Fxn zO-xf%#G?WIXZLN;JtC-VLU5hFEos(kXbHcG`3prwMz^oRxEyDUWW>A5Fz5Ax zY))ahFx8PV&AH@d^Q+w;;~_0{ZMImurefa+*3ULO-cv5C!=2w-@x2N&(zC#pAwk_` zfM?KomOx0}eGY%Y>GukdGkSAz+wbJBuYQOnEgMGvx2JC+gNpRQ5J#cXyDk zq`>?KCp_kduOyw&YFeNDL(H??Py~1>1*vy(mdJyXJ5LxsZuV)#^4Hai_cm=ZzEPBE z8S=0ByHmz**fd%{{Lk$VCf|GA*a7bmSNu5g0|9=Y62LFnvPb4$Ag4173HghozbP$d zO6s*Z zSe?=690u}7gS;aQv_`T=OFn3N%`+4$X}9N9W)&Z^b3Cyywt zOjctL8f}9sE6U?rH;un9XX{1Atva-B{9fx6s~)oW8-E(jjb(T4$ev1tZKwi#&+~BT+z9&Kt2BL&WhX@5 zUY=aF5KnzpW3bN#Z6U3-q}gL`)+K1!^lasPt33-X6MEAnU00FeHn zk(q65R_DVATR{C2N}AI1I1Remm(p`PmcAUHFb?)WlfAy$DC6F(uZ+7FcF&!+8^%g` z{>v}VD-OGyxNyNF#ld)}@0$rc`3O(0wSNS$uN9yN$a>d}DsLK9ugeN4t<=6xM@YOA$t$EZ`*rQsVo$NB-hQu5j!c~R2zNOIa9T{c1W$v>AaKcXvp z?&y(o=ZzYbE;F<5+`S;%pTB$eyqvUZHB1MS*Q_Q30MR7R1Ai_ZX^jh$=d%yV(dyUA z<{+lM17v3;()~vrS%`Gx$ef3Ab>D`a+xJO3rRd+BJa}pJ#z(4BXsuk`Bkh&8BSyB- zms~!+Ysk9IkDco%WP{oU{4ddw#Oc< zyZ8I;tzFPEC&qUhJZ0F>UCM@TZJYJ)-dJCFVBh9ev%^E?_u6u7?^eC}&><;3yR8PF z(Ka*~+o2x|l8*6trXSJ1gRo+!!YZw%oIjs!Kcgviufit1PR`D_e}95nKIf5qsu-%f zzCL9>{Rds;tiaIRx~gUU6^TJL)0&RYj9HTU=DQEhp7=-lZb_X`YEIt))6%pJr2|$L zFSc#+z-l!wzP|UyqYElyhWUy9lVg%H0d7Lw(7F1BTMGLaejI1(3sK{+cv4)(kHck{Z`3i z+a@**3SKrLEpy+T`;#{mDLfSs`2(UuiZ|=kCZT>y0R25k33a?bM zTv0Ff*D<>}F1$0A168fcc12TVd;V4)G<~IMyEhjuf2%{Y`bn>)&)B!Tv#nA0ZcXZS zESa28r)BHfam|!gwK|n5-K*~KNt1@x?OnQ5$65nMjx?&qCf2W3txg@eqHS7g8iZsZ>-=O`u{@VId`|k2;h@!EoWZ9OHvsQ1~ zG4Gfzx27~`(X4r5y~IL@X7SGKH+@S;W!ba|ONS2By`$nA*00|>7+MiLZVv${kG%4Z zGo0-R3p{W|-!o;(9;2I=+_B&2^-%YbC1ZdLT%Q^N3b(^$p+H{uuv_`dxHKWSwUB`|cn$W3aK=%g2 zCXE`VSE*4e>XjN(kUxzbFLRwi$N$@yko28$*?ve?X^5k76Ps>P^j(Y6*LE1SPLTs< zNWFG)WXvm=6!cm+ZB(n_1JYUFsUlOWqm0ti;5l0u9s+11CH$=LFQPU=_7*D-33w0? zp5W4S7%$4b?l?zdhT>3o(`hDSnsj{-NWKO^{87+%+&#yhXM3VGx?lms8?8!CjPM%o1_SF6k zEn1{@XxThfmYTb9>rs&VTjWnK%D%h_@T8Obo0&x>M?;60>{toi-|c<(*n(wsu_>9yY7}x?Q{M?b;3-*0%kSAxiJ0 zo?Tls@6`+SLu0aj=yyEEl)A!WO4ciCzth{Y?<}@2Rm-V=-ZkDbetGjvgk)O1ZXL=r z1LNWZ=(CrX3CwiI%=tGxs}-C+WXd|@$)!(>-`39_Is2arZ$4O`IbzbbZBx?LR+!m+ z$h?JvyHD4urR^$T;pn8xx4*kG>1c(B-Dz)q_+ifGu^Aa-C#+hf1`e1zbLg=7^SQn| zgSK+d#_TVsZ+IUF)HlZLdFxv#z4%bvwr;oX%6wP8ltqnizE9bg6xeWnkF>2Jn`Td5 zJ9+kr-MgDMyYt`{UjF>Zi2lQPST1mNxl&4z&JE}9IdgKuW*Txs?#SK{$o)F|CHUrl z&fXA`%f9f@m3#NDkdMXa@#9D1o@I2_7JaaN$9ox5I(8;QA#mbqP-;u%ZiQ-Nx4ReR zA};*q%TwRWPY3;&Q^|fKUuUn8c#PAB_%(lH9c&c9qX{{c9Ch<`W=zhPbklsK-Tag8 zbYa)SUgaw>MavP5wB2H=OTmP_ac# z5rwtsVg#=9xMt%TiK_{&wYcWt>Vc~-t}clCy+!d6y`bP45X*xv{2p)Fg56oLVBze)Bub<86?^oDNV^r+C^3S+TY-B3-hB_h zn@b|hGEl4l&SLs){4ONw<0_BmJ(Tid3F0P2;GSPi6?N2Y@Zp{=Qh;-ywoohqO+9e$ zNq1$dsE*%*={XD+o0KAsGg?Wplz!t(-X)xVA*ZL`J(X*CR#o&<4vQ%Ky#Nl;RrG?Q zGTm{N#MMs`Uh(J)#ljd;PVWIA!LcSfVqYUA!r_VaMe><~#BJxl6Z0)~GI?yA;)NT!DWR?pJVa*A7G0sNT$apt^f@ zEr*<$e=orO*+q4+Rji{rp|VrndG1tp#^+8(uk&pWs2 zGmd+fiD=_%K>KRsbwn&+{yF7>+5yR;tGq7yDGk2gtX>y;)eNyv9W16RmBePW>+MR6 zXn^PG$`jFB*(|V5lJlbw_UX7U#Jv;lFa+9bD+R@S*bTgeWKSsr{tk3Zvuts^MspY$f8g-icfeiAhx`DBbqWVHjDjezxBEN z#J>Xgj`|OLuSbY@!l|!;4j3TDfsXxrQ6IF)$wMb^UHoHRK>Ratn*6h){zi)xUV$RZ ztGCF)J|dytKtA5M28g59AhgSqh_6rjZ3vfbsoEOt!&fw9{c;YvsHNzQGMoKLckpot zXnMr_bm=wo9qEZZj>aZWT0q9Zc+w{LhJ@gBdm!C#-5KW{jaknl8k7kG}7H`Kjt%KvH zwX!&Cc_P+m*P%a~3LnfSKGc203H_E>W%*gG!m-F_tha$9OeCpapgu^>P}kg!7C~;& zHcZZR0f*9eo9M7G4h4RzKh;i*BMk+;pcpb=@KNBzx3ONPhC% zoitKABw3{P!ZLeS*wm(?9_VB~x$jod31#f5XF*r|fO~rpk6_}_kcU=UJ~7eywrB`h zspqAN-TGG4^FNT4vXGSnBGeLuG1UOEo^+O*XHGs4k7yj{>NB3dyZH5jyU_YNw!Pr_ zi^mer@!$2Gi~ldbBMN<#W5vtfv+kp@5RCyev^&rG$lXWBpxvK&>3diI_o6%DaXo*& zFLw5qu72~SchA1q9CJPEo9XXSjxY`T#l0$EX5zdnZ(>g3jk!r@Je!K&6svTr5aL5z z_y>LRx;{yqq)Xk2DC7k&rbd5^G4C#U3h`cwiiz02JQ-^O^R)r!_m+$H${S*ydKvn< zx7cFMa?Wiq=TZ8h|LKSEK|K2M?V^^tA8}&3iwWSnFOA9d3vtQcf%Cx%+*h+)uwgD|#iVp%VCVQfnI?$SOLb-k*J{)&&|lr}^3 zfgWCq^HetiUk3D01;q=`Mv2ne4pAK;f2&)Y&^{;dqnhaC6(>4l%-;oh&C|TG&!Z47 zZ|sxE2c307M1bBQidAgZ#zWUGhi=@1dt+RIxUS>xr!-c^??S?+^}xK~G;{~_g1T8O zx0J^7EBwtwukS<`(9^CmwiS;1ThOFO-MMp=LqXIm_gt z&GSw)BHwMeE)nl=Kb9vi%EN{CMR(%O9>-sN-9}pQL&X@8@n&XUG zz_D2khYoFsF_Ecjo8mqT*JAZ4`V!(R@Da@zOGHqeX!Aq@)eqO#cri}tDq5&NK#vzg zJ@n^#8HfD(tFy##wHfZdm;+A29B`6IQ&)=icsEe(gmL3>k?EQrYUTO6RMZP-7c+2m zCb=S6bpC@iBC4Q}UKBbwKb~2H#jy&|n_;M9HGVg6ya(9GK`Y^n88%^<#ITj)XFPAs zFvW2mzuWNdw*0o8;}blY!FXmeoW*c9!#NDo8E)lVwlU0NxSin+hC3PVW}JH%?q#@- z;eLj%bG}EIhNBFRF?@sJae~sHQp#bJqgsv1sKzm@&aeg`V)-y64tOKZ_i8}mfH!l% zn>pZ(J=zqTg*f0Xhy&it0dGMZ@MaEp3*vycAP#sl2fPJwz*`UpyajQK^*WF!~t)_>?fSW0dGMZ@D{`YZ$TXJ7Q_K>K^*YL>0AVf1Kxr- z;4O#)-pm1S=72YIz?(VXtr7>kRpLN?Q3E@i@{5|H2w-jaXXTeQ0dYQr<268UhQYuV zDiR!10joP60M>Bq2CV5g30T{)6)?r|Ct!Pi+X3{4!dLtjU}yf_MHImA)$mCQ6>At~ za?14#H!$4D@Cf5M%J3M&Hy9!cD!x5O*kn!05hVhJC=tQx3~K;}fzBTQYdG!#)`quS z7}8&Y$6f))kAMk?=NgXvFMk4dM~)GqkRt=omth%(p^p1_LUWi(Km>BfSEvP~QR4}}T9aX2!19o^UjQ33Y{Iaq<5xUM z;@>F@+cJb*8qYhR6y?F&p8z}a@7?@%55v6-_c7eh@Cd`B439BXiP)=|LG$ z4BudQoZ(5P>J-D%49_q;M-+ksC=u!o?fRhG=t$xhO-#XW;lmoIzg1^Cs9QdcDw}`?)Vlkl3@(PY785p)~cXp z2{vJv#IP0QzY269!4$NSD$s%SyDh&><=-6~pW#VI$2q{x{CghbT*+`1!_^GeFkH(p zgW+z*vxnhchWi-qXZSkfKf?JQWq6F?8w`&#JjrQJF+9x>mLgDcjwq2uDHqf%%B4mT z2h?c5s?d020KFN8!n>_1ICB;-l3@(PY77&MU+}!T<1%0kM{B^EjuC*h9ln66j*kI5 zI3@yibYuZ`=HD|I=S+sP7|v!mhhaLyd5nK0!&MAdGhD-PEyE0knVkE2h8q}eWO$Nu zKgIAg!!r!e5e+CiN(7k!osb!n5n2?bh887QonZ~YD3-}6mdPlV$tae|D3-}6mdPlV z$tae|D3-}6mdPlV$tae|XvP!Gc%m6kG~teAFjNlB$Gn3&ghO-&YVVKTvu45BY?q&>o817}bkKulXM;IPuc#Pp2 z439HBM|nZ!K_SWr%GG!(g<6wgUBGJKwum4Nf*Zj{2qd>zzJfqqdedYrg^q@2g4Sjlh|!_^Ge zFkH(pgW*;#%Ql8t47W4f!Eh(TU5>@TxtrOLerVpYVkGm+EL!1gU?ijy46z{Ywpu`HG@;3poO*jvY4veff78hN1soZC@Uk zRdKI4EZB)G%=RwBu>Ts)PpnOA}|$KFb~cIjnj!UiSu}L0rTlMKElxqw9bPb z{}V79*EbK;YL;?h1+kJ?MXV-nA!8Ghl$V9{!!vF;&I{$;wj>3;u+#u;yL0= z)N`KrGVv9S@EF{-9m(2JFBOXes<~ z5m(zljGB0k(|D`TjUOW4_eP|?3g5T@?8p4w#Njud!=90N){TdMG)CUo2aILjNz_;M zc$`=LfNmc3;2AX@XNul4(dq+?=bov=?h=++s@XQ>K zdx38IQQ|S;apDQ$3vBf%=1&vP5YH0N5nseJZM^joy>XuSGVv8+m-Y$H3iKn+3UJ|G zfS$rgK`-N8@Ea>0=LyaMoF^LN^f`d>qH)rV9|NZ#KM7BFeSjlzUQNPTp)r=|BS(7-jCUIm1)d*OJ7?i zVPruwe27-Vhp>Yu)jrl_jEhf!ZsIOtJ8?I04=@?;8ZQHbh?zG&Lq3bxr4i5MIErU- zjc%d`n1Wir1O^coqht#HP5_AV*pKoW-9!&?I?7)I1`#uH2bm5Qja?d13rA5)qnqdf z&Oi(=3>ZYzckmgwNAw5cTXVo^#OcJD#05k>vS#4C)n$$nj}ea(PiTaffXb;YD;LpC z)K7p9KfW3O z3n&Q-8r?(>a6T;j5~zD~KI(o3)V(<$<*^6lHR|4+55`~OH_LUuq_bbrd1p`OJv|+7 zLzURC<4Ec7j7A+tN=HBR1?o6bI!4?TppGM@TMyxCoQ`*p{=h}dXECqiNa^T1jXI8$ zjxnN9$C1)8Mzn>~#52UR#B;y_~LeFQ@aKo6dV~CR)@N zI`sNqyb&Q9nTZx@yqlN|Z)Bofe+25cs!X&?BWA3D`rRrM?b2lyFyF!a0b(cdAn_3K zFj2olWulE5^*dB1+Ne>#LuI0k+S+O28RA*uIgMx?%Aj>ni`Hq3(>l>QoyT)7a02&C z0WLy|DztxzcWXp>jT4AdfQxxPFXs8Y7_Ga4J^FlJ%>G)8cImu6s~1DFMtxQ3;u+#u;yI1ba}~ca9|?ah!Bt)3E@C@zH*pWJ3?up^P{+*6EFCj1!&~!H zKpitL!@KjdKpitL!y9x5P{+*67&9-!9q?`BbAE^jUS{byd6}i- zX!9Vah?4>jsIc^Tf&!J>4WybRY9jXF+VhU>{mL|(Moa;hz-+H$Hb zr`mF=EvMRYsx7D5a;hz-+H$Hbr`mF=EvMRYsx7D5a;hz-+H$Hbr`mF=EvMRYsx7D5 za;hz-+H$Hbr`igtt)SWps;!{f3aYK3+6tR5IZ!4&_f@&+Mwt{La zsJ4P?E2y@DYAdL=f@&+Mwt{LasJ4P?E2y@DYAdL=l4>idwvuWqskV}8E2$Q59yk*! zskV}8E2*}UYAdO>l4>idwvuWqskV}8E2*}UYAdO>l4>idwvuWqskV}8E2*}UYAdO> zl4`4{wu)-2sJ4n~tEje$YOAQWifXHmY(;if%3~hJ?~QkzONF&mSWAVqR9H)ewNzM3g|$>zONF&mSWAVq zR9H)ewNzM3g|$>zONF&mSVx6*R9HuabyQeKg>_U|M}>7%SVx6*R9HuabyQeKg>_U| zM}>7%SVx6*R9HuabyQeKg>_U|M}>7%SVx6*R9Hua^;B3-h4oZePlfeVSWkuZR9H`i z^;B3-h4oZePlfeVSWkuZR9H`i^;B3-h4oZePlfeVSWkuZR9H`i^;B3-h4oa}!1z3( zk2pUY@P^(GsOPX6a1ZGZ)N@Y_jL$bPKHtFjd;{b24LI{rlJWViw1cQE>};i-t+cb1 zcDB;aR@&K0J6maIEA4EhovpOfNIQ+R(?~mww9`mCjkME9JB_r{NIQ+R(?~mww6l$N zw$aWu+Sx`s+h}JS?QEl+ZM3tEcDB*ZHrm-nJ3D9x@n*DZ2kq>jogK8ZgLZb%&JNny zK|4EWX9w-ckRUQy6IWwCOmg()bkfju>32ao@H+0{6!P&{{(qGf6;{Kgf63J znVUF&(Zub}U|;F^izYlH?Zj`+YW8NbH@8$(A$tqiTgcu*_7<|YlD(Detz>T{dn?&n$=*u# zR}_OkBYPX! z+sNKV_BOJ&k-d%VZDemFdmGu?$lgZwHnO*oy^ZX3)VF1i2W{D)2Ji%yI@VD zj@a*lg-`H}ab3Qh<=a`lo#oqEzMbXUS-zd+ceDI%mfy|tyIFoW%kO6S-7LSG<@d1s z9+uz3@_Sf*56kai`8_PZhvhqPuYcL1^7SnB|59bl~ktaX63I$5iewK`d=leIcotCO`lS*w$^I$7%=YaL{* zgRFIswGOh@LDo9RS_fI{AZs0BtwXGJh_w!})*;q9#9D_~>kw-lVlAwcMC%T-)?wB< z%vy(8>o98_X05}lb(pn|qSiI*C~9fcQ6Q`gBkCy7QPjeI)Y7Pdh9oVAX#)(O@+!CEI+ z>jZ0^V679Zb%M1{u+|CIdI7brS}&j$5M?y#c+m?eqftk4PNB>dppMdtaGDlQ)52+5I86(uY2h?2oTi1-v~ZdhPSe5} zS~x=sXK3LJEu5i+GqiAq7S7PZ8Cp0)3ukEIEG?X+g|oD9mKM&^!dY54OABXd;Vdnj zrG>M!aE=zv(ZV@eI7bWTXyF_!oTG(vv~Z3V&e6g-TIga7p^GsD%q8Q!y9?JejXGA- z#TY^to_79-ypGj$;b}*sj@5MGX-DUEtftG-v6?Q%5V{yc=wb|^i!p>Q#t^y~L+HYj zk1nZW2wiyc(WqlJU3l`*sADxnHB5c42F%!2?i4+6wI2oUoiK+J;x5v>Jc9t4Pa5FqA3fS3mX zVjcvDc@QAxL4cSC0b(8mhnIs(DQ~k2lPA$5c42F z%!2?i4+6wI2%hi|O93MC14QHph<8#TB0oSxet>x22O{zVMC1pE)sjF&et?Kh01^2C zBJu-7J^ApuRyGN1!C1J5UXB+SoI3Ts#hRZy#lf76^K=@K&*NNV$~}Ut6qUv^$NtQ zS0Gls0I5h?3|*Fv0_9BRrrHt6qUv^@=Nk_JE5XaM1%U zdcZ{wxaa{FJ>a4TT=am89&phEE_%R454h+77d_yj2VC@kiym;%11@^NMGv^>0T(^s zq6b{`fQue*(E~1ez(o(Z=m8f!;Gzdy^ni;VaM1%UdcZ{wxaa{FJ>a4TT=am89&phE zZhF8?59oCrEx0o3bHGgxxak2mJ>aGX-1LB(9&pnGZhF8?54h<8y)s1G(dU3(8KP02 z1A1kMMtu&r=>a!A;HC%M^njZlaMJ^BdcaK&xak2mJ>aGX-1LB(9&pnGZhF8?54h<8 zH$9+Np@5MdaMJ^BdcaK&c<2ESJ>a1S^lFp0ac|J0K(98@s7HZ^9`Miu9(uq-4|wPS z4?W@X!MudcZ>uc<2ESJ>a1SJoJEv9`Miu9(uq-4|wPS4?Wa1SJoJEv9`I-n-2AfurV)s~zlX1By(Noei@c}? zs+p=x9ale6SNwwf()^12Uh{YQm-t@_NDNpT@KLYXy|Q~1^=jz#O0V~NI|CB~Hw3;P zG$CkX(7B*bf@cPA2yP3$7!n#18?q*3U&xg{QGIIqTn?QXS`zwP==*&~_RZ@1bl>xR zuY?7Kxx=cHVVvkl&!RK^cRZ27NU+d+?ps8_>kdI!>10PH#}$f+Tj<5e=z*&2svWFh>;`QBbJQ#YGmk0 z$H>@`$s-qz+;?C9`-a~acVFs#3-4Qg-?~u)MvWZh9yN2+qEV|xZ5UNIYR@R&{lo5$ zy+8T>h4(MNf9?HM_rErJ>gai+b4Hhpt{B}i`sx^KO#d;%#yH0$k4YPoHKt(9rZL;c zbc{JQ=8ZA$j`_`)zea>aERDDp=@&U5a%5y&_j65EBKJx9z4W9nksW1fq(VoPGHVq0R5#J(7NA@+lD zJDtOwan9+^Mb3QZMrVU_pYwU=>&{Eg%g!%dL9Rir2-jp+nro?RkL!9|Sezp+HZD1C zVcg2N^>KA^d*Xa?=i}atdoS)v-1YIH;~nE;$0v_pIDX~$_2X;Czv_0lH@V;UBzn$y z-txTf`4o>y{U;2c5I14^ghdmYCbUnuII;J{sS}q>Y@c{3epY-<{QL2rPO>HiO`18W zX43IVZ%w*BIcReK$-^hdO`bk^!Q|}8`I9$JuA1C1`PAf(CtsQT`Q)#rES$1r%JM1O zr|g{4G3EU!A5RULI$-L;sY|9VpZfOHcM=9A6eUz7v?Lr!croEZ!UqXg6Wfy_l9ndD zp6pDnOa2%?4pfw~KDBphSn8dr6{&TpSEnUUYnyg?df4>Y(~r(rHRHvZ_soo*Id$f| znK?7p&irteoK-Mu)2!{YKA3g&!9@?g^57c}zWd;Zv!~8}V@~fmgXTocnLMXx&iXm8 z&$%$?Qko-eRNC6K%X0_L9W^(4ZvNboxf|wI%&nW-G`D?j=iDoEKcD;6yy$sF^A63s zJU@E=hWW277`32d!6yr@r9Yki@xq{m84I%)KKIZ)56ylk`=R!S-pv@8F+C$KV_n9k zjCV6-W>98RW_#w37KJWKTvWE`!s0s@XDog-Yj)Potm9edAC7u>>cdALe*WPXAHMML zr6tiz%9dPOa(T&@kMw?I@*@|rhh(qGe#2Y0bkWlGr5`PeTUNL1i=2#{cXDUtzP&tc zdB*bWCxGbUe9k^ZLQ8(eY7C7U{S&Pf}LxI zt$B0JM{B-%EbXz*$38DwUv#wSaG6_*Gs}mhLuE>Oem=-dAD?AX;JB! z(!Z_^SlfT?thH5ZFFrox@#og1uFF`rYTep(W$S9zZC`isiGfcHdm`$IwNIRR;Dp$wdBEn8o86nIZ(g)HfAhx84V!mvKD7D#=8KyzZ~m&R zciDiltg?=>-;`Y~pI!b|MO;N^Wkltvs?@4itDV)IPy0Q+m?Z{ep z?eyA3wX143)YjGRseP{Y_1br9KdJqqu6Ny_x`?{?y4iJ0>eke4s@q=IS$C%H&AN~3 zzNqhAKd3&UesX%OheZ+&g+rL7-sz1Aoj2Q-dsbT`gy z%xcVUgbV+{e@{1VZ)|UTuJK~y7u)XHHhNp!w#04gwjJO0`SxMkqqa}pes%koJFFd1 zJJ#&ju%lteCrznM8BK3DuWfE@320f~a-`+8mTRpMt;wxfttG8>t#7q{*yh(Zu+7<4 z*Y?UY1D=V0X5lkyp4s`#b35hE(4B*Jj@~(X*N|PSc5T?zu@Kt&E22u3EAV=le}l)o{~LB_Pn>}@}4jD_TD>a@94b~_RiXy zv3J$p4SO5*?%VtP-q-eC+WYaoLHkDUi{CeE-;#Z6_Lc2x+Sj@7%)U4Gy|?emzU%wL z_7B_d+@HFC;r^xjOZHdoZ`*%l|BL%C?Ehf@r~9vW1a%DQi0Fv#nAMThQP8omqp_pC zh8n0#RNfh7ml94I@`bl}i|a|hl$@ZNz>4*az z1)VvaC7l(WEuBX?U+lcl`N6?K2Nxb(aZU3JM#RIkB)rt?8s-AKU?$cg`*)yGmfr3+H~~Nv7lp7#|n<^ zId<{b<>Ld7FFf9H{M8eoC+3}4um7{~*Mfe1Ed5o8NAT`1v1aBG{fC3rvwz6srj9p?DL+@j*V!U9K3RJ8uz z#2ywRO%c1UBd^%ub(9o&b8=UEiyn0pE;pP}HieB*%L-Q~tt`qbF3Iy2I8ZaUsHC{C zz?d)wtyK8Ez$$_NbI=eVc#0-39AU-Ra}9u+~}jzu&)qX`BpBrVsUoF;JQbMf6st@csuE3}pad$tpQ4~4xqTir7sMIWuUlHeWfrD9mj zgC(uh=G5v-uwSd!zclz z!)#rDjDP_cK?Cv2Zg*ODS%dI(gdx`5_^!ac;2mlWv%)chH3EO@cpv^=@P2DF{t7Ju ze{m6^p+sapEsJ;t;KJBTA*CQ}I~aIN6$l*i?d*i1s97onb24Jsr`!nOLDW z3t!osZOy?IVJ=!W-&$a$TMMzOEW^sgdZ)#BlXw_wWFA3`$!i@)G`<2eV=v>|o4>)_ zSOeyjcjFrtox%_E%>I}^+hJY9_o3=>rFmKeSRYuQ;hU{Ttv^|xTVEi~f5Q5A>-+e| z%~E)`5uW-F^v|2tThsj)+OsF=!4%`zsHRG zD)hml=+S)md>=gj7|vpS4wa%O)>@BSpIGax^*FD;Wj$$au+CZgt*7wC&`s86>x%WM z^&-Bm&|3uJr<;RCi1k1CG;1IHENWj7X5A2$=qLJ%+r$8IyBH|$5O<2Z#2_(P48c!* z-Xrc64(m(nFZlNBFcB_>ixFa^xKE4{_lwbDjEE4C_>%Kj5iMe@{}QqIMQta3MLbT7 z7jEG}+-ahS7nAU-;#0&_>m%!zB0(gIB#|sqM5>sEx3n2zrg%Wi5)b10opUUobyB2> zx%k%2e6avuC|QWFSY?Pz>u=Uq*2mVb@GG2)MV5G2ED?{0Y~dA4#WIm2a>a77LaY>d zVwHGQ&3Uk2JxiWD4r6V#AZ<@ z%B^>;U*L-z?^{2!KD2&n{ajRtN>L@M#nWPos1dcIPSlGAu~jsRZDPCFA(}+9Xc4WV z4PPqUDRzl=v0LmBd&NGnUv!8AqEj3chs0rVL_8~wieuuqwO5=F&xvmfpExO=7cYoY z;2jXq< zL-8Z=pW>qUvA86DBHj`ICEgW374M1v7VnFni4Vlj#fRb-;v?}(@v-=oxGa7xej|P> zJ`ukYSH$ndr{WLds`yM?6Mqz+i$94k#Gl2N;xFQ_;&0+B@jv3axFIbmq?AhfNq-q2 zd&%B1PzK3h86x}0P}x_8$$qjwK0!D@-Yy5qJLH}6E;&dJmP6#-@*a7wbjYD{m<*T0 z}6PLLC2yqqK_%PDfIOpu8( zNhZq_nJTBr>2ijgDIdU(Q9meW%Q-Sl&Xx1ze7QiT%Z2hGnISXfBDq**$%o|<`H0Mx zUb$2*lQ}Y1E|)9hN|`5D$wy_rTrCS^plq#=da~&ym~}sTYpwwwN&Bv3RSLJu2$fe(^jfHwMspz@~t*}#o-z25BPr6 zcFZ6j#`9Vep3}agR$H&C0#&HisK->1Dpn<`RIOEyt99xLwO)NoZBS3Djp`}2No_{N zsa#d4N>!z*)zfMVeq+8?)v0>bpth<;wM}hTJ5-ZuRxPSkwW(*+PPI$5tKDjk+N<`d z{i;J9P@U?aI;0M(BkEaoR2@SM>x6nveOvj|N%g#XL7h^k)fshGom1aYFRGW+dG)e- zMSWMjs=Cx`>fhAs>U-)9^?miG`giq~`VVzM{Xo5~euzlef2xb>$Lf;$iF!xazN^`i=Un`UKy)zoLGxK2?8ESJh|gn);*q zT>VLXq5iDCRDV%_Rew`ossB;e)eZd-PJDh?`T6b6HJ;I zki5(bu7DgnNd~dE1Y0`km0}q2AgTogq}YtPOoCE!3QN4pw7j6)ud}^UjE-D84M?#K z=Q0VN)~zIXMR(p-6B}*Pn2>3Byj|_Jt%t1Wu@OAIyH@bZ?!4dhrQRaHm4JX5C3*Qd zxdC}hdd)Cx$TMx2VYeaA_Sy`iHqTCjW_;ZcIb){GTNOOBn<98scRu8S9-2ZPy=7xX zQEqNQzPBJJZ&|=B@3PX8+<<&0A+vgx%kQxfFw6E*J`=xLP~n#k2$*fxFR<&+?olPA zpvOkQY`cDe?d1aRn!@6eqQW&Rb5%;g3YA;1qSqYbheG3rIkq1Pne>^nvb11@x2SY= zzPGfbPhrokfO)otB3r|}9<(7vJvIX7*&2%MWWHUim`U*bZr24DcjrSE^e_-o(qkiF zfo-OQiQfX^a4|OXHe!NFMvq%1k?tH)^yRGY)1TFgd912?hb=E(>uwX^8|D2VDMFswa#B^e* zM*F-^jSfoCT5U7lud}@pQn;&^Hi*qslV-@}0+#XUA?KX%-BJ55Zo z)6{W+D~h~pb5U?NYu>{U$fH7Y@oNGup~D>H_scAvZgo>&F1djDJACk3|uw1D`d{OCIuUDbnE>*O$FrZjBD#o9QDnZ)}zgmNKEyF*^@h{Zw4$)?B z%If{y4)QXZYg`f1Kfu zGyHLeKhE&S8U8rKA7}XE41b*Ak2CynhJU=_A8+`_8~*Wzf4t!zZ}`U>{_%!?yx|{j z_{SUm@rHlA;U91K#~c3fhTm=Y-G<+7_}zxzZTQ`W-);EahSzO)-G= z*KK$`hSy_wJ%-m~cs+*KV|YD=*JIl4G5j9G?=k!y!|yTt9>ec3{2s%fVE7XZe}dsp zF#HLIKf&-P82$vqpJ4bC41a>*PcZxmhCjjZCm8+&!=GsQ6Agc&;ZHRDiH1MX@FyDn zM8ltG_!A9(qTx?8{N`!GnP~VE4S%BHPcr;ThCj*hCmH@E!=GgMlMH{7;ZHLBNrpek z@FyAmB-8#R!=GgMlMH{d;WzgsXR_f>HvGwkKiTl#yk8|7{$#_SZ1|H6f3o3EHvGwk zKiTjn8~zl-pJLjdV)#=Ge~RHxG5jf}{V9e&#qg&X{uINXV)#=Ge~RHxG5jfpKh^N3 z8vaznpKAD14S%ZPPc{6hhCkKtryBlL!=GySQw@Kr;ZHUEsW!jM-1lAPzV9;keV4iK zyP|D=SG3LVinjS((Kf%!-1lA4HowcfySmJM-xY21yUcyx6>amoq7A>f@4L)>-(~Lm zF8jV8lVa;bO8>;9*!L}@sR0l1@i^ddJ9&tY$N`Tt34G}0qf+4GH*@+v5tCw%ccjLi zJ>IcReIcx{BMux?eUIn(|&urW81Xf9`7+JsWAbW_KEuh6Z`D6M>~!hc6+pA+pycC9osg0s{J$- zi|~}LkCd%KO0ObitB}&GNNE=-y^54}kXD!GH%w4w(FF+`5A0O`wEGRBz)U3!aKd;Ce zuqL+{uTA#RghaoT(xO6c#2A?|_C+8zCMGU07gMRLy(PIhfrz8!>bc&PAtfsj%dzvt z!OQd3-pq#-Ls-Gh1K)VjPEE9(gOtueO6R1e*q6lARQr;NG`Y|GWw|+d`T5?c;?>L6 zgr#=}6}aQJ?(MJN%KLZk)9>f{MZHHccJ(**ef?@5kU*=UjE;O=vR@DVMfyE8Hz1Ma z0+Q?`*-ldIB-Ku)*~xS}nPDe0?c@PFnPn#rGU<(1{o-OB!I^FEp2H+?eQr@b@&-i&i6Qwlu$(M}ikI^uv7L?wE=>#x^k@ntAj3%gwMJK^l8Uk7y2egqUy-H~QZa z7vioUhK-mFw&O{rnjK>@2iPBW-VRkU->+vt%RV~4yBUG{6yn~n9sw~^th+_Qb|lR< z*fZW{m$c(?%=f<~Zf7611AELP!ot90x6|w~gT0-IYRT++r_m#y4%u=wV|T7!3o`(!xFwpme50FLN{5U4mQ&of|e_7E%v+!^8s`1WFC_~ z%djpeKR<67&yhaFo0ny~bEtrwbF*kk-m%j&mEyyPlT%>??E`;8#g3g zB72uSZeJ^dcw^$ez~zOdMJA`OF8Wg1yEtzhGeNvhF&i-7mc77E((PoSojhbG8FrFs zCySWa7ifKVq6}uV44pADbk>%^qnezVf;{NP4LOiEO6GFB#d+Ssb$Q-ETN#e_V)@cF zz3q#m&gd5DdUh*y88Tu|cT8OS1V?)F{-F!oY+99}(^e7(XGeF6Aq>3>PSfTXz@zFtXVo=3})vJ-s+bBCauioh{PiZ3u}nJ*}5 zX>z2`&)(yJ!SIs-ej~CSDK+6<-4rrggS9%JV=!89lh3C{gnN@w*FVB1vK`hrIL#O=|MzK{rq3pOKt zeX!q3VNbyQFoZtwe!Xc8JZV``=;LWVE7hCrJ{clz2Wx1ABi=FXCM$g7bw~R8Mnv5a zAL$GGzmEAt(lQ+H7jaTr14lTbe7%#h9jQD?&_Ha=sHvF|zSJke6Q2(g_#QnN`lH8g zcj$vGhAM^M2BX?Qbg?#y0b=Wz z;S*!vUPn~8`(&UPfG)T*;$#TUgPvuL<{20>II+bThc8>7X;bHByr3L@j=?Xek$!_R z6BBVJQLuj!&Wdb(I@`lYC1vM?`}~r;IXKN!l6Nrj*_k-&P|S-SPSxEOAMPGJlm?<4 z@neT(8aa1F_(Jq(x^1%Aan~))u>A*3xiwMY4o7^AJIa(Ba%(x$+<&bJzK|p;sR^GE zo|^6Z|7wpOP9ww7q`~1Zld8{Q?eLH!oy>q&Y-=cn(T4E+}>kl`lXEwzWSw(fj$QsAt(DJA^x9J^`c7R|%|Nx@s# zM*Ne4|5)QlT}z+Gx`)kJ_E`%ua0cVXbF=HsfpcNjGClm%h#5?E9lPobeQ0U8If2pL zH`{sN|C0T`>#I@!%Vf9s`~LrBvVYuXqct;6DLu-0F`j{&4jv;g{BFI3jQM{T{kxuw z_}A;*;*`jLz1}}=UsMFH24f?9QTCk<4^!XijkV9q@HC@`k`=zj7nXu+!>DXLi25RHBM0|%cB3`$DOd_H)TOqrL6BYtuW?BRbx!~X#@{FZ+J literal 0 HcmV?d00001 diff --git a/radio/src/fonts/lvgl/lrg/lv_font_bl.c b/radio/src/fonts/lvgl/lrg/lv_font_bl.c index a4764d3d6..b44650540 100644 --- a/radio/src/fonts/lvgl/lrg/lv_font_bl.c +++ b/radio/src/fonts/lvgl/lrg/lv_font_bl.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 24 px * Bpp: 1 - * Opts: --no-prefilter --bpp 1 --size 24 --no-compress --font ../Roboto/Roboto-Regular.ttf -r 0x20-0x7F --font ../../thirdparty/lvgl/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff -r 61671,63650,63426,61453,61787,61452,61931,62087 --format lvgl -o lrg/lv_font_bl.c --force-fast-kern-format --no-compress + * Opts: --no-prefilter --bpp 1 --size 24 --no-compress --font ../Roboto/Roboto-Regular-BL.ttf -r 0x20-0x7F --font ../../thirdparty/lvgl/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff -r 61671,63650,63426,61453,61787,61452,61931,62087 --format lvgl -o lrg/lv_font_bl.c --force-fast-kern-format --no-compress ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -26,51 +26,50 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, /* U+0021 "!" */ - 0xff, 0xff, 0xff, 0x3, 0xc0, + 0xff, 0xff, 0xfc, 0x3, 0xc0, /* U+0022 "\"" */ - 0xde, 0xf7, 0xbd, 0xec, + 0xcf, 0x3c, 0xf3, 0xce, 0x20, /* U+0023 "#" */ 0x6, 0x20, 0x31, 0x1, 0x18, 0x8, 0xc0, 0xc6, - 0x3f, 0xfd, 0xff, 0xe1, 0x18, 0x8, 0xc0, 0xc6, + 0x3f, 0xfd, 0xff, 0xe1, 0x98, 0x8, 0xc0, 0xc6, 0x3f, 0xfd, 0xff, 0xe1, 0x18, 0x8, 0xc0, 0xc6, 0x6, 0x30, 0x31, 0x0, /* U+0024 "$" */ 0x6, 0x0, 0xc0, 0x3c, 0x1f, 0xe3, 0xc, 0xc0, - 0xd8, 0x1b, 0x3, 0x70, 0x7, 0x0, 0x7c, 0x7, + 0xd8, 0x1b, 0x0, 0x70, 0x7, 0x0, 0x7c, 0x7, 0xc0, 0x1c, 0x1, 0xc0, 0x1e, 0x3, 0xc0, 0x6c, - 0x1c, 0xff, 0x7, 0x80, 0x60, 0xc, 0x0, + 0x18, 0xff, 0x7, 0x80, 0x60, 0xc, 0x0, /* U+0025 "%" */ 0x38, 0x0, 0xf8, 0x3, 0x18, 0x6, 0x31, 0x8c, - 0x62, 0x18, 0xc8, 0x1f, 0x30, 0x1c, 0xc0, 0x1, - 0x0, 0x6, 0x70, 0x19, 0xf0, 0x26, 0x30, 0xcc, - 0x63, 0x18, 0xc4, 0x31, 0x80, 0x3e, 0x0, 0x38, + 0x62, 0x18, 0xc8, 0x1f, 0x30, 0x1c, 0x40, 0x1, + 0x0, 0x6, 0x70, 0x19, 0xf0, 0x36, 0x30, 0xcc, + 0x63, 0x18, 0xc6, 0x31, 0x80, 0x3e, 0x0, 0x38, /* U+0026 "&" */ - 0x1f, 0x0, 0xfe, 0x7, 0x1c, 0x18, 0x30, 0x60, - 0xc1, 0xc6, 0x3, 0x70, 0x7, 0x80, 0x3e, 0x1, - 0xdc, 0x6e, 0x39, 0xb0, 0x76, 0xc0, 0xf3, 0x1, - 0xc6, 0xf, 0x1f, 0xfe, 0x1f, 0x1c, + 0xf, 0x0, 0xfc, 0xe, 0x70, 0x61, 0x83, 0xc, + 0x18, 0xc0, 0x7c, 0x3, 0xc0, 0x3e, 0x3, 0xb8, + 0xf8, 0xe7, 0x83, 0x3c, 0xf, 0x60, 0x39, 0x83, + 0xcf, 0xfe, 0x1f, 0x18, /* U+0027 "'" */ - 0xff, 0xc0, + 0xff, 0xa0, /* U+0028 "(" */ - 0xc, 0x61, 0x8c, 0x21, 0x86, 0x10, 0xc3, 0xc, + 0xc, 0x71, 0x8c, 0x21, 0x86, 0x30, 0xc3, 0xc, 0x30, 0xc3, 0xc, 0x30, 0xc1, 0x86, 0x18, 0x30, - 0x41, 0x83, 0x4, + 0x61, 0x83, /* U+0029 ")" */ 0xc1, 0x86, 0xc, 0x30, 0x61, 0x86, 0xc, 0x30, 0xc3, 0xc, 0x30, 0xc3, 0xc, 0x61, 0x86, 0x30, - 0x86, 0x30, 0x80, + 0x86, 0x30, /* U+002A "*" */ - 0xc, 0x3, 0x0, 0xc3, 0xb3, 0xff, 0xc7, 0x81, - 0xe0, 0xdc, 0x73, 0x8, 0x40, + 0x18, 0x18, 0xdb, 0xff, 0x3c, 0x3c, 0x6e, 0x66, /* U+002B "+" */ 0x6, 0x0, 0x60, 0x6, 0x0, 0x60, 0x6, 0xf, @@ -78,78 +77,77 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x60, /* U+002C "," */ - 0x6d, 0xbd, 0x80, + 0x6d, 0xac, /* U+002D "-" */ - 0xff, 0xf0, + 0xff, 0xfc, /* U+002E "." */ 0xf0, /* U+002F "/" */ - 0x1, 0x80, 0xc0, 0xc0, 0x60, 0x20, 0x30, 0x18, - 0x18, 0xc, 0x6, 0x6, 0x3, 0x1, 0x1, 0x80, - 0xc0, 0xc0, 0x60, 0x20, 0x30, 0x0, + 0x1, 0x80, 0xc0, 0xc0, 0x60, 0x30, 0x30, 0x18, + 0x18, 0xc, 0x6, 0x6, 0x3, 0x3, 0x1, 0x80, + 0xc0, 0xc0, 0x60, 0x30, 0x30, 0x0, /* U+0030 "0" */ 0x1f, 0x7, 0xf1, 0xc7, 0x70, 0x7c, 0x7, 0x80, 0xf0, 0x1e, 0x3, 0xc0, 0x78, 0xf, 0x1, 0xe0, - 0x3c, 0x7, 0xc1, 0x9c, 0x71, 0xfc, 0x1f, 0x0, + 0x3c, 0x7, 0xc1, 0xdc, 0x71, 0xfc, 0x1f, 0x0, /* U+0031 "1" */ - 0x6, 0x3f, 0xff, 0x30, 0x60, 0xc1, 0x83, 0x6, - 0xc, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x6, + 0xff, 0xf0, 0xc3, 0xc, 0x30, 0xc3, 0xc, 0x30, + 0xc3, 0xc, 0x30, 0xc3, 0xc, /* U+0032 "2" */ - 0x1f, 0x7, 0xf9, 0xc3, 0xe0, 0x3c, 0x6, 0x0, - 0xc0, 0x10, 0x6, 0x1, 0x80, 0x60, 0x18, 0x6, - 0x1, 0x80, 0x60, 0x18, 0x7, 0xff, 0xff, 0xe0, + 0x1f, 0xf, 0xf1, 0x87, 0x60, 0x6c, 0xc, 0x1, + 0x80, 0x70, 0xc, 0x3, 0x0, 0xc0, 0x38, 0xe, + 0x3, 0x80, 0x60, 0x18, 0x7, 0xff, 0xff, 0xe0, /* U+0033 "3" */ - 0x1f, 0xf, 0xf3, 0x87, 0x60, 0x60, 0xc, 0x1, - 0x80, 0x60, 0xf8, 0x1f, 0x80, 0x38, 0x1, 0x80, + 0x1f, 0xf, 0xf3, 0x87, 0x60, 0x6c, 0xc, 0x1, + 0x80, 0x60, 0xfc, 0x1f, 0x80, 0x18, 0x1, 0x80, 0x3c, 0x7, 0x80, 0xd8, 0x33, 0xfe, 0x1f, 0x0, /* U+0034 "4" */ - 0x0, 0xc0, 0x1c, 0x3, 0xc0, 0x7c, 0x6, 0xc0, - 0xcc, 0x1c, 0xc1, 0x8c, 0x30, 0xc7, 0xc, 0x60, - 0xcf, 0xff, 0xff, 0xf0, 0xc, 0x0, 0xc0, 0xc, - 0x0, 0xc0, + 0x1, 0x80, 0x38, 0x7, 0x80, 0x78, 0xd, 0x80, + 0xd8, 0x19, 0x83, 0x18, 0x31, 0x86, 0x18, 0x61, + 0x8f, 0xff, 0xff, 0xf0, 0x18, 0x1, 0x80, 0x18, + 0x1, 0x80, /* U+0035 "5" */ - 0x3f, 0xe7, 0xfc, 0xc0, 0x18, 0x7, 0x0, 0xc0, - 0x1b, 0xc3, 0xfe, 0x71, 0xc0, 0x1c, 0x1, 0x80, - 0x3e, 0x6, 0xc0, 0xdc, 0x31, 0xfe, 0x1f, 0x0, + 0x7f, 0x9f, 0xe6, 0x1, 0x80, 0x60, 0x18, 0xf, + 0xe3, 0xfe, 0xe1, 0x90, 0x30, 0xc, 0x3, 0xc0, + 0xf0, 0x3e, 0x19, 0xfe, 0x3e, 0x0, /* U+0036 "6" */ - 0x7, 0x83, 0xf0, 0xe0, 0x38, 0x6, 0x1, 0x9e, - 0x3f, 0xe7, 0x8e, 0xe0, 0xf8, 0xf, 0x1, 0xe0, - 0x3c, 0x6, 0xc1, 0xdc, 0x71, 0xfc, 0x1f, 0x0, + 0xf, 0x87, 0xf9, 0xc0, 0x30, 0xc, 0x1, 0x80, + 0x33, 0xc7, 0xfe, 0xe1, 0xd8, 0xf, 0x1, 0xe0, + 0x3c, 0x7, 0xc1, 0xdc, 0x31, 0xfe, 0x1f, 0x0, /* U+0037 "7" */ - 0xff, 0xff, 0xff, 0x0, 0x60, 0x6, 0x0, 0xe0, - 0xc, 0x1, 0xc0, 0x18, 0x3, 0x80, 0x30, 0x7, - 0x0, 0x60, 0xe, 0x0, 0xc0, 0x1c, 0x1, 0x80, - 0x18, 0x0, + 0xff, 0xff, 0xfc, 0x1, 0x80, 0x60, 0x18, 0x3, + 0x0, 0xc0, 0x18, 0x6, 0x0, 0xc0, 0x10, 0x6, + 0x0, 0xc0, 0x18, 0x3, 0x0, 0x60, 0xc, 0x0, /* U+0038 "8" */ - 0x3e, 0xf, 0xf3, 0x87, 0x60, 0x6c, 0xd, 0x81, - 0x98, 0x61, 0xf8, 0x3f, 0x8c, 0x3b, 0x1, 0xe0, + 0x1f, 0x7, 0xf1, 0xc7, 0x30, 0x66, 0xc, 0xc1, + 0x8c, 0x60, 0xf8, 0x3f, 0x8e, 0x1b, 0x1, 0xe0, 0x3c, 0x7, 0x80, 0xd8, 0x33, 0xfe, 0x1f, 0x0, /* U+0039 "9" */ - 0x1f, 0xf, 0xf1, 0xc7, 0x70, 0x6c, 0x7, 0x80, - 0xf0, 0x1f, 0x3, 0x71, 0xef, 0xfc, 0x79, 0x80, - 0x30, 0xc, 0x3, 0x80, 0xe1, 0xf8, 0x3c, 0x0, + 0x1f, 0x7, 0xf1, 0xc7, 0x70, 0x7c, 0x7, 0x80, + 0xf0, 0x1e, 0x3, 0x60, 0xef, 0xfc, 0x7d, 0x80, + 0x30, 0x6, 0x1, 0xd0, 0x73, 0xfc, 0x3e, 0x0, /* U+003A ":" */ 0xf0, 0x0, 0x3, 0xc0, /* U+003B ";" */ - 0x6c, 0x0, 0x0, 0xd, 0xb6, 0xf0, + 0x6c, 0x0, 0x0, 0x1, 0xb6, 0xb0, /* U+003C "<" */ - 0x0, 0x40, 0xf0, 0xf8, 0xf8, 0xf0, 0x30, 0x7, + 0x0, 0x40, 0xf0, 0xf8, 0xf8, 0xf8, 0x30, 0xf, 0x80, 0x78, 0x7, 0xc0, 0x70, 0x4, /* U+003D "=" */ @@ -157,45 +155,46 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xfc, /* U+003E ">" */ - 0x80, 0x38, 0x7, 0xc0, 0x7c, 0x3, 0xc0, 0x70, - 0x78, 0xf8, 0xf8, 0x38, 0x0, 0x0, + 0x0, 0x38, 0xf, 0x80, 0xf8, 0x7, 0x80, 0x30, + 0x7c, 0x7c, 0xfc, 0x38, 0x8, 0x0, /* U+003F "?" */ - 0x3e, 0x3f, 0xb8, 0xf8, 0x30, 0x18, 0xc, 0xe, - 0x6, 0x6, 0x6, 0x6, 0x3, 0x1, 0x80, 0x0, - 0x0, 0x30, 0x18, 0x0, + 0x3f, 0x1f, 0xee, 0x1f, 0x3, 0x0, 0xc0, 0x30, + 0x1c, 0x6, 0x3, 0x1, 0x80, 0xc0, 0x30, 0xc, + 0x0, 0x0, 0x0, 0x30, 0xc, 0x0, /* U+0040 "@" */ - 0x1, 0xf8, 0x0, 0xff, 0xc0, 0x78, 0x1c, 0x1c, + 0x1, 0xf8, 0x1, 0xff, 0xc0, 0x78, 0x1c, 0x1c, 0x1, 0xc3, 0x0, 0x1c, 0xc1, 0xe1, 0x98, 0x7e, 0x37, 0x1c, 0xc3, 0xc3, 0x18, 0x78, 0xc3, 0xf, 0x18, 0x61, 0xe3, 0xc, 0x3c, 0x61, 0x87, 0x8c, - 0x31, 0xf1, 0x8e, 0x33, 0x3f, 0xfe, 0x63, 0xcf, + 0x31, 0xf1, 0x8e, 0x73, 0x3f, 0xfc, 0x63, 0xcf, 0xe, 0x0, 0x0, 0xe0, 0x0, 0xe, 0x4, 0x0, - 0xff, 0x80, 0x7, 0xe0, 0x0, + 0xff, 0x80, 0x7, 0xc0, 0x0, /* U+0041 "A" */ - 0x1, 0x80, 0x7, 0x0, 0xf, 0x0, 0x3e, 0x0, - 0x6e, 0x0, 0xcc, 0x3, 0x98, 0x6, 0x38, 0xc, - 0x30, 0x30, 0x60, 0x60, 0x61, 0xff, 0xc3, 0xff, - 0xc6, 0x1, 0x9c, 0x3, 0x30, 0x7, 0x60, 0x6, + 0x3, 0x80, 0x7, 0x0, 0xf, 0x0, 0x3e, 0x0, + 0x6c, 0x0, 0xdc, 0x3, 0x98, 0x6, 0x30, 0xc, + 0x70, 0x38, 0x60, 0x60, 0xc1, 0xff, 0xc3, 0xff, + 0x86, 0x3, 0x1c, 0x7, 0x30, 0x6, 0x60, 0xc, /* U+0042 "B" */ - 0xff, 0x9f, 0xfb, 0x3, 0xe0, 0x3c, 0x7, 0x80, - 0xf0, 0x37, 0xfc, 0xff, 0xd8, 0x1b, 0x1, 0xe0, - 0x3c, 0x7, 0x80, 0xf0, 0x37, 0xfe, 0xff, 0x0, + 0xff, 0xf, 0xfc, 0xc0, 0xec, 0x6, 0xc0, 0x6c, + 0x6, 0xc0, 0xcf, 0xf8, 0xff, 0xec, 0x6, 0xc0, + 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0x6f, 0xfe, + 0xff, 0x80, /* U+0043 "C" */ - 0xf, 0x81, 0xff, 0x1c, 0x1c, 0xc0, 0x6e, 0x3, + 0xf, 0xc1, 0xff, 0x1c, 0x1c, 0xc0, 0x7e, 0x1, 0xe0, 0xf, 0x0, 0x18, 0x0, 0xc0, 0x6, 0x0, - 0x30, 0x1, 0x80, 0x3e, 0x3, 0xb0, 0x19, 0xc1, + 0x30, 0x1, 0x80, 0x3e, 0x1, 0xb0, 0x1d, 0xc1, 0xc7, 0xfc, 0xf, 0x80, /* U+0044 "D" */ - 0xff, 0xf, 0xf8, 0xc1, 0xcc, 0x6, 0xc0, 0x6c, - 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, - 0x3c, 0x3, 0xc0, 0x6c, 0xe, 0xc1, 0xcf, 0xf8, - 0xfe, 0x0, + 0xff, 0x87, 0xfe, 0x30, 0x39, 0x80, 0xec, 0x3, + 0xe0, 0xf, 0x0, 0x78, 0x3, 0xc0, 0x1e, 0x0, + 0xf0, 0x7, 0x80, 0x3c, 0x3, 0xe0, 0x3b, 0x3, + 0x9f, 0xf8, 0xff, 0x80, /* U+0045 "E" */ 0xff, 0xff, 0xff, 0x0, 0x60, 0xc, 0x1, 0x80, @@ -208,14 +207,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc, 0x1, 0x80, 0x30, 0x6, 0x0, 0xc0, 0x0, /* U+0047 "G" */ - 0xf, 0xc1, 0xff, 0x1c, 0x1c, 0xc0, 0x7e, 0x1, + 0xf, 0xc1, 0xff, 0x1e, 0x1c, 0xc0, 0x7e, 0x1, 0xe0, 0x3, 0x0, 0x18, 0x0, 0xc1, 0xfe, 0xf, - 0xf0, 0x7, 0x80, 0x36, 0x1, 0xb0, 0xc, 0xe0, - 0xe3, 0xfe, 0xf, 0xc0, + 0xf0, 0x7, 0x80, 0x3e, 0x1, 0xb0, 0xd, 0xe0, + 0xe7, 0xfe, 0xf, 0xc0, /* U+0048 "H" */ 0xc0, 0x1e, 0x0, 0xf0, 0x7, 0x80, 0x3c, 0x1, - 0xe0, 0xf, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x0, + 0xe0, 0xf, 0x0, 0x78, 0x3, 0xff, 0xff, 0xff, 0xf0, 0x7, 0x80, 0x3c, 0x1, 0xe0, 0xf, 0x0, 0x78, 0x3, 0xc0, 0x18, @@ -223,15 +222,15 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0xff, 0xff, 0xff, 0xc0, /* U+004A "J" */ - 0x0, 0x60, 0xc, 0x1, 0x80, 0x30, 0x6, 0x0, - 0xc0, 0x18, 0x3, 0x0, 0x60, 0xc, 0x1, 0x80, - 0x3c, 0x7, 0x80, 0xd8, 0x33, 0xfe, 0x1f, 0x0, + 0x0, 0xc0, 0x30, 0xc, 0x3, 0x0, 0xc0, 0x30, + 0xc, 0x3, 0x0, 0xc0, 0x30, 0xc, 0x3, 0xc0, + 0xf0, 0x3e, 0x19, 0xfe, 0x1e, 0x0, /* U+004B "K" */ 0xc0, 0x76, 0x7, 0x30, 0x71, 0x87, 0xc, 0x30, - 0x63, 0x3, 0x30, 0x1b, 0x80, 0xfc, 0x7, 0xf0, - 0x39, 0xc1, 0x87, 0xc, 0x18, 0x60, 0xe3, 0x3, - 0x98, 0xe, 0xc0, 0x30, + 0x63, 0x3, 0x30, 0x1f, 0x0, 0xfc, 0x6, 0x70, + 0x31, 0xc1, 0x8e, 0xc, 0x38, 0x60, 0xe3, 0x3, + 0x98, 0xe, 0xc0, 0x70, /* U+004C "L" */ 0xc0, 0x18, 0x3, 0x0, 0x60, 0xc, 0x1, 0x80, @@ -240,47 +239,47 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+004D "M" */ 0xe0, 0x3, 0xf0, 0x1, 0xfc, 0x1, 0xfe, 0x0, - 0xff, 0x80, 0xde, 0xc0, 0x6f, 0x60, 0x37, 0x98, - 0x33, 0xcc, 0x19, 0xe3, 0x18, 0xf1, 0x8c, 0x78, - 0xee, 0x3c, 0x36, 0x1e, 0x1b, 0xf, 0x7, 0x7, + 0xff, 0x80, 0x7e, 0xc0, 0x6f, 0x60, 0x37, 0x98, + 0x3b, 0xcc, 0x19, 0xe7, 0x1c, 0xf1, 0x8c, 0x78, + 0xc6, 0x3c, 0x36, 0x1e, 0x1b, 0xf, 0x7, 0x87, 0x83, 0x83, 0xc1, 0xc1, 0x80, /* U+004E "N" */ 0xc0, 0x1f, 0x0, 0xfc, 0x7, 0xe0, 0x3f, 0x81, - 0xee, 0xf, 0x30, 0x79, 0xc3, 0xc7, 0x1e, 0x1c, + 0xee, 0xf, 0x38, 0x79, 0xc3, 0xc7, 0x1e, 0x1c, 0xf0, 0x67, 0x83, 0xbc, 0xf, 0xe0, 0x3f, 0x1, 0xf8, 0x7, 0xc0, 0x18, /* U+004F "O" */ - 0xf, 0xc0, 0x7f, 0x83, 0x87, 0x18, 0x6, 0x60, - 0x1b, 0x0, 0x3c, 0x0, 0xf0, 0x3, 0xc0, 0xf, - 0x0, 0x3c, 0x0, 0xf0, 0x3, 0x60, 0x19, 0x80, - 0x63, 0x87, 0x7, 0xf8, 0xf, 0xc0, + 0xf, 0xc0, 0xff, 0x87, 0x87, 0x18, 0x6, 0xe0, + 0x1f, 0x0, 0x3c, 0x0, 0xf0, 0x3, 0xc0, 0xf, + 0x0, 0x3c, 0x0, 0xf0, 0x3, 0xe0, 0x1d, 0x80, + 0x67, 0x87, 0xf, 0xf8, 0xf, 0xc0, /* U+0050 "P" */ - 0xff, 0x8f, 0xfe, 0xc0, 0xec, 0x3, 0xc0, 0x3c, + 0xff, 0x8f, 0xfe, 0xc0, 0x6c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0x3c, 0x6, 0xff, 0xef, 0xf8, 0xc0, 0xc, 0x0, 0xc0, 0xc, 0x0, 0xc0, 0xc, 0x0, 0xc0, 0x0, /* U+0051 "Q" */ - 0xf, 0xc0, 0x7f, 0x83, 0x87, 0x18, 0x6, 0x60, - 0x1b, 0x0, 0x3c, 0x0, 0xf0, 0x3, 0xc0, 0xf, - 0x0, 0x3c, 0x0, 0xf0, 0x3, 0x60, 0x19, 0x80, - 0x63, 0x87, 0x7, 0xfc, 0xf, 0xf0, 0x0, 0xe0, - 0x1, 0xc0, 0x2, + 0xf, 0xc0, 0x7f, 0xc1, 0xe1, 0xc3, 0x0, 0xce, + 0x1, 0xd8, 0x1, 0xb0, 0x3, 0x60, 0x6, 0xc0, + 0xd, 0x80, 0x1b, 0x0, 0x36, 0x0, 0x6e, 0x1, + 0xcc, 0x3, 0x1e, 0x1e, 0x1f, 0xfe, 0xf, 0xce, + 0x0, 0x8, /* U+0052 "R" */ - 0xff, 0x87, 0xff, 0x30, 0x39, 0x80, 0x6c, 0x3, - 0x60, 0x1b, 0x0, 0xd8, 0x1c, 0xff, 0xc7, 0xfc, - 0x30, 0x61, 0x83, 0x8c, 0xc, 0x60, 0x33, 0x1, - 0x98, 0x6, 0xc0, 0x30, + 0xff, 0xf, 0xfc, 0xc0, 0xcc, 0x6, 0xc0, 0x6c, + 0x6, 0xc0, 0x6c, 0xc, 0xff, 0x8f, 0xfc, 0xc0, + 0xec, 0x6, 0xc0, 0x6c, 0x6, 0xc0, 0x6c, 0x6, + 0xc0, 0x70, /* U+0053 "S" */ - 0xf, 0x83, 0xfc, 0x70, 0x66, 0x3, 0x60, 0x36, + 0xf, 0x83, 0xfc, 0x70, 0xe6, 0x3, 0x60, 0x36, 0x0, 0x30, 0x3, 0xc0, 0xf, 0x80, 0x1e, 0x0, - 0x60, 0x3, 0xc0, 0x3c, 0x3, 0x70, 0x73, 0xfe, - 0x1f, 0x80, + 0x60, 0x3, 0xc0, 0x3e, 0x3, 0x70, 0x73, 0xfe, + 0xf, 0x80, /* U+0054 "T" */ 0xff, 0xff, 0xff, 0xc0, 0xc0, 0x6, 0x0, 0x30, @@ -289,39 +288,39 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x60, 0x3, 0x0, /* U+0055 "U" */ - 0xc0, 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0x3c, - 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, - 0x3c, 0x3, 0xc0, 0x3e, 0x7, 0x70, 0xe3, 0xfc, - 0x1f, 0x80, + 0xc0, 0x1e, 0x0, 0xf0, 0x7, 0x80, 0x3c, 0x1, + 0xe0, 0xf, 0x0, 0x78, 0x3, 0xc0, 0x1e, 0x0, + 0xf0, 0x7, 0x80, 0x3c, 0x1, 0xf0, 0x1d, 0xc1, + 0xc7, 0xfc, 0x1f, 0x80, /* U+0056 "V" */ - 0x60, 0xe, 0xc0, 0x19, 0xc0, 0x31, 0x80, 0xe3, - 0x1, 0x87, 0x3, 0x6, 0xe, 0xc, 0x18, 0x1c, - 0x30, 0x18, 0xc0, 0x31, 0x80, 0x33, 0x0, 0x6c, + 0xe0, 0xe, 0xc0, 0x19, 0xc0, 0x31, 0x80, 0xe3, + 0x1, 0x87, 0x7, 0x6, 0xe, 0xc, 0x18, 0x1c, + 0x70, 0x18, 0xc0, 0x31, 0x80, 0x37, 0x0, 0x6c, 0x0, 0xd8, 0x0, 0xf0, 0x1, 0xc0, 0x3, 0x80, /* U+0057 "W" */ - 0xc0, 0x60, 0x7c, 0xe, 0x6, 0xe0, 0xe0, 0x66, - 0xf, 0x6, 0x60, 0xf0, 0xe6, 0x1b, 0xc, 0x61, - 0x98, 0xc3, 0x19, 0x8c, 0x33, 0x18, 0xc3, 0x31, - 0x98, 0x33, 0xd, 0x81, 0xb0, 0xd8, 0x1e, 0xd, - 0x81, 0xe0, 0x58, 0x1e, 0x7, 0x1, 0xc0, 0x70, - 0xc, 0x7, 0x0, + 0x60, 0x70, 0x36, 0x7, 0x7, 0x60, 0x70, 0x77, + 0xf, 0x6, 0x30, 0xd8, 0x63, 0xd, 0x86, 0x31, + 0xd8, 0xe3, 0x99, 0xcc, 0x39, 0x8c, 0xc1, 0x98, + 0xcc, 0x1b, 0x8d, 0xc1, 0xb0, 0xf8, 0x1f, 0x7, + 0x80, 0xf0, 0x78, 0xe, 0x7, 0x80, 0xe0, 0x30, + 0xe, 0x3, 0x0, /* U+0058 "X" */ - 0xe0, 0x3b, 0x1, 0x9c, 0x1c, 0x71, 0xc1, 0x8c, - 0xe, 0xe0, 0x36, 0x0, 0xf0, 0x7, 0x0, 0x3c, - 0x3, 0x60, 0x3b, 0x81, 0x8e, 0x1c, 0x31, 0xc1, - 0xcc, 0x6, 0xe0, 0x38, + 0xe0, 0x39, 0xc0, 0xc7, 0x7, 0xe, 0x18, 0x18, + 0xe0, 0x77, 0x0, 0xf8, 0x1, 0xe0, 0x7, 0x0, + 0x1e, 0x0, 0xf8, 0x7, 0x70, 0x18, 0xe0, 0xe1, + 0x87, 0x7, 0x18, 0xe, 0xe0, 0x38, /* U+0059 "Y" */ 0xe0, 0x1d, 0x80, 0x67, 0x3, 0x8c, 0xc, 0x18, - 0x60, 0x61, 0x80, 0xcc, 0x3, 0x30, 0x7, 0x80, + 0x70, 0x61, 0x80, 0xcc, 0x3, 0x30, 0x7, 0x80, 0x1e, 0x0, 0x30, 0x0, 0xc0, 0x3, 0x0, 0xc, 0x0, 0x30, 0x0, 0xc0, 0x3, 0x0, /* U+005A "Z" */ - 0xff, 0xff, 0xff, 0x0, 0x60, 0xe, 0x0, 0xc0, + 0xff, 0xff, 0xff, 0x0, 0x70, 0xe, 0x0, 0xc0, 0x18, 0x3, 0x80, 0x70, 0x6, 0x0, 0xe0, 0x1c, 0x1, 0x80, 0x30, 0x7, 0x0, 0xe0, 0xf, 0xff, 0xff, 0xf0, @@ -331,13 +330,13 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x63, 0x18, 0xc6, 0x31, 0x8c, 0x7f, 0xe0, /* U+005C "\\" */ - 0x60, 0x18, 0x6, 0x0, 0xc0, 0x30, 0x6, 0x1, - 0x80, 0x60, 0xc, 0x3, 0x0, 0x60, 0x18, 0x6, - 0x0, 0xc0, 0x30, 0xc, 0x1, 0x80, 0x60, 0xc, + 0x60, 0x18, 0x7, 0x0, 0xc0, 0x30, 0x6, 0x1, + 0x80, 0x70, 0xc, 0x3, 0x0, 0xe0, 0x18, 0x6, + 0x0, 0xc0, 0x30, 0xe, 0x1, 0x80, 0x60, 0xc, /* U+005D "]" */ - 0xff, 0xc6, 0x31, 0x8c, 0x63, 0x18, 0xc6, 0x31, - 0x8c, 0x63, 0x18, 0xc6, 0x31, 0xff, 0xe0, + 0xff, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x3f, 0xf0, /* U+005E "^" */ 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x66, 0x66, 0xc3, @@ -347,23 +346,23 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0xff, 0xfc, /* U+0060 "`" */ - 0xc3, 0x1c, 0x60, + 0xe3, 0x8c, /* U+0061 "a" */ - 0x1f, 0x1f, 0xee, 0x1f, 0x3, 0x0, 0xc7, 0xf7, - 0xff, 0x83, 0xc0, 0xf0, 0x3e, 0x1d, 0xff, 0x3c, + 0x1f, 0x1f, 0xe6, 0x1d, 0x83, 0x0, 0xc7, 0xf7, + 0xff, 0x83, 0xc0, 0xf0, 0x3e, 0x3d, 0xfb, 0x3c, 0xc0, /* U+0062 "b" */ 0xc0, 0x18, 0x3, 0x0, 0x60, 0xc, 0x1, 0x9e, - 0x3f, 0xe7, 0xe, 0xc0, 0xf8, 0xf, 0x1, 0xe0, - 0x3c, 0x7, 0x80, 0xf0, 0x3f, 0xe, 0xff, 0x9b, + 0x3f, 0xe7, 0xe, 0xc0, 0xd8, 0xf, 0x1, 0xe0, + 0x3c, 0x7, 0x80, 0xf0, 0x3f, 0xe, 0xff, 0x99, 0xe0, /* U+0063 "c" */ - 0x1f, 0x7, 0xf1, 0xc7, 0x70, 0x6c, 0xd, 0x80, - 0x30, 0x6, 0x0, 0xc0, 0x1c, 0x19, 0xc7, 0x1f, - 0xc1, 0xf0, + 0x1f, 0xf, 0xe7, 0x1f, 0x83, 0xc0, 0xf0, 0xc, + 0x3, 0x0, 0xc0, 0x38, 0x37, 0x1c, 0xfe, 0x1e, + 0x0, /* U+0064 "d" */ 0x0, 0x60, 0xc, 0x1, 0x80, 0x30, 0x6, 0x3e, @@ -372,9 +371,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xec, /* U+0065 "e" */ - 0x1f, 0x7, 0xf9, 0xc3, 0x30, 0x3c, 0x7, 0xff, - 0xff, 0xfe, 0x0, 0xc0, 0x1c, 0x1, 0xc3, 0x9f, - 0xe1, 0xf0, + 0x1e, 0xf, 0xe6, 0x1b, 0x83, 0xc0, 0xff, 0xff, + 0xff, 0x0, 0xc0, 0x38, 0x7, 0x8, 0xff, 0x1f, + 0x0, /* U+0066 "f" */ 0xf, 0x1f, 0x38, 0x30, 0x30, 0xfe, 0xfe, 0x30, @@ -384,7 +383,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0067 "g" */ 0x1f, 0x67, 0xfd, 0xc3, 0xf0, 0x3c, 0x7, 0x80, 0xf0, 0x1e, 0x3, 0xc0, 0x7c, 0xd, 0xc3, 0x9f, - 0xf1, 0xf6, 0x0, 0xd0, 0x3b, 0xe, 0x7f, 0xc3, + 0xf1, 0xf6, 0x0, 0xc0, 0x1a, 0x6, 0x7f, 0xc7, 0xe0, /* U+0068 "h" */ @@ -393,16 +392,16 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x30, /* U+0069 "i" */ - 0xf0, 0xff, 0xff, 0xff, 0xc0, + 0xf0, 0x3f, 0xff, 0xff, 0xf0, /* U+006A "j" */ - 0x18, 0xc0, 0x1, 0x8c, 0x63, 0x18, 0xc6, 0x31, - 0x8c, 0x63, 0x18, 0xc6, 0x3f, 0xf8, + 0x18, 0xc0, 0x0, 0xc, 0x63, 0x18, 0xc6, 0x31, + 0x8c, 0x63, 0x18, 0xc6, 0x31, 0xfb, 0x80, /* U+006B "k" */ 0xc0, 0x30, 0xc, 0x3, 0x0, 0xc0, 0x30, 0x6c, - 0x33, 0x18, 0xce, 0x37, 0xf, 0x83, 0xf0, 0xec, - 0x33, 0x8c, 0x73, 0xc, 0xc1, 0xb0, 0x70, + 0x3b, 0x1c, 0xce, 0x33, 0xf, 0x83, 0xf0, 0xcc, + 0x33, 0x8c, 0x73, 0xc, 0xc3, 0xb0, 0x70, /* U+006C "l" */ 0xff, 0xff, 0xff, 0xff, 0xf0, @@ -419,21 +418,20 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, /* U+006F "o" */ - 0x1f, 0x7, 0xf1, 0xc7, 0x70, 0x6c, 0x7, 0x80, - 0xf0, 0x1e, 0x3, 0xc0, 0x7c, 0x19, 0xc7, 0x1f, + 0x1f, 0x7, 0xf1, 0xc7, 0x70, 0x7c, 0x7, 0x80, + 0xf0, 0x1e, 0x3, 0xc0, 0x7c, 0x1d, 0xc7, 0x1f, 0xc1, 0xf0, /* U+0070 "p" */ - 0xdf, 0x1f, 0xf3, 0x87, 0x60, 0x7c, 0x7, 0x80, + 0xdf, 0x1f, 0xf3, 0x87, 0x60, 0x6c, 0x7, 0x80, 0xf0, 0x1e, 0x3, 0xc0, 0x78, 0x1f, 0x87, 0x7f, 0xcd, 0xf1, 0x80, 0x30, 0x6, 0x0, 0xc0, 0x18, 0x0, /* U+0071 "q" */ - 0x1f, 0x67, 0xfd, 0xc3, 0xf0, 0x3c, 0x7, 0x80, - 0xf0, 0x1e, 0x3, 0xc0, 0x7c, 0xd, 0xc3, 0x9f, - 0xf1, 0xf6, 0x0, 0xc0, 0x18, 0x3, 0x0, 0x60, - 0xc, + 0x1e, 0xcf, 0xf7, 0x1f, 0x83, 0xc0, 0xf0, 0x3c, + 0xf, 0x3, 0xc0, 0xf8, 0x36, 0x1d, 0xff, 0x1e, + 0xc0, 0x30, 0xc, 0x3, 0x0, 0xc0, 0x30, /* U+0072 "r" */ 0xdf, 0xfe, 0x30, 0xc3, 0xc, 0x30, 0xc3, 0xc, @@ -441,7 +439,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0073 "s" */ 0x1f, 0xf, 0xe7, 0x1d, 0x83, 0x60, 0xe, 0x1, - 0xf0, 0x6, 0x0, 0xf0, 0x3e, 0x1d, 0xfe, 0x1f, + 0xf0, 0xe, 0x0, 0xf0, 0x3e, 0x1d, 0xfe, 0x1f, 0x0, /* U+0074 "t" */ @@ -454,30 +452,30 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, /* U+0076 "v" */ - 0x60, 0x6c, 0x1d, 0x83, 0x18, 0x63, 0xc, 0x63, - 0x6, 0x60, 0xcc, 0x1b, 0x1, 0xe0, 0x3c, 0x7, - 0x0, 0x60, + 0xc0, 0xf8, 0x1b, 0x87, 0x30, 0xc6, 0x18, 0x63, + 0xc, 0xc1, 0x98, 0x1b, 0x3, 0xc0, 0x78, 0x7, + 0x0, 0xc0, /* U+0077 "w" */ - 0x60, 0xc1, 0xb0, 0x60, 0xd8, 0x78, 0x6e, 0x3c, - 0x63, 0x1e, 0x31, 0x99, 0x98, 0xcc, 0xcc, 0x36, - 0x6c, 0x1a, 0x16, 0xf, 0xf, 0x7, 0x87, 0x81, - 0x81, 0x80, 0xc0, 0xc0, + 0xc1, 0x83, 0x60, 0xc1, 0xb8, 0xf0, 0xcc, 0x78, + 0xe6, 0x3c, 0x63, 0x33, 0x31, 0xd9, 0x98, 0x6c, + 0xd8, 0x34, 0x3c, 0x1e, 0x1e, 0xf, 0xf, 0x3, + 0x83, 0x1, 0x81, 0x80, /* U+0078 "x" */ - 0x60, 0xe6, 0x18, 0xe7, 0xc, 0xc0, 0xf0, 0x1e, - 0x1, 0x80, 0x78, 0x1f, 0x3, 0x30, 0xe7, 0x38, - 0x66, 0x6, + 0xe1, 0xd8, 0x67, 0x38, 0xcc, 0x1e, 0x7, 0x80, + 0xc0, 0x78, 0x3f, 0xc, 0xc7, 0x39, 0x87, 0xe0, + 0xc0, /* U+0079 "y" */ - 0xe0, 0x6c, 0x1d, 0x83, 0x18, 0x63, 0x1c, 0x63, - 0x6, 0x60, 0xdc, 0x1b, 0x1, 0xe0, 0x38, 0x7, - 0x0, 0x60, 0x18, 0x3, 0x0, 0xe0, 0x78, 0xe, - 0x0, + 0x60, 0x76, 0x6, 0x70, 0xe3, 0xc, 0x30, 0xc3, + 0x9c, 0x19, 0x81, 0x98, 0xf, 0x80, 0xf0, 0xf, + 0x0, 0x70, 0x6, 0x0, 0x60, 0xe, 0x0, 0xc0, + 0x78, 0x7, 0x0, /* U+007A "z" */ 0xff, 0xff, 0xf0, 0x18, 0xe, 0x7, 0x3, 0x80, - 0xc0, 0x60, 0x38, 0x1c, 0x6, 0x3, 0xff, 0xff, + 0xc0, 0x70, 0x38, 0x1c, 0x6, 0x3, 0xff, 0xff, 0xc0, /* U+007B "{" */ @@ -494,7 +492,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc1, 0x83, 0xc, 0x30, 0x40, /* U+007E "~" */ - 0x38, 0x1b, 0xf0, 0xf9, 0xcf, 0x87, 0xec, 0xe, + 0x38, 0x3, 0xf0, 0xf9, 0xcf, 0x87, 0xe0, 0xe, 0x0, /* U+F00C "" */ @@ -580,108 +578,108 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, {.bitmap_index = 0, .adv_w = 95, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1, .adv_w = 99, .box_w = 2, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6, .adv_w = 123, .box_w = 5, .box_h = 6, .ofs_x = 2, .ofs_y = 12}, - {.bitmap_index = 10, .adv_w = 236, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 38, .adv_w = 216, .box_w = 11, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 69, .adv_w = 281, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 101, .adv_w = 239, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 131, .adv_w = 67, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 13}, - {.bitmap_index = 133, .adv_w = 131, .box_w = 6, .box_h = 25, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 152, .adv_w = 134, .box_w = 6, .box_h = 25, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 171, .adv_w = 165, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 184, .adv_w = 218, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 202, .adv_w = 75, .box_w = 3, .box_h = 6, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 205, .adv_w = 106, .box_w = 6, .box_h = 2, .ofs_x = 1, .ofs_y = 6}, - {.bitmap_index = 207, .adv_w = 101, .box_w = 2, .box_h = 2, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 208, .adv_w = 158, .box_w = 9, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 230, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 254, .adv_w = 216, .box_w = 7, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 269, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 293, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 317, .adv_w = 216, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 343, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 367, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 391, .adv_w = 216, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 417, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 441, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 465, .adv_w = 93, .box_w = 2, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 469, .adv_w = 81, .box_w = 3, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 475, .adv_w = 195, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 489, .adv_w = 211, .box_w = 10, .box_h = 7, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 498, .adv_w = 201, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 512, .adv_w = 181, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 532, .adv_w = 345, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 585, .adv_w = 251, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 617, .adv_w = 239, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 641, .adv_w = 250, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 669, .adv_w = 252, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 695, .adv_w = 218, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 719, .adv_w = 212, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 743, .adv_w = 262, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 771, .adv_w = 274, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 799, .adv_w = 104, .box_w = 2, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 804, .adv_w = 212, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 828, .adv_w = 241, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 856, .adv_w = 207, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 880, .adv_w = 335, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 917, .adv_w = 274, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 945, .adv_w = 264, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 975, .adv_w = 242, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1001, .adv_w = 264, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1036, .adv_w = 236, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1064, .adv_w = 228, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1090, .adv_w = 229, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1118, .adv_w = 249, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1144, .adv_w = 244, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1176, .adv_w = 341, .box_w = 20, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1219, .adv_w = 241, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1247, .adv_w = 231, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1277, .adv_w = 230, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1303, .adv_w = 102, .box_w = 5, .box_h = 23, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 1318, .adv_w = 158, .box_w = 10, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1342, .adv_w = 102, .box_w = 5, .box_h = 23, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 1357, .adv_w = 161, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 1366, .adv_w = 173, .box_w = 11, .box_h = 2, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1369, .adv_w = 119, .box_w = 5, .box_h = 4, .ofs_x = 1, .ofs_y = 15}, - {.bitmap_index = 1372, .adv_w = 209, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1389, .adv_w = 215, .box_w = 11, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1414, .adv_w = 201, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1432, .adv_w = 217, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1457, .adv_w = 203, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1475, .adv_w = 133, .box_w = 8, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1493, .adv_w = 215, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 1518, .adv_w = 212, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1541, .adv_w = 93, .box_w = 2, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1546, .adv_w = 92, .box_w = 5, .box_h = 22, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 1560, .adv_w = 195, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1583, .adv_w = 93, .box_w = 2, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1588, .adv_w = 337, .box_w = 18, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1618, .adv_w = 212, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1635, .adv_w = 219, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1653, .adv_w = 215, .box_w = 11, .box_h = 18, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 1678, .adv_w = 218, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 1703, .adv_w = 130, .box_w = 6, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1713, .adv_w = 198, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1730, .adv_w = 125, .box_w = 7, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1744, .adv_w = 212, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1761, .adv_w = 186, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1779, .adv_w = 289, .box_w = 17, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1807, .adv_w = 190, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1825, .adv_w = 182, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 1850, .adv_w = 190, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1867, .adv_w = 130, .box_w = 7, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 1888, .adv_w = 94, .box_w = 2, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 1894, .adv_w = 130, .box_w = 7, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 1915, .adv_w = 261, .box_w = 13, .box_h = 5, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 1924, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1978, .adv_w = 264, .box_w = 17, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 2012, .adv_w = 240, .box_w = 15, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2057, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2111, .adv_w = 480, .box_w = 30, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2194, .adv_w = 480, .box_w = 30, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2262, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2316, .adv_w = 386, .box_w = 24, .box_h = 15, .ofs_x = 0, .ofs_y = 1} + {.bitmap_index = 1, .adv_w = 101, .box_w = 2, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6, .adv_w = 137, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 11, .adv_w = 239, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 39, .adv_w = 224, .box_w = 11, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 70, .adv_w = 281, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 102, .adv_w = 239, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 130, .adv_w = 83, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 132, .adv_w = 127, .box_w = 6, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 150, .adv_w = 129, .box_w = 6, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 168, .adv_w = 166, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 176, .adv_w = 218, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 194, .adv_w = 76, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 196, .adv_w = 173, .box_w = 7, .box_h = 2, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 198, .adv_w = 103, .box_w = 2, .box_h = 2, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 199, .adv_w = 159, .box_w = 9, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 221, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 245, .adv_w = 216, .box_w = 6, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 258, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 282, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 306, .adv_w = 216, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 332, .adv_w = 216, .box_w = 10, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 354, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 378, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 402, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 426, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 450, .adv_w = 97, .box_w = 2, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 454, .adv_w = 98, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 460, .adv_w = 195, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 474, .adv_w = 216, .box_w = 10, .box_h = 7, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 483, .adv_w = 201, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 497, .adv_w = 183, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 519, .adv_w = 344, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 572, .adv_w = 243, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 604, .adv_w = 244, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 630, .adv_w = 243, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 658, .adv_w = 260, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 686, .adv_w = 212, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 710, .adv_w = 212, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 734, .adv_w = 260, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 762, .adv_w = 270, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 790, .adv_w = 109, .box_w = 2, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 795, .adv_w = 211, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 817, .adv_w = 244, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 845, .adv_w = 211, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 869, .adv_w = 334, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 906, .adv_w = 270, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 934, .adv_w = 262, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 964, .adv_w = 244, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 990, .adv_w = 268, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1024, .adv_w = 244, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1050, .adv_w = 235, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1076, .adv_w = 230, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1104, .adv_w = 260, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1132, .adv_w = 243, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1164, .adv_w = 331, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1207, .adv_w = 243, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1237, .adv_w = 243, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1267, .adv_w = 230, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1293, .adv_w = 104, .box_w = 5, .box_h = 23, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 1308, .adv_w = 159, .box_w = 10, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1332, .adv_w = 104, .box_w = 4, .box_h = 23, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1344, .adv_w = 161, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 1353, .adv_w = 175, .box_w = 11, .box_h = 2, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1356, .adv_w = 120, .box_w = 5, .box_h = 3, .ofs_x = 1, .ofs_y = 15}, + {.bitmap_index = 1358, .adv_w = 211, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1375, .adv_w = 218, .box_w = 11, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1400, .adv_w = 201, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1417, .adv_w = 218, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1442, .adv_w = 201, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1459, .adv_w = 126, .box_w = 8, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1477, .adv_w = 218, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1502, .adv_w = 218, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1525, .adv_w = 97, .box_w = 2, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1530, .adv_w = 99, .box_w = 5, .box_h = 23, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 1545, .adv_w = 197, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1568, .adv_w = 97, .box_w = 2, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1573, .adv_w = 336, .box_w = 18, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1603, .adv_w = 218, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1620, .adv_w = 218, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1638, .adv_w = 218, .box_w = 11, .box_h = 18, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 1663, .adv_w = 218, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1686, .adv_w = 134, .box_w = 6, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1696, .adv_w = 201, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1713, .adv_w = 129, .box_w = 7, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1727, .adv_w = 218, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1744, .adv_w = 193, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1762, .adv_w = 291, .box_w = 17, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1790, .adv_w = 193, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1807, .adv_w = 193, .box_w = 12, .box_h = 18, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 1834, .adv_w = 193, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1851, .adv_w = 131, .box_w = 7, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 1872, .adv_w = 95, .box_w = 2, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 1878, .adv_w = 131, .box_w = 7, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1899, .adv_w = 261, .box_w = 13, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 1908, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1962, .adv_w = 264, .box_w = 17, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 1996, .adv_w = 240, .box_w = 15, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2041, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2095, .adv_w = 480, .box_w = 30, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2178, .adv_w = 480, .box_w = 30, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2246, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2300, .adv_w = 386, .box_w = 24, .box_h = 15, .ofs_x = 0, .ofs_y = 1} }; /*--------------------- @@ -713,201 +711,175 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { - 0, 1, 0, 2, 0, 0, 0, 0, - 2, 3, 0, 0, 0, 4, 0, 4, - 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 7, 8, 9, 10, 11, - 0, 12, 12, 13, 14, 15, 12, 12, - 9, 16, 17, 18, 0, 19, 13, 20, - 21, 22, 23, 24, 25, 0, 0, 0, - 0, 0, 26, 27, 28, 0, 29, 30, - 0, 31, 0, 0, 32, 0, 31, 31, - 33, 27, 0, 34, 0, 35, 0, 36, - 37, 38, 36, 39, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 5, 6, 7, 8, + 0, 9, 9, 10, 11, 12, 9, 9, + 6, 13, 14, 15, 0, 16, 10, 17, + 18, 19, 20, 21, 22, 0, 0, 0, + 0, 0, 23, 24, 25, 0, 26, 27, + 0, 28, 0, 0, 29, 0, 28, 28, + 30, 24, 0, 31, 0, 0, 0, 32, + 33, 34, 32, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /*Map glyph_ids to kern right classes*/ static const uint8_t kern_right_class_mapping[] = { - 0, 1, 0, 2, 0, 0, 0, 3, - 2, 0, 4, 5, 0, 6, 7, 6, - 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 2, + 1, 0, 3, 4, 0, 5, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 0, 10, 0, 11, 0, 0, 0, - 11, 0, 0, 12, 0, 0, 0, 0, - 11, 0, 11, 0, 13, 14, 15, 16, - 17, 18, 19, 20, 0, 0, 21, 0, - 0, 0, 22, 0, 23, 23, 23, 24, - 23, 0, 0, 0, 0, 0, 25, 25, - 26, 25, 23, 27, 28, 29, 30, 31, - 32, 33, 31, 34, 0, 0, 35, 0, + 0, 0, 0, 5, 0, 0, 0, 0, + 7, 0, 8, 0, 9, 0, 0, 0, + 9, 0, 0, 10, 0, 0, 0, 0, + 9, 0, 9, 0, 11, 12, 13, 14, + 15, 16, 17, 18, 0, 0, 19, 0, + 0, 0, 20, 0, 21, 21, 21, 22, + 21, 0, 0, 0, 0, 0, 23, 23, + 24, 23, 21, 25, 26, 27, 28, 29, + 30, 31, 29, 32, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /*Kern values between classes*/ static const int8_t kern_class_values[] = { + -20, 0, 0, 0, 0, 0, 0, -20, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, -9, -11, 0, -4, -11, + 0, -8, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 3, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -20, 0, 0, 0, - 0, 0, 0, 0, -22, 0, 0, 0, + 0, 0, -15, 0, 0, 0, 0, 0, + -11, 0, -2, 0, 0, -24, -3, -16, + -13, 0, -18, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -3, -2, -9, -6, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + -4, 0, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -9, -11, 0, -4, -11, 0, -15, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 3, 0, - 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -42, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -22, 0, 0, 0, 0, 0, 0, -11, - 0, -2, 0, 0, -24, -3, -16, -13, - 0, -18, 0, 0, 0, 0, 0, 0, - -2, 0, 0, -3, -2, -9, -6, 0, - 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, -5, - 0, -4, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, -19, 0, 0, -4, 0, 0, 0, + -5, 0, -4, 0, -4, -8, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -3, 0, -4, 0, 0, + 0, -3, -5, -4, 0, 0, 0, 0, + 0, 0, 0, -44, 0, 0, -11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -6, -4, 0, 0, -4, -5, + 0, 0, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, -5, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -5, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - 0, 0, 0, 0, 0, -19, 0, 0, - 0, -4, 0, 0, 0, -5, 0, -4, - 0, -4, -8, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -12, + 0, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + -4, -5, 0, 0, 0, -4, -7, -12, + 0, 0, 0, -26, 0, 0, 0, 0, + 0, 0, 4, -12, 0, 0, -52, -10, + -33, -27, 0, -45, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, -25, + -17, 0, 0, 0, 0, 0, 0, 0, + -61, 0, 0, -26, 0, 0, 0, 0, + 0, 0, 0, -6, 0, -5, 0, -2, + -2, 0, 0, -2, 0, 0, 3, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, -5, -4, 0, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, - 0, -4, -3, 0, -4, 0, 0, 0, - -3, -5, -4, 0, 0, 0, 0, 0, - 0, 0, 0, -44, 0, 0, 0, -32, - 0, -49, 0, 4, 0, 0, 0, 0, - 0, 0, 0, -6, -4, 0, 0, -4, - -5, 0, 0, -4, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, -5, 0, - 0, 0, 3, -5, 0, 0, 0, 0, + 0, -15, 0, -4, 0, 0, -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -41, -43, 0, -15, -5, + 0, -3, 3, 0, 3, 3, 0, 3, + 0, 0, -21, -19, 0, -20, -19, -14, + -22, 0, -18, -13, -11, -14, -11, 0, + 0, 0, 4, 0, -42, -7, 0, -14, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, -9, -8, 0, 0, -9, + -6, 0, 0, -5, -2, 0, 0, 0, + 4, 0, 0, 3, 0, -23, -11, 0, + -8, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 2, -6, -6, 0, 0, + -6, -4, 0, 0, -4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, -9, + 0, 0, -5, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, -4, 0, 0, 0, -4, -6, 0, + 0, 0, 0, 0, -6, 4, -9, -40, + -10, 0, -15, -5, -18, -3, 3, -18, + 3, 3, 2, 3, 0, 3, -14, -12, + -4, -7, -12, -7, -11, -4, -7, -4, + 0, -4, -6, 4, 0, 0, 0, 0, + 0, 0, 0, 2, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, -4, 0, 0, 0, -4, + -5, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, 0, -3, -3, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 3, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -12, 0, 0, - 0, -6, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -5, 0, -4, - -5, 0, 0, 0, -4, -7, -12, 0, - 0, 0, 0, -63, 0, 0, 0, 0, - 0, 0, 0, 4, -12, 0, 0, -52, - -10, -33, -27, 0, -45, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -8, - -25, -17, 0, 0, 0, 0, 0, 0, - 0, 0, -61, 0, 0, 0, -26, 0, - -37, 0, 0, 0, 0, 0, -6, 0, - -5, 0, -2, -2, 0, 0, -2, 0, - 0, 3, 0, 3, 0, 0, 0, 0, + 0, -3, 0, -4, -3, 0, 3, 0, + 0, 0, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -8, 0, -5, - -4, 0, -7, 0, 0, 0, 0, 0, + 0, 0, -4, 3, 0, -4, 0, 0, + 3, 0, 3, 3, 0, 0, 0, 3, + 0, 0, 0, -20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -2, 2, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -15, 0, -4, 0, 0, -9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -7, 0, - 0, 0, 0, -41, -43, 0, 0, -15, - -5, -45, -3, 3, 0, 3, 3, 0, - 3, 0, 0, -21, -19, 0, -20, -19, - -14, -22, 0, -18, -13, -11, -14, -11, - 0, 0, 0, 0, 4, 0, -42, -7, - 0, 0, -14, -2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, -9, -8, - 0, 0, -9, -6, 0, 0, -5, -2, - 0, 0, 0, 4, 0, 0, 0, 3, - 0, -23, -11, 0, 0, -8, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, - 2, -6, -6, 0, 0, -6, -4, 0, - 0, -4, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, -9, 0, 0, - 0, -5, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, -5, 0, 0, - -4, 0, 0, 0, -4, -6, 0, 0, - 0, 0, 0, 0, -6, 4, -9, -40, - -10, 0, 0, -18, -5, -18, -3, 3, - -18, 3, 3, 2, 3, 0, 3, -14, - -12, -4, -7, -12, -7, -11, -4, -7, - -4, 0, -4, -6, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -4, 0, 0, -4, 0, - 0, 0, -4, -5, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -3, 0, 0, -3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -3, 0, 0, 0, 0, 0, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, -3, -3, - 0, 0, -2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, 0, 0, 0, 0, - 3, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, -4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, -19, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -25, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -3, 0, - -4, -3, 0, 0, 3, 0, 0, 0, - -23, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -7, -4, 3, 0, -4, 0, 0, 9, - 0, 3, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, -20, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -3, -2, - 2, 0, -3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -917,13 +889,13 @@ static const int8_t kern_class_values[] = -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -3, 0, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -4, 0, 0, -4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0 }; @@ -933,8 +905,8 @@ static const lv_font_fmt_txt_kern_classes_t kern_classes = .class_pair_values = kern_class_values, .left_class_mapping = kern_left_class_mapping, .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 40, - .right_class_cnt = 35, + .left_class_cnt = 36, + .right_class_cnt = 33, }; /*-------------------- @@ -979,8 +951,8 @@ lv_font_t lv_font_bl = { #endif .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 27, /*The maximum line height required by the font*/ - .base_line = 6, /*Baseline measured from the bottom of the line*/ + .line_height = 26, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) .subpx = LV_FONT_SUBPX_NONE, #endif diff --git a/radio/src/fonts/lvgl/make_fonts.sh b/radio/src/fonts/lvgl/make_fonts.sh index 3678ca859..156af4bce 100755 --- a/radio/src/fonts/lvgl/make_fonts.sh +++ b/radio/src/fonts/lvgl/make_fonts.sh @@ -170,9 +170,9 @@ function make_font_set() { } # Bootloader font -make_bootloader_font "bl" ${LATIN_FONT} 16 "std" # 480x272, 480x320, 320x480 -make_bootloader_font "bl" ${LATIN_FONT} 14 "sml" # 320x240 -make_bootloader_font "bl" ${LATIN_FONT} 24 "lrg" # 800x480 +make_bootloader_font "bl" "Roboto/Roboto-Regular-BL.ttf" 16 "std" # 480x272, 480x320, 320x480 +make_bootloader_font "bl" "Roboto/Roboto-Regular-BL.ttf" 14 "sml" # 320x240 +make_bootloader_font "bl" "Roboto/Roboto-Regular-BL.ttf" 24 "lrg" # 800x480 # XXL fonts (no translation chars) make_font_no_sym_no_trans "en_bold" ${LATIN_FONT_BOLD} 64 "XXL" "std" diff --git a/radio/src/fonts/lvgl/sml/lv_font_bl.c b/radio/src/fonts/lvgl/sml/lv_font_bl.c index 85ca1f2b1..c98000130 100644 --- a/radio/src/fonts/lvgl/sml/lv_font_bl.c +++ b/radio/src/fonts/lvgl/sml/lv_font_bl.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 14 px * Bpp: 1 - * Opts: --no-prefilter --bpp 1 --size 14 --no-compress --font ../Roboto/Roboto-Regular.ttf -r 0x20-0x7F --font ../../thirdparty/lvgl/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff -r 61671,63650,63426,61453,61787,61452,61931,62087 --format lvgl -o sml/lv_font_bl.c --force-fast-kern-format --no-compress + * Opts: --no-prefilter --bpp 1 --size 14 --no-compress --font ../Roboto/Roboto-Regular-BL.ttf -r 0x20-0x7F --font ../../thirdparty/lvgl/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff -r 61671,63650,63426,61453,61787,61452,61931,62087 --format lvgl -o sml/lv_font_bl.c --force-fast-kern-format --no-compress ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -29,80 +29,80 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xfe, 0x20, /* U+0022 "\"" */ - 0xb6, 0x80, + 0xb6, 0xd0, /* U+0023 "#" */ - 0x12, 0x12, 0x12, 0x7f, 0x14, 0x24, 0x24, 0xff, - 0x24, 0x24, 0x28, + 0x12, 0x12, 0x14, 0x7f, 0x24, 0x24, 0x24, 0xfe, + 0x28, 0x28, 0x28, /* U+0024 "$" */ - 0x10, 0xe4, 0xd1, 0x41, 0x83, 0x83, 0x6, 0x1c, - 0xde, 0x10, + 0x10, 0x43, 0x93, 0x45, 0x6, 0xe, 0xc, 0x18, + 0x73, 0x78, 0x40, /* U+0025 "%" */ - 0x60, 0x49, 0x24, 0x92, 0x86, 0x40, 0x40, 0x4c, + 0x60, 0x48, 0x24, 0x92, 0x86, 0x40, 0x40, 0x4c, 0x29, 0x24, 0x92, 0x40, 0xc0, /* U+0026 "&" */ - 0x38, 0x44, 0x44, 0x4c, 0x78, 0x70, 0xda, 0x8e, - 0x86, 0xc6, 0x7a, + 0x38, 0x44, 0x44, 0x4c, 0x78, 0x70, 0xd9, 0x8d, + 0x87, 0xc6, 0x7f, /* U+0027 "'" */ 0xe0, /* U+0028 "(" */ - 0x5, 0x29, 0x24, 0x92, 0x24, 0x88, + 0x5, 0x29, 0x24, 0x92, 0x44, 0x88, /* U+0029 ")" */ 0x11, 0x22, 0x49, 0x24, 0xa4, 0xa0, /* U+002A "*" */ - 0x21, 0x3e, 0x45, 0x6c, + 0x25, 0x5c, 0xe5, 0x0, /* U+002B "+" */ 0x10, 0x20, 0x47, 0xf1, 0x2, 0x4, 0x0, /* U+002C "," */ - 0x54, + 0xe0, /* U+002D "-" */ - 0xe0, + 0xf0, /* U+002E "." */ 0x80, /* U+002F "/" */ - 0x8, 0x44, 0x21, 0x10, 0x84, 0x42, 0x31, 0x0, + 0x8, 0x46, 0x21, 0x10, 0x84, 0x42, 0x31, 0x0, /* U+0030 "0" */ 0x79, 0x28, 0x61, 0x86, 0x18, 0x61, 0x85, 0x27, 0x80, /* U+0031 "1" */ - 0x1f, 0x91, 0x11, 0x11, 0x11, 0x10, + 0xe4, 0x92, 0x49, 0x24, /* U+0032 "2" */ - 0x79, 0x9a, 0x10, 0x20, 0x41, 0x4, 0x18, 0x60, - 0x83, 0xf8, + 0x7b, 0x38, 0x41, 0xc, 0x21, 0xc, 0x61, 0xf, + 0xc0, /* U+0033 "3" */ - 0x7b, 0x38, 0x41, 0xc, 0xe0, 0xc1, 0x87, 0x37, + 0x7b, 0x38, 0x41, 0x4, 0xe0, 0xc1, 0x87, 0x37, 0x80, /* U+0034 "4" */ - 0x4, 0x18, 0x70, 0xa2, 0x4c, 0x91, 0x7f, 0x4, - 0x8, 0x10, + 0x8, 0x30, 0x61, 0x46, 0x89, 0x32, 0x7f, 0x8, + 0x10, 0x20, /* U+0035 "5" */ - 0x7d, 0x4, 0x10, 0xf9, 0x30, 0x41, 0x87, 0x37, + 0x7f, 0xc, 0x20, 0xfa, 0x30, 0x41, 0x87, 0x37, 0x80, /* U+0036 "6" */ - 0x39, 0x84, 0x20, 0xfb, 0x38, 0x61, 0x85, 0x37, + 0x39, 0x8, 0x20, 0xfb, 0x38, 0x61, 0x85, 0x33, 0x80, /* U+0037 "7" */ - 0xfe, 0xc, 0x10, 0x20, 0x81, 0x6, 0x8, 0x30, + 0xfe, 0xc, 0x30, 0x41, 0x2, 0x8, 0x10, 0x20, 0x40, 0x80, /* U+0038 "8" */ @@ -110,47 +110,47 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x80, /* U+0039 "9" */ - 0x73, 0x28, 0x61, 0x87, 0x37, 0x41, 0x8, 0x67, + 0x7b, 0x28, 0x61, 0x87, 0x37, 0xc1, 0x4, 0x27, 0x0, /* U+003A ":" */ 0x81, /* U+003B ";" */ - 0x87, 0x80, + 0x83, 0x80, /* U+003C "<" */ - 0x4, 0x66, 0x30, 0x70, 0x70, 0x40, + 0xc, 0xec, 0x38, 0x38, 0x30, /* U+003D "=" */ 0xfc, 0x0, 0x3f, /* U+003E ">" */ - 0x83, 0x81, 0x83, 0x3b, 0x0, 0x0, + 0xc1, 0xc1, 0xc7, 0x73, 0x0, /* U+003F "?" */ 0x74, 0x62, 0x11, 0x88, 0x84, 0x0, 0x8, /* U+0040 "@" */ - 0x1f, 0x6, 0x11, 0x1, 0x23, 0x28, 0x93, 0x22, - 0x64, 0x4c, 0x91, 0x92, 0x32, 0x6b, 0x77, 0x20, + 0x1f, 0x6, 0x11, 0x1, 0x20, 0x28, 0xe3, 0x32, + 0x64, 0x4c, 0x99, 0x92, 0x32, 0x4b, 0x77, 0x20, 0x2, 0x0, 0x3c, 0x0, /* U+0041 "A" */ - 0x8, 0xe, 0x5, 0x2, 0x83, 0x61, 0x10, 0x88, - 0xfe, 0x41, 0x20, 0xb0, 0x60, + 0x8, 0xe, 0x5, 0x2, 0x83, 0x41, 0x30, 0x88, + 0xfc, 0x43, 0x20, 0xb0, 0x40, /* U+0042 "B" */ - 0xf9, 0xa, 0x14, 0x28, 0xdf, 0x21, 0xc1, 0x83, + 0xf9, 0x1a, 0x14, 0x28, 0xdf, 0x21, 0xc1, 0x83, 0xf, 0xf0, /* U+0043 "C" */ - 0x3c, 0x8e, 0xc, 0x18, 0x10, 0x20, 0x40, 0x82, - 0x8c, 0xf0, + 0x38, 0x8a, 0xc, 0x8, 0x10, 0x20, 0x41, 0x82, + 0x88, 0xe0, /* U+0044 "D" */ - 0xf9, 0x1a, 0x14, 0x18, 0x30, 0x60, 0xc1, 0x87, - 0x1b, 0xe0, + 0xf9, 0xa, 0x1c, 0x18, 0x30, 0x60, 0xc1, 0x87, + 0xb, 0xe0, /* U+0045 "E" */ 0xfe, 0x8, 0x20, 0x83, 0xe8, 0x20, 0x82, 0xf, @@ -161,8 +161,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, /* U+0047 "G" */ - 0x3c, 0x42, 0xc1, 0x80, 0x80, 0x80, 0x8f, 0x81, - 0xc1, 0x61, 0x3e, + 0x38, 0x8a, 0xc, 0x18, 0x10, 0x23, 0xc1, 0x82, + 0x84, 0xf0, /* U+0048 "H" */ 0x83, 0x6, 0xc, 0x18, 0x3f, 0xe0, 0xc1, 0x83, @@ -176,39 +176,39 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x80, /* U+004B "K" */ - 0x87, 0x1a, 0x64, 0x8a, 0x1e, 0x34, 0x4c, 0x8d, - 0xa, 0x18, + 0x87, 0x1a, 0x24, 0x8b, 0x1c, 0x2c, 0x4c, 0x89, + 0x1a, 0x18, /* U+004C "L" */ 0x82, 0x8, 0x20, 0x82, 0x8, 0x20, 0x82, 0xf, 0xc0, /* U+004D "M" */ - 0xc0, 0xf0, 0x3c, 0xe, 0x85, 0xa1, 0x6c, 0xd9, - 0x26, 0x49, 0x9e, 0x63, 0x18, 0xc4, + 0xc0, 0xf0, 0x3c, 0xf, 0x87, 0xa1, 0x6c, 0xd9, + 0x26, 0x79, 0x9e, 0x63, 0x18, 0xc4, /* U+004E "N" */ - 0x81, 0xc1, 0xe1, 0xa1, 0xb1, 0x99, 0x8d, 0x85, - 0x87, 0x83, 0x81, + 0x83, 0x87, 0xd, 0x1b, 0x32, 0x66, 0xc5, 0x87, + 0xe, 0x8, /* U+004F "O" */ - 0x3c, 0x42, 0xc3, 0x81, 0x81, 0x81, 0x81, 0x81, - 0xc3, 0x42, 0x3c, + 0x3c, 0x42, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x42, 0x3c, /* U+0050 "P" */ - 0xfd, 0xa, 0xc, 0x18, 0x30, 0xff, 0x40, 0x81, + 0xfd, 0xe, 0xc, 0x18, 0x30, 0xbe, 0x40, 0x81, 0x2, 0x0, /* U+0051 "Q" */ - 0x3c, 0x42, 0xc3, 0x81, 0x81, 0x81, 0x81, 0x81, - 0xc3, 0x42, 0x3e, 0x3, 0x0, + 0x3c, 0x21, 0x20, 0x50, 0x28, 0x14, 0xa, 0x5, + 0x2, 0x81, 0x21, 0xf, 0xc0, 0x20, /* U+0052 "R" */ - 0xfd, 0xe, 0xc, 0x18, 0x30, 0xff, 0x46, 0x85, - 0xe, 0x8, + 0xfd, 0xe, 0xc, 0x18, 0x7f, 0xa1, 0xc1, 0x83, + 0x6, 0x8, /* U+0053 "S" */ - 0x79, 0x8a, 0xc, 0xe, 0x7, 0x3, 0x81, 0x83, + 0x79, 0x8e, 0xc, 0xe, 0x7, 0x1, 0x81, 0x83, 0x8c, 0xf0, /* U+0054 "T" */ @@ -217,24 +217,24 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0055 "U" */ 0x83, 0x6, 0xc, 0x18, 0x30, 0x60, 0xc1, 0x82, - 0x88, 0xf0, + 0x88, 0xe0, /* U+0056 "V" */ 0xc1, 0xa0, 0x90, 0xcc, 0x62, 0x21, 0x30, 0xd8, 0x28, 0x14, 0xe, 0x2, 0x0, /* U+0057 "W" */ - 0x42, 0x14, 0x63, 0x46, 0x34, 0x52, 0x65, 0x22, - 0x92, 0x29, 0x62, 0x8c, 0x28, 0xc3, 0xc, 0x10, + 0xc6, 0x34, 0x62, 0x46, 0x24, 0xf2, 0x6f, 0x66, + 0x96, 0x29, 0x42, 0x9c, 0x38, 0xc3, 0xc, 0x10, 0xc0, /* U+0058 "X" */ - 0x43, 0x62, 0x26, 0x34, 0x1c, 0x8, 0x1c, 0x34, + 0x43, 0x63, 0x36, 0x14, 0x1c, 0x8, 0x1c, 0x34, 0x26, 0x63, 0x41, /* U+0059 "Y" */ - 0x83, 0x8d, 0x13, 0x62, 0x87, 0x4, 0x8, 0x10, - 0x20, 0x40, + 0x82, 0xc6, 0x44, 0x6c, 0x28, 0x38, 0x10, 0x10, + 0x10, 0x10, 0x10, /* U+005A "Z" */ 0xfe, 0xc, 0x30, 0x41, 0x82, 0xc, 0x30, 0x41, @@ -244,33 +244,33 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xea, 0xaa, 0xaa, 0xb0, /* U+005C "\\" */ - 0xc1, 0x4, 0x8, 0x20, 0x81, 0x4, 0x18, 0x20, + 0xc1, 0x4, 0x8, 0x20, 0xc1, 0x4, 0x18, 0x20, 0x83, /* U+005D "]" */ 0xd5, 0x55, 0x55, 0x70, /* U+005E "^" */ - 0x21, 0x8c, 0xe4, 0xa4, + 0x21, 0x8c, 0xf4, 0xa4, /* U+005F "_" */ 0xfc, /* U+0060 "`" */ - 0x44, + 0x90, /* U+0061 "a" */ - 0x7b, 0x10, 0x5f, 0xc6, 0x18, 0xdf, + 0x7b, 0x10, 0x5f, 0xc6, 0x18, 0xdd, /* U+0062 "b" */ - 0x82, 0x8, 0x3e, 0xca, 0x18, 0x61, 0x87, 0x2f, + 0x82, 0x8, 0x3e, 0xca, 0x18, 0x61, 0x87, 0x3f, 0x80, /* U+0063 "c" */ - 0x79, 0x38, 0x60, 0x82, 0x14, 0xde, + 0x79, 0x38, 0x60, 0x82, 0x14, 0x5e, /* U+0064 "d" */ - 0x4, 0x10, 0x5f, 0x4e, 0x18, 0x61, 0x85, 0x37, + 0x4, 0x10, 0x5f, 0x4e, 0x18, 0x61, 0x87, 0x37, 0xc0, /* U+0065 "e" */ @@ -280,7 +280,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x3a, 0x11, 0xe4, 0x21, 0x8, 0x42, 0x10, /* U+0067 "g" */ - 0x7d, 0x38, 0x61, 0x86, 0x14, 0xdf, 0x6, 0x37, + 0x7d, 0x38, 0x61, 0x86, 0x1c, 0xdf, 0x4, 0x17, 0x80, /* U+0068 "h" */ @@ -291,58 +291,58 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x9f, 0xe0, /* U+006A "j" */ - 0x41, 0x55, 0x55, 0x70, + 0x20, 0x12, 0x49, 0x24, 0x93, 0x80, /* U+006B "k" */ - 0x82, 0x8, 0x22, 0x92, 0x8e, 0x38, 0x92, 0x68, - 0xc0, + 0x82, 0x8, 0x22, 0x92, 0xce, 0x28, 0x92, 0x68, + 0x80, /* U+006C "l" */ 0xff, 0xe0, /* U+006D "m" */ - 0xfb, 0xd8, 0xc6, 0x10, 0xc2, 0x18, 0x43, 0x8, + 0xb9, 0xd9, 0xce, 0x10, 0xc2, 0x18, 0x43, 0x8, 0x61, 0xc, 0x21, /* U+006E "n" */ 0xbb, 0x18, 0x61, 0x86, 0x18, 0x61, /* U+006F "o" */ - 0x38, 0x8a, 0xc, 0x18, 0x30, 0x51, 0x1c, + 0x79, 0x28, 0x61, 0x86, 0x14, 0x9e, /* U+0070 "p" */ - 0xfb, 0x28, 0x61, 0x86, 0x18, 0xbe, 0x82, 0x8, + 0xfa, 0x28, 0x61, 0x86, 0x18, 0xfe, 0x82, 0x8, 0x0, /* U+0071 "q" */ - 0x7f, 0x18, 0x61, 0x86, 0x14, 0xdf, 0x4, 0x10, + 0x7d, 0x18, 0x61, 0x86, 0x1c, 0x5f, 0x4, 0x10, 0x40, /* U+0072 "r" */ 0xf2, 0x49, 0x24, /* U+0073 "s" */ - 0x7a, 0x38, 0x1c, 0x1c, 0x1c, 0x5e, + 0x74, 0x61, 0xc3, 0x86, 0x2e, /* U+0074 "t" */ 0x44, 0xf4, 0x44, 0x44, 0x43, /* U+0075 "u" */ - 0x86, 0x18, 0x61, 0x86, 0x18, 0xdf, + 0x86, 0x18, 0x61, 0x86, 0x18, 0xdd, /* U+0076 "v" */ - 0xc4, 0x89, 0x33, 0x42, 0x85, 0xc, 0x8, + 0xc6, 0x89, 0x11, 0x62, 0x85, 0x6, 0x8, /* U+0077 "w" */ - 0xc4, 0x53, 0x14, 0xcd, 0x2a, 0x7a, 0x8c, 0xa3, - 0x10, 0xc4, + 0xc4, 0x53, 0x14, 0xed, 0xaa, 0x3a, 0x8c, 0xa3, + 0x18, 0xc4, /* U+0078 "x" */ - 0x44, 0xd8, 0xa1, 0x83, 0x5, 0x1b, 0x22, + 0x44, 0xd8, 0xa1, 0xc3, 0x85, 0x1b, 0x22, /* U+0079 "y" */ - 0x8e, 0x2c, 0x96, 0x51, 0xc3, 0x8, 0x20, 0x8c, - 0x0, + 0xc6, 0x89, 0x13, 0x62, 0x85, 0xe, 0x8, 0x10, + 0x61, 0x80, /* U+007A "z" */ 0xfc, 0x31, 0x8c, 0x21, 0x8c, 0x3f, @@ -406,109 +406,109 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 55, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1, .adv_w = 58, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3, .adv_w = 72, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 5, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16, .adv_w = 126, .box_w = 6, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 26, .adv_w = 164, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 39, .adv_w = 139, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 50, .adv_w = 39, .box_w = 1, .box_h = 3, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 51, .adv_w = 77, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 57, .adv_w = 78, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 63, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 67, .adv_w = 127, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 74, .adv_w = 44, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75, .adv_w = 62, .box_w = 3, .box_h = 1, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 76, .adv_w = 59, .box_w = 1, .box_h = 1, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 77, .adv_w = 92, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 85, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 94, .adv_w = 126, .box_w = 4, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 100, .adv_w = 126, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 110, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 119, .adv_w = 126, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 129, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 138, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 147, .adv_w = 126, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 157, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 166, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 175, .adv_w = 54, .box_w = 1, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 176, .adv_w = 47, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 178, .adv_w = 114, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 184, .adv_w = 123, .box_w = 6, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 187, .adv_w = 117, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 193, .adv_w = 106, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 200, .adv_w = 201, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 220, .adv_w = 146, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 233, .adv_w = 139, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 243, .adv_w = 146, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 253, .adv_w = 147, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 263, .adv_w = 127, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 272, .adv_w = 124, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 281, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 292, .adv_w = 160, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 302, .adv_w = 61, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 304, .adv_w = 124, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 313, .adv_w = 140, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 323, .adv_w = 121, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 332, .adv_w = 196, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 346, .adv_w = 160, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 357, .adv_w = 154, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 368, .adv_w = 141, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 378, .adv_w = 154, .box_w = 8, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 391, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 401, .adv_w = 133, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 411, .adv_w = 134, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 422, .adv_w = 145, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 432, .adv_w = 143, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 445, .adv_w = 199, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 462, .adv_w = 140, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 473, .adv_w = 135, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 483, .adv_w = 134, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 493, .adv_w = 59, .box_w = 2, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 497, .adv_w = 92, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 506, .adv_w = 59, .box_w = 2, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 510, .adv_w = 94, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 514, .adv_w = 101, .box_w = 6, .box_h = 1, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 515, .adv_w = 69, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 516, .adv_w = 122, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 522, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 531, .adv_w = 117, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 537, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 546, .adv_w = 119, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 552, .adv_w = 78, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 559, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 568, .adv_w = 123, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 577, .adv_w = 54, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 579, .adv_w = 53, .box_w = 2, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 583, .adv_w = 114, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 592, .adv_w = 54, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 594, .adv_w = 196, .box_w = 11, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 605, .adv_w = 124, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 611, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 618, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 627, .adv_w = 127, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 636, .adv_w = 76, .box_w = 3, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 639, .adv_w = 116, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 645, .adv_w = 73, .box_w = 4, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 650, .adv_w = 123, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 656, .adv_w = 109, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 663, .adv_w = 168, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 673, .adv_w = 111, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 680, .adv_w = 106, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 689, .adv_w = 111, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 695, .adv_w = 76, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 703, .adv_w = 55, .box_w = 1, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 705, .adv_w = 76, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 713, .adv_w = 152, .box_w = 8, .box_h = 3, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 716, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 734, .adv_w = 154, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 746, .adv_w = 140, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 762, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 780, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 810, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 835, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 853, .adv_w = 225, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 1} + {.bitmap_index = 0, .adv_w = 56, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1, .adv_w = 59, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3, .adv_w = 80, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 5, .adv_w = 140, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16, .adv_w = 130, .box_w = 6, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 27, .adv_w = 164, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 40, .adv_w = 140, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 51, .adv_w = 49, .box_w = 1, .box_h = 3, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 52, .adv_w = 74, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 58, .adv_w = 75, .box_w = 3, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 64, .adv_w = 97, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 68, .adv_w = 127, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 75, .adv_w = 44, .box_w = 1, .box_h = 3, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76, .adv_w = 101, .box_w = 4, .box_h = 1, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 77, .adv_w = 60, .box_w = 1, .box_h = 1, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 78, .adv_w = 93, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 95, .adv_w = 126, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 99, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 108, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 117, .adv_w = 126, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 127, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 136, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 145, .adv_w = 126, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 155, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 164, .adv_w = 126, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 173, .adv_w = 57, .box_w = 1, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 174, .adv_w = 57, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 176, .adv_w = 114, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 181, .adv_w = 126, .box_w = 6, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 184, .adv_w = 117, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 189, .adv_w = 107, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 196, .adv_w = 200, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 216, .adv_w = 142, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 229, .adv_w = 142, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 239, .adv_w = 142, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 249, .adv_w = 152, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 259, .adv_w = 124, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 268, .adv_w = 124, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 277, .adv_w = 152, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 287, .adv_w = 158, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 297, .adv_w = 63, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 299, .adv_w = 123, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 308, .adv_w = 142, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 318, .adv_w = 123, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 327, .adv_w = 195, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 341, .adv_w = 158, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 351, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 362, .adv_w = 142, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 372, .adv_w = 156, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 386, .adv_w = 143, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 396, .adv_w = 137, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 406, .adv_w = 134, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 417, .adv_w = 152, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 427, .adv_w = 142, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 440, .adv_w = 193, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 457, .adv_w = 142, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 468, .adv_w = 142, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 479, .adv_w = 134, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 489, .adv_w = 60, .box_w = 2, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 493, .adv_w = 93, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 502, .adv_w = 60, .box_w = 2, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 506, .adv_w = 94, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 510, .adv_w = 102, .box_w = 6, .box_h = 1, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 511, .adv_w = 70, .box_w = 2, .box_h = 2, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 512, .adv_w = 123, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 518, .adv_w = 127, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 527, .adv_w = 117, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 533, .adv_w = 127, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 542, .adv_w = 117, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 548, .adv_w = 74, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 555, .adv_w = 127, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 564, .adv_w = 127, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 573, .adv_w = 56, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 575, .adv_w = 58, .box_w = 3, .box_h = 14, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 581, .adv_w = 115, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 590, .adv_w = 56, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 592, .adv_w = 196, .box_w = 11, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 603, .adv_w = 127, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 609, .adv_w = 127, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 615, .adv_w = 127, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 624, .adv_w = 127, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 633, .adv_w = 78, .box_w = 3, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 636, .adv_w = 117, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 641, .adv_w = 75, .box_w = 4, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 646, .adv_w = 127, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 652, .adv_w = 113, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 659, .adv_w = 170, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 669, .adv_w = 113, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 676, .adv_w = 113, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 686, .adv_w = 113, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 692, .adv_w = 76, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 700, .adv_w = 55, .box_w = 1, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 702, .adv_w = 76, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 710, .adv_w = 152, .box_w = 8, .box_h = 3, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 713, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 731, .adv_w = 154, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 743, .adv_w = 140, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 759, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 777, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 807, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 832, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 850, .adv_w = 225, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 1} }; /*--------------------- @@ -540,201 +540,175 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { - 0, 1, 0, 2, 0, 0, 0, 0, - 2, 3, 0, 0, 0, 4, 0, 4, - 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 7, 8, 9, 10, 11, - 0, 12, 12, 13, 14, 15, 12, 12, - 9, 16, 17, 18, 0, 19, 13, 20, - 21, 22, 23, 24, 25, 0, 0, 0, - 0, 0, 26, 27, 28, 0, 29, 30, - 0, 31, 0, 0, 32, 0, 31, 31, - 33, 27, 0, 34, 0, 35, 0, 36, - 37, 38, 36, 39, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 5, 6, 7, 8, + 0, 9, 9, 10, 11, 12, 9, 9, + 6, 13, 14, 15, 0, 16, 10, 17, + 18, 19, 20, 21, 22, 0, 0, 0, + 0, 0, 23, 24, 25, 0, 26, 27, + 0, 28, 0, 0, 29, 0, 28, 28, + 30, 24, 0, 31, 0, 0, 0, 32, + 33, 34, 32, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /*Map glyph_ids to kern right classes*/ static const uint8_t kern_right_class_mapping[] = { - 0, 1, 0, 2, 0, 0, 0, 3, - 2, 0, 4, 5, 0, 6, 7, 6, - 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 2, + 1, 0, 3, 4, 0, 5, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 0, 10, 0, 11, 0, 0, 0, - 11, 0, 0, 12, 0, 0, 0, 0, - 11, 0, 11, 0, 13, 14, 15, 16, - 17, 18, 19, 20, 0, 0, 21, 0, - 0, 0, 22, 0, 23, 23, 23, 24, - 23, 0, 0, 0, 0, 0, 25, 25, - 26, 25, 23, 27, 28, 29, 30, 31, - 32, 33, 31, 34, 0, 0, 35, 0, + 0, 0, 0, 5, 0, 0, 0, 0, + 7, 0, 8, 0, 9, 0, 0, 0, + 9, 0, 0, 10, 0, 0, 0, 0, + 9, 0, 9, 0, 11, 12, 13, 14, + 15, 16, 17, 18, 0, 0, 19, 0, + 0, 0, 20, 0, 21, 21, 21, 22, + 21, 0, 0, 0, 0, 0, 23, 23, + 24, 23, 21, 25, 26, 27, 28, 29, + 30, 31, 29, 32, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /*Kern values between classes*/ static const int8_t kern_class_values[] = { + -12, 0, 0, 0, 0, 0, 0, -12, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, -5, -6, 0, -2, -7, + 0, -5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -12, 0, 0, 0, - 0, 0, 0, 0, -13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -5, -6, 0, -2, -7, 0, -9, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -19, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -24, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -13, 0, 0, 0, 0, 0, 0, -7, - 0, -1, 0, 0, -14, -2, -10, -8, - 0, -10, 0, 0, 0, 0, 0, 0, - -1, 0, 0, -2, -1, -5, -4, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - 0, -3, 0, 0, -6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -3, 0, 0, 0, 0, 0, - 0, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, 0, 0, 0, 0, -11, 0, 0, - 0, -2, 0, 0, 0, -3, 0, -2, - 0, -2, -5, -3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, -2, -2, 0, -2, 0, 0, 0, - -2, -3, -2, 0, 0, 0, 0, 0, - 0, 0, 0, -26, 0, 0, 0, -19, - 0, -29, 0, 2, 0, 0, 0, 0, - 0, 0, 0, -4, -2, 0, 0, -2, - -3, 0, 0, -2, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, -3, 0, - 0, 0, 2, -3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -7, 0, 0, - 0, -3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, -3, - -3, 0, 0, 0, -3, -4, -7, 0, - 0, 0, 0, -37, 0, 0, 0, 0, - 0, 0, 0, 2, -7, 0, 0, -30, - -6, -19, -16, 0, -26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - -15, -10, 0, 0, 0, 0, 0, 0, - 0, 0, -35, 0, 0, 0, -15, 0, - -22, 0, 0, 0, 0, 0, -3, 0, - -3, 0, -1, -1, 0, 0, -1, 0, - 0, 2, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -5, 0, -3, - -2, 0, -4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -9, 0, -2, 0, 0, -5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -4, 0, - 0, 0, 0, -24, -25, 0, 0, -9, - -3, -26, -2, 2, 0, 2, 2, 0, - 2, 0, 0, -12, -11, 0, -12, -11, - -8, -13, 0, -10, -8, -6, -8, -7, - 0, 0, 0, 0, 2, 0, -25, -4, - 0, 0, -8, -1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, -5, -5, - 0, 0, -5, -3, 0, 0, -3, -1, - 0, 0, 0, 2, 0, 0, 0, 2, - 0, -13, -7, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, - 1, -4, -3, 0, 0, -3, -2, 0, - 0, -2, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, -5, 0, 0, - 0, -3, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - -2, 0, 0, 0, -2, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 0, 0, 0, 0, 0, + -7, 0, -1, 0, 0, -14, -2, -10, + -8, 0, -10, 0, 0, 0, 0, 0, + 0, -1, 0, 0, -2, -1, -5, -4, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + -3, 0, 0, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, -11, 0, 0, -2, 0, 0, 0, + -3, 0, -2, 0, -2, -5, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -2, 0, 0, + 0, -2, -3, -2, 0, 0, 0, 0, + 0, 0, 0, -26, 0, 0, -6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -2, 0, 0, -2, -3, + 0, 0, -2, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, -3, 0, 0, 0, 2, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + -3, -3, 0, 0, 0, -3, -4, -7, + 0, 0, 0, -15, 0, 0, 0, 0, + 0, 0, 2, -7, 0, 0, -30, -6, + -19, -16, 0, -26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -15, + -10, 0, 0, 0, 0, 0, 0, 0, + -35, 0, 0, -15, 0, 0, 0, 0, + 0, 0, 0, -3, 0, -3, 0, -1, + -1, 0, 0, -1, 0, 0, 2, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, -3, -2, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, -2, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -24, -25, 0, -9, -3, + 0, -2, 2, 0, 2, 2, 0, 2, + 0, 0, -12, -11, 0, -12, -11, -8, + -13, 0, -10, -8, -6, -8, -7, 0, + 0, 0, 2, 0, -25, -4, 0, -8, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, -5, -5, 0, 0, -5, + -3, 0, 0, -3, -1, 0, 0, 0, + 2, 0, 0, 2, 0, -13, -7, 0, + -5, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 1, -4, -3, 0, 0, + -3, -2, 0, 0, -2, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, -5, + 0, 0, -3, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, -2, 0, 0, 0, -2, -3, 0, 0, 0, 0, 0, -3, 2, -5, -23, - -6, 0, 0, -10, -3, -10, -2, 2, - -10, 2, 2, 1, 2, 0, 2, -8, - -7, -2, -4, -7, -4, -6, -2, -4, - -2, 0, -3, -3, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, -3, + -6, 0, -9, -3, -10, -2, 2, -10, + 2, 2, 1, 2, 0, 2, -8, -7, + -2, -4, -7, -4, -6, -2, -4, -2, + 0, -3, -3, 2, 0, 0, 0, 0, + 0, 0, 0, 1, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -2, 0, 0, -2, 0, - 0, 0, -2, -3, -3, 0, 0, 0, + -2, 0, 0, -2, 0, 0, 0, -2, + -3, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -2, 0, 0, -2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, -3, + 0, 0, -2, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1, 0, -2, -2, - 0, 0, -1, 0, 0, 0, 0, 0, + 0, 0, 0, -1, 0, -2, -2, 0, + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 2, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - 2, 0, 2, 0, 0, 0, 0, 0, + 0, -2, 0, -2, -2, 0, 2, 0, + 0, 0, -13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, -3, 0, 0, + 0, 0, -2, 2, 0, -2, 0, 0, + 2, 0, 2, 2, 0, 0, 0, 2, + 0, 0, 0, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, -11, 0, 0, 0, 0, + 0, 0, -2, -1, 1, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, 0, - -2, -2, 0, 0, 2, 0, 0, 0, - -13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -4, -2, 2, 0, -2, 0, 0, 5, - 0, 2, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, -12, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, -1, - 1, 0, -2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -744,13 +718,13 @@ static const int8_t kern_class_values[] = -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -2, 0, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -2, 0, 0, -2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0 }; @@ -760,8 +734,8 @@ static const lv_font_fmt_txt_kern_classes_t kern_classes = .class_pair_values = kern_class_values, .left_class_mapping = kern_left_class_mapping, .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 40, - .right_class_cnt = 35, + .left_class_cnt = 36, + .right_class_cnt = 33, }; /*-------------------- diff --git a/radio/src/fonts/lvgl/std/lv_font_bl.c b/radio/src/fonts/lvgl/std/lv_font_bl.c index b34d18c81..35fd87390 100644 --- a/radio/src/fonts/lvgl/std/lv_font_bl.c +++ b/radio/src/fonts/lvgl/std/lv_font_bl.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 16 px * Bpp: 1 - * Opts: --no-prefilter --bpp 1 --size 16 --no-compress --font ../Roboto/Roboto-Regular.ttf -r 0x20-0x7F --font ../../thirdparty/lvgl/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff -r 61671,63650,63426,61453,61787,61452,61931,62087 --format lvgl -o std/lv_font_bl.c --force-fast-kern-format --no-compress + * Opts: --no-prefilter --bpp 1 --size 16 --no-compress --font ../Roboto/Roboto-Regular-BL.ttf -r 0x20-0x7F --font ../../thirdparty/lvgl/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff -r 61671,63650,63426,61453,61787,61452,61931,62087 --format lvgl -o std/lv_font_bl.c --force-fast-kern-format --no-compress ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -26,235 +26,236 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, /* U+0021 "!" */ - 0xff, 0x10, + 0xff, 0xff, 0x3, /* U+0022 "\"" */ - 0xb6, 0xd0, + 0xff, 0xfa, /* U+0023 "#" */ - 0xb, 0x9, 0x4, 0x8f, 0xf1, 0x20, 0x90, 0x48, - 0x48, 0xff, 0x12, 0x9, 0x4, 0x80, + 0xb, 0x9, 0x4, 0x8f, 0xf1, 0x20, 0x90, 0x58, + 0x68, 0xff, 0x12, 0x9, 0x4, 0x80, /* U+0024 "$" */ - 0x10, 0x20, 0xf3, 0x34, 0x28, 0x18, 0x1c, 0x4, - 0x6, 0xe, 0x37, 0xc2, 0x4, 0x0, + 0x10, 0x21, 0xf6, 0x7c, 0x78, 0x38, 0x1c, 0xc, + 0xf, 0x1e, 0x37, 0xc2, 0x4, 0x0, /* U+0025 "%" */ - 0x70, 0x22, 0x48, 0x92, 0x28, 0x72, 0x1, 0x0, + 0x70, 0x22, 0x8, 0x92, 0x28, 0x72, 0x1, 0x0, 0x98, 0x29, 0x12, 0x4c, 0x92, 0x24, 0x6, /* U+0026 "&" */ - 0x38, 0x22, 0x11, 0x8, 0x86, 0x81, 0xc1, 0xc1, - 0xb2, 0x8d, 0x43, 0xb1, 0xcf, 0xa0, + 0x3c, 0x33, 0x19, 0x8c, 0xc6, 0xc1, 0xc0, 0xe1, + 0xd3, 0xcd, 0xe3, 0xb8, 0xc7, 0xb0, /* U+0027 "'" */ - 0xf0, + 0xfe, /* U+0028 "(" */ - 0x32, 0x44, 0x88, 0x88, 0x88, 0x88, 0x44, 0x42, - 0x0, + 0x19, 0x98, 0xc4, 0x63, 0x18, 0xc6, 0x31, 0x86, + 0x30, 0xc2, 0x0, /* U+0029 ")" */ - 0xc4, 0x22, 0x11, 0x11, 0x11, 0x11, 0x22, 0x64, - 0x0, + 0xc3, 0x8, 0x61, 0xc, 0x63, 0x18, 0xc6, 0x33, + 0x19, 0x88, 0x0, /* U+002A "*" */ - 0x10, 0x23, 0x51, 0xe3, 0x85, 0x0, 0x0, + 0x25, 0x3e, 0xc5, 0x28, /* U+002B "+" */ - 0x10, 0x10, 0x10, 0xff, 0x10, 0x10, 0x10, 0x10, + 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, /* U+002C "," */ - 0x56, + 0x6d, 0x20, /* U+002D "-" */ - 0xf0, + 0xf8, /* U+002E "." */ - 0xf0, + 0xc0, /* U+002F "/" */ - 0x4, 0x30, 0x82, 0x10, 0x41, 0x8, 0x21, 0x84, + 0x4, 0x30, 0x82, 0x18, 0x43, 0x8, 0x21, 0x84, 0x10, 0xc0, /* U+0030 "0" */ - 0x38, 0x8a, 0xc, 0x18, 0x30, 0x60, 0xc1, 0x83, - 0x5, 0x11, 0xc0, + 0x38, 0xdb, 0x1e, 0x3c, 0x78, 0xf1, 0xe3, 0xc7, + 0x8d, 0xb1, 0xc0, /* U+0031 "1" */ - 0x1f, 0x91, 0x11, 0x11, 0x11, 0x11, + 0xff, 0x33, 0x33, 0x33, 0x33, 0x33, /* U+0032 "2" */ - 0x3c, 0x8e, 0xc, 0x10, 0x20, 0x83, 0xc, 0x30, - 0xc1, 0x7, 0xf0, + 0x3c, 0xcf, 0x18, 0x30, 0x61, 0x87, 0xc, 0x30, + 0xe3, 0x87, 0xf0, /* U+0033 "3" */ - 0x7d, 0x8e, 0x8, 0x10, 0x67, 0x81, 0x81, 0x3, - 0x7, 0x13, 0xc0, + 0x3d, 0xcf, 0x18, 0x30, 0x43, 0x1, 0x3, 0x7, + 0x8d, 0xb1, 0xc0, /* U+0034 "4" */ - 0x4, 0xc, 0x1c, 0x14, 0x34, 0x24, 0x44, 0xc4, - 0xff, 0x4, 0x4, 0x4, + 0x6, 0xe, 0x1e, 0x16, 0x36, 0x26, 0x66, 0xc6, + 0xff, 0x6, 0x6, 0x6, /* U+0035 "5" */ - 0x7e, 0x81, 0x2, 0x7, 0xc8, 0x80, 0x81, 0x3, - 0x85, 0x11, 0xc0, + 0x7c, 0x81, 0x2, 0x7, 0xc9, 0x81, 0x83, 0x7, + 0x8f, 0xb3, 0xc0, /* U+0036 "6" */ - 0x1c, 0x41, 0x4, 0xb, 0x98, 0xa0, 0xc1, 0x83, - 0x5, 0x11, 0xc0, + 0x3c, 0xc3, 0x6, 0xf, 0xd9, 0xf1, 0xe3, 0xc7, + 0x8d, 0xb1, 0xc0, /* U+0037 "7" */ - 0xff, 0x3, 0x2, 0x6, 0x4, 0xc, 0x8, 0x18, - 0x18, 0x10, 0x30, 0x20, + 0xff, 0x3, 0x6, 0xc, 0x8, 0x18, 0x18, 0x30, + 0x30, 0x30, 0x30, 0x30, /* U+0038 "8" */ - 0x7d, 0x8e, 0xc, 0x1c, 0x6f, 0xb1, 0xc1, 0x83, - 0x7, 0x13, 0xe0, + 0x7c, 0xce, 0xc6, 0xc6, 0x6c, 0x38, 0x66, 0xc3, + 0xc3, 0xc3, 0x66, 0x3c, /* U+0039 "9" */ - 0x38, 0x8a, 0xc, 0x18, 0x30, 0x51, 0x9d, 0x2, - 0x8, 0x33, 0x80, + 0x38, 0xdb, 0x1e, 0x3c, 0x78, 0xdb, 0xbf, 0x6, + 0xc, 0x33, 0xc0, /* U+003A ":" */ - 0xf0, 0x3, 0xc0, + 0xc0, 0x0, 0xc0, /* U+003B ";" */ - 0x6c, 0x0, 0x3, 0x6d, 0x20, + 0xc0, 0xf, 0xa0, /* U+003C "<" */ - 0x6, 0x3d, 0xe6, 0xe, 0x7, 0x81, 0x80, + 0x6, 0x39, 0xc6, 0x7, 0x3, 0xc1, 0x80, /* U+003D "=" */ 0xfe, 0x0, 0x0, 0xf, 0xe0, /* U+003E ">" */ - 0x81, 0xc0, 0xe0, 0x31, 0xce, 0x30, 0x0, + 0x81, 0xc0, 0xf0, 0x31, 0xde, 0x30, 0x0, /* U+003F "?" */ - 0x7b, 0x38, 0x41, 0x4, 0x21, 0x8, 0x20, 0x0, - 0x8, + 0x7d, 0x8f, 0x18, 0x30, 0x61, 0x86, 0x18, 0x30, + 0x0, 0x1, 0x80, /* U+0040 "@" */ - 0xf, 0x80, 0x83, 0x8, 0xc, 0x87, 0x2c, 0x48, - 0xc4, 0x46, 0x22, 0x31, 0x11, 0x98, 0x8c, 0x4c, + 0xf, 0x81, 0x83, 0x8, 0xc, 0x8f, 0x2c, 0xc8, + 0xc4, 0x46, 0x22, 0x31, 0x11, 0x98, 0x8c, 0x44, 0x62, 0x64, 0x9d, 0xc6, 0x0, 0x18, 0x0, 0x3e, 0x0, /* U+0041 "A" */ - 0xc, 0x3, 0x0, 0xe0, 0x68, 0x13, 0x4, 0xc3, - 0x10, 0x86, 0x7f, 0x98, 0x24, 0xf, 0x3, + 0xc, 0x3, 0x0, 0xe0, 0x78, 0x12, 0x4, 0xc3, + 0x30, 0xc4, 0x3f, 0x98, 0x64, 0x9, 0x3, /* U+0042 "B" */ - 0xfd, 0xe, 0xc, 0x18, 0x7f, 0xa1, 0xc1, 0x83, - 0x6, 0x1f, 0xe0, + 0xfc, 0xc7, 0xc3, 0xc3, 0xc6, 0xfc, 0xc6, 0xc3, + 0xc3, 0xc3, 0xc7, 0xfe, /* U+0043 "C" */ - 0x3c, 0x42, 0x43, 0x81, 0x80, 0x80, 0x80, 0x80, - 0x81, 0x43, 0x42, 0x3c, + 0x3e, 0x31, 0x98, 0x78, 0x3c, 0x6, 0x3, 0x1, + 0x80, 0xc1, 0xa0, 0xd8, 0xc7, 0xc0, /* U+0044 "D" */ - 0xf8, 0x86, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x82, 0x86, 0xf8, + 0xfc, 0x63, 0xb0, 0xd8, 0x3c, 0x1e, 0xf, 0x7, + 0x83, 0xc1, 0xe1, 0xb1, 0xdf, 0x80, /* U+0045 "E" */ - 0xff, 0x2, 0x4, 0x8, 0x1f, 0xa0, 0x40, 0x81, - 0x2, 0x7, 0xf0, + 0xff, 0x83, 0x6, 0xc, 0x1f, 0xf0, 0x60, 0xc1, + 0x83, 0x7, 0xf0, /* U+0046 "F" */ - 0xff, 0x2, 0x4, 0x8, 0x10, 0x3f, 0x40, 0x81, - 0x2, 0x4, 0x0, + 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, /* U+0047 "G" */ - 0x3e, 0x30, 0x90, 0x30, 0x8, 0x4, 0x2, 0x1f, - 0x1, 0x80, 0xa0, 0x58, 0x63, 0xe0, + 0x3e, 0x31, 0xb0, 0x78, 0x3c, 0x6, 0x3, 0x1f, + 0x83, 0xc1, 0xe0, 0xd8, 0xe7, 0xe0, /* U+0048 "H" */ - 0x81, 0x81, 0x81, 0x81, 0x81, 0xff, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, + 0xc1, 0xe0, 0xf0, 0x78, 0x3c, 0x1e, 0xf, 0xff, + 0x83, 0xc1, 0xe0, 0xf0, 0x78, 0x30, /* U+0049 "I" */ - 0xff, 0xf0, + 0xff, 0xff, 0xff, /* U+004A "J" */ - 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x81, 0x3, - 0x7, 0x13, 0xc0, + 0x6, 0xc, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x7, + 0x8f, 0x33, 0xc0, /* U+004B "K" */ - 0x82, 0x86, 0x8c, 0x98, 0xb0, 0xf0, 0xf0, 0x98, - 0x8c, 0x84, 0x86, 0x83, + 0xc1, 0x61, 0xb1, 0x99, 0x8d, 0x87, 0x83, 0x61, + 0x98, 0xc6, 0x63, 0x30, 0xd8, 0x30, /* U+004C "L" */ - 0x82, 0x8, 0x20, 0x82, 0x8, 0x20, 0x82, 0x8, - 0x3f, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xff, /* U+004D "M" */ - 0xc0, 0x78, 0xf, 0x83, 0xf0, 0x7a, 0xb, 0x63, - 0x64, 0x4c, 0xd9, 0x9b, 0x31, 0x46, 0x38, 0xc2, - 0x10, + 0xe0, 0xfc, 0x1f, 0x83, 0xf8, 0x7d, 0x17, 0xa2, + 0xf4, 0x5e, 0x53, 0xca, 0x79, 0x4f, 0x11, 0xe2, + 0x30, /* U+004E "N" */ - 0x81, 0xc1, 0xe1, 0xe1, 0xb1, 0x99, 0x99, 0x8d, - 0x85, 0x87, 0x83, 0x81, + 0xc1, 0xf0, 0xf8, 0x7e, 0x3d, 0x1e, 0xcf, 0x37, + 0x8b, 0xc7, 0xe1, 0xf0, 0xf8, 0x30, /* U+004F "O" */ - 0x3e, 0x31, 0x90, 0x50, 0x18, 0xc, 0x6, 0x3, - 0x1, 0x80, 0xa0, 0x98, 0xc7, 0xc0, + 0x3e, 0x31, 0xb0, 0x58, 0x3c, 0x1e, 0xf, 0x7, + 0x83, 0xc1, 0xe0, 0x98, 0xc7, 0xc0, /* U+0050 "P" */ - 0xfc, 0x82, 0x81, 0x81, 0x81, 0x82, 0xfc, 0x80, - 0x80, 0x80, 0x80, 0x80, + 0xfc, 0xc6, 0xc3, 0xc3, 0xc3, 0xc6, 0xfc, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, /* U+0051 "Q" */ - 0x3e, 0x31, 0x90, 0x50, 0x18, 0xc, 0x6, 0x3, - 0x1, 0x80, 0xa0, 0xd8, 0xc7, 0xe0, 0x18, 0x4, + 0x3e, 0x18, 0xcc, 0x13, 0x6, 0xc1, 0xb0, 0x6c, + 0x1b, 0x6, 0xc1, 0xb0, 0x46, 0x30, 0xf6, 0x0, + 0x80, /* U+0052 "R" */ - 0xfc, 0x41, 0x20, 0x50, 0x28, 0x14, 0x1b, 0xf9, - 0xc, 0x86, 0x41, 0x20, 0xd0, 0x20, + 0xfc, 0xc6, 0xc3, 0xc3, 0xc3, 0xc6, 0xfc, 0xc7, + 0xc3, 0xc3, 0xc3, 0xc3, /* U+0053 "S" */ - 0x1c, 0x62, 0x41, 0x40, 0x60, 0x38, 0xe, 0x3, - 0x1, 0x81, 0x43, 0x3c, + 0x3c, 0x66, 0xc3, 0xc0, 0xe0, 0x7c, 0x1e, 0x7, + 0x3, 0xc3, 0x67, 0x3c, /* U+0054 "T" */ - 0xff, 0x84, 0x2, 0x1, 0x0, 0x80, 0x40, 0x20, - 0x10, 0x8, 0x4, 0x2, 0x1, 0x0, + 0xff, 0x8c, 0x6, 0x3, 0x1, 0x80, 0xc0, 0x60, + 0x30, 0x18, 0xc, 0x6, 0x3, 0x0, /* U+0055 "U" */ - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x42, 0x3c, + 0xc1, 0xe0, 0xf0, 0x78, 0x3c, 0x1e, 0xf, 0x7, + 0x83, 0xc1, 0xe0, 0xd8, 0xc7, 0xc0, /* U+0056 "V" */ - 0xc0, 0xd0, 0x26, 0x9, 0x86, 0x21, 0xc, 0x41, - 0x30, 0x48, 0x1a, 0x3, 0x80, 0xc0, 0x30, + 0xc0, 0xd0, 0x26, 0x19, 0x86, 0x21, 0xc, 0xc3, + 0x30, 0x48, 0x1e, 0x3, 0x80, 0xc0, 0x30, /* U+0057 "W" */ - 0x43, 0xd, 0xc, 0x36, 0x30, 0x98, 0xe2, 0x26, - 0x98, 0x92, 0x62, 0x4d, 0xd, 0x14, 0x3c, 0x50, - 0x61, 0xc1, 0x86, 0x6, 0x8, + 0xc3, 0x9, 0xc, 0x64, 0x71, 0x99, 0xe6, 0x65, + 0x90, 0x92, 0x42, 0xcb, 0xf, 0x3c, 0x38, 0xf0, + 0xe1, 0x81, 0x86, 0x6, 0x18, /* U+0058 "X" */ - 0x61, 0x98, 0x63, 0x30, 0x48, 0x1e, 0x3, 0x0, - 0xc0, 0x78, 0x12, 0xc, 0xc6, 0x19, 0x82, + 0xc3, 0x61, 0x99, 0x84, 0x83, 0xc0, 0xc0, 0x60, + 0x78, 0x26, 0x33, 0x30, 0xd8, 0x20, /* U+0059 "Y" */ - 0xc1, 0xa0, 0x98, 0xc4, 0x43, 0x60, 0xa0, 0x70, - 0x10, 0x8, 0x4, 0x2, 0x1, 0x0, + 0xc0, 0xd8, 0x66, 0x18, 0xcc, 0x33, 0x7, 0x81, + 0xe0, 0x30, 0xc, 0x3, 0x0, 0xc0, 0x30, /* U+005A "Z" */ 0xff, 0x3, 0x6, 0x4, 0xc, 0x18, 0x18, 0x30, 0x20, 0x60, 0xc0, 0xff, /* U+005B "[" */ - 0xf2, 0x49, 0x24, 0x92, 0x49, 0x27, + 0xfb, 0x6d, 0xb6, 0xdb, 0x6d, 0xb7, /* U+005C "\\" */ - 0xc1, 0x6, 0x8, 0x20, 0xc1, 0x4, 0x18, 0x20, - 0xc1, 0x4, + 0xc0, 0x81, 0x81, 0x2, 0x6, 0x4, 0xc, 0x18, + 0x10, 0x30, 0x20, 0x40, /* U+005D "]" */ - 0xe4, 0x92, 0x49, 0x24, 0x92, 0x4f, + 0xed, 0xb6, 0xdb, 0x6d, 0xb6, 0xdf, /* U+005E "^" */ 0x10, 0xc3, 0x9a, 0x4d, 0x10, @@ -263,111 +264,113 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xfe, /* U+0060 "`" */ - 0xc6, 0x20, + 0xc8, /* U+0061 "a" */ - 0x7b, 0x38, 0x41, 0x7f, 0x18, 0x63, 0x7c, + 0x3c, 0xcd, 0x18, 0x37, 0xf8, 0xf1, 0xe7, 0x76, /* U+0062 "b" */ - 0x81, 0x2, 0x5, 0xcc, 0x50, 0x60, 0xc1, 0x83, - 0x7, 0x17, 0xc0, + 0xc1, 0x83, 0x6, 0xf, 0xd9, 0xb1, 0xe3, 0xc7, + 0x8f, 0x1e, 0x6f, 0xc0, /* U+0063 "c" */ - 0x3c, 0x8e, 0x1c, 0x8, 0x10, 0x20, 0xa3, 0x3c, + 0x3c, 0xdf, 0x1e, 0xc, 0x18, 0x31, 0xb3, 0x3c, /* U+0064 "d" */ - 0x2, 0x4, 0x9, 0xf4, 0x70, 0x60, 0xc1, 0x83, - 0x5, 0x19, 0xf0, + 0x6, 0xc, 0x18, 0x37, 0xec, 0xf1, 0xe3, 0xc7, + 0x8f, 0x1b, 0x37, 0xe0, /* U+0065 "e" */ - 0x38, 0x8a, 0xc, 0x1f, 0xf0, 0x20, 0x21, 0x3c, + 0x38, 0xdb, 0x1e, 0x3f, 0xf8, 0x30, 0x30, 0x3c, /* U+0066 "f" */ - 0x19, 0x8, 0x4f, 0x90, 0x84, 0x21, 0x8, 0x42, + 0x3b, 0x18, 0xcf, 0x31, 0x8c, 0x63, 0x18, 0xc6, 0x0, /* U+0067 "g" */ - 0x3e, 0x8e, 0xc, 0x18, 0x30, 0x60, 0xa3, 0x3e, - 0x7, 0x13, 0xc0, + 0x7e, 0xcf, 0x1e, 0x3c, 0x78, 0xf1, 0xb3, 0x7e, + 0xd, 0x1b, 0xe0, /* U+0068 "h" */ - 0x82, 0x8, 0x2e, 0xc6, 0x18, 0x61, 0x86, 0x18, - 0x61, + 0xc1, 0x83, 0x6, 0xd, 0xdc, 0xf1, 0xe3, 0xc7, + 0x8f, 0x1e, 0x3c, 0x60, /* U+0069 "i" */ - 0x9f, 0xf0, + 0xc0, 0xff, 0xff, 0xc0, /* U+006A "j" */ - 0x20, 0x12, 0x49, 0x24, 0x92, 0x70, + 0x30, 0x0, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3e, /* U+006B "k" */ - 0x81, 0x2, 0x4, 0x69, 0x96, 0x38, 0x70, 0xb1, - 0x32, 0x34, 0x60, + 0xc1, 0x83, 0x6, 0xc, 0x79, 0xb2, 0x6c, 0xf1, + 0xb3, 0x36, 0x2c, 0x60, /* U+006C "l" */ - 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xc0, /* U+006D "m" */ - 0xfb, 0xd8, 0xc6, 0x10, 0xc2, 0x18, 0x43, 0x8, - 0x61, 0xc, 0x21, 0x84, 0x20, + 0xdd, 0xee, 0x73, 0xc6, 0x3c, 0x63, 0xc6, 0x3c, + 0x63, 0xc6, 0x3c, 0x63, 0xc6, 0x30, /* U+006E "n" */ - 0xbb, 0x18, 0x61, 0x86, 0x18, 0x61, 0x84, + 0xdd, 0xcf, 0x1e, 0x3c, 0x78, 0xf1, 0xe3, 0xc6, /* U+006F "o" */ - 0x38, 0x8a, 0xc, 0x18, 0x30, 0x60, 0xa2, 0x38, + 0x3c, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, + 0x3c, /* U+0070 "p" */ - 0xf9, 0x8a, 0xc, 0x18, 0x30, 0x60, 0xe2, 0xf9, - 0x2, 0x4, 0x0, + 0xfd, 0x9b, 0x1e, 0x3c, 0x78, 0xf1, 0xe6, 0xfd, + 0x83, 0x6, 0x0, /* U+0071 "q" */ - 0x3e, 0x8e, 0xc, 0x18, 0x30, 0x60, 0xa3, 0x3e, - 0x4, 0x8, 0x10, + 0x7e, 0xcf, 0x1e, 0x3c, 0x78, 0xf1, 0xb3, 0x7e, + 0xc, 0x18, 0x30, /* U+0072 "r" */ - 0xfc, 0x88, 0x88, 0x88, 0x80, + 0xfe, 0x31, 0x8c, 0x63, 0x18, 0xc0, /* U+0073 "s" */ - 0x39, 0x14, 0x58, 0x38, 0x38, 0x71, 0x78, + 0x7d, 0x8f, 0x1f, 0x7, 0xc1, 0xf1, 0xe3, 0x7c, /* U+0074 "t" */ - 0x21, 0x3e, 0x42, 0x10, 0x84, 0x21, 0x6, + 0x66, 0xf6, 0x66, 0x66, 0x66, 0x30, /* U+0075 "u" */ - 0x86, 0x18, 0x61, 0x86, 0x18, 0x63, 0x7c, + 0xc7, 0x8f, 0x1e, 0x3c, 0x78, 0xf1, 0xe7, 0x76, /* U+0076 "v" */ - 0xc2, 0x85, 0x9b, 0x22, 0x45, 0x8e, 0xc, 0x18, + 0x43, 0x42, 0x66, 0x26, 0x24, 0x34, 0x1c, 0x18, + 0x18, /* U+0077 "w" */ - 0xc6, 0x34, 0x62, 0x46, 0x26, 0xf6, 0x29, 0x42, - 0x94, 0x39, 0xc3, 0xc, 0x10, 0x80, + 0xc6, 0x34, 0x62, 0x66, 0x26, 0xf6, 0x29, 0x62, + 0x94, 0x29, 0x43, 0x8c, 0x10, 0x80, /* U+0078 "x" */ - 0x42, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x2c, 0x66, + 0x46, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x34, 0x66, 0x42, /* U+0079 "y" */ - 0x87, 0x8b, 0x32, 0x66, 0x8d, 0xe, 0x18, 0x30, - 0x40, 0x86, 0x0, + 0xc3, 0x42, 0x66, 0x66, 0x24, 0x3c, 0x1c, 0x18, + 0x18, 0x10, 0x30, 0x60, /* U+007A "z" */ - 0xfe, 0xc, 0x30, 0xc3, 0x6, 0x18, 0x60, 0xfe, + 0xfc, 0x18, 0x60, 0x83, 0x4, 0x18, 0x60, 0xfe, /* U+007B "{" */ - 0x19, 0x8, 0x42, 0x10, 0x98, 0x21, 0x8, 0x42, - 0x10, 0x60, + 0x1c, 0xc3, 0xc, 0x30, 0xc3, 0x30, 0x30, 0xc3, + 0xc, 0x30, 0xc1, 0xc0, /* U+007C "|" */ - 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xf0, /* U+007D "}" */ - 0xc1, 0x8, 0x42, 0x10, 0xc3, 0x31, 0x8, 0x42, - 0x13, 0x0, + 0xe1, 0x8c, 0x63, 0x18, 0xc1, 0x31, 0x8c, 0x63, + 0x1b, 0x80, /* U+007E "~" */ - 0x70, 0xcc, 0x61, 0xc0, + 0x70, 0xc4, 0x61, 0xc0, /* U+F00C "" */ 0x0, 0x6, 0x0, 0xf, 0x0, 0x1f, 0x0, 0x3e, @@ -419,109 +422,109 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 63, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1, .adv_w = 66, .box_w = 1, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3, .adv_w = 82, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 5, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 19, .adv_w = 144, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33, .adv_w = 188, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 48, .adv_w = 159, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 62, .adv_w = 45, .box_w = 1, .box_h = 4, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 63, .adv_w = 88, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 72, .adv_w = 89, .box_w = 4, .box_h = 17, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 81, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 88, .adv_w = 145, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 96, .adv_w = 50, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97, .adv_w = 71, .box_w = 4, .box_h = 1, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 98, .adv_w = 67, .box_w = 2, .box_h = 2, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 99, .adv_w = 106, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 109, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 120, .adv_w = 144, .box_w = 4, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 126, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 137, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 148, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 160, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 171, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 182, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 194, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 205, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 216, .adv_w = 62, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 219, .adv_w = 54, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 224, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 231, .adv_w = 141, .box_w = 7, .box_h = 5, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 236, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 243, .adv_w = 121, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 252, .adv_w = 230, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 277, .adv_w = 167, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 292, .adv_w = 159, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 303, .adv_w = 167, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 315, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 327, .adv_w = 146, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 338, .adv_w = 142, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 349, .adv_w = 174, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 363, .adv_w = 183, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 375, .adv_w = 70, .box_w = 1, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 377, .adv_w = 141, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 388, .adv_w = 161, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 400, .adv_w = 138, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 409, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 426, .adv_w = 183, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 438, .adv_w = 176, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 452, .adv_w = 162, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 464, .adv_w = 176, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 480, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 494, .adv_w = 152, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 506, .adv_w = 153, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 520, .adv_w = 166, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 532, .adv_w = 163, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 547, .adv_w = 227, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 568, .adv_w = 161, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 583, .adv_w = 154, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 597, .adv_w = 153, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 609, .adv_w = 68, .box_w = 3, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 615, .adv_w = 105, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 625, .adv_w = 68, .box_w = 3, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 631, .adv_w = 107, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 636, .adv_w = 116, .box_w = 7, .box_h = 1, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 637, .adv_w = 79, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 639, .adv_w = 139, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 646, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 657, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 665, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 676, .adv_w = 136, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 684, .adv_w = 89, .box_w = 5, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 693, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 704, .adv_w = 141, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 713, .adv_w = 62, .box_w = 1, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 715, .adv_w = 61, .box_w = 3, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 721, .adv_w = 130, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 732, .adv_w = 62, .box_w = 1, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 734, .adv_w = 224, .box_w = 11, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 747, .adv_w = 141, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 754, .adv_w = 146, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 762, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 773, .adv_w = 146, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 784, .adv_w = 87, .box_w = 4, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 789, .adv_w = 132, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 796, .adv_w = 84, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 803, .adv_w = 141, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 810, .adv_w = 124, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 818, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 832, .adv_w = 127, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 841, .adv_w = 121, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 852, .adv_w = 127, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 860, .adv_w = 87, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 870, .adv_w = 62, .box_w = 1, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 872, .adv_w = 87, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 882, .adv_w = 174, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 886, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 910, .adv_w = 176, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 926, .adv_w = 160, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 946, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 970, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1005, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1035, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1059, .adv_w = 258, .box_w = 17, .box_h = 10, .ofs_x = -1, .ofs_y = 1} + {.bitmap_index = 0, .adv_w = 64, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1, .adv_w = 67, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4, .adv_w = 92, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 6, .adv_w = 160, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20, .adv_w = 149, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34, .adv_w = 187, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 49, .adv_w = 160, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 63, .adv_w = 56, .box_w = 2, .box_h = 4, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 64, .adv_w = 85, .box_w = 5, .box_h = 17, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 75, .adv_w = 86, .box_w = 5, .box_h = 17, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 86, .adv_w = 111, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 90, .adv_w = 145, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 98, .adv_w = 51, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100, .adv_w = 115, .box_w = 5, .box_h = 1, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 101, .adv_w = 69, .box_w = 2, .box_h = 1, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 102, .adv_w = 106, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 112, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 123, .adv_w = 144, .box_w = 4, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 129, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 140, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 151, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 163, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 174, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 185, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 197, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 209, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 220, .adv_w = 65, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 223, .adv_w = 66, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 226, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 233, .adv_w = 144, .box_w = 7, .box_h = 5, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 238, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 245, .adv_w = 122, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 256, .adv_w = 229, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 281, .adv_w = 162, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 296, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 308, .adv_w = 162, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 322, .adv_w = 173, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 336, .adv_w = 141, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 347, .adv_w = 141, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 359, .adv_w = 173, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 373, .adv_w = 180, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 387, .adv_w = 72, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 390, .adv_w = 140, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 401, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 415, .adv_w = 141, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 427, .adv_w = 222, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 444, .adv_w = 180, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 458, .adv_w = 175, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 472, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 484, .adv_w = 178, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 501, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 513, .adv_w = 157, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 525, .adv_w = 153, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 539, .adv_w = 173, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 553, .adv_w = 162, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 568, .adv_w = 220, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 589, .adv_w = 162, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 603, .adv_w = 162, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 618, .adv_w = 153, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 630, .adv_w = 69, .box_w = 3, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 636, .adv_w = 106, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 648, .adv_w = 69, .box_w = 3, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 654, .adv_w = 107, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 659, .adv_w = 116, .box_w = 7, .box_h = 1, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 660, .adv_w = 80, .box_w = 3, .box_h = 2, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 661, .adv_w = 141, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 669, .adv_w = 146, .box_w = 7, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 681, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 689, .adv_w = 146, .box_w = 7, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 701, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 709, .adv_w = 84, .box_w = 5, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 718, .adv_w = 146, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 729, .adv_w = 146, .box_w = 7, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 741, .adv_w = 65, .box_w = 2, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 745, .adv_w = 66, .box_w = 4, .box_h = 16, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 753, .adv_w = 131, .box_w = 7, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 765, .adv_w = 65, .box_w = 2, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 769, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 783, .adv_w = 146, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 791, .adv_w = 146, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 800, .adv_w = 146, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 811, .adv_w = 146, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 822, .adv_w = 90, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 828, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 836, .adv_w = 86, .box_w = 4, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 842, .adv_w = 146, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 850, .adv_w = 129, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 859, .adv_w = 194, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 873, .adv_w = 129, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 882, .adv_w = 129, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 894, .adv_w = 129, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 902, .adv_w = 87, .box_w = 6, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 914, .adv_w = 63, .box_w = 2, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 918, .adv_w = 87, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 928, .adv_w = 174, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 932, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 956, .adv_w = 176, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 972, .adv_w = 160, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 992, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1016, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1051, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1081, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1105, .adv_w = 258, .box_w = 17, .box_h = 10, .ofs_x = -1, .ofs_y = 1} }; /*--------------------- @@ -553,201 +556,175 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { - 0, 1, 0, 2, 0, 0, 0, 0, - 2, 3, 0, 0, 0, 4, 0, 4, - 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 7, 8, 9, 10, 11, - 0, 12, 12, 13, 14, 15, 12, 12, - 9, 16, 17, 18, 0, 19, 13, 20, - 21, 22, 23, 24, 25, 0, 0, 0, - 0, 0, 26, 27, 28, 0, 29, 30, - 0, 31, 0, 0, 32, 0, 31, 31, - 33, 27, 0, 34, 0, 35, 0, 36, - 37, 38, 36, 39, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 5, 6, 7, 8, + 0, 9, 9, 10, 11, 12, 9, 9, + 6, 13, 14, 15, 0, 16, 10, 17, + 18, 19, 20, 21, 22, 0, 0, 0, + 0, 0, 23, 24, 25, 0, 26, 27, + 0, 28, 0, 0, 29, 0, 28, 28, + 30, 24, 0, 31, 0, 0, 0, 32, + 33, 34, 32, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /*Map glyph_ids to kern right classes*/ static const uint8_t kern_right_class_mapping[] = { - 0, 1, 0, 2, 0, 0, 0, 3, - 2, 0, 4, 5, 0, 6, 7, 6, - 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 2, + 1, 0, 3, 4, 0, 5, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 0, 10, 0, 11, 0, 0, 0, - 11, 0, 0, 12, 0, 0, 0, 0, - 11, 0, 11, 0, 13, 14, 15, 16, - 17, 18, 19, 20, 0, 0, 21, 0, - 0, 0, 22, 0, 23, 23, 23, 24, - 23, 0, 0, 0, 0, 0, 25, 25, - 26, 25, 23, 27, 28, 29, 30, 31, - 32, 33, 31, 34, 0, 0, 35, 0, + 0, 0, 0, 5, 0, 0, 0, 0, + 7, 0, 8, 0, 9, 0, 0, 0, + 9, 0, 0, 10, 0, 0, 0, 0, + 9, 0, 9, 0, 11, 12, 13, 14, + 15, 16, 17, 18, 0, 0, 19, 0, + 0, 0, 20, 0, 21, 21, 21, 22, + 21, 0, 0, 0, 0, 0, 23, 23, + 24, 23, 21, 25, 26, 27, 28, 29, + 30, 31, 29, 32, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /*Kern values between classes*/ static const int8_t kern_class_values[] = { + -13, 0, 0, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, -6, -7, 0, -2, -8, + 0, -5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 2, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -13, 0, 0, 0, - 0, 0, 0, 0, -15, 0, 0, 0, + 0, 0, -10, 0, 0, 0, 0, 0, + -8, 0, -1, 0, 0, -16, -2, -11, + -9, 0, -12, 0, 0, 0, 0, 0, + 0, -1, 0, 0, -2, -1, -6, -4, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + -3, 0, 0, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -6, -7, 0, -2, -8, 0, -10, 0, - 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 2, 0, - 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, -13, 0, 0, -3, 0, 0, 0, + -3, 0, -3, 0, -3, -5, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -28, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -2, 0, 0, + 0, -2, -3, -3, 0, 0, 0, 0, + 0, 0, 0, -29, 0, 0, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -15, 0, 0, 0, 0, 0, 0, -8, - 0, -1, 0, 0, -16, -2, -11, -9, - 0, -12, 0, 0, 0, 0, 0, 0, - -1, 0, 0, -2, -1, -6, -4, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - 0, -3, 0, 0, -7, 0, 0, 0, + 0, 0, -4, -3, 0, 0, -3, -3, + 0, 0, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, -4, 0, 0, 0, 2, + -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, 0, 0, -4, 0, 0, 0, 0, 0, - 0, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, 0, 0, 0, 0, -13, 0, 0, - 0, -3, 0, 0, 0, -3, 0, -3, - 0, -3, -5, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + -3, -3, 0, 0, 0, -3, -5, -8, + 0, 0, 0, -17, 0, 0, 0, 0, + 0, 0, 2, -8, 0, 0, -34, -7, + -22, -18, 0, -30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -17, + -11, 0, 0, 0, 0, 0, 0, 0, + -40, 0, 0, -17, 0, 0, 0, 0, + 0, 0, 0, -4, 0, -3, 0, -1, + -2, 0, 0, -2, 0, 0, 2, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, -3, -2, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, - 0, -2, -2, 0, -2, 0, 0, 0, - -2, -3, -3, 0, 0, 0, 0, 0, - 0, 0, 0, -29, 0, 0, 0, -21, - 0, -33, 0, 3, 0, 0, 0, 0, - 0, 0, 0, -4, -3, 0, 0, -3, - -3, 0, 0, -3, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, -4, 0, - 0, 0, 2, -3, 0, 0, 0, 0, + 0, -10, 0, -2, 0, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -8, 0, 0, - 0, -4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, -3, - -3, 0, 0, 0, -3, -5, -8, 0, - 0, 0, 0, -42, 0, 0, 0, 0, - 0, 0, 0, 2, -8, 0, 0, -34, - -7, -22, -18, 0, -30, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - -17, -11, 0, 0, 0, 0, 0, 0, - 0, 0, -40, 0, 0, 0, -17, 0, - -25, 0, 0, 0, 0, 0, -4, 0, - -3, 0, -1, -2, 0, 0, -2, 0, - 0, 2, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -5, 0, -3, - -2, 0, -4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -10, 0, -2, 0, 0, -6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -5, 0, - 0, 0, 0, -27, -29, 0, 0, -10, - -3, -30, -2, 2, 0, 2, 2, 0, - 2, 0, 0, -14, -12, 0, -14, -12, - -9, -14, 0, -12, -9, -7, -10, -7, - 0, 0, 0, 0, 3, 0, -28, -5, - 0, 0, -9, -2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, -6, -5, - 0, 0, -6, -4, 0, 0, -3, -1, - 0, 0, 0, 2, 0, 0, 0, 2, - 0, -15, -7, 0, 0, -5, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, - 2, -4, -4, 0, 0, -4, -3, 0, - 0, -2, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, -6, 0, 0, - 0, -3, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - -3, 0, 0, 0, -3, -4, 0, 0, + 0, 0, 0, -27, -29, 0, -10, -3, + 0, -2, 2, 0, 2, 2, 0, 2, + 0, 0, -14, -12, 0, -14, -12, -9, + -14, 0, -12, -9, -7, -10, -7, 0, + 0, 0, 3, 0, -28, -5, 0, -9, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, -6, -5, 0, 0, -6, + -4, 0, 0, -3, -1, 0, 0, 0, + 2, 0, 0, 2, 0, -15, -7, 0, + -5, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 2, -4, -4, 0, 0, + -4, -3, 0, 0, -2, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, -6, + 0, 0, -3, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, -3, 0, 0, 0, -3, -4, 0, 0, 0, 0, 0, -4, 3, -6, -26, - -6, 0, 0, -12, -4, -12, -2, 2, - -12, 2, 2, 2, 2, 0, 2, -9, - -8, -3, -5, -8, -5, -7, -3, -5, - -2, 0, -3, -4, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, -3, + -6, 0, -10, -4, -12, -2, 2, -12, + 2, 2, 2, 2, 0, 2, -9, -8, + -3, -5, -8, -5, -7, -3, -5, -2, + 0, -3, -4, 2, 0, 0, 0, 0, + 0, 0, 0, 2, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -3, 0, 0, -3, 0, - 0, 0, -2, -3, -3, 0, 0, 0, + -3, 0, 0, -3, 0, 0, 0, -2, + -3, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -2, 0, 0, -2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, -4, + 0, 0, -2, 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1, 0, -2, -2, - 0, 0, -1, 0, 0, 0, 0, 0, + 0, 0, 0, -1, 0, -2, -2, 0, + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 2, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, 0, 0, 0, 0, - 2, 0, 3, 0, 0, 0, 0, 0, + 0, -2, 0, -3, -2, 0, 2, 0, + 0, 0, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, -3, 0, 0, + 0, 0, -2, 2, 0, -2, 0, 0, + 2, 0, 2, 2, 0, 0, 0, 2, + 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, -13, 0, 0, 0, 0, + 0, 0, -2, -2, 2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, 0, - -3, -2, 0, 0, 2, 0, 0, 0, - -15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -5, -2, 2, 0, -2, 0, 0, 6, - 0, 2, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, -13, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, -2, - 2, 0, -2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -757,13 +734,13 @@ static const int8_t kern_class_values[] = -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -2, 0, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -2, 0, 0, -2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0 }; @@ -773,8 +750,8 @@ static const lv_font_fmt_txt_kern_classes_t kern_classes = .class_pair_values = kern_class_values, .left_class_mapping = kern_left_class_mapping, .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 40, - .right_class_cnt = 35, + .left_class_cnt = 36, + .right_class_cnt = 33, }; /*-------------------- diff --git a/radio/src/gui/colorlcd/boot_menu.cpp b/radio/src/gui/colorlcd/boot_menu.cpp new file mode 100644 index 000000000..b16897771 --- /dev/null +++ b/radio/src/gui/colorlcd/boot_menu.cpp @@ -0,0 +1,448 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#include "board.h" +#include "fw_version.h" +#include "lcd.h" +#include "etx_lv_theme.h" +#include "bitmaps.h" + +#include "translations/bl_translations.h" + +#include "bootloader/boot.h" +#include "bootloader/firmware_files.h" + +#include + +#define BL_GREEN COLOR2FLAGS(RGB(73, 219, 62)) +#define BL_RED COLOR2FLAGS(RGB(229, 32, 30)) +#define BL_BACKGROUND COLOR_BLACK +#define BL_FOREGROUND COLOR_WHITE +#define BL_SELECTED COLOR2FLAGS(RGB(11, 65, 244)) // deep blue + +static constexpr coord_t LINE_H = 2; + +LAYOUT_VAL_SCALED(TITLE_Y1, 28) +LAYOUT_VAL_SCALED(TITLE_Y2, 56) + +LAYOUT_ORIENTATION(FOOTER_X1, PAD_LARGE * 2, LCD_W / 2) +LAYOUT_ORIENTATION(FOOTER_X2, LCD_W - 1 - PAD_LARGE * 2, LCD_W / 2) +LAYOUT_ORIENTATION(FOOTER_ALIGN1, LEFT, CENTERED) +LAYOUT_ORIENTATION(FOOTER_ALIGN2, RIGHT, LEFT) +LAYOUT_VAL_SCALED(FOOTER_Y1, 30) +LAYOUT_ORIENTATION_SCALED(FOOTER_Y2, 30, 58) +LAYOUT_ORIENTATION_SCALED(FOOTER_LY, 38, 62) + +constexpr coord_t PROGRESS_W = LCD_W * 3 / 4; +constexpr coord_t PROGRESS_X = (LCD_W - PROGRESS_W) / 2; +LAYOUT_VAL_SCALED(PROGRESS_H, 31) + +extern BitmapBuffer * lcd; + +#if defined(USB_SW_GPIO) +#include "hal/gpio.h" +#include "stm32_gpio.h" + #define USB_SW_TO_INTERNAL_MODULE() gpio_set(USB_SW_GPIO); + #define USB_SW_TO_MCU() gpio_clear(USB_SW_GPIO); + static bool rfUsbAccess = false; +#endif + +void blExit(void) +{ + lcdClear(); + lcdRefresh(); + lcdRefreshWait(); +} + +static void bootloaderDrawTitle(const char* text) +{ + lcd->drawText(LCD_W / 2, TITLE_Y1, text, CENTERED | BL_FOREGROUND); + lcd->drawSolidFilledRect(PAD_LARGE, TITLE_Y2, LCD_W - PAD_LARGE * 2, LINE_H, BL_FOREGROUND); +} + +static void bootloaderDrawFooter() +{ + lcd->drawSolidFilledRect(PAD_LARGE, LCD_H - FOOTER_LY, LCD_W - PAD_LARGE * 2, LINE_H, BL_FOREGROUND); +} + +static void bootloaderDrawVerFooter() +{ + bootloaderDrawFooter(); + if (LCD_W < LCD_H) + lcd->drawText(LCD_W / 2, LCD_H - FOOTER_Y2 + PAD_TINY, TR_BL_CURRENT_FW, CENTERED | BL_FOREGROUND); + const char* fw_ver = getFirmwareVersion(); + if (!fw_ver) fw_ver = TR_BL_NO_VERSION; + lcd->drawText(LCD_W / 2, LCD_H - FOOTER_Y1, fw_ver, CENTERED | BL_FOREGROUND); +} + +static void bootloaderDrawBackground() +{ + lcd->clear(BL_BACKGROUND); +} + +bool bootloaderRadioMenu(uint32_t menuItem, event_t event) +{ +#if defined(USB_SW_GPIO) + #define RADIO_MENU_LEN 2 + + static int pos = 0; + + if (IS_NEXT_EVENT(event)) { + if (pos < RADIO_MENU_LEN-1) + pos++; + } else if (IS_PREVIOUS_EVENT(event)) { + if (pos > 0) + pos--; + } else if (event == EVT_KEY_BREAK(KEY_ENTER)) { + switch (pos) { + case 0: + if (rfUsbAccess) + { + rfUsbAccess = false; + INTERNAL_MODULE_OFF(); + USB_SW_TO_MCU(); + } else { + rfUsbAccess = true; + INTERNAL_MODULE_ON(); + USB_SW_TO_INTERNAL_MODULE(); + } + break; + case 1: // fall through + default: + rfUsbAccess = false; + INTERNAL_MODULE_OFF(); + USB_SW_TO_MCU(); + pos = 0; + return true; + } + } else if (event == EVT_KEY_BREAK(KEY_EXIT)) { + rfUsbAccess = false; + INTERNAL_MODULE_OFF(); + USB_SW_TO_MCU(); + pos = 0; + return true; + } + bootloaderDrawScreen(ST_RADIO_MENU, pos, nullptr); + return false; +#else + return true; +#endif +} + +#if defined(FIRMWARE_FORMAT_UF2) + +void bootloaderInitScreen() +{ + lcdInitDisplayDriver(); + backlightEnable(BACKLIGHT_LEVEL_MAX); +} + +void bootloaderDrawDFUScreen() +{ + lcdInitDirectDrawing(); + bootloaderDrawBackground(); + lcd->drawText(LCD_W / 2, LCD_H / 2, TR_BL_DFU_MODE, CENTERED | BL_FOREGROUND); +} + +void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) +{ + lcdInitDirectDrawing(); + bootloaderDrawBackground(); + + bootloaderDrawTitle(BOOTLOADER_TITLE); + + if (st == ST_START || st == ST_USB) { + + const char* msg = (st == ST_START) ? TR_BL_PLUG_USB : TR_BL_COPY_UF2; + + lcd->drawText(LCD_W / 2, LCD_H / 2 - TITLE_Y1, msg, CENTERED | BL_FOREGROUND); + lcd->drawText(LCD_W / 2, LCD_H / 2 + TITLE_Y1, LV_SYMBOL_NEW_LINE " " TR_BL_EXIT_KEY, CENTERED | BL_FOREGROUND); + + bootloaderDrawVerFooter(); + + } else if (st == ST_FLASHING || st == ST_FLASH_DONE) { + + const coord_t pb_y = (LCD_H - PROGRESS_H) / 2; + + const char* msg = (st == ST_FLASH_DONE) ? TR_BL_WRITING_COMPL : TR_BL_WRITING_FW; + lcd->drawText(PROGRESS_X, pb_y - TITLE_Y1, msg, BL_FOREGROUND); + lcd->drawRect(PROGRESS_X, pb_y, PROGRESS_W, PROGRESS_H, LINE_H, SOLID, BL_SELECTED); + + LcdFlags color = (st == ST_FLASH_DONE) ? BL_GREEN : BL_RED; + lcd->drawSolidFilledRect(PROGRESS_X + PAD_SMALL, pb_y + PAD_SMALL, ((PROGRESS_W - PAD_SMALL * 2) * opt) / 100, PROGRESS_H - PAD_SMALL * 2, color); + } +} + +#else + +LAYOUT_ORIENTATION_SCALED(SYM_X, 102, 38) +LAYOUT_ORIENTATION_SCALED(LBL_X, 124, 60) +LAYOUT_VAL_SCALED(SYM_Y, 75) +LAYOUT_VAL_SCALED(SYM_H, 35) + +LAYOUT_VAL_SCALED(BOX_GAP, 8) +LAYOUT_VAL_SCALED(BOX_Y, 71) +LAYOUT_VAL_SCALED(BOX_H, 27) + +LAYOUT_ORIENTATION_SCALED(OPTBOX_X, 92, 28) + +LAYOUT_ORIENTATION_SCALED(USB_ICN_X, 60, 105) +LAYOUT_ORIENTATION_SCALED(USB_ICN_Y, 106, 185) +LAYOUT_ORIENTATION_SCALED(USB_TXT_X, 195, 160) +LAYOUT_ORIENTATION_SCALED(USB_TXT_Y1, 97, 125) +LAYOUT_ORIENTATION_SCALED(USB_TXT_Y2, 72, 100) +LAYOUT_ORIENTATION(USB_TXT_ALIGN, 0, CENTERED) + +LAYOUT_ORIENTATION_SCALED(USB_PLG_X, 136, 134) +LAYOUT_ORIENTATION_SCALED(USB_PLG_TXT_YO, 30, 58) + +LAYOUT_ORIENTATION_SCALED(FILENAM_X1, 94, 28) +LAYOUT_ORIENTATION_SCALED(FILENAM_X2, 124, 58) +LAYOUT_VAL_SCALED(FILENAM_Y1, 75) +LAYOUT_VAL_SCALED(FILENAM_H, 25) +LAYOUT_ORIENTATION_SCALED(FILESEL_X, 119, 53) +LAYOUT_ORIENTATION_SCALED(FILESEL_W, 278, 240) + +LAYOUT_ORIENTATION_SCALED(VERCHK_X, 168, 112) +LAYOUT_ORIENTATION_SCALED(VERCHK_Y, 138, 240) +LAYOUT_ORIENTATION_SCALED(VERCHK_ICN_X, 78, 22) + +const uint8_t __bmp_plug_usb[] { + #include "bmp_plug_usb.lbm" +}; +LZ4BitmapBuffer BMP_PLUG_USB(BMP_ARGB4444); + +const uint8_t __bmp_usb_plugged[] { + #include "bmp_usb_plugged.lbm" +}; +LZ4BitmapBuffer BMP_USB_PLUGGED(BMP_ARGB4444); + +void bootloaderInitScreen() +{ + BMP_PLUG_USB.load((LZ4Bitmap*)__bmp_plug_usb); + BMP_USB_PLUGGED.load((LZ4Bitmap*)__bmp_usb_plugged); + + lcdInitDisplayDriver(); + backlightEnable(BACKLIGHT_LEVEL_MAX); +} + +void bootloaderDrawItem(const char* symbol, const char* text, coord_t& y, coord_t& lastX, coord_t symXO = 0) +{ + lcd->drawText(SYM_X - symXO, y, symbol, BL_FOREGROUND); + coord_t nx = lcd->drawText(LBL_X, y, text, BL_FOREGROUND) + BOX_GAP; + if (nx > lastX) lastX = nx; + y += SYM_H; +} + +void bootloaderDrawSelected(coord_t boxX2, int opt) +{ + boxX2 -= OPTBOX_X; + lcd->drawSolidRect(OPTBOX_X, BOX_Y + (opt * SYM_H), boxX2, BOX_H, PAD_TINY, BL_SELECTED); +} + +void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) +{ + lcdInitDirectDrawing(); + bootloaderDrawBackground(); + + coord_t y = SYM_Y, boxX2 = 0; + + if (st == ST_START) { + bootloaderDrawTitle(BOOTLOADER_TITLE); + + bootloaderDrawItem(LV_SYMBOL_CHARGE, TR_BL_WRITE_FW, y, boxX2); + +#if defined(SPI_FLASH) + bootloaderDrawItem(LV_SYMBOL_SD_CARD, TR_BL_ERASE_FLASH, y, boxX2); +#endif + +#if defined(USB_SW_GPIO) +#if defined(RADIO_NV14_FAMILY) + if (hardwareOptions.pcbrev == PCBREV_EL18) +#endif + bootloaderDrawItem(LV_SYMBOL_WIFI, TR_BL_RF_USB_ACCESS, y, boxX2); +#endif + + bootloaderDrawItem(LV_SYMBOL_NEW_LINE, TR_BL_EXIT, y, boxX2, PAD_TINY); + + bootloaderDrawSelected(boxX2, opt); + + lcd->drawBitmap(USB_ICN_X, LCD_H - USB_ICN_Y, (const BitmapBuffer*)&BMP_PLUG_USB); + lcd->drawText(USB_TXT_X, LCD_H - USB_TXT_Y1, TR_BL_USB_PLUGIN, USB_TXT_ALIGN | BL_FOREGROUND); + lcd->drawText(USB_TXT_X, LCD_H - USB_TXT_Y2, TR_BL_USB_MASS_STORE, USB_TXT_ALIGN | BL_FOREGROUND); + + bootloaderDrawVerFooter(); + } +#if defined(SPI_FLASH) + else if (st == ST_CLEAR_FLASH_CHECK) { + bootloaderDrawTitle(TR_BL_ERASE_INT_FLASH); + + bootloaderDrawItem(LV_SYMBOL_SD_CARD, TR_BL_ERASE_FLASH, y, boxX2); + + bootloaderDrawSelected(boxX2, opt); + + bootloaderDrawFooter(); + int pos = lcd->drawText(FOOTER_X1, LCD_H - FOOTER_Y1, LV_SYMBOL_SD_CARD " " TR_BL_ERASE_KEY, FOOTER_ALIGN1 | BL_FOREGROUND); +#if LANDSCAPE + pos = 0; +#else + if (pos != 0) { + pos = (pos - FOOTER_X1) / 2; + } +#endif + lcd->drawText(FOOTER_X2 - pos, LCD_H - FOOTER_Y2, LV_SYMBOL_NEW_LINE " " TR_BL_EXIT_KEY, FOOTER_ALIGN2 | BL_FOREGROUND); + } + else if (st == ST_CLEAR_FLASH) { + bootloaderDrawTitle(TR_BL_ERASE_INT_FLASH); + + lcd->drawText(LCD_W / 2, SYM_Y, TR_BL_ERASE_FLASH_MSG, CENTERED | BL_FOREGROUND); + bootloaderDrawFooter(); + } +#endif +#if defined(USB_SW_GPIO) + else if (st == ST_RADIO_MENU) { + bootloaderDrawTitle(TR_BL_RF_USB_ACCESS); + + bootloaderDrawItem(LV_SYMBOL_USB, rfUsbAccess ? TR_BL_DISABLE : TR_BL_ENABLE, y, boxX2); + + bootloaderDrawSelected(boxX2, opt); + + bootloaderDrawFooter(); + int pos = lcd->drawText(FOOTER_X1, LCD_H - FOOTER_Y1, LV_SYMBOL_USB " " TR_BL_TOGGLE_KEY, FOOTER_ALIGN1 | BL_FOREGROUND); +#if LANDSCAPE + pos = 0; +#else + if (pos != 0) { + pos = (pos - FOOTER_X1) / 2; + } +#endif + lcd->drawText(FOOTER_X2 - pos, LCD_H - FOOTER_Y2, LV_SYMBOL_NEW_LINE " " TR_BL_EXIT_KEY, FOOTER_ALIGN2 | BL_FOREGROUND); + } +#endif + else if (st == ST_USB) { + y = (LCD_H - BMP_USB_PLUGGED.height()) / 2; + lcd->drawBitmap(USB_PLG_X, y, (const BitmapBuffer*)&BMP_USB_PLUGGED); + lcd->drawText(USB_TXT_X, y + USB_PLG_TXT_YO, TR_BL_USB_CONNECTED, USB_TXT_ALIGN | BL_FOREGROUND); + } + else if (st == ST_FILE_LIST || st == ST_DIR_CHECK || st == ST_FLASH_CHECK || + st == ST_FLASHING || st == ST_FLASH_DONE) { + + bootloaderDrawTitle(LV_SYMBOL_SD_CARD " /FIRMWARE"); + + if (st == ST_FLASHING || st == ST_FLASH_DONE) { + LcdFlags color = BL_RED; + + if (st == ST_FLASH_DONE) { + color = BL_GREEN; + opt = 100; // Completed > 100% + } + + lcd->drawRect(PROGRESS_X, (LCD_H - PROGRESS_H) / 2, PROGRESS_W, PROGRESS_H, LINE_H, SOLID, BL_SELECTED); + lcd->drawSolidFilledRect(PROGRESS_X + PAD_SMALL, (LCD_H - PROGRESS_H) / 2 + PAD_SMALL, ((PROGRESS_W - PAD_SMALL * 2) * opt) / 100, PROGRESS_H - PAD_SMALL * 2, color); + } else if (st == ST_DIR_CHECK) { + if (opt == FR_NO_PATH) { + lcd->drawText(LCD_W / 2, LCD_H / 2, LV_SYMBOL_CLOSE " " TR_BL_DIR_MISSING, CENTERED | BL_FOREGROUND); + } else { + lcd->drawText(LCD_W / 2, LCD_H / 2, LV_SYMBOL_CLOSE " " TR_BL_DIR_EMPTY, CENTERED | BL_FOREGROUND); + } + } else if (st == ST_FLASH_CHECK) { + bootloaderDrawFilename(str, 0, true); + + if (opt == FC_ERROR) { + lcd->drawText(LCD_W / 2, LCD_H / 2, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE, CENTERED | BL_FOREGROUND); + } else if (opt == FC_OK) { + VersionTag tag; + memset(&tag, 0, sizeof(tag)); + getFileFirmwareVersion(&tag); + + if (strcmp(tag.flavour, FLAVOUR)) { + lcd->drawText(LCD_W / 2, LCD_H / 2, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE, CENTERED | BL_FOREGROUND); + } else { + lcd->drawText(VERCHK_X, VERCHK_Y, TR_BL_FORK, RIGHT | BL_FOREGROUND); + lcd->drawSizedText(VERCHK_X + PAD_MEDIUM, VERCHK_Y, tag.fork, 6, BL_FOREGROUND); + + lcd->drawText(VERCHK_X, VERCHK_Y + EdgeTxStyles::STD_FONT_HEIGHT, TR_BL_VERSION, RIGHT | BL_FOREGROUND); + lcd->drawText(VERCHK_X + PAD_MEDIUM, VERCHK_Y + EdgeTxStyles::STD_FONT_HEIGHT, tag.version, BL_FOREGROUND); + + lcd->drawText(VERCHK_X, VERCHK_Y + EdgeTxStyles::STD_FONT_HEIGHT * 2, TR_BL_RADIO, RIGHT | BL_FOREGROUND); + lcd->drawText(VERCHK_X + PAD_MEDIUM, VERCHK_Y + EdgeTxStyles::STD_FONT_HEIGHT * 2, tag.flavour, BL_FOREGROUND); + + lcd->drawText(VERCHK_ICN_X, VERCHK_Y + EdgeTxStyles::STD_FONT_HEIGHT, LV_SYMBOL_OK, BL_GREEN); + } + } + } + + bootloaderDrawFooter(); + + int pos = 0; + int align = FOOTER_ALIGN2; + if ( st != ST_DIR_CHECK && (st != ST_FLASH_CHECK || opt == FC_OK)) { + if (st == ST_FILE_LIST) { + pos = lcd->drawText(FOOTER_X1, LCD_H - FOOTER_Y1, LV_SYMBOL_CHARGE " " TR_BL_SELECT_KEY, FOOTER_ALIGN1 | BL_FOREGROUND); + } + else if (st == ST_FLASH_CHECK && opt == FC_OK) { + pos = lcd->drawText(FOOTER_X1, LCD_H - FOOTER_Y1, LV_SYMBOL_CHARGE " " TR_BL_FLASH_KEY, FOOTER_ALIGN1 | BL_FOREGROUND); + } + else if (st == ST_FLASHING) { + pos = lcd->drawText(LCD_W / 2, LCD_H - FOOTER_Y1, LV_SYMBOL_CHARGE " " TR_BL_WRITING_FW, CENTERED | BL_FOREGROUND); + } + else if (st == ST_FLASH_DONE) { + pos = lcd->drawText(FOOTER_X1, LCD_H - FOOTER_Y1, LV_SYMBOL_CHARGE " " TR_BL_WRITING_COMPL, FOOTER_ALIGN1 | BL_FOREGROUND); + } + } +#if LANDSCAPE + pos = 0; +#else + if (pos != 0) { + pos = (pos - FOOTER_X1) / 2; + } else { + align = FOOTER_ALIGN1; + } +#endif + if (st != ST_FLASHING) { + lcd->drawText(FOOTER_X2 - pos, LCD_H - FOOTER_Y2, LV_SYMBOL_NEW_LINE " " TR_BL_EXIT_KEY, align | BL_FOREGROUND); + } + } +} + +void bootloaderDrawFilename(const char* str, uint8_t line, bool selected) +{ + lcd->drawText(FILENAM_X1, FILENAM_Y1 + (line * FILENAM_H), LV_SYMBOL_FILE, BL_FOREGROUND); + lcd->drawText(FILENAM_X2, FILENAM_Y1 + (line * FILENAM_H), str, BL_FOREGROUND); + + if (selected) { + lcd->drawSolidRect(FILESEL_X, BOX_Y + (line * FILENAM_H), FILESEL_W, BOX_H, PAD_TINY, BL_SELECTED); + } +} + +uint32_t bootloaderGetMenuItemCount(int baseCount) +{ + uint8_t n = 0; +#if defined(USB_SW_GPIO) +#if defined(RADIO_NV14_FAMILY) + if(hardwareOptions.pcbrev == PCBREV_EL18) +#endif + n = 1; +#endif + return baseCount + n; +} + +#endif diff --git a/radio/src/targets/taranis/bootloader/boot_menu.cpp b/radio/src/gui/common/stdlcd/boot_menu.cpp similarity index 82% rename from radio/src/targets/taranis/bootloader/boot_menu.cpp rename to radio/src/gui/common/stdlcd/boot_menu.cpp index 5487c7878..7875396ba 100644 --- a/radio/src/targets/taranis/bootloader/boot_menu.cpp +++ b/radio/src/gui/common/stdlcd/boot_menu.cpp @@ -27,8 +27,8 @@ #include "translations.h" #include "fw_version.h" -#include "translations.h" -#include "../../common/arm/stm32/bootloader/boot.h" +#include "translations/bl_translations.h" +#include "bootloader/boot.h" #include "bootloader/firmware_files.h" void bootloaderInitScreen() @@ -44,14 +44,14 @@ void bootloaderInitScreen() #endif } -static void bootloaderDrawMsg(unsigned int x, const char *str, uint8_t line, bool inverted) +static void bootloaderDrawMsg(const char *str, uint8_t line, bool inverted) { - lcdDrawSizedText(x, (line + 2) * FH, str, DISPLAY_CHAR_WIDTH, inverted ? INVERS : 0); + lcdDrawSizedText(LCD_W / 2, (line + 2) * FH, str, DISPLAY_CHAR_WIDTH, (inverted ? INVERS : 0) | CENTERED); } void bootloaderDrawFilename(const char *str, uint8_t line, bool selected) { - bootloaderDrawMsg(INDENT_WIDTH, str, line, selected); + lcdDrawSizedText(INDENT_WIDTH, (line + 2) * FH, str, DISPLAY_CHAR_WIDTH, selected ? INVERS : 0); } bool checkFirmwareFlavor(const char * flavour) @@ -93,16 +93,16 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) } else if (st == ST_DIR_CHECK) { if (opt == FR_NO_PATH) { - bootloaderDrawMsg(INDENT_WIDTH, TR_BL_DIR_MISSING, 1, false); - bootloaderDrawMsg(INDENT_WIDTH, getFirmwarePath(), 2, false); + bootloaderDrawMsg(TR_BL_DIR_MISSING, 1, false); + bootloaderDrawMsg(getFirmwarePath(), 2, false); } else { - bootloaderDrawMsg(INDENT_WIDTH, TR_BL_DIR_EMPTY, 1, false); + bootloaderDrawMsg(TR_BL_DIR_EMPTY, 1, false); } } else if (st == ST_FLASH_CHECK) { if (opt == FC_ERROR) { - bootloaderDrawMsg(0, TR_BL_INVALID_FIRMWARE, 2, false); + bootloaderDrawMsg(TR_BL_INVALID_FIRMWARE, 2, false); } else if (opt == FC_OK) { bool flavorCheck = false; @@ -114,11 +114,11 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) #else flavorCheck = checkFirmwareFlavor(tag.flavour); #endif - bootloaderDrawMsg(INDENT_WIDTH, tag.version, 0, false); + bootloaderDrawMsg(tag.version, 0, false); if (flavorCheck) - bootloaderDrawMsg(0, TR_BL_HOLD_ENTER_TO_START, 2, false); + bootloaderDrawMsg(TR_BL_HOLD_ENTER_TO_START, 2, false); else - bootloaderDrawMsg(0, TR_BL_INVALID_FIRMWARE, 2, false); + bootloaderDrawMsg(TR_BL_INVALID_FIRMWARE, 2, false); } } else if (st == ST_FLASHING) { diff --git a/radio/src/gui/common/stdlcd/fonts.cpp b/radio/src/gui/common/stdlcd/fonts.cpp index 74c3a33ad..729f3ffd0 100644 --- a/radio/src/gui/common/stdlcd/fonts.cpp +++ b/radio/src/gui/common/stdlcd/fonts.cpp @@ -56,9 +56,9 @@ const unsigned char font_5x7[] = { #include "font_da_05x07.lbm" #elif defined(TRANSLATIONS_CZ) #include "font_cz_05x07.lbm" -#elif defined(TRANSLATIONS_ES) +#elif defined(TRANSLATIONS_ES) && !defined(BOOT) #include "font_es_05x07.lbm" -#elif defined(TRANSLATIONS_FI) +#elif defined(TRANSLATIONS_FI) && !defined(BOOT) #include "font_fi_05x07.lbm" #elif defined(TRANSLATIONS_FR) #include "font_fr_05x07.lbm" @@ -68,11 +68,11 @@ const unsigned char font_5x7[] = { #include "font_pl_05x07.lbm" #elif defined(TRANSLATIONS_PT) #include "font_pt_05x07.lbm" -#elif defined(TRANSLATIONS_RU) +#elif defined(TRANSLATIONS_RU) && !defined(BOOT) #include "font_ru_05x07.lbm" #elif defined(TRANSLATIONS_SE) #include "font_se_05x07.lbm" -#elif defined(TRANSLATIONS_UA) +#elif defined(TRANSLATIONS_UA) && !defined(BOOT) #include "font_ua_05x07.lbm" #endif }; diff --git a/radio/src/gui/common/stdlcd/utf8.cpp b/radio/src/gui/common/stdlcd/utf8.cpp index 55b507332..a985a4d7b 100644 --- a/radio/src/gui/common/stdlcd/utf8.cpp +++ b/radio/src/gui/common/stdlcd/utf8.cpp @@ -30,7 +30,6 @@ static uint16_t _utf8_lut[] = { L'é', L'è', L'à', L'î', L'ç', }; -#if !defined(COLORLCD) #define UTF8_SUBS_LUT static uint16_t _utf8_substitution_lut[] = { L'Â', L'A', @@ -48,7 +47,6 @@ static uint16_t _utf8_substitution_lut[] = { L'Ù', L'U', */ }; -#endif #elif defined(TRANSLATIONS_DA) static uint16_t _utf8_lut[] = { L'å', L'æ', L'ø', L'Å', L'Æ', L'Ø', @@ -64,7 +62,6 @@ static uint16_t _utf8_lut[] = { L'Ý', L'ž', L'É', L'ň', }; -#if !defined(COLORLCD) #define UTF8_SUBS_LUT static uint16_t _utf8_substitution_lut[] = { L'Ě', L'ě', @@ -76,8 +73,7 @@ static uint16_t _utf8_substitution_lut[] = { L'Ó', L'ó', L'Ň', L'ň', }; -#endif -#elif defined(TRANSLATIONS_ES) +#elif defined(TRANSLATIONS_ES) && !defined(BOOT) static uint16_t _utf8_lut[] = { L'Ñ', L'ñ', L'Á', L'á', L'É', L'é', L'Í', L'í', L'Ó', L'ó', L'ú', @@ -89,7 +85,7 @@ static uint16_t _utf8_lut[] = { L'Í', L'í', L'Ó', L'ó', L'Ô', L'ô', L'Õ', L'õ', L'Ú', L'ú', }; -#elif defined(TRANSLATIONS_FI) +#elif defined(TRANSLATIONS_FI) && !defined(BOOT) static uint16_t _utf8_lut[] = { L'å', L'ä', L'ö', L'Å', L'Ä', L'Ö', }; @@ -103,7 +99,7 @@ static uint16_t _utf8_lut[] = { L'ż', L'ź', L'Ą', L'Ć', L'Ę', L'Ł', L'Ń', L'Ó', L'Ś', L'Ż', L'Ź', }; -#elif defined(TRANSLATIONS_RU) +#elif defined(TRANSLATIONS_RU) && !defined(BOOT) static uint16_t _utf8_lut[] = { L'А', L'Б', L'В', L'Г', L'Д', L'Е', L'Ж', L'З', L'И', L'Й', L'К', L'Л', L'М', L'Н', @@ -116,8 +112,7 @@ static uint16_t _utf8_lut[] = { L'ш', L'щ', L'ъ', L'ы', L'ь', L'э', L'ю', L'я', }; -#elif defined(TRANSLATIONS_UA) -#if !defined(COLORLCD) +#elif defined(TRANSLATIONS_UA) && !defined(BOOT) #define UTF8_SUBS_LUT // Warning, albeit the following table looks useless // It does translate Cyrillic to Latin @@ -144,7 +139,6 @@ static uint16_t _utf8_substitution_lut[] = { L'х', L'x', L'у', L'y' }; -#endif static uint16_t _utf8_lut[] = { L'Б', L'Г', L'Ґ', L'Д', L'Є', L'Ж', L'З', diff --git a/radio/src/keys.cpp b/radio/src/keys.cpp index 3c8c9d415..b529c3156 100644 --- a/radio/src/keys.cpp +++ b/radio/src/keys.cpp @@ -326,6 +326,10 @@ uint8_t keysGetTrimState(uint8_t trim) #if defined(USE_HATS_AS_KEYS) #define ROTARY_EMU_KEY_REPEAT_RATE 12 // times 10 [ms] +#if defined(BOOT) +bool getHatsAsKeys() { return true; } +bool getTransposeHatsForLUA() { return false; } +#else static bool _trims_as_buttons = false; static bool _trims_as_buttons_LUA = false; @@ -366,6 +370,7 @@ int16_t getEmuRotaryData() return 0; } +#endif static void transpose_trims(uint32_t *keys) { diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot_dfu.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot_dfu.cpp deleted file mode 100644 index 918d938fc..000000000 --- a/radio/src/targets/common/arm/stm32/bootloader/boot_dfu.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "stm32_hal.h" - -#include "boot.h" -#include "hal/usb_driver.h" -#include "os/time.h" - -#include "lcd.h" - -#define FRAME_INTERVAL_MS 20 - -void bootloaderDFU() -{ - usbPlugged(); - usbStart(); - - bootloaderDrawDFUScreen(); - - uint32_t next_frame = time_get_ms(); - for (;;) { - if (time_get_ms() - next_frame >= FRAME_INTERVAL_MS) { - next_frame += FRAME_INTERVAL_MS; - - if (!usbPlugged()) break; - bootloaderDrawDFUScreen(); - lcdRefresh(); - } - } - - blExit(); - NVIC_SystemReset(); -} diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 87ad9a37e..614606b00 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -290,7 +290,7 @@ endif() # Bootloader board library add_library(board_bl OBJECT EXCLUDE_FROM_ALL ${BOARD_COMMON_SRC} - ${TARGET_SRC_DIR}/bootloader/boot_menu.cpp + ${RADIO_SRC_DIR}/gui/colorlcd/boot_menu.cpp ) add_dependencies(board_bl ${BITMAPS_TARGET}) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} $) @@ -348,7 +348,7 @@ endif() set(FIRMWARE_SRC ${FIRMWARE_SRC} - targets/common/arm/loadboot.cpp + bootloader/loadboot.cpp ) if (MULTIMODULE) diff --git a/radio/src/targets/horus/bootloader/boot_menu.cpp b/radio/src/targets/horus/bootloader/boot_menu.cpp deleted file mode 100644 index 40315eef2..000000000 --- a/radio/src/targets/horus/bootloader/boot_menu.cpp +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "board.h" -#include "fw_version.h" -#include "lcd.h" -#include "etx_lv_theme.h" - -#include "translations.h" - -#include "targets/common/arm/stm32/bootloader/boot.h" -#include "bootloader/firmware_files.h" - -#include - -const uint8_t __bmp_plug_usb[] { -#include "bmp_plug_usb.lbm" -}; -LZ4BitmapBuffer BMP_PLUG_USB(BMP_ARGB4444); - -const uint8_t __bmp_usb_plugged[] { -#include "bmp_usb_plugged.lbm" -}; -LZ4BitmapBuffer BMP_USB_PLUGGED(BMP_ARGB4444); - -#define BL_GREEN COLOR2FLAGS(RGB(73, 219, 62)) -#define BL_RED COLOR2FLAGS(RGB(229, 32, 30)) -#define BL_BACKGROUND COLOR_BLACK -#define BL_FOREGROUND COLOR_WHITE -#define BL_SELECTED COLOR2FLAGS(RGB(11, 65, 244)) // deep blue - -LAYOUT_VAL_SCALED(LINE_X1, 28) -LAYOUT_VAL_SCALED(LINE_W, 422) -static constexpr coord_t LINE_H = 2; - -LAYOUT_VAL_SCALED(TITLE_X1, 88) -LAYOUT_VAL_SCALED(TITLE_Y1, 28) -LAYOUT_VAL_SCALED(TITLE_Y2, 56) - -LAYOUT_VAL_SCALED(FOOTER_Y1, 30) -LAYOUT_VAL_SCALED(FOOTER_Y2, 38) - -LAYOUT_VAL_SCALED(SYM_X, 102) -LAYOUT_VAL_SCALED(SYM_X2, 100) -LAYOUT_VAL_SCALED(LBL_X, 124) -LAYOUT_VAL_SCALED(SYM_Y, 75) -LAYOUT_VAL_SCALED(SYM_H, 35) - -LAYOUT_VAL_SCALED(BOX_GAP, 8) -LAYOUT_VAL_SCALED(BOX_Y, 72) -LAYOUT_VAL_SCALED(BOX_H, 26) - -LAYOUT_VAL_SCALED(OPTBOX_X, 92) - -LAYOUT_VAL_SCALED(USB_ICN_X, 60) -LAYOUT_VAL_SCALED(USB_PLG_X, 136) -LAYOUT_VAL_SCALED(USB_ICN_Y, 106) -LAYOUT_VAL_SCALED(USB_TXT_X, 195) -LAYOUT_VAL_SCALED(USB_TXT_Y1, 97) -LAYOUT_VAL_SCALED(USB_TXT_Y2, 72) - -LAYOUT_VAL_SCALED(FILENAM_X1, 94) -LAYOUT_VAL_SCALED(FILENAM_X2, 124) -LAYOUT_VAL_SCALED(FILENAM_Y1, 75) -LAYOUT_VAL_SCALED(FILENAM_H, 25) -LAYOUT_VAL_SCALED(FILESEL_X, 119) -LAYOUT_VAL_SCALED(FILESEL_W, 278) - -LAYOUT_VAL_SCALED(NLSYM_X, 305) -LAYOUT_VAL_SCALED(RTNTXT_X, 335) - -LAYOUT_VAL_SCALED(DIRMSG_X, 90) -LAYOUT_VAL_SCALED(DIRMSG_Y, 168) - -LAYOUT_VAL_SCALED(PROGRESS_X, 70) -LAYOUT_VAL_SCALED(PROGRESS_W, 340) -LAYOUT_VAL_SCALED(PROGRESS_H, 31) - -LAYOUT_VAL_SCALED(VERCHK_X, 168) -LAYOUT_VAL_SCALED(VERCHK_Y, 138) -LAYOUT_VAL_SCALED(VERCHK_ICN_X, 78) - -extern BitmapBuffer * lcd; - -void bootloaderInitScreen() -{ - BMP_PLUG_USB.load((LZ4Bitmap*)__bmp_plug_usb); - BMP_USB_PLUGGED.load((LZ4Bitmap*)__bmp_usb_plugged); - - lcdInitDisplayDriver(); -} - -static void bootloaderDrawTitle(unsigned int x, const char* text) -{ - lcd->drawText(x, TITLE_Y1, text, BL_FOREGROUND); - lcd->drawSolidFilledRect(LINE_X1, TITLE_Y2, LINE_W, LINE_H, BL_FOREGROUND); -} - -static void bootloaderDrawFooter() -{ - lcd->drawSolidFilledRect(LINE_X1, LCD_H - FOOTER_Y2, LINE_W, LINE_H, BL_FOREGROUND); -} - -static void bootloaderDrawBackground() -{ - lcd->clear(BL_BACKGROUND); -} - -void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) -{ - static bool _first_screen = true; - - lcdInitDirectDrawing(); - bootloaderDrawBackground(); - - if (!_first_screen) { - // ... and turn backlight ON - backlightEnable(BACKLIGHT_LEVEL_MAX); - } - - if (st == ST_START) { - bootloaderDrawTitle(TITLE_X1, BOOTLOADER_TITLE); - - lcd->drawText(SYM_X, SYM_Y, LV_SYMBOL_CHARGE, BL_FOREGROUND); - coord_t pos = lcd->drawText(LBL_X, SYM_Y, TR_BL_WRITE_FW, BL_FOREGROUND); - pos += BOX_GAP; - -#if defined(SPI_FLASH) - lcd->drawText(SYM_X, SYM_Y + SYM_H, LV_SYMBOL_SD_CARD, BL_FOREGROUND); - pos = lcd->drawText(LBL_X, SYM_Y + SYM_H, TR_BL_ERASE_FLASH, BL_FOREGROUND); - pos += BOX_GAP; - - lcd->drawText(SYM_X2, SYMY + SYM_H * 2, LV_SYMBOL_NEW_LINE, BL_FOREGROUND); - lcd->drawText(LBL_X, SYMY + SYM_H * 2, TR_BL_EXIT, BL_FOREGROUND); -#else - lcd->drawText(SYM_X2, SYM_Y + SYM_H, LV_SYMBOL_NEW_LINE, BL_FOREGROUND); - lcd->drawText(LBL_X, SYM_Y + SYM_H, TR_BL_EXIT, BL_FOREGROUND); -#endif - - pos -= OPTBOX_X; - lcd->drawSolidRect(OPTBOX_X, BOX_Y + (opt * SYM_H), pos, BOX_H, PAD_TINY, BL_SELECTED); - - lcd->drawBitmap(USB_ICN_X, LCD_H - USB_ICN_Y, (const BitmapBuffer*)&BMP_PLUG_USB); - lcd->drawText(USB_TXT_X, LCD_H - USB_TXT_Y1, TR_BL_USB_PLUGIN, BL_FOREGROUND); - lcd->drawText(USB_TXT_X, LCD_H - USB_TXT_Y2, TR_BL_USB_MASS_STORE, BL_FOREGROUND); - - bootloaderDrawFooter(); - lcd->drawText(LCD_W / 2, LCD_H - FOOTER_Y1, getFirmwareVersion(), CENTERED | BL_FOREGROUND); - } -#if defined(SPI_FLASH) - else if (st == ST_CLEAR_FLASH_CHECK) { - - bootloaderDrawTitle(TITLE_X1, TR_BL_ERASE_INT_FLASH); - - lcd->drawText(SYM_X, SYM_Y, LV_SYMBOL_SD_CARD, BL_FOREGROUND); - coord_t pos = lcd->drawText(LBL_X, SYM_Y, TR_BL_ERASE_FLASH, BL_FOREGROUND); - pos += BOX_GAP; - - lcd->drawText(SYM_X2, SYM_Y + SYM_H, LV_SYMBOL_NEW_LINE, BL_FOREGROUND); - lcd->drawText(LBL_X, SYM_Y + SYM_H, TR_BL_EXIT, BL_FOREGROUND); - - pos -= OPTBOX_X; - lcd->drawSolidRect(OPTBOX_X, BOX_Y + (opt * SYM_H), pos, BOX_H, PAD_TINY, BL_SELECTED); - - bootloaderDrawFooter(); - lcd->drawText(LINE_X1 * 2, 244, - LV_SYMBOL_SD_CARD TR_BL_ERASE_KEY, BL_FOREGROUND); - lcd->drawText(NLSYM_X, 244, - LV_SYMBOL_NEW_LINE TR_BL_EXIT_KEY, BL_FOREGROUND); - } - else if (st == ST_CLEAR_FLASH) { - bootloaderDrawTitle(TITLE_X1, TR_BL_ERASE_INT_FLASH); - - lcd->drawText(LCD_W / 2, SYM_Y, TR_BL_ERASE_FLASH_MSG, CENTERED | BL_FOREGROUND); - bootloaderDrawFooter(); - } -#endif - else if (st == ST_USB) { - coord_t y = (LCD_H - BMP_USB_PLUGGED.height()) / 2; - lcd->drawBitmap(USB_PLG_X, y, (const BitmapBuffer*)&BMP_USB_PLUGGED); - lcd->drawText(USB_TXT_X, y + FOOTER_Y1, TR_BL_USB_CONNECTED, BL_FOREGROUND); - } - else if (st == ST_FILE_LIST || st == ST_DIR_CHECK || st == ST_FLASH_CHECK || - st == ST_FLASHING || st == ST_FLASH_DONE) { - - bootloaderDrawTitle(TITLE_X1, LV_SYMBOL_SD_CARD " /FIRMWARE"); - - if (st == ST_FLASHING || st == ST_FLASH_DONE) { - LcdFlags color = BL_RED; - - if (st == ST_FLASH_DONE) { - color = BL_GREEN; - opt = 100; // Completed > 100% - } - - lcd->drawRect(PROGRESS_X, (LCD_H - PROGRESS_H) / 2, PROGRESS_W, PROGRESS_H, LINE_H, SOLID, BL_SELECTED); - lcd->drawSolidFilledRect(PROGRESS_X + PAD_SMALL, (LCD_H - PROGRESS_H) / 2 + PAD_SMALL, ((PROGRESS_W - PAD_SMALL * 2) * opt) / 100, PROGRESS_H - PAD_SMALL * 2, color); - } else if (st == ST_DIR_CHECK) { - if (opt == FR_NO_PATH) { - lcd->drawText(DIRMSG_X, DIRMSG_Y, LV_SYMBOL_CLOSE TR_BL_DIR_MISSING, - BL_FOREGROUND); - } else { - lcd->drawText(DIRMSG_X, DIRMSG_Y, LV_SYMBOL_CLOSE TR_BL_DIR_EMPTY, - BL_FOREGROUND); - } - } else if (st == ST_FLASH_CHECK) { - bootloaderDrawFilename(str, 0, true); - - if (opt == FC_ERROR) { - lcd->drawText(DIRMSG_X, DIRMSG_Y, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE, - BL_FOREGROUND); - } else if (opt == FC_OK) { - VersionTag tag; - memset(&tag, 0, sizeof(tag)); - getFileFirmwareVersion(&tag); - - if (strcmp(tag.flavour, FLAVOUR)) { - lcd->drawText(DIRMSG_X, DIRMSG_Y, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE, - BL_FOREGROUND); - } else { - lcd->drawText(VERCHK_X, VERCHK_Y, TR_BL_FORK, RIGHT | BL_FOREGROUND); - lcd->drawSizedText(VERCHK_X + PAD_MEDIUM, VERCHK_Y, tag.fork, 6, BL_FOREGROUND); - - lcd->drawText(VERCHK_X, VERCHK_Y + EdgeTxStyles::STD_FONT_HEIGHT, TR_BL_VERSION, RIGHT | BL_FOREGROUND); - lcd->drawText(VERCHK_X + PAD_MEDIUM, VERCHK_Y + EdgeTxStyles::STD_FONT_HEIGHT, tag.version, BL_FOREGROUND); - - lcd->drawText(VERCHK_X, VERCHK_Y + EdgeTxStyles::STD_FONT_HEIGHT * 2, TR_BL_RADIO, RIGHT | BL_FOREGROUND); - lcd->drawText(VERCHK_X + PAD_MEDIUM, VERCHK_Y + EdgeTxStyles::STD_FONT_HEIGHT * 2, tag.flavour, BL_FOREGROUND); - - lcd->drawText(VERCHK_ICN_X, VERCHK_Y + EdgeTxStyles::STD_FONT_HEIGHT, LV_SYMBOL_OK, BL_GREEN); - } - } - } - - bootloaderDrawFooter(); - - if ( st != ST_DIR_CHECK && (st != ST_FLASH_CHECK || opt == FC_OK)) { - - lcd->drawText(LINE_X1, LCD_H - FOOTER_Y1, LV_SYMBOL_CHARGE, BL_FOREGROUND); - - if (st == ST_FILE_LIST) { - lcd->drawText(LINE_X1 * 2, LCD_H - TITLE_Y1, TR_BL_SELECT_KEY, BL_FOREGROUND); - } - else if (st == ST_FLASH_CHECK && opt == FC_OK) { - lcd->drawText(LINE_X1 * 2, LCD_H - TITLE_Y1, TR_BL_FLASH_KEY, BL_FOREGROUND); - } - else if (st == ST_FLASHING) { - lcd->drawText(LINE_X1 * 2, LCD_H - TITLE_Y1, TR_BL_WRITING_FW, BL_FOREGROUND); - } - else if (st == ST_FLASH_DONE) { - lcd->drawText(LINE_X1 * 2, LCD_H - TITLE_Y1, TR_BL_WRITING_COMPL, BL_FOREGROUND); - } - } - - if (st != ST_FLASHING) { - lcd->drawText(NLSYM_X, LCD_H - TITLE_Y1, LV_SYMBOL_NEW_LINE, BL_FOREGROUND); - lcd->drawText(RTNTXT_X, LCD_H - TITLE_Y1, TR_BL_EXIT_KEY, BL_FOREGROUND); - } - } - - _first_screen = false; -} - -void bootloaderDrawFilename(const char* str, uint8_t line, bool selected) -{ - lcd->drawText(FILENAM_X1, FILENAM_Y1 + (line * FILENAM_H), LV_SYMBOL_FILE, BL_FOREGROUND); - lcd->drawText(FILENAM_X2, FILENAM_Y1 + (line * FILENAM_H), str, BL_FOREGROUND); - - if (selected) { - lcd->drawSolidRect(FILESEL_X, BOX_Y + (line * FILENAM_H), FILESEL_W, BOX_H, PAD_TINY, BL_SELECTED); - } -} - -uint32_t bootloaderGetMenuItemCount(int baseCount) -{ - return baseCount; -} - -bool bootloaderRadioMenu(uint32_t menuItem, event_t event) -{ - return true; -} - -void blExit(void) -{ - lcdClear(); - lcdRefresh(); - lcdRefreshWait(); -} diff --git a/radio/src/targets/nv14/CMakeLists.txt b/radio/src/targets/nv14/CMakeLists.txt index ed3d99b93..e83b9d050 100644 --- a/radio/src/targets/nv14/CMakeLists.txt +++ b/radio/src/targets/nv14/CMakeLists.txt @@ -117,7 +117,7 @@ set(BOARD_COMMON_SRC # Bootloader board library add_library(board_bl OBJECT EXCLUDE_FROM_ALL ${BOARD_COMMON_SRC} - ${TARGET_SRC_DIR}/bootloader/boot_menu.cpp + ${RADIO_SRC_DIR}/gui/colorlcd/boot_menu.cpp ) add_dependencies(board_bl ${BITMAPS_TARGET}) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} $) @@ -142,7 +142,7 @@ set(FIRMWARE_SRC ${FIRMWARE_SRC} $) set(FIRMWARE_SRC ${FIRMWARE_SRC} - targets/common/arm/loadboot.cpp + bootloader/loadboot.cpp ) set(SRC ${SRC} diff --git a/radio/src/targets/nv14/bootloader/boot_menu.cpp b/radio/src/targets/nv14/bootloader/boot_menu.cpp deleted file mode 100644 index 6b9111ecf..000000000 --- a/radio/src/targets/nv14/bootloader/boot_menu.cpp +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "hal/gpio.h" -#include "stm32_gpio.h" - -#include "board.h" -#include "fw_version.h" -#include "lcd.h" - -#include "translations.h" - -#include "targets/common/arm/stm32/bootloader/boot.h" -#include "bootloader/firmware_files.h" - -#include - -#define RADIO_MENU_LEN 2 - -#define USB_SW_TO_INTERNAL_MODULE() gpio_set(USB_SW_GPIO); -#define USB_SW_TO_MCU() gpio_clear(USB_SW_GPIO); - -#define DEFAULT_PADDING 28 -#define DOUBLE_PADDING 56 -#define MESSAGE_TOP (LCD_H - (2*DOUBLE_PADDING)) - -const uint8_t __bmp_plug_usb[] { -#include "bmp_plug_usb.lbm" -}; -LZ4BitmapBuffer BMP_PLUG_USB(BMP_ARGB4444); - -const uint8_t __bmp_usb_plugged[] { -#include "bmp_usb_plugged.lbm" -}; -LZ4BitmapBuffer BMP_USB_PLUGGED(BMP_ARGB4444); - -#define BL_GREEN COLOR2FLAGS(RGB(73, 219, 62)) -#define BL_RED COLOR2FLAGS(RGB(229, 32, 30)) -#define BL_BACKGROUND COLOR_BLACK -#define BL_FOREGROUND COLOR_WHITE -#define BL_SELECTED COLOR2FLAGS(RGB(11, 65, 244)) // deep blue - -extern BitmapBuffer * lcd; - -static bool rfUsbAccess = false; - -void bootloaderInitScreen() -{ - BMP_PLUG_USB.load((LZ4Bitmap*)__bmp_plug_usb); - BMP_USB_PLUGGED.load((LZ4Bitmap*)__bmp_usb_plugged); - - lcdInitDisplayDriver(); - setHatsAsKeys(true); -} - -static void bootloaderDrawTitle(const char* text) -{ - lcd->drawText(LCD_W/2, DEFAULT_PADDING, text, CENTERED | BL_FOREGROUND); - lcd->drawSolidFilledRect(DEFAULT_PADDING, DOUBLE_PADDING, LCD_W - DOUBLE_PADDING, 2, BL_FOREGROUND); -} - -static void bootloaderDrawFooter() -{ - lcd->drawSolidFilledRect(DEFAULT_PADDING, LCD_H - (DOUBLE_PADDING + 4), LCD_W - DOUBLE_PADDING, 2, BL_FOREGROUND); -} - -static void bootloaderDrawBackground() -{ - lcd->clear(BL_BACKGROUND); -} - -void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) -{ - static bool _first_screen = true; - - lcdInitDirectDrawing(); - bootloaderDrawBackground(); - - if (!_first_screen) { - // ... and turn backlight ON - backlightEnable(BACKLIGHT_LEVEL_MAX); - } - - int center = LCD_W/2; - if (st == ST_START) { - int yOffset = 0; - - bootloaderDrawTitle(BOOTLOADER_TITLE); - - lcd->drawText(62, 75, LV_SYMBOL_CHARGE, BL_FOREGROUND); - coord_t pos = lcd->drawText(84, 75, TR_BL_WRITE_FW, BL_FOREGROUND); - pos += 8; - if(hardwareOptions.pcbrev == PCBREV_EL18) - { - lcd->drawText(57, 110, LV_SYMBOL_WIFI, BL_FOREGROUND); - lcd->drawText(84, 110, TR_BL_RF_USB_ACCESS, BL_FOREGROUND); - pos += 8; - yOffset = 35; - } - - lcd->drawText(60, 110 + yOffset, LV_SYMBOL_NEW_LINE, BL_FOREGROUND); - lcd->drawText(84, 110 + yOffset, TR_BL_EXIT, BL_FOREGROUND); - - pos -= 79; - lcd->drawSolidRect(79, 72 + (opt * 35), pos, 26, 2, BL_SELECTED); - - lcd->drawBitmap(center - 55, 165, (const BitmapBuffer*)&BMP_PLUG_USB); - lcd->drawText(center, 250, TR_BL_USB_PLUGIN, CENTERED | BL_FOREGROUND); - lcd->drawText(center, 275, TR_BL_USB_MASS_STORE, CENTERED | BL_FOREGROUND); - - bootloaderDrawFooter(); - lcd->drawText(center, LCD_H - DOUBLE_PADDING, - TR_BL_CURRENT_FW, CENTERED | BL_FOREGROUND); - lcd->drawText(center, LCD_H - DEFAULT_PADDING, - getFirmwareVersion(), CENTERED | BL_FOREGROUND); - } else if (st == ST_USB) { - lcd->drawBitmap(center - 26, 98, (const BitmapBuffer*)&BMP_USB_PLUGGED); - lcd->drawText(center, 168, TR_BL_USB_CONNECTED, CENTERED | BL_FOREGROUND); - } else if (st == ST_FILE_LIST || st == ST_DIR_CHECK || - st == ST_FLASH_CHECK || st == ST_FLASHING || - st == ST_FLASH_DONE) { - - bootloaderDrawTitle(LV_SYMBOL_SD_CARD " /FIRMWARE"); - - if (st == ST_FLASHING || st == ST_FLASH_DONE) { - LcdFlags color = BL_RED; // red - - if (st == ST_FLASH_DONE) { - color = BL_GREEN /* green */; - opt = 100; // Completed > 100% - } - - lcd->drawRect(DEFAULT_PADDING, 120, LCD_W - DOUBLE_PADDING, 31, 2, - SOLID, BL_SELECTED); - lcd->drawSolidFilledRect(DEFAULT_PADDING + 4, 124, - ((LCD_W - DOUBLE_PADDING - 8) * opt) / 100, 23, - color); - } else if (st == ST_DIR_CHECK) { - if (opt == FR_NO_PATH) { - lcd->drawText(20, MESSAGE_TOP, - LV_SYMBOL_CLOSE TR_BL_DIR_MISSING, BL_FOREGROUND); - } else { - lcd->drawText(20, MESSAGE_TOP, LV_SYMBOL_CLOSE TR_BL_DIR_EMPTY, - BL_FOREGROUND); - } - } else if (st == ST_FLASH_CHECK) { - bootloaderDrawFilename(str, 0, true); - - if (opt == FC_ERROR) { - lcd->drawText(20, MESSAGE_TOP, - LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE, - BL_FOREGROUND); - } else if (opt == FC_OK) { - VersionTag tag; - memset(&tag, 0, sizeof(tag)); - getFileFirmwareVersion(&tag); - - if (strcmp(tag.flavour, FLAVOUR)) { - lcd->drawText(20, MESSAGE_TOP, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE, - BL_FOREGROUND); - } else { - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, - MESSAGE_TOP - DEFAULT_PADDING, - TR_BL_FORK, RIGHT | BL_FOREGROUND); - lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING, - MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6, - BL_FOREGROUND); - - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP, - TR_BL_VERSION, RIGHT | BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP, - tag.version, BL_FOREGROUND); - - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, - MESSAGE_TOP + DEFAULT_PADDING, - TR_BL_RADIO, RIGHT | BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, - MESSAGE_TOP + DEFAULT_PADDING, tag.flavour, - BL_FOREGROUND); - - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING - 90, MESSAGE_TOP, - LV_SYMBOL_OK, BL_GREEN); - } - } - } - - bootloaderDrawFooter(); - - if (st != ST_DIR_CHECK && (st != ST_FLASH_CHECK || opt == FC_OK)) { - - lcd->drawText(DEFAULT_PADDING, LCD_H - DOUBLE_PADDING - 2, - LV_SYMBOL_CHARGE, BL_FOREGROUND); - - if (st == ST_FILE_LIST) { - lcd->drawText(DOUBLE_PADDING, LCD_H - DOUBLE_PADDING, - TR_BL_SELECT_KEY, BL_FOREGROUND); - } else if (st == ST_FLASH_CHECK && opt == FC_OK) { - lcd->drawText(DOUBLE_PADDING, LCD_H - DOUBLE_PADDING, - TR_BL_FLASH_KEY, BL_FOREGROUND); - } else if (st == ST_FLASHING) { - lcd->drawText(DOUBLE_PADDING, LCD_H - DOUBLE_PADDING, - TR_BL_WRITING_FW, BL_FOREGROUND); - } else if (st == ST_FLASH_DONE) { - lcd->drawText(DOUBLE_PADDING, LCD_H - DOUBLE_PADDING, - TR_BL_WRITING_COMPL, BL_FOREGROUND); - } - } - - if (st != ST_FLASHING) { - lcd->drawText(DOUBLE_PADDING, LCD_H - DEFAULT_PADDING, - LV_SYMBOL_NEW_LINE TR_BL_EXIT_KEY, BL_FOREGROUND); - } - } else if (st == ST_RADIO_MENU) { - bootloaderDrawTitle(TR_BL_RF_USB_ACCESS); - - lcd->drawText(62, 75, LV_SYMBOL_USB, BL_FOREGROUND); - coord_t pos = lcd->drawText(84, 75, rfUsbAccess ? TR_BL_DISABLE : TR_BL_ENABLE, BL_FOREGROUND); - pos += 8; - - lcd->drawText(60, 110, LV_SYMBOL_NEW_LINE, BL_FOREGROUND); - lcd->drawText(84, 110, TR_BL_EXIT, BL_FOREGROUND); - - pos -= 79; - lcd->drawSolidRect(79, 72 + (opt * 35), pos, 26, 2, BL_SELECTED); - } - - _first_screen = false; -} - -void bootloaderDrawFilename(const char* str, uint8_t line, bool selected) -{ - lcd->drawText(DEFAULT_PADDING, 75 + (line * 25), LV_SYMBOL_FILE, BL_FOREGROUND); - lcd->drawText(DEFAULT_PADDING + 30, 75 + (line * 25), str, BL_FOREGROUND); - - if (selected) { - lcd->drawSolidRect(DEFAULT_PADDING + 25, 72 + (line * 25), - LCD_W - (DEFAULT_PADDING + 25) - 28, 26, 2, - BL_SELECTED); - } -} - -uint32_t bootloaderGetMenuItemCount(int baseCount) -{ - if(hardwareOptions.pcbrev == PCBREV_EL18) - return baseCount+1; - - return baseCount; -} - -bool bootloaderRadioMenu(uint32_t menuItem, event_t event) -{ - static int pos = 0; - - if (event == EVT_KEY_FIRST(KEY_DOWN)) { - if (pos < RADIO_MENU_LEN-1) - pos++; - } else if (event == EVT_KEY_FIRST(KEY_UP)) { - if (pos > 0) - pos--; - } else if (event == EVT_KEY_BREAK(KEY_ENTER)) { - switch (pos) { - case 0: - if (rfUsbAccess) - { - rfUsbAccess = false; - INTERNAL_MODULE_OFF(); - USB_SW_TO_MCU(); - } else { - rfUsbAccess = true; - INTERNAL_MODULE_ON(); - USB_SW_TO_INTERNAL_MODULE(); - } - break; - case 1: // fall through - default: - USB_SW_TO_MCU(); - pos = 0; - return true; - } - } - bootloaderDrawScreen(ST_RADIO_MENU, pos, nullptr); - return false; -} - -void blExit(void) -{ - USB_SW_TO_MCU(); - lcdClear(); - lcdRefresh(); - lcdRefreshWait(); -} diff --git a/radio/src/targets/pl18/CMakeLists.txt b/radio/src/targets/pl18/CMakeLists.txt index 1c548b560..ad02c18ea 100644 --- a/radio/src/targets/pl18/CMakeLists.txt +++ b/radio/src/targets/pl18/CMakeLists.txt @@ -180,7 +180,7 @@ endif() # Bootloader board library add_library(board_bl OBJECT EXCLUDE_FROM_ALL ${BOARD_COMMON_SRC} - ${TARGET_SRC_DIR}/bootloader/boot_menu.cpp + ${RADIO_SRC_DIR}/gui/colorlcd/boot_menu.cpp ) add_dependencies(board_bl ${BITMAPS_TARGET}) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} $) @@ -223,7 +223,7 @@ endif() set(FIRMWARE_SRC ${FIRMWARE_SRC} - targets/common/arm/loadboot.cpp + bootloader/loadboot.cpp ) set(SRC ${SRC} diff --git a/radio/src/targets/pl18/bootloader/boot_menu.cpp b/radio/src/targets/pl18/bootloader/boot_menu.cpp deleted file mode 100644 index 94a52b209..000000000 --- a/radio/src/targets/pl18/bootloader/boot_menu.cpp +++ /dev/null @@ -1,387 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "hal/gpio.h" -#include "stm32_gpio.h" - -#include "board.h" -#include "fw_version.h" -#include "lcd.h" - -#include "translations.h" - -#include "targets/common/arm/stm32/bootloader/boot.h" -#include "bootloader/firmware_files.h" - -#include -#include "etx_lv_theme.h" - -#define RADIO_MENU_LEN 2 - -#define SELECTED_COLOR (INVERS | COLOR_THEME_SECONDARY1) -#define DEFAULT_PADDING 28 -#define DOUBLE_PADDING 56 -#define MESSAGE_TOP (LCD_H - (2*DOUBLE_PADDING)) - -const uint8_t __bmp_plug_usb[] { -#include "bmp_plug_usb.lbm" -}; -LZ4BitmapBuffer BMP_PLUG_USB(BMP_ARGB4444); - -const uint8_t __bmp_usb_plugged[] { -#include "bmp_usb_plugged.lbm" -}; -LZ4BitmapBuffer BMP_USB_PLUGGED(BMP_ARGB4444); - -#define BL_GREEN COLOR2FLAGS(RGB(73, 219, 62)) -#define BL_RED COLOR2FLAGS(RGB(229, 32, 30)) -#define BL_BACKGROUND COLOR_BLACK -#define BL_FOREGROUND COLOR_WHITE -#define BL_SELECTED COLOR2FLAGS(RGB(11, 65, 244)) // deep blue - -extern BitmapBuffer * lcd; - -#if defined(USB_SW_GPIO) - #define USB_SW_TO_INTERNAL_MODULE() gpio_set(USB_SW_GPIO); - #define USB_SW_TO_MCU() gpio_clear(USB_SW_GPIO); - static bool rfUsbAccess = false; -#endif - -void bootloaderInitScreen() -{ - BMP_PLUG_USB.load((LZ4Bitmap*)__bmp_plug_usb); - BMP_USB_PLUGGED.load((LZ4Bitmap*)__bmp_usb_plugged); - - lcdInitDisplayDriver(); -#if defined(USE_HATS_AS_KEYS) - setHatsAsKeys(true); -#endif -} - -static void bootloaderDrawTitle(const char* text) -{ - lcd->drawText(LCD_W/2, DEFAULT_PADDING, text, CENTERED | BL_FOREGROUND); - lcd->drawSolidFilledRect(DEFAULT_PADDING, DOUBLE_PADDING, LCD_W - DOUBLE_PADDING, 2, BL_FOREGROUND); -} - -static void bootloaderDrawFooter() -{ - if (LANDSCAPE) - lcd->drawSolidFilledRect(DEFAULT_PADDING, LCD_H - (DEFAULT_PADDING + 10), LCD_W - DOUBLE_PADDING, 2, BL_FOREGROUND); - else - lcd->drawSolidFilledRect(DEFAULT_PADDING, LCD_H - (DOUBLE_PADDING + 4), LCD_W - DOUBLE_PADDING, 2, BL_FOREGROUND); -} - -static void bootloaderDrawBackground() -{ - lcd->clear(BL_BACKGROUND); -} - -void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) -{ - static bool _first_screen = true; - lcdInitDirectDrawing(); - bootloaderDrawBackground(); - - if (!_first_screen) { - // ... and turn backlight ON - backlightEnable(BACKLIGHT_LEVEL_MAX); - } - - int center = LCD_W/2; - int menuItemX = center - 120; - if (st == ST_START) { - int y = 75; - - bootloaderDrawTitle(BOOTLOADER_TITLE); - - lcd->drawText(menuItemX + 2, y, LV_SYMBOL_CHARGE, BL_FOREGROUND); - coord_t pos = lcd->drawText(menuItemX + 24, y, TR_BL_WRITE_FW, BL_FOREGROUND); - pos += 8; - coord_t npos; - y += 35; - -#if defined(SPI_FLASH) - lcd->drawText(menuItemX + 2, y, LV_SYMBOL_SD_CARD, BL_FOREGROUND); - npos = lcd->drawText(menuItemX + 24, y, TR_BL_ERASE_FLASH, BL_FOREGROUND); - npos += 8; - if (npos > pos) - pos = npos; - y += 35; -#endif -#if defined(USB_SW_GPIO) -#if defined(RADIO_NV14_FAMILY) - if(hardwareOptions.pcbrev == PCBREV_EL18) -#endif - { - lcd->drawText(menuItemX, y, LV_SYMBOL_WIFI, BL_FOREGROUND); - npos = lcd->drawText(menuItemX + 24, y, TR_BL_RF_USB_ACCESS, BL_FOREGROUND); - npos += 8; - if (npos > pos) - pos = npos; - y += 35; - } -#endif - lcd->drawText(menuItemX, y, LV_SYMBOL_NEW_LINE, BL_FOREGROUND); - lcd->drawText(menuItemX + 24, y, TR_BL_EXIT, BL_FOREGROUND); - - pos -= menuItemX - 8; - lcd->drawSolidRect(menuItemX - 8, 72 + (opt * 35), pos, 26, 2, BL_SELECTED); - - if (LANDSCAPE) { - lcd->drawBitmap(menuItemX - 40, LCD_H - 106, (const BitmapBuffer*)&BMP_PLUG_USB); - lcd->drawText(menuItemX + 95, LCD_H - 97, TR_BL_USB_PLUGIN, BL_FOREGROUND); - lcd->drawText(menuItemX + 95, LCD_H - 72, TR_BL_USB_MASS_STORE, BL_FOREGROUND); - } else { - lcd->drawBitmap(center - 55, LCD_H - DEFAULT_PADDING - 157, (const BitmapBuffer*)&BMP_PLUG_USB); - lcd->drawText(center, LCD_H - DEFAULT_PADDING - 97, TR_BL_USB_PLUGIN, CENTERED | BL_FOREGROUND); - lcd->drawText(center, LCD_H - DEFAULT_PADDING - 72, TR_BL_USB_MASS_STORE, CENTERED | BL_FOREGROUND); - } - - bootloaderDrawFooter(); - if (LCD_W < LCD_H) - lcd->drawText(center, LCD_H - DOUBLE_PADDING, TR_BL_CURRENT_FW, CENTERED | BL_FOREGROUND); - lcd->drawText(center, LCD_H - DEFAULT_PADDING, getFirmwareVersion(), CENTERED | BL_FOREGROUND); - } -#if defined(SPI_FLASH) - else if (st == ST_CLEAR_FLASH_CHECK) { - - bootloaderDrawTitle(TR_BL_ERASE_INT_FLASH); - - lcd->drawText(menuItemX + 2, 75, LV_SYMBOL_SD_CARD, BL_FOREGROUND); - coord_t pos = lcd->drawText(menuItemX + 24, 75, TR_BL_ERASE_FLASH, BL_FOREGROUND); - pos += 8; - - lcd->drawText(menuItemX, 110, LV_SYMBOL_NEW_LINE, BL_FOREGROUND); - lcd->drawText(menuItemX + 24, 110, TR_BL_EXIT, BL_FOREGROUND); - - pos -= menuItemX - 8; - lcd->drawSolidRect(menuItemX - 8, 72 + (opt * 35), pos, 26, 2, BL_SELECTED); - - bootloaderDrawFooter(); - if (LANDSCAPE) { - lcd->drawText(DEFAULT_PADDING, LCD_H - DEFAULT_PADDING, - LV_SYMBOL_SD_CARD " " TR_BL_ERASE_KEY, BL_FOREGROUND); - lcd->drawText(LCD_W - 175, LCD_H - DEFAULT_PADDING, - LV_SYMBOL_NEW_LINE " " TR_BL_EXIT_KEY, BL_FOREGROUND); - } else { - lcd->drawText(DOUBLE_PADDING, LCD_H - DOUBLE_PADDING, - LV_SYMBOL_SD_CARD " " TR_BL_ERASE_KEY, BL_FOREGROUND); - lcd->drawText(DOUBLE_PADDING, LCD_H - DEFAULT_PADDING, - LV_SYMBOL_NEW_LINE " " TR_BL_EXIT_KEY, BL_FOREGROUND); - } - } - else if (st == ST_CLEAR_FLASH) { - bootloaderDrawTitle(TR_BL_ERASE_INT_FLASH); - - lcd->drawText(center, 75, TR_BL_ERASE_FLASH_MSG, CENTERED | BL_FOREGROUND); - bootloaderDrawFooter(); - } -#endif -#if defined(USB_SW_GPIO) - else if (st == ST_RADIO_MENU) { - bootloaderDrawTitle(TR_BL_RF_USB_ACCESS); - - lcd->drawText(menuItemX + 2, 75, LV_SYMBOL_USB, BL_FOREGROUND); - coord_t pos = lcd->drawText(menuItemX + 24, 75, rfUsbAccess ? TR_BL_DISABLE : TR_BL_ENABLE, BL_FOREGROUND); - pos += 8; - - lcd->drawText(menuItemX + 2, 110, LV_SYMBOL_NEW_LINE, BL_FOREGROUND); - lcd->drawText(menuItemX + 24, 110, TR_BL_EXIT, BL_FOREGROUND); - - pos -= menuItemX - 8; - lcd->drawSolidRect(menuItemX - 8, 72 + (opt * 35), pos, 26, 2, BL_SELECTED); - } -#endif - else if (st == ST_USB) { - lcd->drawBitmap(center - 26, 98, (const BitmapBuffer*)&BMP_USB_PLUGGED); - lcd->drawText(center, 168, TR_BL_USB_CONNECTED, CENTERED | BL_FOREGROUND); - } else if (st == ST_FILE_LIST || st == ST_DIR_CHECK || - st == ST_FLASH_CHECK || st == ST_FLASHING || - st == ST_FLASH_DONE) { - - bootloaderDrawTitle(LV_SYMBOL_SD_CARD " /FIRMWARE"); - - if (st == ST_FLASHING || st == ST_FLASH_DONE) { - LcdFlags color = BL_RED; // red - - if (st == ST_FLASH_DONE) { - color = BL_GREEN /* green */; - opt = 100; // Completed > 100% - } - - lcd->drawRect(DEFAULT_PADDING, 120, LCD_W - DOUBLE_PADDING, 31, 2, - SOLID, BL_SELECTED); - lcd->drawSolidFilledRect(DEFAULT_PADDING + 4, 124, - ((LCD_W - DOUBLE_PADDING - 8) * opt) / 100, 23, - color); - } else if (st == ST_DIR_CHECK) { - if (opt == FR_NO_PATH) { - lcd->drawText(20, MESSAGE_TOP, - LV_SYMBOL_CLOSE TR_BL_DIR_MISSING, BL_FOREGROUND); - } else { - lcd->drawText(20, MESSAGE_TOP, LV_SYMBOL_CLOSE TR_BL_DIR_EMPTY, - BL_FOREGROUND); - } - } else if (st == ST_FLASH_CHECK) { - bootloaderDrawFilename(str, 0, true); - - if (opt == FC_ERROR) { - lcd->drawText(20, MESSAGE_TOP, - LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE, - BL_FOREGROUND); - } else if (opt == FC_OK) { - VersionTag tag; - memset(&tag, 0, sizeof(tag)); - getFileFirmwareVersion(&tag); - if (strcmp(tag.flavour, FLAVOUR)) { - lcd->drawText(20, MESSAGE_TOP, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE, - BL_FOREGROUND); - } else { - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, - MESSAGE_TOP - DEFAULT_PADDING, - TR_BL_FORK, RIGHT | BL_FOREGROUND); - lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING, - MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6, - BL_FOREGROUND); - - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP, - TR_BL_VERSION, RIGHT | BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP, - tag.version, BL_FOREGROUND); - - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, - MESSAGE_TOP + DEFAULT_PADDING, - TR_BL_RADIO, RIGHT | BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, - MESSAGE_TOP + DEFAULT_PADDING, tag.flavour, - BL_FOREGROUND); - - lcd->drawText(LANDSCAPE ? DOUBLE_PADDING : DEFAULT_PADDING, MESSAGE_TOP, LV_SYMBOL_OK, BL_GREEN); - } - } - } - - bootloaderDrawFooter(); - - if (st != ST_DIR_CHECK && (st != ST_FLASH_CHECK || opt == FC_OK)) { - - int padding = DOUBLE_PADDING; - if (LANDSCAPE) - padding = DEFAULT_PADDING; - if (st == ST_FILE_LIST) { - lcd->drawText(padding, LCD_H - padding, - LV_SYMBOL_CHARGE " " TR_BL_SELECT_KEY, BL_FOREGROUND); - } else if (st == ST_FLASH_CHECK && opt == FC_OK) { - lcd->drawText(padding, LCD_H - padding, - LV_SYMBOL_CHARGE " " TR_BL_FLASH_KEY, BL_FOREGROUND); - } else if (st == ST_FLASHING) { - lcd->drawText(padding, LCD_H - padding, - LV_SYMBOL_CHARGE " " TR_BL_WRITING_FW, BL_FOREGROUND); - } else if (st == ST_FLASH_DONE) { - lcd->drawText(padding, LCD_H - padding, - LV_SYMBOL_CHARGE " " TR_BL_WRITING_COMPL, BL_FOREGROUND); - } - } - - if (st != ST_FLASHING) { - if (LANDSCAPE) { - lcd->drawText(LCD_W - 175, LCD_H - DEFAULT_PADDING, - LV_SYMBOL_NEW_LINE " " TR_BL_EXIT_KEY, BL_FOREGROUND); - } else { - lcd->drawText(DOUBLE_PADDING, LCD_H - DEFAULT_PADDING, - LV_SYMBOL_NEW_LINE " " TR_BL_EXIT_KEY, BL_FOREGROUND); - } - } - } - _first_screen = false; -} - -void bootloaderDrawFilename(const char* str, uint8_t line, bool selected) -{ - lcd->drawText(DEFAULT_PADDING, 75 + (line * 25), LV_SYMBOL_FILE, BL_FOREGROUND); - lcd->drawText(DEFAULT_PADDING + 30, 75 + (line * 25), str, BL_FOREGROUND); - - if (selected) { - lcd->drawSolidRect(DEFAULT_PADDING + 25, 72 + (line * 25), - LCD_W - (DEFAULT_PADDING + 25) - 28, 26, 2, BL_SELECTED); - } -} -uint32_t bootloaderGetMenuItemCount(int baseCount) -{ - uint8_t n = 0; -#if defined(USB_SW_GPIO) -#if defined(RADIO_NV14_FAMILY) - if(hardwareOptions.pcbrev == PCBREV_EL18) -#endif - n = 1; -#endif - return baseCount + n; -} - -bool bootloaderRadioMenu(uint32_t menuItem, event_t event) -{ -#if defined(USB_SW_GPIO) - static int pos = 0; - - if (event == EVT_KEY_FIRST(KEY_DOWN)) { - if (pos < RADIO_MENU_LEN-1) - pos++; - } else if (event == EVT_KEY_FIRST(KEY_UP)) { - if (pos > 0) - pos--; - } else if (event == EVT_KEY_BREAK(KEY_ENTER)) { - switch (pos) { - case 0: - if (rfUsbAccess) - { - rfUsbAccess = false; - INTERNAL_MODULE_OFF(); - USB_SW_TO_MCU(); - } else { - rfUsbAccess = true; - INTERNAL_MODULE_ON(); - USB_SW_TO_INTERNAL_MODULE(); - } - break; - case 1: // fall through - default: - USB_SW_TO_MCU(); - pos = 0; - return true; - } - } - bootloaderDrawScreen(ST_RADIO_MENU, pos, nullptr); - return false; -#else - return true; -#endif -} - -void blExit(void) -{ -#if defined(USB_SW_GPIO) - USB_SW_TO_MCU(); -#endif - lcdClear(); - lcdRefresh(); - lcdRefreshWait(); -} diff --git a/radio/src/targets/simu/CMakeLists.txt b/radio/src/targets/simu/CMakeLists.txt index a97d2899c..744dfdded 100644 --- a/radio/src/targets/simu/CMakeLists.txt +++ b/radio/src/targets/simu/CMakeLists.txt @@ -50,9 +50,10 @@ endif() if(SIMU_BOOTLOADER) add_definitions(-DSIMU_BOOTLOADER) set(SIMU_DRIVERS ${SIMU_DRIVERS} - ../../targets/common/arm/stm32/bootloader/bin_files.cpp - ../../targets/common/arm/stm32/bootloader/boot.cpp - ../../targets/${TARGET_DIR}/bootloader/boot_menu.cpp + ../../bootloader/bin_files.cpp + ../../bootloader/boot.cpp + # TODO - how to handle this for B&W (not currently used)? + ../../gui/colorlcd/boot_menu.cpp ../../thirdparty/lz4/lz4.c ) endif() diff --git a/radio/src/targets/st16/CMakeLists.txt b/radio/src/targets/st16/CMakeLists.txt index a733e33cf..d31133800 100644 --- a/radio/src/targets/st16/CMakeLists.txt +++ b/radio/src/targets/st16/CMakeLists.txt @@ -137,7 +137,7 @@ add_library(board_bl OBJECT EXCLUDE_FROM_ALL ${BOARD_COMMON_SRC} ${TARGET_SRC_DIR}/system_clock.c ${TARGET_SRC_DIR}/sdram_driver.cpp - ${TARGET_SRC_DIR}/bootloader/boot_menu.cpp + ${RADIO_SRC_DIR}/gui/colorlcd/boot_menu.cpp targets/common/arm/stm32/stm32_qspi.cpp targets/common/arm/stm32/stm32_pulse_driver.cpp ) @@ -170,7 +170,7 @@ include_directories(${RADIO_SRC_DIR}/fonts/colorlcd gui/${GUI_DIR} gui/${GUI_DIR if(BOOTLOADER) set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} - ../common/arm/loadboot.cpp + ../../bootloader/loadboot.cpp ) endif() diff --git a/radio/src/targets/st16/bootloader/boot_menu.cpp b/radio/src/targets/st16/bootloader/boot_menu.cpp deleted file mode 100644 index a0eb29328..000000000 --- a/radio/src/targets/st16/bootloader/boot_menu.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "board.h" -#include "bsp_io.h" -#include "fw_version.h" -#include "lcd.h" -#include "bitmapbuffer.h" - -#include "translations.h" - -#include "targets/common/arm/stm32/bootloader/boot.h" - -#include - -#define SELECTED_COLOR (INVERS | COLOR_THEME_SECONDARY1) -#define DEFAULT_PADDING 28 -#define DOUBLE_PADDING 56 -#define MESSAGE_TOP (LCD_H - (2*DOUBLE_PADDING)) - -#define BL_GREEN COLOR2FLAGS(RGB(73, 219, 62)) -#define BL_RED COLOR2FLAGS(RGB(229, 32, 30)) -#define BL_BACKGROUND COLOR_BLACK -#define BL_FOREGROUND COLOR_WHITE -#define BL_SELECTED COLOR2FLAGS(RGB(11, 65, 244)) // deep blue - -extern BitmapBuffer* lcd; - -void bootloaderInitScreen() -{ - lcdInitDisplayDriver(); - backlightInit(); - backlightEnable(100); -} - -static void bootloaderDrawTitle(const char* text) -{ - lcd->drawText(LCD_W / 2, DEFAULT_PADDING, text, CENTERED | BL_FOREGROUND); - lcd->drawSolidFilledRect(DEFAULT_PADDING, DOUBLE_PADDING, - LCD_W - DOUBLE_PADDING, 2, BL_FOREGROUND); -} - -static void bootloaderDrawFooter() -{ - lcd->drawSolidFilledRect(DEFAULT_PADDING, LCD_H - (DEFAULT_PADDING + 10), - LCD_W - DOUBLE_PADDING, 2, BL_FOREGROUND); -} - -static void bootloaderDrawBackground() { lcd->clear(BL_BACKGROUND); } - -void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) -{ - lcdInitDirectDrawing(); - bootloaderDrawBackground(); - bootloaderDrawTitle(BOOTLOADER_TITLE); - - if (st == ST_START || st == ST_USB) { - - const char* msg = nullptr; - if (st == ST_START) { - msg = "Plug USB cable"; - } else if (st == ST_USB) { - msg = "Copy firmware.uf2 to flash"; - } - - coord_t x = LCD_W/2; - coord_t y = LCD_H/2; - lcd->drawText(x, y, msg, CENTERED | BL_FOREGROUND); - - bootloaderDrawFooter(); - - const char* fw_ver = getFirmwareVersion(); - if (!fw_ver) fw_ver = "no version"; - lcd->drawText(x, LCD_H - DEFAULT_PADDING, fw_ver, - CENTERED | BL_FOREGROUND); - - } else if (st == ST_FLASHING || st == ST_FLASH_DONE) { - - const coord_t pb_h = 31; - const coord_t pb_x = 70; - const coord_t pb_y = (LCD_H - pb_h) / 2; - - const char* msg = (st == ST_FLASH_DONE) ? TR_BL_WRITING_COMPL : TR_BL_WRITING_FW; - lcd->drawText(pb_x, pb_y - 28, msg, BL_FOREGROUND); - lcd->drawRect(pb_x, pb_y, 340, pb_h, 2, SOLID, BL_SELECTED); - - LcdFlags color = (st == ST_FLASH_DONE) ? BL_GREEN : BL_RED; - lcd->drawSolidFilledRect(pb_x + 4, pb_y + 4, (332 * opt) / 100, 23, color); - } -} - -void bootloaderDrawDFUScreen() -{ - lcdInitDirectDrawing(); - bootloaderDrawBackground(); - lcd->drawText(LCD_W / 2, LCD_H / 2, "DFU mode", CENTERED | BL_FOREGROUND); -} - -void blExit(void) -{ - lcdClear(); - lcdRefresh(); - lcdRefreshWait(); -} diff --git a/radio/src/targets/stm32h7s78-dk/CMakeLists.txt b/radio/src/targets/stm32h7s78-dk/CMakeLists.txt index 56c645def..0e0e533d6 100644 --- a/radio/src/targets/stm32h7s78-dk/CMakeLists.txt +++ b/radio/src/targets/stm32h7s78-dk/CMakeLists.txt @@ -88,7 +88,7 @@ add_library(board_bl OBJECT EXCLUDE_FROM_ALL ${BOARD_COMMON_SRC} ${TARGET_SRC_DIR}/system_clock.c ${TARGET_SRC_DIR}/extram_driver.cpp - ${TARGET_SRC_DIR}/bootloader/boot_menu.cpp + ${RADIO_SRC_DIR}/gui/colorlcd/boot_menu.cpp ) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} $) @@ -110,6 +110,6 @@ include_directories(${RADIO_SRC_DIR}/fonts/colorlcd gui/${GUI_DIR} gui/${GUI_DIR if(BOOTLOADER) set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} - ../common/arm/loadboot.cpp + ../../bootloader/loadboot.cpp ) endif() diff --git a/radio/src/targets/stm32h7s78-dk/bootloader/boot_menu.cpp b/radio/src/targets/stm32h7s78-dk/bootloader/boot_menu.cpp deleted file mode 100644 index 0b3f7b8a0..000000000 --- a/radio/src/targets/stm32h7s78-dk/bootloader/boot_menu.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "board.h" -#include "fw_version.h" -#include "lcd.h" - -#include "translations.h" - -#include "targets/common/arm/stm32/bootloader/boot.h" -#include "bootloader/firmware_files.h" - -#include - -#define SELECTED_COLOR (INVERS | COLOR_THEME_SECONDARY1) -#define DEFAULT_PADDING 28 -#define DOUBLE_PADDING 56 -#define MESSAGE_TOP (LCD_H - (2*DOUBLE_PADDING)) - -#define BL_GREEN COLOR2FLAGS(RGB(73, 219, 62)) -#define BL_RED COLOR2FLAGS(RGB(229, 32, 30)) -#define BL_BACKGROUND COLOR_BLACK -#define BL_FOREGROUND COLOR_WHITE -#define BL_SELECTED COLOR2FLAGS(RGB(11, 65, 244)) // deep blue - -extern BitmapBuffer * lcd; - -void bootloaderInitScreen() -{ - lcdInitDisplayDriver(); -} - -static void bootloaderDrawTitle(const char* text) -{ - lcd->drawText(LCD_W / 2, DEFAULT_PADDING, text, CENTERED | BL_FOREGROUND); - lcd->drawSolidFilledRect(DEFAULT_PADDING, DOUBLE_PADDING, - LCD_W - DOUBLE_PADDING, 2, BL_FOREGROUND); -} - -static void bootloaderDrawFooter() -{ - lcd->drawSolidFilledRect(DEFAULT_PADDING, LCD_H - (DEFAULT_PADDING + 10), - LCD_W - DOUBLE_PADDING, 2, BL_FOREGROUND); -} - -static void bootloaderDrawBackground() { lcd->clear(BL_BACKGROUND); } - -void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) -{ - lcdInitDirectDrawing(); - bootloaderDrawBackground(); - bootloaderDrawTitle(BOOTLOADER_TITLE); - - if (st == ST_START || st == ST_USB) { - - const char* msg = nullptr; - if (st == ST_START) { - msg = "Plug USB cable"; - } else if (st == ST_USB) { - msg = "Copy firmware.uf2 to flash"; - } - - coord_t x = LCD_W/2; - coord_t y = LCD_H/2; - lcd->drawText(x, y, msg, CENTERED | BL_FOREGROUND); - - bootloaderDrawFooter(); - - const char* fw_ver = getFirmwareVersion(); - if (!fw_ver) fw_ver = "no version"; - lcd->drawText(x, LCD_H - DEFAULT_PADDING, fw_ver, - CENTERED | BL_FOREGROUND); - - } else if (st == ST_FLASHING || st == ST_FLASH_DONE) { - - const coord_t pb_h = 31; - const coord_t pb_x = 70; - const coord_t pb_y = (LCD_H - pb_h) / 2; - - const char* msg = (st == ST_FLASH_DONE) ? TR_BL_WRITING_COMPL : TR_BL_WRITING_FW; - lcd->drawText(pb_x, pb_y - 28, msg, BL_FOREGROUND); - lcd->drawRect(pb_x, pb_y, 340, pb_h, 2, SOLID, BL_SELECTED); - - LcdFlags color = (st == ST_FLASH_DONE) ? BL_GREEN : BL_RED; - lcd->drawSolidFilledRect(pb_x + 4, pb_y + 4, (332 * opt) / 100, 23, color); - } -} - -void bootloaderDrawDFUScreen() -{ - lcdInitDirectDrawing(); - bootloaderDrawBackground(); - lcd->drawText(LCD_W / 2, LCD_H / 2, "DFU mode", CENTERED | BL_FOREGROUND); -} - -void blExit(void) -{ - lcdClear(); - lcdRefresh(); - lcdRefreshWait(); -} diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 5367348bd..bafba2ac3 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -628,7 +628,7 @@ endif() # Bootloader board library add_library(board_bl OBJECT EXCLUDE_FROM_ALL ${BOARD_COMMON_SRC} - ${TARGET_SRC_DIR}/bootloader/boot_menu.cpp + ${RADIO_SRC_DIR}/gui/common/stdlcd/boot_menu.cpp ) # add_dependencies(board_bl ${BITMAPS_TARGET}) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} $) @@ -723,7 +723,7 @@ endif() set(FIRMWARE_SRC ${FIRMWARE_SRC} - targets/common/arm/loadboot.cpp + bootloader/loadboot.cpp ) set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} ${BITMAPS_TARGET}) diff --git a/radio/src/translations/bl_translations.h b/radio/src/translations/bl_translations.h new file mode 100644 index 000000000..31414b06b --- /dev/null +++ b/radio/src/translations/bl_translations.h @@ -0,0 +1,425 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + + #pragma once + +// Bootloader strings - ASCII characters only (no extended ASCII or unicode) + +#if defined(PCBPL18) + #if defined(RADIO_NV14_FAMILY) + #define BL_SELECT_KEY "[R TRIM]" + #define BL_EXIT_KEY "[L TRIM]" + #elif defined(RADIO_NB4P) + #define BL_SELECT_KEY "[SW1A]" + #define BL_EXIT_KEY "[SW1B]" + #elif defined(RADIO_PL18U) + #define BL_SELECT_KEY "[KR Dn]" + #define BL_EXIT_KEY "[KR Up]" + #else + #define BL_SELECT_KEY "[TR4 Dn]" + #define BL_EXIT_KEY "[TR4 Up]" + #endif +#elif defined(PCBNV14) + #define BL_SELECT_KEY "[R TRIM]" + #define BL_EXIT_KEY "[L TRIM]" +#elif defined(RADIO_ST16) + #define BL_SELECT_KEY "[ENT]" + #define BL_EXIT_KEY "[EXIT]" +#else + #define BL_SELECT_KEY "[ENT]" + #define BL_EXIT_KEY "[RTN]" +#endif + +#if defined(TRANSLATIONS_CZ) + + // Poznamka: nutne pouziti textu bez diakritiky - omezeni velikosti pameti bootloader! + #define TR_BL_USB_CONNECTED "USB pripojeno" + #define TR_BL_USB_PLUGIN "nebo pripojte USB kabel" + #define TR_BL_USB_MASS_STORE "pro pouziti uloziste" + #define TR_BL_WRITE_FW "Nahrat firmware" + #define TR_BL_FORK "Fork:" + #define TR_BL_VERSION "Verze:" + #define TR_BL_RADIO "Radio:" + #define TR_BL_EXIT "Ukoncit" + #define TR_BL_DIR_MISSING "Adresar chybi" + #define TR_BL_DIR_EMPTY "Adresar je prazdny" + #define TR_BL_WRITING_FW "Nahravani firmware ..." + #define TR_BL_WRITING_COMPL "Nahravani dokonceno" + #define TR_BL_ENABLE "Povoleno" + #define TR_BL_DISABLE "Zakazano" + + #if defined(COLORLCD) + #define TR_BL_INVALID_FIRMWARE "Neplatny soubor s firmwarem" + #elif LCD_W >= 212 + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN " " TR_BL_USB_MASS_STORE + #define TR_BL_HOLD_ENTER_TO_START "Drzet [ENT] pro zahajeni nahravani" + #define TR_BL_INVALID_FIRMWARE "Neplatny firmware soubor!" + #else + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN + #define TR_BL_HOLD_ENTER_TO_START "Drzet [ENT] pro zahajeni" + #define TR_BL_INVALID_FIRMWARE "Neplatny firmware!" + #endif + + // Bootloader Taranis specific - ASCII characters only + #define TR_BL_POWER_KEY "Stisknete tlacitko napajeni." + #define TR_BL_FLASH_EXIT "Ukoncit rezim nahravani." + + // Bootloader Horus specific - ASCII characters only + #define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" + #define TR_BL_ERASE_FLASH "Erase Flash Storage" + #define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" + #define TR_BL_RF_USB_ACCESS "RF USB access" + #define TR_BL_CURRENT_FW "Aktualni firmware:" + + #define TR_BL_SELECT_KEY BL_SELECT_KEY " pro vybrani souboru" + #define TR_BL_FLASH_KEY "Drzet dlouze " BL_SELECT_KEY " pro nahrani" + #define TR_BL_ERASE_KEY "Hold " BL_SELECT_KEY " long to erase" + #define TR_BL_TOGGLE_KEY BL_SELECT_KEY " to toggle" + #define TR_BL_EXIT_KEY BL_EXIT_KEY " pro ukonceni" + +#elif defined(TRANSLATIONS_DA) + + #define TR_BL_USB_CONNECTED "USB forbundet" + #define TR_BL_USB_PLUGIN "eller brug USB kabel" + #define TR_BL_USB_MASS_STORE "for USB disk" + #define TR_BL_WRITE_FW "Installer firmware" + #define TR_BL_FORK "Fork:" + #define TR_BL_VERSION "Version:" + #define TR_BL_RADIO "Radio:" + #define TR_BL_EXIT "Forlad" + #define TR_BL_DIR_MISSING "Katalog mangler" + #define TR_BL_DIR_EMPTY "Katalog er tomt" + #define TR_BL_WRITING_FW "Installerer..." + #define TR_BL_WRITING_COMPL "Installation slut" + #define TR_BL_ENABLE "Aktiver" + #define TR_BL_DISABLE "Deaktiver" + + #if defined(COLORLCD) + #define TR_BL_INVALID_FIRMWARE "Ikke en installationsfil!" + #elif LCD_W >= 212 + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN " " TR_BL_USB_MASS_STORE + #define TR_BL_HOLD_ENTER_TO_START "[ENT] for at starte installation" + #define TR_BL_INVALID_FIRMWARE "Ikke en installationsfil!" + #else + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN + #define TR_BL_HOLD_ENTER_TO_START "[ENT] for at starte" + #define TR_BL_INVALID_FIRMWARE "Ikke en installationsfil!" + #endif + + // Bootloader Taranis specific - ASCII characters only + #define TR_BL_POWER_KEY "Tryk power knap." + #define TR_BL_FLASH_EXIT "Forlad installation tilstand." + + // Bootloader Horus specific - ASCII characters only + #define TR_BL_ERASE_INT_FLASH "Slet intern flash lager" + #define TR_BL_ERASE_FLASH "Slet flash lager" + #define TR_BL_ERASE_FLASH_MSG "Dette kan vare op til 200s" + #define TR_BL_RF_USB_ACCESS "RF USB adgang" + #define TR_BL_CURRENT_FW "Current firmware:" + + #define TR_BL_SELECT_KEY BL_SELECT_KEY " for at bruge fil" + #define TR_BL_FLASH_KEY "Hold " BL_SELECT_KEY " laenge, for at starte" + #define TR_BL_ERASE_KEY "Hold " BL_SELECT_KEY " laenge, for at slette" + #define TR_BL_TOGGLE_KEY BL_SELECT_KEY " to toggle" + #define TR_BL_EXIT_KEY BL_EXIT_KEY " for at forlade" + +#elif defined(TRANSLATIONS_DE) + + #define TR_BL_USB_CONNECTED "USB verbunden" + #define TR_BL_USB_PLUGIN "oder USB-Kabel anschl." + #define TR_BL_USB_MASS_STORE "für den SD-Speicher an" + #define TR_BL_WRITE_FW "Schreibe Firmware" + #define TR_BL_FORK "Fork:" + #define TR_BL_VERSION "Version:" + #define TR_BL_RADIO "Radio:" + #define TR_BL_EXIT "Beenden" + #define TR_BL_DIR_MISSING "Verzeichnis fehlt" + #define TR_BL_DIR_EMPTY "Verzeichnis leer" + #define TR_BL_WRITING_FW "Schreibe..." + #define TR_BL_WRITING_COMPL TR("Schreiben fertig","Schreiben abgeschlossen") + #define TR_BL_ENABLE "Aktivieren" + #define TR_BL_DISABLE "Deaktivieren" + + #if defined(COLORLCD) + #define TR_BL_INVALID_FIRMWARE "Keine gültige Firmwaredatei" + #elif LCD_W >= 212 + #define TR_BL_OR_PLUGIN_USB_CABLE "Oder schließen Sie ein USB-Kabel " TR_BL_USB_MASS_STORE + #define TR_BL_HOLD_ENTER_TO_START "Halte [ENT] gedrückt, um mit dem Schreiben zu beginnen" + #define TR_BL_INVALID_FIRMWARE "Keine gültige Firmwaredatei!" + #else + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN + #define TR_BL_HOLD_ENTER_TO_START "Zum Starten [ENT] halten" + #define TR_BL_INVALID_FIRMWARE "Keine gültige Firmware!" + #endif + + // Bootloader Taranis specific - ASCII characters only + #define TR_BL_POWER_KEY "Drücke den Power Knopf." + #define TR_BL_FLASH_EXIT "Verlasse den Flashmodus." + + // Bootloader Horus specific - ASCII characters only + #define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" + #define TR_BL_ERASE_FLASH "Erase Flash Storage" + #define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" + #define TR_BL_RF_USB_ACCESS "RF USB Zugriff" + #define TR_BL_CURRENT_FW "Aktuelle Firmware:" + + #define TR_BL_SELECT_KEY BL_SELECT_KEY " um Datei auszuwählen" + #define TR_BL_FLASH_KEY "Halte " BL_SELECT_KEY " gedrückt, zum schreiben" + #define TR_BL_ERASE_KEY "Halte " BL_SELECT_KEY " gedrückt, to erase" + #define TR_BL_TOGGLE_KEY BL_SELECT_KEY " to toggle" + #define TR_BL_EXIT_KEY BL_EXIT_KEY " zum beenden" + +#elif defined(TRANSLATIONS_FR) + + #define TR_BL_USB_CONNECTED "USB Connecte" + #define TR_BL_USB_PLUGIN "ou branchez cable USB" + #define TR_BL_USB_MASS_STORE "pour stockage de masse" + #define TR_BL_WRITE_FW "Ecriture Firmware" + #define TR_BL_FORK "Fork:" + #define TR_BL_VERSION "Version:" + #define TR_BL_RADIO "Radio:" + #define TR_BL_EXIT "Quitter" + #define TR_BL_DIR_MISSING "Repertoire absent" + #define TR_BL_DIR_EMPTY "Repertoire vide" + #define TR_BL_WRITING_FW "Ecriture Firmware ..." + #define TR_BL_WRITING_COMPL "Ecriture terminée" + #define TR_BL_ENABLE "Activer" + #define TR_BL_DISABLE "Désactiver" + + #if defined(COLORLCD) + #define TR_BL_INVALID_FIRMWARE "Fichier firmware non valide" + #elif LCD_W >= 212 + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN " " TR_BL_USB_MASS_STORE + #define TR_BL_HOLD_ENTER_TO_START "Appui [ENT] pour demarrer ecriture" + #define TR_BL_INVALID_FIRMWARE "Fichier firmware non valide!" + #else + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN + #define TR_BL_HOLD_ENTER_TO_START "Appui [ENT] pour demarrer" + #define TR_BL_INVALID_FIRMWARE "Firmware non valide!" + #endif + + // Bootloader Taranis specific - ASCII characters only + #define TR_BL_POWER_KEY "Appuyez sur le bouton power." + #define TR_BL_FLASH_EXIT "Quitter mode flashage." + + // Bootloader Horus specific - ASCII characters only + #define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" + #define TR_BL_ERASE_FLASH "Erase Flash Storage" + #define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" + #define TR_BL_RF_USB_ACCESS "RF USB access" + #define TR_BL_CURRENT_FW "Firmware actuel:" + + #define TR_BL_SELECT_KEY BL_SELECT_KEY " pour select. fichier" + #define TR_BL_FLASH_KEY "Appui long " BL_SELECT_KEY " pour flasher" + #define TR_BL_ERASE_KEY "Appui long " BL_SELECT_KEY " to erase" + #define TR_BL_TOGGLE_KEY BL_SELECT_KEY " to toggle" + #define TR_BL_EXIT_KEY BL_EXIT_KEY " pour quitter" + +#elif defined(TRANSLATIONS_IT) + + #define TR_BL_USB_CONNECTED "USB Connessa" + #define TR_BL_USB_PLUGIN "O connetti il cavo USB" + #define TR_BL_USB_MASS_STORE "per memoria di massa" + #define TR_BL_WRITE_FW "Scrivo il Firmware" + #define TR_BL_FORK "Fork:" + #define TR_BL_VERSION "Versione:" + #define TR_BL_RADIO "Radio:" + #define TR_BL_EXIT "Esci" + #define TR_BL_DIR_MISSING "Cartella non trovata" + #define TR_BL_DIR_EMPTY "Cartella vuota" + #define TR_BL_WRITING_FW "Scrittura Firmware..." + #define TR_BL_WRITING_COMPL "Scrittura completata" + #define TR_BL_ENABLE "Abilita" + #define TR_BL_DISABLE "Disabilita" + + #if defined(COLORLCD) + #define TR_BL_INVALID_FIRMWARE "Firmware non valido" + #elif LCD_W >= 212 + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN " " TR_BL_USB_MASS_STORE + #define TR_BL_HOLD_ENTER_TO_START "Premi [ENT] per iniziare la scrittura" + #define TR_BL_INVALID_FIRMWARE "Non è un file Firmware valido!" + #else + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN + #define TR_BL_HOLD_ENTER_TO_START "Premi [ENT] per partire" + #define TR_BL_INVALID_FIRMWARE "Non è un file Firmware valido!" + #endif + + // Bootloader Taranis specific - ASCII characters only + #define TR_BL_POWER_KEY "Premi il bottone d'accensione" + #define TR_BL_FLASH_EXIT "Esci dal modo scrittura." + + // Bootloader Horus specific - ASCII characters only + #define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" + #define TR_BL_ERASE_FLASH "Erase Flash Storage" + #define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" + #define TR_BL_RF_USB_ACCESS "RF USB access" + + #define TR_BL_SELECT_KEY BL_SELECT_KEY " per scegliere il file" + #define TR_BL_FLASH_KEY "Tenere premuto " BL_SELECT_KEY " per scrivere" + #define TR_BL_ERASE_KEY "Hold " BL_SELECT_KEY " long to erase" + #define TR_BL_TOGGLE_KEY BL_SELECT_KEY " to toggle" + #define TR_BL_EXIT_KEY BL_EXIT_KEY " per uscire" + +#elif defined(TRANSLATIONS_PL) + + #define TR_BL_USB_CONNECTED "USB polaczone" + #define TR_BL_USB_PLUGIN "lub podlacz kabel USB" + #define TR_BL_USB_MASS_STORE "dla trybu danych" + #define TR_BL_WRITE_FW "Zapis firmware" + #define TR_BL_FORK "Fork:" + #define TR_BL_VERSION "Wersja:" + #define TR_BL_RADIO "Radio:" + #define TR_BL_EXIT "Wyjdz" + #define TR_BL_DIR_MISSING "Brak katalogu" + #define TR_BL_DIR_EMPTY "Katalog jest pusty" + #define TR_BL_WRITING_FW "Zapis firmware ..." + #define TR_BL_WRITING_COMPL "Zapis ukonczony" + #define TR_BL_ENABLE "Enable" + #define TR_BL_DISABLE "Disable" + + #if defined(COLORLCD) + #define TR_BL_INVALID_FIRMWARE "Nieprawidlowy plik firmware" + #elif LCD_W >= 212 + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN " " TR_BL_USB_MASS_STORE + #define TR_BL_HOLD_ENTER_TO_START "Przytrzymaj [ENT] by zaczac zapis" + #define TR_BL_INVALID_FIRMWARE "Nieprawidlowy plik firmware!" + #else + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN + #define TR_BL_HOLD_ENTER_TO_START "Przytrzymaj [ENT] by zaczac" + #define TR_BL_INVALID_FIRMWARE "011Nieprawidlowy firmware!" + #endif + + // Bootloader Taranis specific - ASCII characters only + #define TR_BL_POWER_KEY "Nacisnij przycisk Power" + #define TR_BL_FLASH_EXIT "Wyjdz z trybu flashowania" + + // Bootloader Horus specific - ASCII characters only + #define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" + #define TR_BL_ERASE_FLASH "Erase Flash Storage" + #define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" + #define TR_BL_RF_USB_ACCESS "RF USB access" + #define TR_BL_CURRENT_FW "Obecny firmware:" + + #define TR_BL_SELECT_KEY BL_SELECT_KEY " aby wybrac plik" + #define TR_BL_FLASH_KEY "Przytrzymaj " BL_SELECT_KEY " aby flashowac" + #define TR_BL_ERASE_KEY "Przytrzymaj " BL_SELECT_KEY " long to erase" + #define TR_BL_TOGGLE_KEY BL_SELECT_KEY " to toggle" + #define TR_BL_EXIT_KEY BL_EXIT_KEY " aby wyjsc" + +#elif defined(TRANSLATIONS_SE) + + // Bootloader common + #define TR_BL_USB_CONNECTED "USB ansluten" + #define TR_BL_USB_PLUGIN "Eller anslut med USB-kabel" + #define TR_BL_USB_MASS_STORE "foer masslagring" + #define TR_BL_WRITE_FW "Skriv firmware" + #define TR_BL_FORK "Gren:" + #define TR_BL_VERSION "Version:" + #define TR_BL_RADIO "Radio:" + #define TR_BL_EXIT "Avsluta" + #define TR_BL_DIR_MISSING "Katalogen saknas" + #define TR_BL_DIR_EMPTY "Katalogen aer tom" + #define TR_BL_WRITING_FW "Skriver..." + #define TR_BL_WRITING_COMPL "Skrivning klar" + #define TR_BL_ENABLE "Aktivera" + #define TR_BL_DISABLE "Inaktivera" + + #if LCD_W >= 480 + #define TR_BL_INVALID_FIRMWARE "Ej en giltig firmwarefil" + #elif LCD_W >= 212 + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN " " TR_BL_USB_MASS_STORE + #define TR_BL_HOLD_ENTER_TO_START "Tryck [ENT] foer att boerja skriva " + #define TR_BL_INVALID_FIRMWARE "Ej en giltig firmwarefil!" + #else + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN + #define TR_BL_HOLD_ENTER_TO_START "Tryck [ENT] för att boerja" + #define TR_BL_INVALID_FIRMWARE "Ej en giltig firmware!" + #endif + + // Bootloader Taranis specific - ASCII characters only + #define TR_BL_POWER_KEY "Tryck paa startknappen." + #define TR_BL_FLASH_EXIT "Avsluta flashningslaeget." + + // Bootloader Horus specific - ASCII characters only + #define TR_BL_ERASE_INT_FLASH "Radera interna flashminnet" + #define TR_BL_ERASE_FLASH "Radera flashminnet" + #define TR_BL_ERASE_FLASH_MSG "Detta kan ta upp till 200s" + #define TR_BL_RF_USB_ACCESS "RF USB-access" + #define TR_BL_CURRENT_FW "Nuvarande firmware:" + + #define TR_BL_SELECT_KEY BL_SELECT_KEY " foer att vaelja fil" + #define TR_BL_FLASH_KEY "Haall ner " BL_SELECT_KEY " foer att flasha" + #define TR_BL_ERASE_KEY "Haall ner " BL_SELECT_KEY " foer att radera" + #define TR_BL_TOGGLE_KEY BL_SELECT_KEY " to toggle" + #define TR_BL_EXIT_KEY BL_EXIT_KEY " foer att avbryta" + +#else + + #define TR_BL_USB_CONNECTED "USB Connected" + #define TR_BL_USB_PLUGIN "Or plug in a USB cable" + #define TR_BL_USB_MASS_STORE "for mass storage" + #define TR_BL_WRITE_FW "Write Firmware" + #define TR_BL_FORK "Fork:" + #define TR_BL_VERSION "Version:" + #define TR_BL_RADIO "Radio:" + #define TR_BL_EXIT "Exit" + #define TR_BL_DIR_MISSING "Directory is missing" + #define TR_BL_DIR_EMPTY "Directory is empty" + #define TR_BL_WRITING_FW "Writing..." + #define TR_BL_WRITING_COMPL "Writing complete" + #define TR_BL_ENABLE "Enable" + #define TR_BL_DISABLE "Disable" + + #if defined(COLORLCD) + #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" + #elif LCD_W >= 212 + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN " " TR_BL_USB_MASS_STORE + #define TR_BL_HOLD_ENTER_TO_START "Hold [ENT] to start writing" + #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file!" + #else + #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN + #define TR_BL_HOLD_ENTER_TO_START "Hold [ENT] to start" + #define TR_BL_INVALID_FIRMWARE "Not a valid firmware!" + #endif + + // Bootloader Taranis specific - ASCII characters only + #define TR_BL_POWER_KEY "Press the power button." + #define TR_BL_FLASH_EXIT "Exit the flashing mode." + + // Bootloader Horus specific - ASCII characters only + #define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" + #define TR_BL_ERASE_FLASH "Erase Flash Storage" + #define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" + #define TR_BL_RF_USB_ACCESS "RF USB access" + #define TR_BL_CURRENT_FW "Current Firmware:" + + #define TR_BL_SELECT_KEY BL_SELECT_KEY " to select file" + #define TR_BL_FLASH_KEY "Hold " BL_SELECT_KEY " long to flash" + #define TR_BL_ERASE_KEY "Hold " BL_SELECT_KEY " long to erase" + #define TR_BL_TOGGLE_KEY BL_SELECT_KEY " to toggle" + #define TR_BL_EXIT_KEY BL_EXIT_KEY " to exit" + +#endif + +#define TR_BL_DFU_MODE "DFU mode" +#define TR_BL_PLUG_USB "Plug USB cable" +#define TR_BL_COPY_UF2 "Copy firmware.uf2 to EDGETX_UF2 drive" +#define TR_BL_NO_VERSION "No version" \ No newline at end of file diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 598175d80..126707214 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -1024,80 +1024,6 @@ #define TR_WIDGET_VALUE "数值" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Writing..." -#define TR_BL_WRITING_COMPL "Writing complete" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS TR(" 关于 ", "关于") diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 4e571d85b..58b1d6dc1 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -1039,80 +1039,6 @@ #define TR_WIDGET_VALUE "Hodnota" #endif -// Bootloader common (Poznamka: nutne pouziti textu bez diakritiky - omezeni velikosti pameti bootloader!) -#define TR_BL_USB_CONNECTED "USB pripojeno" -#define TR_BL_USB_PLUGIN "nebo pripojte USB kabel" -#define TR_BL_USB_MASS_STORE "pro pouziti uloziste" -#define TR_BL_USB_PLUGIN_MASS_STORE "nebo pripojte USB kabel pro pouziti uloziste" -#define TR_BL_WRITE_FW "Nahrat firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Verze:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Ukoncit" -#define TR_BL_DIR_MISSING " Adresar chybi" -#define TR_BL_DIR_EMPTY " Adresar je prazdny" -#define TR_BL_WRITING_FW "Nahravani firmware ..." -#define TR_BL_WRITING_COMPL "Nahravani dokonceno" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Neplatny soubor s firmwarem" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Drzet [ENT] pro zahajeni nahravani" - #define TR_BL_INVALID_FIRMWARE "\011Neplatny firmware soubor! " - #define TR_BL_INVALID_EEPROM "\011Neplatny EEPROM soubor! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Drzet [ENT] pro zahajeni" - #define TR_BL_INVALID_FIRMWARE "\004Neplatny firmware! " - #define TR_BL_INVALID_EEPROM "\004Neplatny EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Obnovit EEPROM" -#define TR_BL_POWER_KEY "Stisknete tlacitko napajeni." -#define TR_BL_FLASH_EXIT "Ukoncit rezim nahravani." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Aktualni firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Povoleno" - #define TR_BL_DISABLE "Zakazano" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] pro vybrani souboru" - #define TR_BL_FLASH_KEY "Drzet dlouze [R TRIM] pro nahrani" - #define TR_BL_ERASE_KEY "Drzet dlouze [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] pro ukonceni" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] pro vybrani souboru" - #define TR_BL_FLASH_KEY "Drzet dlouze [SW1A] pro nahrani" - #define TR_BL_ERASE_KEY "Drzet dlouze [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] pro ukonceni" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] pro vybrani souboru" - #define TR_BL_FLASH_KEY "Drzet dlouze [TR4 Dn] pro nahrani" - #define TR_BL_ERASE_KEY "Drzet dlouze [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] pro ukonceni" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] pro vybrani souboru" - #define TR_BL_FLASH_KEY "Drzet dlouze [R TRIM] pro nahrani" - #define TR_BL_EXIT_KEY " [L TRIM] pro ukonceni" - #define TR_BL_ENABLE "Povoleno" - #define TR_BL_DISABLE "Zakazano" -#else - #define TR_BL_SELECT_KEY "[ENT] pro vybrani souboru" - #define TR_BL_FLASH_KEY "Drzet dlouze [ENT] pro nahrani" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] pro ukonceni" -#endif - // About screen #define TR_ABOUTUS "O nás" diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index 968e5db37..91d008ceb 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -1027,80 +1027,6 @@ #define TR_WIDGET_VALUE "Værdi" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB forbundet" -#define TR_BL_USB_PLUGIN "eller brug USB kabel" -#define TR_BL_USB_MASS_STORE "for USB disk" -#define TR_BL_USB_PLUGIN_MASS_STORE "eller brug USB kabel for USB disk" -#define TR_BL_WRITE_FW "Installer firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Forlad" -#define TR_BL_DIR_MISSING " Katalog mangler" -#define TR_BL_DIR_EMPTY " Katalog er tomt" -#define TR_BL_WRITING_FW "Installerer..." -#define TR_BL_WRITING_COMPL "Installation slut" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Ikke en installationsfil!" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012[ENT] for at starte installation" - #define TR_BL_INVALID_FIRMWARE "\011Ikke en installationsfil! " - #define TR_BL_INVALID_EEPROM "\011Ikke en EEPROM fil! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006[ENT] for at starte" - #define TR_BL_INVALID_FIRMWARE "\004Ikke en installationsfil! " - #define TR_BL_INVALID_EEPROM "\004Ikke en EEPROM fil! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Genskab EEPROM" -#define TR_BL_POWER_KEY "Tryk power knap." -#define TR_BL_FLASH_EXIT "Forlad installation tilstand." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Slet intern flash lager" -#define TR_BL_ERASE_FLASH "Slet flash lager" -#define TR_BL_ERASE_FLASH_MSG "Dette kan vare op til 200s" -#define TR_BL_RF_USB_ACCESS "RF USB adgang" -#define TR_BL_CURRENT_FW "Current firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Aktiver" - #define TR_BL_DISABLE "Deaktiver" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] for at bruge fil" - #define TR_BL_FLASH_KEY "Hold [R TRIM] laenge, for at starte" - #define TR_BL_ERASE_KEY "Hold [R TRIM] laenge, for at slette" - #define TR_BL_EXIT_KEY "[L TRIM] for at forlade" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] for at bruge fil" - #define TR_BL_FLASH_KEY "Hold [SW1A] laenge, for at starte" - #define TR_BL_ERASE_KEY "Hold [SW1A] laenge, for at slette" - #define TR_BL_EXIT_KEY "[SW1B] for at forlade" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] for at bruge fil" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] laenge, for at starte" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] laenge, for at slette" - #define TR_BL_EXIT_KEY "[TR4 Up] for at forlade" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] for at bruge fil" - #define TR_BL_FLASH_KEY "[R TRIM] laenge, for at starte" - #define TR_BL_EXIT_KEY "[L TRIM] for at forlade" - #define TR_BL_ENABLE "Aktiver" - #define TR_BL_DISABLE "Deaktiver" -#else - #define TR_BL_SELECT_KEY "[ENT] for at bruge fil" - #define TR_BL_FLASH_KEY "Hold [ENT] laenge, for at starte" - #define TR_BL_ERASE_KEY "Hold [ENT] laenge, for at slette" - #define TR_BL_EXIT_KEY "[RTN] for at forlade" -#endif - // About screen #define TR_ABOUTUS TR(" OM ", "OM") diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 8593472f6..ca98d5618 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -1015,80 +1015,6 @@ #define TR_WIDGET_VALUE "Wert" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB verbunden" -#define TR_BL_USB_PLUGIN "oder USB-Kabel anschl." -#define TR_BL_USB_MASS_STORE "für den SD-Speicher an" -#define TR_BL_USB_PLUGIN_MASS_STORE "Oder schließen Sie ein USB-Kabel für den SD-Speicher an" -#define TR_BL_WRITE_FW "Schreibe Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Beenden" -#define TR_BL_DIR_MISSING " Verzeichnis fehlt" -#define TR_BL_DIR_EMPTY " Verzeichnis leer" -#define TR_BL_WRITING_FW "Schreibe..." -#define TR_BL_WRITING_COMPL TR("Schreiben fertig","Schreiben abgeschlossen") - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Keine gültige Firmwaredatei" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Halte [ENT] gedrückt, um mit dem Schreiben zu beginnen" - #define TR_BL_INVALID_FIRMWARE "\011Keine gültige Firmwaredatei! " - #define TR_BL_INVALID_EEPROM "\011Keine gültige EEPROM Datei! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "Zum Starten [ENT] halten" - #define TR_BL_INVALID_FIRMWARE "Keine gültige Firmware!" - #define TR_BL_INVALID_EEPROM "Kein gültiges EEPROM!" -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "EEPROM wiederherstellen" -#define TR_BL_POWER_KEY "Drücke den Power Knopf." -#define TR_BL_FLASH_EXIT "Verlasse den Flashmodus." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB Zugriff" -#define TR_BL_CURRENT_FW "Aktuelle Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Aktivieren" - #define TR_BL_DISABLE "Deaktivieren" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] um Datei auszuwählen" - #define TR_BL_FLASH_KEY "Halte [R TRIM] gedrückt, zum schreiben" - #define TR_BL_ERASE_KEY "Halte [R TRIM] gedrückt, to erase" - #define TR_BL_EXIT_KEY "[L TRIM] zum beenden" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] um Datei auszuwählen" - #define TR_BL_FLASH_KEY "Halte [SW1A] gedrückt, zum schreiben" - #define TR_BL_ERASE_KEY "Halte [SW1A] gedrückt, to erase" - #define TR_BL_EXIT_KEY "[SW1B] zum beenden" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] um Datei auszuwählen" - #define TR_BL_FLASH_KEY "Halte [TR4 Dn] gedrückt, zum schreiben" - #define TR_BL_ERASE_KEY "Halte [TR4 Dn] gedrückt, to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] zum beenden" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] um Datei auszuwählen" - #define TR_BL_FLASH_KEY "Halte [R TRIM] gedrückt, zum schreiben" - #define TR_BL_EXIT_KEY " [L TRIM] zum beenden" - #define TR_BL_ENABLE "Aktivieren" - #define TR_BL_DISABLE "Deaktivieren" -#else - #define TR_BL_SELECT_KEY "[ENT] um Datei auszuwählen" - #define TR_BL_FLASH_KEY "Halte [ENT] gedrückt, zum schreiben" - #define TR_BL_ERASE_KEY "Halte [ENT] gedrückt, to erase" - #define TR_BL_EXIT_KEY "[RTN] zum beenden" -#endif - // Taranis Info Zeile Anzeigen #define TR_LIMITS_HEADERS_NAME "Name" #define TR_LIMITS_HEADERS_SUBTRIM "Subtrim" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 045300418..fc974e72d 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -1028,80 +1028,6 @@ #define TR_WIDGET_VALUE "Value" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Writing..." -#define TR_BL_WRITING_COMPL "Writing complete" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS TR(" ABOUT ", "ABOUT") diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index 45dc205aa..c59ace681 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -1025,80 +1025,6 @@ #define TR_WIDGET_VALUE "Value" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Writing..." -#define TR_BL_WRITING_COMPL "Writing complete" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS "Nosotros" diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index c0aa04439..9ebecac58 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -1037,80 +1037,6 @@ #define TR_WIDGET_VALUE "Value" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Writing..." -#define TR_BL_WRITING_COMPL "Writing complete" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS TR(" ABOUT ", "ABOUT") diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index 6d098a3a8..e0d87ed33 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -1038,80 +1038,6 @@ #define TR_WIDGET_VALUE "Valeur" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connecte" -#define TR_BL_USB_PLUGIN "ou branchez cable USB" -#define TR_BL_USB_MASS_STORE "pour stockage de masse" -#define TR_BL_USB_PLUGIN_MASS_STORE "ou branchez cable USB pour stockage de masse" -#define TR_BL_WRITE_FW "Ecriture Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Quitter" -#define TR_BL_DIR_MISSING " Repertoire absent" -#define TR_BL_DIR_EMPTY " Repertoire vide" -#define TR_BL_WRITING_FW "Ecriture Firmware ..." -#define TR_BL_WRITING_COMPL "Ecriture terminée" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Fichier firmware non valide" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Appui [ENT] pour demarrer ecriture" - #define TR_BL_INVALID_FIRMWARE "\011 Fichier firmware non valide! " - #define TR_BL_INVALID_EEPROM "\011Fichier EEPROM non valide ! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Appui [ENT] pour demarrer" - #define TR_BL_INVALID_FIRMWARE "\004Firmware non valide! " - #define TR_BL_INVALID_EEPROM "\004EEPROM non valide ! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restaurer EEPROM" -#define TR_BL_POWER_KEY "Appuyez sur le bouton power." -#define TR_BL_FLASH_EXIT "Quitter mode flashage." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Firmware actuel:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Activer" - #define TR_BL_DISABLE "Désactiver" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] pour sélect. fichier" - #define TR_BL_FLASH_KEY "Appui long [R TRIM] pour flasher" - #define TR_BL_ERASE_KEY "Appui long [R TRIM] to erase" - #define TR_BL_EXIT_KEY "[L TRIM] pour quitter" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] pour sélect. fichier" - #define TR_BL_FLASH_KEY "Appui long [SW1A] pour flasher" - #define TR_BL_ERASE_KEY "Appui long [SW1A] to erase" - #define TR_BL_EXIT_KEY "[SW1B] pour quitter" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] pour sélect. fichier" - #define TR_BL_FLASH_KEY "Appui long [TR4 Dn] pour flasher" - #define TR_BL_ERASE_KEY "Appui long [TR4 Dn] to erase" - #define TR_BL_EXIT_KEY "[TR4 U] pour quitter" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] pour sélect. fichier" - #define TR_BL_FLASH_KEY "Appui long [R TRIM] pour flasher" - #define TR_BL_EXIT_KEY " [L TRIM] pour quitter" - #define TR_BL_ENABLE "Activer" - #define TR_BL_DISABLE "Désactiver" -#else - #define TR_BL_SELECT_KEY "[ENT] pour select. fichier" - #define TR_BL_FLASH_KEY "Appui long [ENT] pour flasher" - #define TR_BL_ERASE_KEY "Appui long [ENT] to erase" - #define TR_BL_EXIT_KEY "[RTN] pour quitter" -#endif - // About screen #define TR_ABOUTUS TR(" A PROPOS ", "A PROPOS") diff --git a/radio/src/translations/he.h b/radio/src/translations/he.h index a1b43ca0d..482583f5a 100644 --- a/radio/src/translations/he.h +++ b/radio/src/translations/he.h @@ -1027,80 +1027,6 @@ #define TR_WIDGET_VALUE "ערך" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Writing..." -#define TR_BL_WRITING_COMPL "Writing complete" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS TR(" ABOUT ", "ABOUT") diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index e74be7320..c65720acc 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -1022,79 +1022,6 @@ #define TR_WIDGET_VALUE "Valore" #endif -// Bootloader common -#define TR_BL_USB_CONNECTED "USB Connessa" -#define TR_BL_USB_PLUGIN "O connetti il cavo USB" -#define TR_BL_USB_MASS_STORE "per memoria di massa" -#define TR_BL_USB_PLUGIN_MASS_STORE "O connetti il cavo USB per memoria di massa" -#define TR_BL_WRITE_FW "Scrivo il Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Versione:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Esci" -#define TR_BL_DIR_MISSING " Cartella non trovata" -#define TR_BL_DIR_EMPTY " Cartella vuota" -#define TR_BL_WRITING_FW "Scrittura Firmware..." -#define TR_BL_WRITING_COMPL "Scrittura completata" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Firmware non valido" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Premi [ENT] per iniziare la scrittura" - #define TR_BL_INVALID_FIRMWARE "\011Non è un file Firmware valido! " - #define TR_BL_INVALID_EEPROM "\011Non è un file EEPROM valido! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Premi [ENT] per partire" - #define TR_BL_INVALID_FIRMWARE "\00Non è un file Firmware valido!" - #define TR_BL_INVALID_EEPROM "\004Non è un file EEPROM valido! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Ripristino EEPROM" -#define TR_BL_POWER_KEY "Premi il bottone d'accensione" -#define TR_BL_FLASH_EXIT "Esci dal modo scrittura." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Abilita" - #define TR_BL_DISABLE "Disabilita" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] per scegliere il file" - #define TR_BL_FLASH_KEY "Tener premuto [R TRIM] per scrivere" - #define TR_BL_ERASE_KEY "Tener premuto [R TRIM] to erase" - #define TR_BL_EXIT_KEY "[L TRIM] per uscire" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] per scegliere il file" - #define TR_BL_FLASH_KEY "Tener premuto [SW1A] per scrivere" - #define TR_BL_ERASE_KEY "Tener premuto [SW1A] to erase" - #define TR_BL_EXIT_KEY "[SW1B] per uscire" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] per scegliere il file" - #define TR_BL_FLASH_KEY "Tener premuto [TR4 Dn] per scrivere" - #define TR_BL_ERASE_KEY "Tener premuto [TR4 Dn] to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] per uscire" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] per scegliere il file" - #define TR_BL_FLASH_KEY "Tener premuto [R TRIM] per scrivere" - #define TR_BL_EXIT_KEY " [L TRIM] per uscire" - #define TR_BL_ENABLE "Abilita" - #define TR_BL_DISABLE "Disabilita" -#else - #define TR_BL_SELECT_KEY "[ENT] per scegliere il file" - #define TR_BL_FLASH_KEY "Tenere premuto [ENT] per scrivere" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] per uscire" -#endif - // About screen #define TR_ABOUTUS TR(" INFO ", "INFO SU") diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h index 7f8c8b8d0..08301cf5f 100644 --- a/radio/src/translations/jp.h +++ b/radio/src/translations/jp.h @@ -1027,80 +1027,6 @@ #define TR_WIDGET_VALUE "値" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Writing..." -#define TR_BL_WRITING_COMPL "Writing complete" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS TR(" 概要 ", "概要") diff --git a/radio/src/translations/ko.h b/radio/src/translations/ko.h index 87a40550a..66e8b5698 100644 --- a/radio/src/translations/ko.h +++ b/radio/src/translations/ko.h @@ -1089,80 +1089,6 @@ #define TR_WIDGET_VALUE "값" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Writing..." -#define TR_BL_WRITING_COMPL "Writing complete" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS TR(" 정보 ", "정보") #define TR_CHR_HOUR 'h' diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 633167f59..2e4f8ed65 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -1030,80 +1030,6 @@ #define TR_WIDGET_VALUE "Value" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Writing Firmware ..." -#define TR_BL_WRITING_COMPL "Writing Complete" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS TR(" ABOUT ", "ABOUT") diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index a4f17412f..9e220a0ed 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -1024,80 +1024,6 @@ #define TR_WIDGET_VALUE "Wartość" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB polaczone" -#define TR_BL_USB_PLUGIN "lub podlacz kabel USB" -#define TR_BL_USB_MASS_STORE "dla trybu danych" -#define TR_BL_USB_PLUGIN_MASS_STORE "lub podlacz kabel USB dla trybu danych" -#define TR_BL_WRITE_FW "Zapis firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Wersja:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Wyjdz" -#define TR_BL_DIR_MISSING " Brak katalogu" -#define TR_BL_DIR_EMPTY " Katalog jest pusty" -#define TR_BL_WRITING_FW "Zapis firmware ..." -#define TR_BL_WRITING_COMPL "Zapis ukonczony" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Nieprawidlowy plik firmware" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Przytrzymaj [ENT] by zaczac zapis" - #define TR_BL_INVALID_FIRMWARE "\011Nieprawidlowy plik firmware! " - #define TR_BL_INVALID_EEPROM "\011Nieprawidlowy plik EEPROM! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Przytrzymaj [ENT] by zaczac" - #define TR_BL_INVALID_FIRMWARE "\004011Nieprawidlowy firmware! " - #define TR_BL_INVALID_EEPROM "\004011Nieprawidlowy EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Przywroc EEPROM" -#define TR_BL_POWER_KEY "Nacisnij przycisk Power" -#define TR_BL_FLASH_EXIT "Wyjdz z trybu flashowania" - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Obecny firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] aby wybrac plik" - #define TR_BL_FLASH_KEY "Przytrzymaj [R TRIM] aby flashowac" - #define TR_BL_ERASE_KEY "Przytrzymaj [R TRIM] to erase" - #define TR_BL_EXIT_KEY "[L TRIM] aby wyjsc" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] aby wybrac plik" - #define TR_BL_FLASH_KEY "Przytrzymaj [SW1A] aby flashowac" - #define TR_BL_ERASE_KEY "Przytrzymaj [SW1A] to erase" - #define TR_BL_EXIT_KEY "[SW1B] aby wyjsc" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] aby wybrac plik" - #define TR_BL_FLASH_KEY "Przytrzymaj [TR4 Dn] aby flashowac" - #define TR_BL_ERASE_KEY "Przytrzymaj [TR4 Dn] to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] aby wyjsc" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] aby wybrac plik" - #define TR_BL_FLASH_KEY "Przytrzymaj [R TRIM] aby flashowac" - #define TR_BL_EXIT_KEY " [L TRIM] aby wyjsc" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] aby wybrac plik" - #define TR_BL_FLASH_KEY "Przytrzymaj [ENT] aby flashowac" - #define TR_BL_ERASE_KEY "Przytrzymaj [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] aby wyjsc" -#endif - // About screen #define TR_ABOUTUS TR(" O ", " O ") diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 799a2a934..5483994df 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -1031,80 +1031,6 @@ #define TR_WIDGET_VALUE "Value" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Gravando..." -#define TR_BL_WRITING_COMPL "Grav. Completa" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS TR(" ABOUT ", "ABOUT") diff --git a/radio/src/translations/ru.h b/radio/src/translations/ru.h index 70a2ed914..b774b4bd6 100644 --- a/radio/src/translations/ru.h +++ b/radio/src/translations/ru.h @@ -1030,80 +1030,6 @@ #define TR_WIDGET_VALUE "Значение" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Writing..." -#define TR_BL_WRITING_COMPL "Writing complete" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS TR("ИНФОРМАЦИЯ", "ИНФОРМАЦИЯ") diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index 4d2d69077..c2f6ac282 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -1053,80 +1053,6 @@ #define TR_WIDGET_VALUE "Värde" #endif -// Bootloader common -#define TR_BL_USB_CONNECTED "USB ansluten" -#define TR_BL_USB_PLUGIN "Eller anslut med USB-kabel" -#define TR_BL_USB_MASS_STORE "foer masslagring" -#define TR_BL_USB_PLUGIN_MASS_STORE "Eller anslut med USB-kabel foer masslagring" -#define TR_BL_WRITE_FW "Skriv firmware" -#define TR_BL_FORK "Gren:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Avsluta" -#define TR_BL_DIR_MISSING " Katalogen saknas" -#define TR_BL_DIR_EMPTY " Katalogen aer tom" -#define TR_BL_WRITING_FW "Skriver..." -#define TR_BL_WRITING_COMPL "Skrivning klar" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Ej en giltig firmwarefil" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Tryck [ENT] foer att boerja skriva " - #define TR_BL_INVALID_FIRMWARE "\011Ej en giltig firmwarefil! " - #define TR_BL_INVALID_EEPROM "\011Ej en giltig EEPROM-fil! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Tryck [ENT] för att boerja " - #define TR_BL_INVALID_FIRMWARE "\004Ej en giltig firmware! " - #define TR_BL_INVALID_EEPROM "\004Ej en giltig EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Aaterstaell EEPROM" -#define TR_BL_POWER_KEY "Tryck paa startknappen." -#define TR_BL_FLASH_EXIT "Avsluta flashningslaeget." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Radera interna flashminnet" -#define TR_BL_ERASE_FLASH "Radera flashminnet" -#define TR_BL_ERASE_FLASH_MSG "Detta kan ta upp till 200s" -#define TR_BL_RF_USB_ACCESS "RF USB-access" -#define TR_BL_CURRENT_FW "Nuvarande firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Aktivera" - #define TR_BL_DISABLE "Inaktivera" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] foer att vaelja fil" - #define TR_BL_FLASH_KEY "Haall ner [R TRIM] foer att flasha" - #define TR_BL_ERASE_KEY "Haall ner [R TRIM] foer att radera" - #define TR_BL_EXIT_KEY "[L TRIM] foer att avsluta" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] foer att vaelja fil" - #define TR_BL_FLASH_KEY "Haall ner [SW1A] foer att flasha" - #define TR_BL_ERASE_KEY "Haall ner [SW1A] foer att radera" - #define TR_BL_EXIT_KEY "[SW1B] foer att avsluta" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] foer att vaelja fil" - #define TR_BL_FLASH_KEY "Haall ner [TR4 Dn] foer att flasha" - #define TR_BL_ERASE_KEY "Haall ner [TR4 Dn] foer att radera" - #define TR_BL_EXIT_KEY "[TR4 Up] foer att avsluta" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] foer att vaelja fil" - #define TR_BL_FLASH_KEY "[R TRIM] foer att flasha" - #define TR_BL_EXIT_KEY " [L TRIM] foer att avbryta" - #define TR_BL_ENABLE "Aktivera" - #define TR_BL_DISABLE "Inaktivera" -#else - #define TR_BL_SELECT_KEY "[ENT] foer att vaelja fil" - #define TR_BL_FLASH_KEY "Haall ner [ENT] foer att flasha" - #define TR_BL_ERASE_KEY "Haall ner [ENT] foer att radera" - #define TR_BL_EXIT_KEY "[RTN] foer att avbryta" -#endif - // About screen #define TR_ABOUTUS "Om oss" diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 15aaacf4c..7e1d1395c 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -1029,80 +1029,6 @@ #define TR_WIDGET_VALUE "數值" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Writing Firmware ..." -#define TR_BL_WRITING_COMPL "Writing Completed" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - ASCII characters only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS TR(" 關於 ", "關於") diff --git a/radio/src/translations/ua.h b/radio/src/translations/ua.h index e4c7b9080..b69229b9f 100644 --- a/radio/src/translations/ua.h +++ b/radio/src/translations/ua.h @@ -1030,80 +1030,6 @@ #define TR_WIDGET_VALUE "Значення" #endif -// Bootloader common - ASCII characters only -#define TR_BL_USB_CONNECTED "USB Connected" -#define TR_BL_USB_PLUGIN "Or plug in a USB cable" -#define TR_BL_USB_MASS_STORE "for mass storage" -#define TR_BL_USB_PLUGIN_MASS_STORE "Or plug in a USB cable for mass storage" -#define TR_BL_WRITE_FW "Write Firmware" -#define TR_BL_FORK "Fork:" -#define TR_BL_VERSION "Version:" -#define TR_BL_RADIO "Radio:" -#define TR_BL_EXIT "Exit" -#define TR_BL_DIR_MISSING " Directory is missing" -#define TR_BL_DIR_EMPTY " Directory is empty" -#define TR_BL_WRITING_FW "Writing..." -#define TR_BL_WRITING_COMPL "Writing complete" - -#if LCD_W >= 480 - #define TR_BL_INVALID_FIRMWARE "Not a valid firmware file" -#elif LCD_W >= 212 - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN_MASS_STORE - #define TR_BL_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" - #define TR_BL_INVALID_FIRMWARE "\011Not a valid firmware file! " - #define TR_BL_INVALID_EEPROM "\011Not a valid EEPROM file! " -#else - #define TR_BL_OR_PLUGIN_USB_CABLE TR_BL_USB_PLUGIN - #define TR_BL_HOLD_ENTER_TO_START "\006Hold [ENT] to start" - #define TR_BL_INVALID_FIRMWARE "\004Not a valid firmware! " - #define TR_BL_INVALID_EEPROM "\004Not a valid EEPROM! " -#endif - -// Bootloader Taranis specific - ASCII characters only -#define TR_BL_RESTORE_EEPROM "Restore EEPROM" -#define TR_BL_POWER_KEY "Press the power button." -#define TR_BL_FLASH_EXIT "Exit the flashing mode." - -// Bootloader Horus specific - ASCII characters only -#define TR_BL_ERASE_INT_FLASH "Erase Internal Flash Storage" -#define TR_BL_ERASE_FLASH "Erase Flash Storage" -#define TR_BL_ERASE_FLASH_MSG "This may take up to 200s" -#define TR_BL_RF_USB_ACCESS "RF USB access" -#define TR_BL_CURRENT_FW "Current Firmware:" - -#if defined(PCBPL18) - // Bootloader PL18/NB4+ specific - Ascii only - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" - #if defined(RADIO_NV14_FAMILY) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_ERASE_KEY "Hold [R TRIM] long to erase" - #define TR_BL_EXIT_KEY "[L TRIM] to exit" - #elif defined(RADIO_NB4P) - #define TR_BL_SELECT_KEY "[SW1A] to select file" - #define TR_BL_FLASH_KEY "Hold [SW1A] long to flash" - #define TR_BL_ERASE_KEY "Hold [SW1A] long to erase" - #define TR_BL_EXIT_KEY "[SW1B] to exit" - #else - #define TR_BL_SELECT_KEY "[TR4 Dn] to select file" - #define TR_BL_FLASH_KEY "Hold [TR4 Dn] long to flash" - #define TR_BL_ERASE_KEY "Hold [TR4 Dn] long to erase" - #define TR_BL_EXIT_KEY "[TR4 Up] to exit" - #endif -#elif defined(PCBNV14) - #define TR_BL_SELECT_KEY "[R TRIM] to select file" - #define TR_BL_FLASH_KEY "Hold [R TRIM] long to flash" - #define TR_BL_EXIT_KEY " [L TRIM] to exit" - #define TR_BL_ENABLE "Enable" - #define TR_BL_DISABLE "Disable" -#else - #define TR_BL_SELECT_KEY "[ENT] to select file" - #define TR_BL_FLASH_KEY "Hold [ENT] long to flash" - #define TR_BL_ERASE_KEY "Hold [ENT] long to erase" - #define TR_BL_EXIT_KEY "[RTN] to exit" -#endif - // About screen #define TR_ABOUTUS TR(" ПРО... ", "ПРО...")