From 319dfd23e7dd1ecfedea113e49dfe30b5a814c67 Mon Sep 17 00:00:00 2001 From: ITCactus Date: Mon, 9 May 2022 17:45:53 +0200 Subject: [PATCH] [new watchface] watchface inspired by G7710, with day of year and week number info --- src/CMakeLists.txt | 3 + src/components/settings/Settings.h | 12 +- src/displayapp/fonts/7segment.woff | Bin 0 -> 2124 bytes src/displayapp/fonts/lv_font_7segment_115.c | 735 ++++++++++++++++++ src/displayapp/fonts/lv_font_7segment_40.c | 228 ++++++ src/displayapp/fonts/lv_font_dots_40.c | 410 ++++++++++ src/displayapp/fonts/repetitionscrolling.ttf | Bin 0 -> 42872 bytes src/displayapp/screens/CheckboxList.cpp | 115 +++ src/displayapp/screens/CheckboxList.h | 49 ++ src/displayapp/screens/Clock.cpp | 15 + src/displayapp/screens/Clock.h | 1 + .../screens/WatchFaceCasioStyleG7710.cpp | 297 +++++++ .../screens/WatchFaceCasioStyleG7710.h | 91 +++ .../screens/settings/SettingWatchFace.h | 13 +- src/libs/lv_conf.h | 3 + 15 files changed, 1967 insertions(+), 5 deletions(-) create mode 100644 src/displayapp/fonts/7segment.woff create mode 100644 src/displayapp/fonts/lv_font_7segment_115.c create mode 100644 src/displayapp/fonts/lv_font_7segment_40.c create mode 100644 src/displayapp/fonts/lv_font_dots_40.c create mode 100644 src/displayapp/fonts/repetitionscrolling.ttf create mode 100644 src/displayapp/screens/CheckboxList.cpp create mode 100644 src/displayapp/screens/CheckboxList.h create mode 100644 src/displayapp/screens/WatchFaceCasioStyleG7710.cpp create mode 100644 src/displayapp/screens/WatchFaceCasioStyleG7710.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3b7503fd..59119c49 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -396,6 +396,7 @@ list(APPEND SOURCE_FILES displayapp/screens/Motion.cpp displayapp/screens/FlashLight.cpp displayapp/screens/List.cpp + displayapp/screens/CheckboxList.cpp displayapp/screens/BatteryInfo.cpp displayapp/screens/Steps.cpp displayapp/screens/Timer.cpp @@ -426,6 +427,7 @@ list(APPEND SOURCE_FILES displayapp/screens/WatchFaceDigital.cpp displayapp/screens/WatchFaceTerminal.cpp displayapp/screens/WatchFacePineTimeStyle.cpp + displayapp/screens/WatchFaceCasioStyleG7710.cpp ## @@ -600,6 +602,7 @@ set(INCLUDE_FILES displayapp/screens/FirmwareUpdate.h displayapp/screens/FirmwareValidation.h displayapp/screens/ApplicationList.h + displayapp/screens/CheckboxList.h displayapp/Apps.h displayapp/screens/Notifications.h displayapp/screens/HeartRate.h diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 3b113ead..83987b77 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -102,6 +102,14 @@ namespace Pinetime { return appMenu; }; + void SetWatchfacesMenu(uint8_t menu) { + watchFacesMenu = menu; + }; + + uint8_t GetWatchfacesMenu() const { + return watchFacesMenu; + }; + void SetSettingsMenu(uint8_t menu) { settingsMenu = menu; }; @@ -212,7 +220,7 @@ namespace Pinetime { private: Pinetime::Controllers::FS& fs; - static constexpr uint32_t settingsVersion = 0x0003; + static constexpr uint32_t settingsVersion = 0x0004; struct SettingsData { uint32_t version = settingsVersion; uint32_t stepsGoal = 10000; @@ -236,6 +244,8 @@ namespace Pinetime { uint8_t appMenu = 0; uint8_t settingsMenu = 0; + uint8_t watchFacesMenu = 0; + /* ble state is intentionally not saved with the other watch settings and initialized * to off (false) on every boot because we always want ble to be enabled on startup */ diff --git a/src/displayapp/fonts/7segment.woff b/src/displayapp/fonts/7segment.woff new file mode 100644 index 0000000000000000000000000000000000000000..79ed924933bb24152a246eeaf303c60f6948ebdb GIT binary patch literal 2124 zcmZuwdpOkF8eYHojXSx=Ms9IrTyl#^J{z=S?YEgldV@;>r9hv;$9u!dB~*Y*W+AS*J43Ujel(8rd*n@`G$ zqA+32*h`Qbu7M1Q(Ud4U+!wA1_;7Sky^cS~h>1^tb>X2;T@oj51cr<_I?R>ng**fz zp5us^GW)1x8W{|)%Wcg5w(JpX19) zpWC`z#WL$1YZ>y)+v><<2fvo?n60ZDl3E|=z|8b>k~skd+vu`OX}0!XzJ})RbBNr z+dWr}=LW7!FMAMu*PN&=fr<3m#BuS8>7fXp1sxuD`{YPmKqF%l#pI!lPM)nQmui<|t0{k}9)}B1_{FhN z?NOurVR!YEYupuK1F>{SrDsIrp2D7>b5~;5Ri?>DH+=~o=bIcVzn*7nxBqk8;wCFN#cZ9xrRl zvA&1?*4JA+8!)4ImOtqH@?7bSg$vki=BowECl?2k1^!nh?xd;{cVqWq!?EF#^JeBEG+kfq=iiO47=I@g4d6_*wc{k|PK!Am& zFO7yMQf2&`!%>w;pyEh)aMR}Oa5<_CezOI%VgPvS`PHJ%+k+zYvEi8%v3OowyQC%? zIjZQ|bO7%|xU#<`{XoQlf6OG#ZQZ4&VKRCET4bs`3@)BZEh#+CFC}l)M5!T8X zr+(U?(H@@Aii=_ZVWMEncyN_@>o zPE#3>_0Q@|niF`Nn%TW7t&hI15i~e)Gxozat;|w_8KL5L&n|L*-YLHfefI~8lfQgP z4nF)mq7jx>~iK?zI07x#&7vjc3|)Q@ot>7(jPZIR<_;zzM#B;uCoZG z4&_b;N^9C*>%GsCvs-WWf z>UV|t6|FB8V(5W0RXg6z_gTMXJ$V+}`K&4;Y#C%k7zzLW=V5>)meJPG<^f>26Bz~n E0bwmy4*&oF literal 0 HcmV?d00001 diff --git a/src/displayapp/fonts/lv_font_7segment_115.c b/src/displayapp/fonts/lv_font_7segment_115.c new file mode 100644 index 00000000..1d509403 --- /dev/null +++ b/src/displayapp/fonts/lv_font_7segment_115.c @@ -0,0 +1,735 @@ +/******************************************************************************* + * Size: 115 px + * Bpp: 1 + * Opts: + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#ifndef LV_FONT_7SEGMENT_115 +#define LV_FONT_7SEGMENT_115 1 +#endif + +#if LV_FONT_7SEGMENT_115 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x0, + + /* U+0030 "0" */ + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0x88, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xcf, 0x0, 0x7, 0xff, 0xff, 0xff, 0xc7, + 0xc0, 0x11, 0xff, 0xff, 0xff, 0xe7, 0xe0, 0x1c, + 0x7f, 0xff, 0xff, 0xf3, 0xf8, 0x1f, 0x1f, 0xff, + 0xff, 0xf3, 0xfc, 0xf, 0xc7, 0xff, 0xff, 0xf9, + 0xff, 0x7, 0xf1, 0xff, 0xff, 0xf9, 0xff, 0x83, + 0xfc, 0x7f, 0xff, 0xfc, 0xff, 0xc3, 0xff, 0x0, + 0x0, 0x0, 0x7f, 0xe1, 0xff, 0xc0, 0x0, 0x0, + 0x7f, 0xf0, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xf8, + 0x7f, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x3f, 0xf8, + 0x0, 0x0, 0xf, 0xfe, 0x1f, 0xfc, 0x0, 0x0, + 0x7, 0xff, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, + 0x87, 0xff, 0x0, 0x0, 0x1, 0xff, 0x83, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xc1, 0xff, 0xc0, 0x0, + 0x0, 0xff, 0xe0, 0xff, 0xe0, 0x0, 0x0, 0x7f, + 0xf0, 0x7f, 0xe0, 0x0, 0x0, 0x3f, 0xf8, 0x3f, + 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x1f, 0xf8, 0x0, + 0x0, 0xf, 0xfe, 0xf, 0xfc, 0x0, 0x0, 0x7, + 0xff, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, 0x87, + 0xff, 0x0, 0x0, 0x1, 0xff, 0xc3, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xe1, 0xff, 0xc0, 0x0, 0x0, + 0x7f, 0xf0, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xf8, + 0x7f, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x3f, 0xf8, + 0x0, 0x0, 0xf, 0xfe, 0x1f, 0xfc, 0x0, 0x0, + 0x7, 0xff, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, + 0x7, 0xff, 0x0, 0x0, 0x1, 0xff, 0x83, 0xff, + 0x80, 0x0, 0x1, 0xff, 0xc1, 0xff, 0x80, 0x0, + 0x0, 0x7f, 0xe0, 0xff, 0x80, 0x0, 0x0, 0x1f, + 0xf0, 0x7f, 0x0, 0x0, 0x0, 0x3, 0xf8, 0x1f, + 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0x0, + 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x1, 0x80, 0x7c, 0x0, 0x0, 0x0, 0x1, 0xe0, + 0x7f, 0x0, 0x0, 0x0, 0x3, 0xfc, 0x3f, 0xe0, + 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf8, 0x0, 0x0, + 0x7, 0xfe, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, + 0x7, 0xff, 0x0, 0x0, 0x1, 0xff, 0x83, 0xff, + 0x80, 0x0, 0x1, 0xff, 0xc1, 0xff, 0xc0, 0x0, + 0x0, 0xff, 0xe0, 0xff, 0xc0, 0x0, 0x0, 0x7f, + 0xf0, 0x7f, 0xe0, 0x0, 0x0, 0x3f, 0xf8, 0x3f, + 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x3f, 0xf8, 0x0, + 0x0, 0xf, 0xfe, 0x1f, 0xfc, 0x0, 0x0, 0x7, + 0xff, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, 0x87, + 0xff, 0x0, 0x0, 0x1, 0xff, 0xc3, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xe1, 0xff, 0xc0, 0x0, 0x0, + 0x7f, 0xf0, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xf8, + 0x7f, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x3f, 0xf8, + 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfc, 0x0, 0x0, + 0x7, 0xfe, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, + 0x7, 0xff, 0x0, 0x0, 0x3, 0xff, 0x83, 0xff, + 0x80, 0x0, 0x1, 0xff, 0xc1, 0xff, 0x80, 0x0, + 0x0, 0xff, 0xe0, 0xff, 0xc0, 0x0, 0x0, 0x7f, + 0xf0, 0x7f, 0xe0, 0x0, 0x0, 0x3f, 0xf8, 0x3f, + 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x3f, 0xf8, 0x0, + 0x0, 0xf, 0xfe, 0x1f, 0xf8, 0x0, 0x0, 0x7, + 0xff, 0xf, 0xf8, 0xff, 0xff, 0xf9, 0xff, 0x87, + 0xf8, 0xff, 0xff, 0xfc, 0xff, 0xc3, 0xf8, 0xff, + 0xff, 0xfe, 0x7f, 0xc0, 0xf8, 0xff, 0xff, 0xff, + 0x9f, 0xe0, 0x70, 0xff, 0xff, 0xff, 0xcf, 0xe0, + 0x11, 0xff, 0xff, 0xff, 0xe7, 0xf0, 0x1, 0xff, + 0xff, 0xff, 0xf1, 0xf0, 0x1, 0xff, 0xff, 0xff, + 0xfc, 0xf0, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, + + /* U+0031 "1" */ + 0x0, 0x40, 0x1, 0xc0, 0x3, 0xe0, 0xf, 0xc0, + 0x1f, 0xc0, 0x3f, 0x80, 0xff, 0x81, 0xff, 0x7, + 0xfe, 0xf, 0xfc, 0x3f, 0xf8, 0x7f, 0xf0, 0xff, + 0xe1, 0xff, 0xc3, 0xff, 0x87, 0xff, 0xf, 0xfc, + 0x1f, 0xf8, 0x3f, 0xf0, 0xff, 0xe1, 0xff, 0xc3, + 0xff, 0x87, 0xff, 0xf, 0xfe, 0x1f, 0xfc, 0x3f, + 0xf8, 0x7f, 0xf0, 0xff, 0xe1, 0xff, 0xc3, 0xff, + 0x87, 0xff, 0xf, 0xfe, 0x1f, 0xf8, 0x3f, 0xf0, + 0xff, 0xe0, 0xff, 0xc0, 0xff, 0x80, 0xff, 0x0, + 0x7c, 0x0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x7c, 0x1, 0xfe, + 0x7, 0xfc, 0x3f, 0xf0, 0x7f, 0xe0, 0xff, 0xc3, + 0xff, 0x87, 0xff, 0xf, 0xfe, 0x1f, 0xfc, 0x3f, + 0xf8, 0x7f, 0xf0, 0xff, 0xe1, 0xff, 0xc3, 0xff, + 0x87, 0xff, 0xf, 0xfe, 0x1f, 0xfc, 0x3f, 0xf8, + 0x7f, 0xe0, 0xff, 0xc3, 0xff, 0x87, 0xff, 0xf, + 0xfe, 0x1f, 0xfc, 0x3f, 0xf8, 0x7f, 0xf0, 0xff, + 0xe1, 0xff, 0xc1, 0xff, 0x83, 0xff, 0x7, 0xfe, + 0x7, 0xf8, 0xf, 0xf0, 0x1f, 0xc0, 0x1f, 0x80, + 0x3e, 0x0, 0x78, 0x0, 0xc0, 0x0, + + /* U+0032 "2" */ + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0x88, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xcf, 0x0, 0x7, 0xff, 0xff, 0xff, 0xc7, + 0xc0, 0x1, 0xff, 0xff, 0xff, 0xe7, 0xe0, 0x0, + 0x7f, 0xff, 0xff, 0xf3, 0xf8, 0x0, 0x1f, 0xff, + 0xff, 0xf3, 0xfc, 0x0, 0x7, 0xff, 0xff, 0xf9, + 0xff, 0x0, 0x1, 0xff, 0xff, 0xf9, 0xff, 0x80, + 0x0, 0x7f, 0xff, 0xfc, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf0, 0x0, 0xf, 0xff, 0xff, 0xc7, 0xf8, 0x0, + 0xf, 0xff, 0xff, 0xf1, 0xf8, 0x0, 0x1f, 0xff, + 0xff, 0xfc, 0x38, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0x88, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x70, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x7e, 0x3f, 0xff, 0xff, 0xc0, 0x0, + 0x7f, 0x87, 0xff, 0xff, 0xc0, 0x0, 0x3f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x7, + 0xf8, 0xff, 0xff, 0xfc, 0x0, 0x3, 0xf8, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0xf8, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x70, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x11, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, + + /* U+0033 "3" */ + 0x0, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0x88, 0x1, 0xff, 0xff, 0xff, 0xfc, + 0xf0, 0x7, 0xff, 0xff, 0xff, 0xc7, 0xc0, 0x1f, + 0xff, 0xff, 0xfe, 0x7e, 0x0, 0x7f, 0xff, 0xff, + 0xf3, 0xf8, 0x1, 0xff, 0xff, 0xff, 0x3f, 0xc0, + 0x7, 0xff, 0xff, 0xf9, 0xff, 0x0, 0x1f, 0xff, + 0xff, 0x9f, 0xf8, 0x0, 0x7f, 0xff, 0xfc, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf8, 0x0, 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0xff, + 0xff, 0xfc, 0x7f, 0x80, 0xf, 0xff, 0xff, 0xf1, + 0xf8, 0x1, 0xff, 0xff, 0xff, 0xc3, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0x88, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x3f, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xe1, 0x80, 0x3, 0xff, 0xff, 0xfc, 0x3f, + 0x0, 0x7, 0xff, 0xff, 0xc3, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x0, 0xf, 0xff, 0xff, 0x9f, + 0xf8, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xc0, 0xf, + 0xff, 0xff, 0xe7, 0xfc, 0x0, 0xff, 0xff, 0xff, + 0x9f, 0xe0, 0xf, 0xff, 0xff, 0xfc, 0xfe, 0x1, + 0xff, 0xff, 0xff, 0xe7, 0xf0, 0x1f, 0xff, 0xff, + 0xff, 0x1f, 0x1, 0xff, 0xff, 0xff, 0xfc, 0xf0, + 0x7, 0xff, 0xff, 0xff, 0xe6, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0x18, + 0x0, 0x0, 0x0, 0x3, 0xf8, 0x70, 0x0, 0x0, + 0x0, 0xf, 0xe3, 0xe0, 0x0, 0x0, 0x0, 0x7f, + 0xcf, 0xc0, 0x0, 0x0, 0x1, 0xff, 0x3f, 0x80, + 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, 0x0, 0x0, + 0x3f, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0xff, 0xdf, + 0xfc, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xf0, 0x0, + 0x0, 0x1f, 0xfd, 0xff, 0xc0, 0x0, 0x0, 0x7f, + 0xf7, 0xff, 0x0, 0x0, 0x1, 0xff, 0xdf, 0xfc, + 0x0, 0x0, 0x7, 0xff, 0x7f, 0xf0, 0x0, 0x0, + 0x1f, 0xfd, 0xff, 0xc0, 0x0, 0x0, 0x7f, 0xe7, + 0xff, 0x0, 0x0, 0x1, 0xff, 0x9f, 0xfc, 0x0, + 0x0, 0xf, 0xfe, 0x7f, 0xf0, 0x0, 0x0, 0x3f, + 0xf9, 0xff, 0x80, 0x0, 0x0, 0xff, 0xe7, 0xfe, + 0x0, 0x0, 0x3, 0xff, 0x9f, 0xf8, 0x0, 0x0, + 0xf, 0xfe, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xfb, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xef, 0xfe, 0x0, + 0x0, 0x3, 0xff, 0xbf, 0xf8, 0x0, 0x0, 0xf, + 0xfe, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xfb, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xef, 0xfe, 0x0, 0x0, + 0x3, 0xff, 0xbf, 0xf8, 0x0, 0x0, 0xf, 0xfe, + 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xf3, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xcf, 0xfe, 0x0, 0x0, 0x7, + 0xff, 0x3f, 0xf8, 0x0, 0x0, 0x1f, 0xfc, 0xff, + 0x80, 0x0, 0x0, 0x1f, 0xf3, 0xfc, 0x7f, 0xff, + 0xfe, 0x3f, 0xcf, 0xc3, 0xff, 0xff, 0xfc, 0x7e, + 0xe, 0x3f, 0xff, 0xff, 0xf8, 0x70, 0x1, 0xff, + 0xff, 0xff, 0xf8, 0x80, 0x1f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x7f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xe1, 0x80, 0x1, 0xff, 0xff, 0xfe, 0x1f, + 0x80, 0x1, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x7f, 0xff, 0xff, 0xfc, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf0, 0x1, 0xc7, 0xff, 0xff, 0xff, + 0x0, 0x3e, 0x3f, 0xff, 0xff, 0xe0, 0x3, 0xf1, + 0xff, 0xff, 0xfe, 0x0, 0x3f, 0x8f, 0xff, 0xff, + 0xc0, 0x3, 0xfc, 0x7f, 0xff, 0xfc, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x1f, 0xff, 0xff, 0x80, 0xf, 0xc3, + 0xff, 0xff, 0xfc, 0x0, 0x38, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x80, 0x7, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xc0, 0x1, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xf, 0xff, 0xff, 0xfe, 0x18, 0x0, 0x7f, 0xff, + 0xff, 0x87, 0xe0, 0x1, 0xff, 0xff, 0xf0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, + 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1f, + 0xfc, 0x0, 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x1f, 0xfc, 0x0, 0x7f, 0xff, 0xfc, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xcf, 0xfc, 0x1, 0xff, 0xff, + 0xfc, 0xff, 0x80, 0x3f, 0xff, 0xff, 0xe7, 0xf8, + 0x7, 0xff, 0xff, 0xfe, 0x7f, 0x1, 0xff, 0xff, + 0xff, 0xe7, 0xf0, 0x3f, 0xff, 0xff, 0xfe, 0x3e, + 0x7, 0xff, 0xff, 0xff, 0xf3, 0xc0, 0x3f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xff, 0xf0, + 0x0, + + /* U+0036 "6" */ + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, + 0xff, 0xff, 0xfe, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x11, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x71, 0xff, + 0xff, 0xff, 0xc0, 0x1, 0xf1, 0xff, 0xff, 0xff, + 0x0, 0x3, 0xf1, 0xff, 0xff, 0xfe, 0x0, 0x7, + 0xf1, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xf1, 0xff, + 0xff, 0xf0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf8, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xc3, 0xff, + 0xff, 0xfc, 0x0, 0x7, 0x1f, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x3, 0xff, 0xff, 0xff, 0xe0, + 0x1, 0xc3, 0xff, 0xff, 0xff, 0x86, 0x7, 0xe3, + 0xff, 0xff, 0xfc, 0x3f, 0x1f, 0xe1, 0xff, 0xff, + 0xf0, 0xff, 0x3f, 0xe0, 0x0, 0x0, 0x7, 0xfc, + 0x7f, 0xf0, 0x0, 0x0, 0x1f, 0xf8, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xf1, 0xff, 0xc0, 0x0, 0x0, + 0x7f, 0xe3, 0xff, 0x80, 0x0, 0x1, 0xff, 0xc7, + 0xff, 0x0, 0x0, 0x3, 0xff, 0x8f, 0xfc, 0x0, + 0x0, 0x7, 0xff, 0x1f, 0xf8, 0x0, 0x0, 0xf, + 0xfe, 0x3f, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0xff, + 0xe0, 0x0, 0x0, 0x3f, 0xf9, 0xff, 0xc0, 0x0, + 0x0, 0x7f, 0xf3, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xe7, 0xff, 0x0, 0x0, 0x1, 0xff, 0xcf, 0xfe, + 0x0, 0x0, 0x3, 0xff, 0x9f, 0xfc, 0x0, 0x0, + 0x7, 0xff, 0x3f, 0xf8, 0x0, 0x0, 0xf, 0xfe, + 0x7f, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xf1, 0xff, 0xc0, 0x0, 0x0, + 0x7f, 0xe3, 0xff, 0x80, 0x0, 0x0, 0xff, 0xc7, + 0xff, 0x0, 0x0, 0x3, 0xff, 0x8f, 0xfe, 0x0, + 0x0, 0x7, 0xff, 0x1f, 0xf8, 0x0, 0x0, 0xf, + 0xfe, 0x3f, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x7f, + 0xe0, 0x0, 0x0, 0x3f, 0xf8, 0xff, 0xc0, 0x0, + 0x0, 0x7f, 0xf3, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xe7, 0xfe, 0x0, 0x0, 0x1, 0xff, 0xcf, 0xf8, + 0xff, 0xff, 0xf9, 0xff, 0x9f, 0xe3, 0xff, 0xff, + 0xf3, 0xff, 0x3f, 0x8f, 0xff, 0xff, 0xe7, 0xfc, + 0x3e, 0x3f, 0xff, 0xff, 0xe7, 0xf8, 0x70, 0xff, + 0xff, 0xff, 0xcf, 0xe0, 0x47, 0xff, 0xff, 0xff, + 0x9f, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0x1f, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0x3c, 0x0, 0x7f, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x3f, 0xff, 0xff, 0xfc, + 0x0, 0x0, + + /* U+0037 "7" */ + 0x1f, 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, + 0xfe, 0x20, 0xff, 0xff, 0xff, 0xfe, 0x78, 0x7f, + 0xff, 0xff, 0xfc, 0x7c, 0x3f, 0xff, 0xff, 0xfc, + 0xfe, 0x1f, 0xff, 0xff, 0xfc, 0xfe, 0xf, 0xff, + 0xff, 0xf9, 0xfe, 0x7, 0xff, 0xff, 0xf9, 0xff, + 0x3, 0xff, 0xff, 0xf3, 0xff, 0x1, 0xff, 0xff, + 0xf3, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0xf, + 0xfe, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xfe, + 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, + 0xf, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0xf, + 0xfe, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xfe, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, + 0xf, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, + 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x7, + 0xfc, 0x0, 0x0, 0x0, 0x3, 0xfc, 0x0, 0x0, + 0x0, 0x1, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xf8, + 0x0, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x0, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x0, + 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x3f, + 0xf8, 0x0, 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, + 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, + 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x3f, 0xf8, 0x0, + 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x3f, + 0xf8, 0x0, 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, + 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, + 0x3f, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7f, + 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xf0, + 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, + 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, 0x3f, + 0xf0, 0x0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, + 0x0, 0x1f, 0xe0, 0x0, 0x0, 0x0, 0x1f, 0xc0, + 0x0, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x0, 0x0, + 0xf, 0x80, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, + + /* U+0038 "8" */ + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0x88, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xcf, 0x0, 0x7, 0xff, 0xff, 0xff, 0xc7, + 0xc0, 0x11, 0xff, 0xff, 0xff, 0xe7, 0xe0, 0x1c, + 0x7f, 0xff, 0xff, 0xf3, 0xf8, 0x1f, 0x1f, 0xff, + 0xff, 0xf3, 0xfc, 0xf, 0xc7, 0xff, 0xff, 0xf9, + 0xff, 0x7, 0xf1, 0xff, 0xff, 0xf9, 0xff, 0x83, + 0xfc, 0x7f, 0xff, 0xfc, 0xff, 0xc3, 0xff, 0x0, + 0x0, 0x0, 0x7f, 0xe1, 0xff, 0xc0, 0x0, 0x0, + 0x7f, 0xf0, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xf8, + 0x7f, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x3f, 0xf8, + 0x0, 0x0, 0xf, 0xfe, 0x1f, 0xfc, 0x0, 0x0, + 0x7, 0xff, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, + 0x87, 0xff, 0x0, 0x0, 0x1, 0xff, 0x83, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xc1, 0xff, 0xc0, 0x0, + 0x0, 0x7f, 0xe0, 0xff, 0xe0, 0x0, 0x0, 0x7f, + 0xf0, 0x7f, 0xf0, 0x0, 0x0, 0x3f, 0xf8, 0x3f, + 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x1f, 0xf8, 0x0, + 0x0, 0xf, 0xfe, 0xf, 0xfc, 0x0, 0x0, 0x7, + 0xff, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, 0x87, + 0xff, 0x0, 0x0, 0x1, 0xff, 0xc3, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xe1, 0xff, 0xc0, 0x0, 0x0, + 0x7f, 0xf0, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xf8, + 0x7f, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x3f, 0xf8, + 0x0, 0x0, 0xf, 0xfe, 0x1f, 0xfc, 0x0, 0x0, + 0x7, 0xff, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, + 0x7, 0xff, 0x0, 0x0, 0x1, 0xff, 0x83, 0xff, + 0x80, 0x0, 0x1, 0xff, 0xc1, 0xff, 0xc0, 0x0, + 0x0, 0xff, 0xe0, 0xff, 0x80, 0x0, 0x0, 0x1f, + 0xf0, 0x7f, 0x8f, 0xff, 0xff, 0xc7, 0xf8, 0x3f, + 0xf, 0xff, 0xff, 0xf1, 0xf8, 0x7, 0x1f, 0xff, + 0xff, 0xfc, 0x38, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0x88, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x70, 0xff, 0xff, 0xff, + 0xe1, 0x80, 0x7e, 0x3f, 0xff, 0xff, 0xc3, 0xf0, + 0x7f, 0x87, 0xff, 0xff, 0xc3, 0xfc, 0x3f, 0xe0, + 0x0, 0x0, 0x7, 0xfc, 0x1f, 0xfc, 0x0, 0x0, + 0x7, 0xfe, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, + 0x7, 0xff, 0x0, 0x0, 0x1, 0xff, 0x83, 0xff, + 0x80, 0x0, 0x1, 0xff, 0xc1, 0xff, 0xc0, 0x0, + 0x0, 0xff, 0xe0, 0xff, 0xc0, 0x0, 0x0, 0x7f, + 0xf0, 0x7f, 0xe0, 0x0, 0x0, 0x3f, 0xf8, 0x3f, + 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x3f, 0xf8, 0x0, + 0x0, 0xf, 0xfe, 0x1f, 0xfc, 0x0, 0x0, 0x7, + 0xff, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, 0x87, + 0xff, 0x0, 0x0, 0x1, 0xff, 0xc3, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xe1, 0xff, 0xc0, 0x0, 0x0, + 0x7f, 0xf0, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xf8, + 0x7f, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x3f, 0xf8, + 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfc, 0x0, 0x0, + 0x7, 0xfe, 0xf, 0xfe, 0x0, 0x0, 0x3, 0xff, + 0x7, 0xff, 0x0, 0x0, 0x3, 0xff, 0x83, 0xff, + 0x80, 0x0, 0x1, 0xff, 0xc1, 0xff, 0x80, 0x0, + 0x0, 0xff, 0xe0, 0xff, 0xc0, 0x0, 0x0, 0x7f, + 0xf0, 0x7f, 0xe0, 0x0, 0x0, 0x3f, 0xf8, 0x3f, + 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x3f, 0xf8, 0x0, + 0x0, 0xf, 0xfe, 0x1f, 0xf8, 0x0, 0x0, 0x7, + 0xff, 0xf, 0xf8, 0xff, 0xff, 0xf9, 0xff, 0x87, + 0xf8, 0xff, 0xff, 0xfc, 0xff, 0xc3, 0xf8, 0xff, + 0xff, 0xfe, 0x7f, 0xc0, 0xf8, 0xff, 0xff, 0xff, + 0x9f, 0xe0, 0x70, 0xff, 0xff, 0xff, 0xcf, 0xe0, + 0x11, 0xff, 0xff, 0xff, 0xe7, 0xf0, 0x1, 0xff, + 0xff, 0xff, 0xf1, 0xf0, 0x1, 0xff, 0xff, 0xff, + 0xfc, 0xf0, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x7f, 0xff, 0xff, 0xfc, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0x9e, 0x0, 0x7f, 0xff, 0xff, 0xfc, 0x7c, 0x8, + 0xff, 0xff, 0xff, 0xf3, 0xf0, 0x71, 0xff, 0xff, + 0xff, 0xcf, 0xe3, 0xe3, 0xff, 0xff, 0xfe, 0x7f, + 0x8f, 0xc7, 0xff, 0xff, 0xf9, 0xff, 0x3f, 0x8f, + 0xff, 0xff, 0xcf, 0xfc, 0xff, 0x1f, 0xff, 0xff, + 0x3f, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0xff, 0xdf, + 0xfc, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xf0, 0x0, + 0x0, 0x1f, 0xfd, 0xff, 0xc0, 0x0, 0x0, 0x7f, + 0xf7, 0xff, 0x0, 0x0, 0x1, 0xff, 0xdf, 0xfc, + 0x0, 0x0, 0x7, 0xff, 0x7f, 0xf0, 0x0, 0x0, + 0x1f, 0xfd, 0xff, 0xc0, 0x0, 0x0, 0x7f, 0xe7, + 0xff, 0x0, 0x0, 0x1, 0xff, 0x9f, 0xfc, 0x0, + 0x0, 0x7, 0xfe, 0x7f, 0xf0, 0x0, 0x0, 0x3f, + 0xf9, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xe7, 0xfe, + 0x0, 0x0, 0x3, 0xff, 0x9f, 0xf8, 0x0, 0x0, + 0xf, 0xfe, 0x7f, 0xe0, 0x0, 0x0, 0x3f, 0xfb, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xef, 0xfe, 0x0, + 0x0, 0x3, 0xff, 0xbf, 0xf8, 0x0, 0x0, 0xf, + 0xfe, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xfb, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xef, 0xfe, 0x0, 0x0, + 0x3, 0xff, 0xbf, 0xf8, 0x0, 0x0, 0xf, 0xfe, + 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xfb, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xcf, 0xfe, 0x0, 0x0, 0x3, + 0xff, 0x3f, 0xf8, 0x0, 0x0, 0x1f, 0xfc, 0xff, + 0xe0, 0x0, 0x0, 0x7f, 0xf3, 0xfe, 0x0, 0x0, + 0x0, 0x7f, 0xcf, 0xf1, 0xff, 0xff, 0xf8, 0xff, + 0x3f, 0xf, 0xff, 0xff, 0xf1, 0xf8, 0x38, 0xff, + 0xff, 0xff, 0xe1, 0xc0, 0x7, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x86, + 0x0, 0x7, 0xff, 0xff, 0xf8, 0x7e, 0x0, 0x7, + 0xff, 0xff, 0xc3, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x7f, 0xff, + 0xfc, 0xff, 0xc0, 0x3, 0xff, 0xff, 0xf3, 0xff, + 0x0, 0x1f, 0xff, 0xff, 0xcf, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0x9f, 0xe0, 0x7, 0xff, 0xff, 0xfe, + 0x7f, 0x0, 0x7f, 0xff, 0xff, 0xf9, 0xfc, 0x3, + 0xff, 0xff, 0xff, 0xe3, 0xe0, 0x1f, 0xff, 0xff, + 0xff, 0xcf, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x3f, 0xff, 0xff, 0xfc, 0x0, 0x0, + + /* U+003A ":" */ + 0x3f, 0xf9, 0xff, 0xcf, 0xfe, 0x7f, 0xf3, 0xff, + 0x9f, 0xfc, 0xff, 0xe7, 0xff, 0x3f, 0xf9, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x9f, + 0xfc, 0xff, 0xe7, 0xff, 0x3f, 0xf9, 0xff, 0xcf, + 0xfe, 0x7f, 0xf3, 0xff, 0x9f, 0xfc +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +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 = 863, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1, .adv_w = 863, .box_w = 49, .box_h = 86, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 528, .adv_w = 863, .box_w = 15, .box_h = 84, .ofs_x = 39, .ofs_y = 1}, + {.bitmap_index = 686, .adv_w = 863, .box_w = 49, .box_h = 86, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 1213, .adv_w = 863, .box_w = 45, .box_h = 86, .ofs_x = 9, .ofs_y = 0}, + {.bitmap_index = 1697, .adv_w = 863, .box_w = 46, .box_h = 84, .ofs_x = 8, .ofs_y = 1}, + {.bitmap_index = 2180, .adv_w = 863, .box_w = 44, .box_h = 86, .ofs_x = 8, .ofs_y = 0}, + {.bitmap_index = 2653, .adv_w = 863, .box_w = 47, .box_h = 86, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 3159, .adv_w = 863, .box_w = 40, .box_h = 84, .ofs_x = 14, .ofs_y = 2}, + {.bitmap_index = 3579, .adv_w = 863, .box_w = 49, .box_h = 86, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 4106, .adv_w = 863, .box_w = 46, .box_h = 86, .ofs_x = 8, .ofs_y = 0}, + {.bitmap_index = 4601, .adv_w = 323, .box_w = 13, .box_h = 48, .ofs_x = 6, .ofs_y = 19} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + + + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 32, .range_length = 1, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 48, .range_length = 11, .glyph_id_start = 2, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + + + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 2, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_7segment_115 = { +#else +lv_font_t lv_font_7segment_115 = { +#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 = 86, /*The maximum line height required by the font*/ + .base_line = 0, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -7, + .underline_thickness = 4, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_7SEGMENT_115*/ + diff --git a/src/displayapp/fonts/lv_font_7segment_40.c b/src/displayapp/fonts/lv_font_7segment_40.c new file mode 100644 index 00000000..ebcb1424 --- /dev/null +++ b/src/displayapp/fonts/lv_font_7segment_40.c @@ -0,0 +1,228 @@ +/******************************************************************************* + * Size: 40 px + * Bpp: 1 + * Opts: + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#ifndef LV_FONT_7SEGMENT_40 +#define LV_FONT_7SEGMENT_40 1 +#endif + +#if LV_FONT_7SEGMENT_40 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x0, + + /* U+002D "-" */ + 0x3f, 0xc7, 0xff, 0x7f, 0xf3, 0xfc, + + /* U+0030 "0" */ + 0x1f, 0xfc, 0x1f, 0xfb, 0x6f, 0xff, 0x77, 0xf7, + 0x78, 0xf, 0x78, 0xf, 0x78, 0xf, 0x78, 0xf, + 0x78, 0xf, 0x78, 0xf, 0x78, 0xf, 0x78, 0xf, + 0x78, 0xf, 0x70, 0x7, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x7, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, + 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, + 0xf0, 0xf, 0xf0, 0xf, 0xef, 0xef, 0xdf, 0xef, + 0xbf, 0xfe, 0x3f, 0xf8, + + /* U+0031 "1" */ + 0x11, 0xce, 0xf7, 0xbd, 0xef, 0x7b, 0xde, 0xf7, + 0x9c, 0x0, 0x77, 0xbd, 0xef, 0x7b, 0xde, 0xf7, + 0xbc, 0xe6, 0x20, + + /* U+0032 "2" */ + 0x1f, 0xf8, 0x1f, 0xfa, 0xf, 0xf7, 0x7, 0xf7, + 0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf, + 0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf, + 0x0, 0xf, 0xf, 0xf7, 0x1f, 0xf8, 0x1f, 0xf8, + 0xef, 0xf0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, + 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, + 0xf0, 0x0, 0xf0, 0x0, 0xef, 0xe0, 0xdf, 0xe0, + 0x3f, 0xe0, 0x7f, 0xe0, + + /* U+0033 "3" */ + 0x1f, 0xf8, 0x3f, 0xfe, 0x1f, 0xf7, 0xf, 0xf7, + 0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf, + 0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf, + 0x0, 0xf, 0x1f, 0xf7, 0x3f, 0xf8, 0x3f, 0xf8, + 0x1f, 0xe6, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x0, 0x1e, 0x1f, 0xde, 0x3f, 0xee, + 0x7f, 0xec, 0x7f, 0xe8, + + /* U+0034 "4" */ + 0x0, 0x2, 0x40, 0x7, 0xe0, 0x7, 0xe0, 0xf, + 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, + 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, + 0xf0, 0xf, 0xcf, 0xf7, 0x3f, 0xf8, 0x3f, 0xf8, + 0x1f, 0xe6, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0xc, 0x0, 0x8, + + /* U+0035 "5" */ + 0x1f, 0xf8, 0x7f, 0xf3, 0x7f, 0xc7, 0x7f, 0x8f, + 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x78, 0x0, 0xf0, + 0x1, 0xe0, 0x3, 0xc0, 0x7, 0x80, 0xf, 0x0, + 0x19, 0xfe, 0xf, 0xfe, 0x1f, 0xfc, 0x1f, 0xe6, + 0x0, 0x3c, 0x0, 0x78, 0x0, 0xf0, 0x1, 0xe0, + 0x3, 0xc0, 0x7, 0x80, 0xf, 0x0, 0x1e, 0x0, + 0x3c, 0x7f, 0x79, 0xff, 0x77, 0xfe, 0xcf, 0xfd, + 0x0, + + /* U+0036 "6" */ + 0x1f, 0xfc, 0x1f, 0xfc, 0x6f, 0xf8, 0x77, 0xf8, + 0x78, 0x0, 0x78, 0x0, 0x78, 0x0, 0x78, 0x0, + 0x78, 0x0, 0x78, 0x0, 0x78, 0x0, 0x78, 0x0, + 0x78, 0x0, 0x67, 0xf8, 0x1f, 0xfc, 0x1f, 0xfc, + 0xef, 0xf3, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, + 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, + 0xf0, 0xf, 0xf0, 0xf, 0xef, 0xef, 0xdf, 0xf7, + 0xbf, 0xf6, 0x3f, 0xf4, + + /* U+0037 "7" */ + 0x7f, 0xe3, 0xff, 0xa7, 0xfd, 0xcf, 0xf7, 0x0, + 0x3c, 0x0, 0xf0, 0x3, 0xc0, 0xf, 0x0, 0x3c, + 0x0, 0xf0, 0x3, 0xc0, 0xf, 0x0, 0x3c, 0x0, + 0x70, 0x0, 0x80, 0x0, 0x0, 0x18, 0x0, 0xe0, + 0x7, 0x80, 0x1e, 0x0, 0x78, 0x1, 0xe0, 0x7, + 0x80, 0x1e, 0x0, 0x78, 0x1, 0xe0, 0x7, 0x80, + 0x1e, 0x0, 0x38, 0x0, 0xc0, + + /* U+0038 "8" */ + 0x1f, 0xfc, 0x1f, 0xfb, 0x6f, 0xff, 0x77, 0xf7, + 0x78, 0xf, 0x78, 0xf, 0x78, 0xf, 0x78, 0xf, + 0x78, 0xf, 0x78, 0xf, 0x78, 0xf, 0x78, 0xf, + 0x78, 0xf, 0x67, 0xff, 0x1f, 0xfc, 0x1f, 0xfc, + 0xef, 0xf7, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, + 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, + 0xf0, 0xf, 0xf0, 0xf, 0xef, 0xef, 0xdf, 0xef, + 0xbf, 0xfe, 0x3f, 0xf8, + + /* U+0039 "9" */ + 0x1f, 0xf8, 0x3f, 0xfe, 0xdf, 0xf7, 0xef, 0xf7, + 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, + 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, + 0xf0, 0xf, 0xcf, 0xf7, 0x3f, 0xf8, 0x3f, 0xf8, + 0x1f, 0xe6, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x0, 0x1e, 0x1f, 0xde, 0x3f, 0xee, + 0x7f, 0xec, 0x7f, 0xe8, + + /* U+003A ":" */ + 0x7b, 0xde, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0xde, 0xf0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +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 = 300, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1, .adv_w = 300, .box_w = 12, .box_h = 4, .ofs_x = 4, .ofs_y = 13}, + {.bitmap_index = 7, .adv_w = 300, .box_w = 16, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 67, .adv_w = 300, .box_w = 5, .box_h = 30, .ofs_x = 14, .ofs_y = 0}, + {.bitmap_index = 86, .adv_w = 300, .box_w = 16, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 146, .adv_w = 300, .box_w = 16, .box_h = 30, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 206, .adv_w = 300, .box_w = 16, .box_h = 30, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 266, .adv_w = 300, .box_w = 15, .box_h = 30, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 323, .adv_w = 300, .box_w = 16, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 383, .adv_w = 300, .box_w = 14, .box_h = 30, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 436, .adv_w = 300, .box_w = 16, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 496, .adv_w = 300, .box_w = 16, .box_h = 30, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 556, .adv_w = 113, .box_w = 5, .box_h = 17, .ofs_x = 2, .ofs_y = 7} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_0[] = { + 0x0, 0xd +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 32, .range_length = 14, .glyph_id_start = 1, + .unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 2, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 48, .range_length = 11, .glyph_id_start = 3, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + + + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 2, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_7segment_40 = { +#else +lv_font_t lv_font_7segment_40 = { +#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 = 30, /*The maximum line height required by the font*/ + .base_line = 0, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_7SEGMENT_40*/ + diff --git a/src/displayapp/fonts/lv_font_dots_40.c b/src/displayapp/fonts/lv_font_dots_40.c new file mode 100644 index 00000000..921ff085 --- /dev/null +++ b/src/displayapp/fonts/lv_font_dots_40.c @@ -0,0 +1,410 @@ +/******************************************************************************* + * Size: 40 px + * Bpp: 1 + * Opts: + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#ifndef LV_FONT_DOTS_40 +#define LV_FONT_DOTS_40 1 +#endif + +#if LV_FONT_DOTS_40 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x0, + + /* U+002D "-" */ + 0xee, 0xfd, 0xdf, 0xbb, 0x80, + + /* U+0030 "0" */ + 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, 0x0, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, + 0x80, 0x3, 0x80, 0x0, 0xe, 0x0, 0xf, 0xc0, + 0x1, 0xf8, 0x0, 0x38, 0x0, 0x0, 0xe0, 0x0, + 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, + 0x0, + + /* U+0031 "1" */ + 0xe, 0x1, 0xc0, 0x38, 0x0, 0xe, 0xe1, 0xdc, + 0x3b, 0x80, 0x0, 0xe, 0x1, 0xc0, 0x38, 0x0, + 0x0, 0xe0, 0x1c, 0x3, 0x80, 0x0, 0xe, 0x1, + 0xc0, 0x38, 0x0, 0x0, 0xe0, 0x1c, 0x3, 0x80, + 0x0, 0xee, 0xfd, 0xdf, 0xbb, 0x80, + + /* U+0032 "2" */ + 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, 0x0, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x1c, + 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x1c, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, 0x0, + 0x0, 0xee, 0xee, 0xfd, 0xdd, 0xdf, 0xbb, 0xbb, + 0x80, + + /* U+0033 "3" */ + 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, 0x0, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x1c, + 0x0, 0x3, 0x80, 0x0, 0x0, 0xee, 0xe0, 0x1d, + 0xdc, 0x3, 0xbb, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, + 0x0, + + /* U+0034 "4" */ + 0x0, 0xe, 0x0, 0x1, 0xc0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0xe, 0xe0, 0x1, 0xdc, 0x0, 0x3b, + 0x80, 0x0, 0x0, 0xe, 0xe, 0x1, 0xc1, 0xc0, + 0x38, 0x38, 0x0, 0x0, 0xe, 0x0, 0xe1, 0xc0, + 0x1c, 0x38, 0x3, 0x80, 0x0, 0x0, 0xee, 0xee, + 0xfd, 0xdd, 0xdf, 0xbb, 0xbb, 0x80, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x1, 0xc0, 0x0, 0x38, + 0x0, + + /* U+0035 "5" */ + 0xee, 0xee, 0xfd, 0xdd, 0xdf, 0xbb, 0xbb, 0x80, + 0x0, 0xe, 0x0, 0x1, 0xc0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0xee, 0xee, 0x1d, 0xdd, 0xc3, + 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x1, 0xc0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, + 0x0, + + /* U+0036 "6" */ + 0x0, 0xee, 0x0, 0x1d, 0xc0, 0x3, 0xb8, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, + 0x80, 0x0, 0x0, 0x0, 0xe, 0xee, 0xe1, 0xdd, + 0xdc, 0x3b, 0xbb, 0x80, 0x0, 0x0, 0xe0, 0x0, + 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, + 0x0, + + /* U+0037 "7" */ + 0xee, 0xee, 0xfd, 0xdd, 0xdf, 0xbb, 0xbb, 0x80, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x1, 0xc0, 0x0, + 0x38, 0x0, 0x0, 0x0, 0xe, 0x0, 0x1, 0xc0, + 0x0, 0x38, 0x0, 0x0, 0x0, 0xe, 0x0, 0x1, + 0xc0, 0x0, 0x38, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x1, 0xc0, 0x0, 0x38, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x1, 0xc0, 0x0, 0x38, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, + 0x0, + + /* U+0038 "8" */ + 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, 0x0, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, + 0x80, 0x3, 0x80, 0x0, 0x0, 0xee, 0xe0, 0x1d, + 0xdc, 0x3, 0xbb, 0x80, 0x0, 0x0, 0xe0, 0x0, + 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, + 0x0, + + /* U+0039 "9" */ + 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, 0x0, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, + 0x80, 0x3, 0x80, 0x0, 0x0, 0xee, 0xee, 0x1d, + 0xdd, 0xc3, 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, + 0x0, 0xe, 0xe0, 0x1, 0xdc, 0x0, 0x3b, 0x80, + 0x0, + + /* U+0041 "A" */ + 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, 0x0, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, + 0x80, 0x3, 0x80, 0x0, 0xe, 0xee, 0xef, 0xdd, + 0xdd, 0xfb, 0xbb, 0xb8, 0x0, 0x0, 0xe0, 0x0, + 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, + 0x80, + + /* U+0044 "D" */ + 0xee, 0xee, 0x1d, 0xdd, 0xc3, 0xbb, 0xb8, 0x0, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, + 0x80, 0x3, 0x80, 0x0, 0xe, 0x0, 0xf, 0xc0, + 0x1, 0xf8, 0x0, 0x38, 0x0, 0x0, 0xe0, 0x0, + 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xee, 0xee, 0x1d, 0xdd, 0xc3, 0xbb, 0xb8, + 0x0, + + /* U+0045 "E" */ + 0xee, 0xee, 0xfd, 0xdd, 0xdf, 0xbb, 0xbb, 0x80, + 0x0, 0xe, 0x0, 0x1, 0xc0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, + 0x80, 0x0, 0x0, 0x0, 0xe, 0xee, 0xef, 0xdd, + 0xdd, 0xfb, 0xbb, 0xb8, 0x0, 0x0, 0xe0, 0x0, + 0x1c, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x1, 0xc0, 0x0, 0x38, 0x0, 0x0, 0x0, + 0x0, 0xee, 0xee, 0xfd, 0xdd, 0xdf, 0xbb, 0xbb, + 0x80, + + /* U+0046 "F" */ + 0xee, 0xee, 0xfd, 0xdd, 0xdf, 0xbb, 0xbb, 0x80, + 0x0, 0xe, 0x0, 0x1, 0xc0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, + 0x80, 0x0, 0x0, 0x0, 0xe, 0xee, 0xef, 0xdd, + 0xdd, 0xfb, 0xbb, 0xb8, 0x0, 0x0, 0xe0, 0x0, + 0x1c, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x1, 0xc0, 0x0, 0x38, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, + 0x0, + + /* U+0048 "H" */ + 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, + 0x80, 0x3, 0x80, 0x0, 0xe, 0xee, 0xef, 0xdd, + 0xdd, 0xfb, 0xbb, 0xb8, 0x0, 0x0, 0xe0, 0x0, + 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, + 0x80, + + /* U+0049 "I" */ + 0xee, 0xfd, 0xdf, 0xbb, 0x80, 0x0, 0xe0, 0x1c, + 0x3, 0x80, 0x0, 0xe, 0x1, 0xc0, 0x38, 0x0, + 0x0, 0xe0, 0x1c, 0x3, 0x80, 0x0, 0xe, 0x1, + 0xc0, 0x38, 0x0, 0x0, 0xe0, 0x1c, 0x3, 0x80, + 0x0, 0xee, 0xfd, 0xdf, 0xbb, 0x80, + + /* U+004B "K" */ + 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, + 0x0, 0xe, 0x0, 0xe1, 0xc0, 0x1c, 0x38, 0x3, + 0x80, 0x0, 0x0, 0xe0, 0xe0, 0x1c, 0x1c, 0x3, + 0x83, 0x80, 0x0, 0x0, 0xe, 0xe0, 0x1, 0xdc, + 0x0, 0x3b, 0x80, 0x0, 0x0, 0x0, 0xe0, 0xe0, + 0x1c, 0x1c, 0x3, 0x83, 0x80, 0x0, 0x0, 0xe, + 0x0, 0xe1, 0xc0, 0x1c, 0x38, 0x3, 0x80, 0x0, + 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, + 0x80, + + /* U+004D "M" */ + 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, + 0x0, 0xe, 0xe0, 0xef, 0xdc, 0x1d, 0xfb, 0x83, + 0xb8, 0x0, 0x0, 0xe0, 0xe0, 0xfc, 0x1c, 0x1f, + 0x83, 0x83, 0x80, 0x0, 0xe, 0xe, 0xf, 0xc1, + 0xc1, 0xf8, 0x38, 0x38, 0x0, 0x0, 0xe0, 0x0, + 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, + 0x80, + + /* U+004E "N" */ + 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, + 0x0, 0xe, 0xe0, 0xf, 0xdc, 0x1, 0xfb, 0x80, + 0x38, 0x0, 0x0, 0xe0, 0xe0, 0xfc, 0x1c, 0x1f, + 0x83, 0x83, 0x80, 0x0, 0xe, 0x0, 0xef, 0xc0, + 0x1d, 0xf8, 0x3, 0xb8, 0x0, 0x0, 0xe0, 0x0, + 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, + 0x80, + + /* U+004F "O" */ + 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, 0x0, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, + 0x80, 0x3, 0x80, 0x0, 0xe, 0x0, 0xf, 0xc0, + 0x1, 0xf8, 0x0, 0x38, 0x0, 0x0, 0xe0, 0x0, + 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, + 0x0, + + /* U+0052 "R" */ + 0xee, 0xee, 0x1d, 0xdd, 0xc3, 0xbb, 0xb8, 0x0, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, + 0x80, 0x3, 0x80, 0x0, 0xe, 0xee, 0xe1, 0xdd, + 0xdc, 0x3b, 0xbb, 0x80, 0x0, 0x0, 0xe0, 0x0, + 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, + 0x80, + + /* U+0053 "S" */ + 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, 0x0, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xee, 0xe0, 0x1d, + 0xdc, 0x3, 0xbb, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, + 0x0, + + /* U+0054 "T" */ + 0xee, 0xee, 0xfd, 0xdd, 0xdf, 0xbb, 0xbb, 0x80, + 0x0, 0x0, 0xe, 0x0, 0x1, 0xc0, 0x0, 0x38, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x1c, 0x0, + 0x3, 0x80, 0x0, 0x0, 0x0, 0xe, 0x0, 0x1, + 0xc0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x1, 0xc0, 0x0, 0x38, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, + 0x0, + + /* U+0055 "U" */ + 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, + 0x80, 0x3, 0x80, 0x0, 0xe, 0x0, 0xf, 0xc0, + 0x1, 0xf8, 0x0, 0x38, 0x0, 0x0, 0xe0, 0x0, + 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, 0x0, 0xe, + 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, 0x38, 0x0, + 0x0, 0xe, 0xee, 0x1, 0xdd, 0xc0, 0x3b, 0xb8, + 0x0, + + /* U+0057 "W" */ + 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, 0x80, + 0x0, 0xe, 0x0, 0xf, 0xc0, 0x1, 0xf8, 0x0, + 0x38, 0x0, 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, + 0x80, 0x3, 0x80, 0x0, 0xe, 0xe, 0xf, 0xc1, + 0xc1, 0xf8, 0x38, 0x38, 0x0, 0x0, 0xe0, 0xe0, + 0xfc, 0x1c, 0x1f, 0x83, 0x83, 0x80, 0x0, 0xe, + 0xe0, 0xef, 0xdc, 0x1d, 0xfb, 0x83, 0xb8, 0x0, + 0x0, 0xe0, 0x0, 0xfc, 0x0, 0x1f, 0x80, 0x3, + 0x80 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +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 = 353, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1, .adv_w = 353, .box_w = 11, .box_h = 3, .ofs_x = 5, .ofs_y = 8}, + {.bitmap_index = 6, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 71, .adv_w = 353, .box_w = 11, .box_h = 27, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 109, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 174, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 239, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 304, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 369, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 434, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 499, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 564, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 629, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 694, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 759, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 824, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 889, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 954, .adv_w = 353, .box_w = 11, .box_h = 27, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 992, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1057, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1122, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1187, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1252, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1317, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1382, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1447, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1512, .adv_w = 353, .box_w = 19, .box_h = 27, .ofs_x = 1, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_0[] = { + 0x0, 0xd, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x21, 0x24, 0x25, 0x26, + 0x28, 0x29, 0x2b, 0x2d, 0x2e, 0x2f, 0x32, 0x33, + 0x34, 0x35, 0x37 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 32, .range_length = 56, .glyph_id_start = 1, + .unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 27, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + + + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_dots_40 = { +#else +lv_font_t lv_font_dots_40 = { +#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 = 0, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -5, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_DOTS_40*/ + diff --git a/src/displayapp/fonts/repetitionscrolling.ttf b/src/displayapp/fonts/repetitionscrolling.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dc124164424fc1696f36e4af8319607c1a5150ea GIT binary patch literal 42872 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 WD}ALN7ts4wM(-PY7QTgZ$^QX@HiAR| literal 0 HcmV?d00001 diff --git a/src/displayapp/screens/CheckboxList.cpp b/src/displayapp/screens/CheckboxList.cpp new file mode 100644 index 00000000..7667946a --- /dev/null +++ b/src/displayapp/screens/CheckboxList.cpp @@ -0,0 +1,115 @@ +#include "displayapp/screens/CheckboxList.h" +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Styles.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + static void event_handler(lv_obj_t* obj, lv_event_t event) { + CheckboxList* screen = static_cast(obj->user_data); + screen->UpdateSelected(obj, event); + } + +} + +CheckboxList::CheckboxList(const uint8_t screenID, + const uint8_t numScreens, + DisplayApp* app, + Controllers::Settings& settingsController, + const char* optionsTitle, + const char* optionsSymbol, + void (Controllers::Settings::*SetOptionIndex)(uint8_t), + uint8_t (Controllers::Settings::*GetOptionIndex )() const, + std::array options) + : Screen(app), screenID {screenID}, settingsController {settingsController}, + SetOptionIndex {SetOptionIndex}, GetOptionIndex {GetOptionIndex}, + options {options} { + + settingsController.SetWatchfacesMenu(screenID); + + // Set the background to Black + lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + + if (numScreens > 1) { + pageIndicatorBasePoints[0].x = LV_HOR_RES - 1; + pageIndicatorBasePoints[0].y = 0; + pageIndicatorBasePoints[1].x = LV_HOR_RES - 1; + pageIndicatorBasePoints[1].y = LV_VER_RES; + + pageIndicatorBase = lv_line_create(lv_scr_act(), NULL); + lv_obj_set_style_local_line_width(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 3); + lv_obj_set_style_local_line_color(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); + lv_line_set_points(pageIndicatorBase, pageIndicatorBasePoints, 2); + + const uint16_t indicatorSize = LV_VER_RES / numScreens; + const uint16_t indicatorPos = indicatorSize * screenID; + + pageIndicatorPoints[0].x = LV_HOR_RES - 1; + pageIndicatorPoints[0].y = indicatorPos; + pageIndicatorPoints[1].x = LV_HOR_RES - 1; + pageIndicatorPoints[1].y = indicatorPos + indicatorSize; + + pageIndicator = lv_line_create(lv_scr_act(), NULL); + lv_obj_set_style_local_line_width(pageIndicator, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 3); + lv_obj_set_style_local_line_color(pageIndicator, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); + lv_line_set_points(pageIndicator, pageIndicatorPoints, 2); + } + + lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr); + + lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); + lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10); + lv_obj_set_style_local_pad_inner(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5); + lv_obj_set_style_local_border_width(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 0); + + lv_obj_set_pos(container1, 10, 60); + lv_obj_set_width(container1, LV_HOR_RES - 20); + lv_obj_set_height(container1, LV_VER_RES - 50); + lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT); + + lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(title, optionsTitle); + lv_label_set_align(title, LV_LABEL_ALIGN_CENTER); + lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 10, 15); + + lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); + lv_label_set_text_static(icon, optionsSymbol); + lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); + lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0); + + for (unsigned int i = 0; i < options.size(); i++) { + if (strcmp(options[i], "")) { + cbOption[i] = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text(cbOption[i], options[i]); + cbOption[i]->user_data = this; + lv_obj_set_event_cb(cbOption[i], event_handler); + SetRadioButtonStyle(cbOption[i]); + + if (static_cast((settingsController.*GetOptionIndex)() - MAXLISTITEMS*screenID) == i) { + lv_checkbox_set_checked(cbOption[i], true); + } + } + } +} + +CheckboxList::~CheckboxList() { + lv_obj_clean(lv_scr_act()); + settingsController.SaveSettings(); +} + +void CheckboxList::UpdateSelected(lv_obj_t* object, lv_event_t event) { + if (event == LV_EVENT_VALUE_CHANGED) { + for (unsigned int i = 0; i < options.size(); i++) { + if (strcmp(options[i], "")) { + if (object == cbOption[i]) { + lv_checkbox_set_checked(cbOption[i], true); + (settingsController.*SetOptionIndex)(MAXLISTITEMS*screenID + i); + } else { + lv_checkbox_set_checked(cbOption[i], false); + } + } + } + } +} \ No newline at end of file diff --git a/src/displayapp/screens/CheckboxList.h b/src/displayapp/screens/CheckboxList.h new file mode 100644 index 00000000..e90dcd30 --- /dev/null +++ b/src/displayapp/screens/CheckboxList.h @@ -0,0 +1,49 @@ +#pragma once + +#include +#include +#include +#include "displayapp/screens/Screen.h" +#include "displayapp/Apps.h" +#include "components/settings/Settings.h" + +#define MAXLISTITEMS 4 + +namespace Pinetime { + namespace Applications { + namespace Screens { + class CheckboxList : public Screen { + public: + CheckboxList(const uint8_t screenID, + const uint8_t numScreens, + DisplayApp* app, + Controllers::Settings& settingsController, + const char* optionsTitle, + const char* optionsSymbol, + void (Controllers::Settings::*SetOptionIndex)(uint8_t), + uint8_t (Controllers::Settings::*GetOptionIndex)() const, + std::array options); + + ~CheckboxList() override; + + void UpdateSelected(lv_obj_t* object, lv_event_t event); + + private: + const uint8_t screenID; + Controllers::Settings& settingsController; + const char* optionsTitle; + const char* optionsSymbol; + void (Controllers::Settings::*SetOptionIndex)(uint8_t); + uint8_t (Controllers::Settings::*GetOptionIndex)() const; + std::array options; + + lv_obj_t* cbOption[MAXLISTITEMS]; + + lv_point_t pageIndicatorBasePoints[2]; + lv_point_t pageIndicatorPoints[2]; + lv_obj_t* pageIndicatorBase; + lv_obj_t* pageIndicator; + }; + } + } +} \ No newline at end of file diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index 1687dccf..4e76af18 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -12,6 +12,7 @@ #include "displayapp/screens/WatchFaceTerminal.h" #include "displayapp/screens/WatchFaceAnalog.h" #include "displayapp/screens/WatchFacePineTimeStyle.h" +#include "displayapp/screens/WatchFaceCasioStyleG7710.h" using namespace Pinetime::Applications::Screens; @@ -45,6 +46,9 @@ Clock::Clock(DisplayApp* app, case 3: return WatchFaceTerminalScreen(); break; + case 4: + return WatchFaceCasioStyleG7710(); + break; } return WatchFaceDigitalScreen(); }()} { @@ -103,3 +107,14 @@ std::unique_ptr Clock::WatchFaceTerminalScreen() { heartRateController, motionController); } + +std::unique_ptr Clock::WatchFaceCasioStyleG7710() { + return std::make_unique(app, + dateTimeController, + batteryController, + bleController, + notificatioManager, + settingsController, + heartRateController, + motionController); +} diff --git a/src/displayapp/screens/Clock.h b/src/displayapp/screens/Clock.h index 1ba752c7..5446a11b 100644 --- a/src/displayapp/screens/Clock.h +++ b/src/displayapp/screens/Clock.h @@ -48,6 +48,7 @@ namespace Pinetime { std::unique_ptr WatchFaceAnalogScreen(); std::unique_ptr WatchFacePineTimeStyleScreen(); std::unique_ptr WatchFaceTerminalScreen(); + std::unique_ptr WatchFaceCasioStyleG7710(); }; } } diff --git a/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp b/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp new file mode 100644 index 00000000..8f730d52 --- /dev/null +++ b/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp @@ -0,0 +1,297 @@ +#include "displayapp/screens/WatchFaceCasioStyleG7710.h" + +#include +#include +#include +#include "displayapp/screens/BatteryIcon.h" +#include "displayapp/screens/BleIcon.h" +#include "displayapp/screens/NotificationIcon.h" +#include "displayapp/screens/Symbols.h" +#include "components/battery/BatteryController.h" +#include "components/ble/BleController.h" +#include "components/ble/NotificationManager.h" +#include "components/heartrate/HeartRateController.h" +#include "components/motion/MotionController.h" +#include "components/settings/Settings.h" +using namespace Pinetime::Applications::Screens; + + +WatchFaceCasioStyleG7710::WatchFaceCasioStyleG7710(DisplayApp* app, + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificatioManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, + Controllers::MotionController& motionController) + : Screen(app), + currentDateTime {{}}, + dateTimeController {dateTimeController}, + batteryController {batteryController}, + bleController {bleController}, + notificatioManager {notificatioManager}, + settingsController {settingsController}, + heartRateController {heartRateController}, + motionController {motionController} { + + batteryIcon = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(batteryIcon, Symbols::batteryFull); + lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, -5, 0); + + batteryPlug = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(batteryPlug, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_label_set_text_static(batteryPlug, Symbols::plug); + lv_obj_align(batteryPlug, batteryIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0); + + bleIcon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(bleIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_label_set_text_static(bleIcon, Symbols::bluetooth); + lv_obj_align(bleIcon, batteryPlug, LV_ALIGN_OUT_LEFT_MID, -5, 0); + + notificationIcon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(false)); + lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_TOP_LEFT, 5, 0); + + + label_day_of_week = lv_label_create(lv_scr_act(), nullptr); + lv_obj_align(label_day_of_week, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 10, 64); + lv_obj_set_style_local_text_color(label_day_of_week, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_obj_set_style_local_text_font(label_day_of_week, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_dots_40); + lv_label_set_text_static(label_day_of_week, "SUN"); + + label_week_number = lv_label_create(lv_scr_act(), nullptr); + lv_obj_align(label_week_number, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 5, 34); + lv_obj_set_style_local_text_color(label_week_number, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_obj_set_style_local_text_font(label_week_number, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_dots_40); + lv_label_set_text_static(label_week_number, "WK26"); + + label_day_of_year = lv_label_create(lv_scr_act(), nullptr); + lv_obj_align(label_day_of_year, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 100, 25); + lv_obj_set_style_local_text_color(label_day_of_year, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_obj_set_style_local_text_font(label_day_of_year, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_7segment_40); + lv_label_set_text_static(label_day_of_year, "181-184"); + + static lv_style_t style_line; + lv_style_init(&style_line); + lv_style_set_line_width(&style_line, LV_STATE_DEFAULT, 2); + lv_style_set_line_color(&style_line, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_style_set_line_rounded(&style_line, LV_STATE_DEFAULT, true); + + static lv_style_t style_border; + lv_style_init(&style_border); + lv_style_set_line_width(&style_border, LV_STATE_DEFAULT, 6); + lv_style_set_line_color(&style_border, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_style_set_line_rounded(&style_border, LV_STATE_DEFAULT, true); + + line_day_of_week_number = lv_line_create(lv_scr_act(), nullptr); + static lv_point_t line_day_of_week_number_points[] = {{0, 0}, {100, 0}, {94, 70}, {0, 70}}; + lv_line_set_points(line_day_of_week_number, line_day_of_week_number_points, 4); + lv_obj_add_style(line_day_of_week_number, LV_LINE_PART_MAIN, &style_border); + lv_obj_align(line_day_of_week_number, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 28); + + line_day_of_year = lv_line_create(lv_scr_act(), nullptr); + static lv_point_t line_day_of_year_points[] = {{0, 5}, {130, 5}, {135, 0}}; + lv_line_set_points(line_day_of_year, line_day_of_year_points, 3); + lv_obj_add_style(line_day_of_year, LV_LINE_PART_MAIN, &style_line); + lv_obj_align(line_day_of_year, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 55); + + label_date = lv_label_create(lv_scr_act(), nullptr); + lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 100, 65); + lv_obj_set_style_local_text_color(label_date, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_obj_set_style_local_text_font(label_date, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_7segment_40); + lv_label_set_text_static(label_date, "6-30"); + + line_date = lv_line_create(lv_scr_act(), nullptr); + static lv_point_t line_date_points[] = {{0, 5}, {135, 5}, {140, 0}}; + lv_line_set_points(line_date, line_date_points, 3); + lv_obj_add_style(line_date, LV_LINE_PART_MAIN, &style_line); + lv_obj_align(line_date, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 95); + + label_time = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_7segment_115); + lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); + + line_time = lv_line_create(lv_scr_act(), nullptr); + static lv_point_t line_time_points[] = {{0, 0}, {230, 0}, {235, 5}}; + lv_line_set_points(line_time, line_time_points, 3); + lv_obj_add_style(line_time, LV_LINE_PART_MAIN, &style_line); + lv_obj_align(line_time, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, -35); + + label_time_ampm = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(label_time_ampm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_label_set_text_static(label_time_ampm, ""); + lv_obj_align(label_time_ampm, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 5, -5); + + backgroundLabel = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_click(backgroundLabel, true); + lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); + lv_obj_set_size(backgroundLabel, 240, 240); + lv_obj_set_pos(backgroundLabel, 0, 0); + lv_label_set_text_static(backgroundLabel, ""); + + heartbeatIcon = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(heartbeatIcon, Symbols::heartBeat); + lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_obj_align(heartbeatIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 5, -2); + + heartbeatValue = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(heartbeatValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_label_set_text_static(heartbeatValue, ""); + lv_obj_align(heartbeatValue, heartbeatIcon, LV_ALIGN_OUT_RIGHT_MID, 5, 0); + + stepValue = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_label_set_text_static(stepValue, "0"); + lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -5, -2); + + stepIcon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(stepIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_label_set_text_static(stepIcon, Symbols::shoe); + lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0); + + taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); + Refresh(); +} + +WatchFaceCasioStyleG7710::~WatchFaceCasioStyleG7710() { + lv_task_del(taskRefresh); + lv_obj_clean(lv_scr_act()); +} + +void WatchFaceCasioStyleG7710::Refresh() { + powerPresent = batteryController.IsPowerPresent(); + if (powerPresent.IsUpdated()) { + lv_label_set_text_static(batteryPlug, BatteryIcon::GetPlugIcon(powerPresent.Get())); + } + + batteryPercentRemaining = batteryController.PercentRemaining(); + if (batteryPercentRemaining.IsUpdated()) { + auto batteryPercent = batteryPercentRemaining.Get(); + lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); + } + + bleState = bleController.IsConnected(); + bleRadioEnabled = bleController.IsRadioEnabled(); + if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { + lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get())); + } + lv_obj_realign(batteryPlug); + lv_obj_realign(bleIcon); + + notificationState = notificatioManager.AreNewNotificationsAvailable(); + if (notificationState.IsUpdated()) { + lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(notificationState.Get())); + } + + currentDateTime = dateTimeController.CurrentDateTime(); + + if (currentDateTime.IsUpdated()) { + auto newDateTime = currentDateTime.Get(); + + auto dp = date::floor(newDateTime); + auto time = date::make_time(newDateTime - dp); + auto yearMonthDay = date::year_month_day(dp); + + auto year = static_cast(yearMonthDay.year()); + auto month = static_cast(static_cast(yearMonthDay.month())); + auto day = static_cast(yearMonthDay.day()); + auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); + + uint8_t hour = time.hours().count(); + uint8_t minute = time.minutes().count(); + auto weekNumberFormat = "%V"; + + if (displayedHour != hour || displayedMinute != minute) { + displayedHour = hour; + displayedMinute = minute; + + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { + char ampmChar[2] = "A"; + if (hour == 0) { + hour = 12; + } else if (hour == 12) { + ampmChar[0] = 'P'; + } else if (hour > 12) { + hour = hour - 12; + ampmChar[0] = 'P'; + } + lv_label_set_text(label_time_ampm, ampmChar); + lv_label_set_text_fmt(label_time, "%2d:%02d", hour, minute); + lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 30); + } else { + lv_label_set_text_fmt(label_time, "%02d:%02d", hour, minute); + lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 30); + } + } + + if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { + // 24h mode: ddmmyyyy, first DOW=Monday; + lv_label_set_text_fmt( + label_date, "%3d-%2d", day, month); + weekNumberFormat = "%V"; // Replaced by the week number of the year (Monday as the first day of the week) as a decimal number [01,53]. If the week containing 1 January has four or more days in the new year, then it is considered week 1. Otherwise, it is the last week of the previous year, and the next week is week 1. Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday] + } else { + // 12h mode: mmddyyyy, first DOW=Sunday; + lv_label_set_text_fmt( + label_date, "%3d-%2d", month, day); + weekNumberFormat = "%U"; // Replaced by the week number of the year as a decimal number [00,53]. The first Sunday of January is the first day of week 1; days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] + } + + uint8_t weekNumber; + uint16_t dayOfYearNumber, daysTillEndOfYearNumber; + + std::tm date = {}; + date.tm_year = year - 1900; + date.tm_mon = static_cast(yearMonthDay.month()) - 1; + date.tm_mday = day + 1; + std::mktime( &date ); + + dayOfYearNumber = date.tm_yday; + daysTillEndOfYearNumber = yearMonthDay.year().is_leap() ? 366 : 365 - dayOfYearNumber; + + char buffer[8]; + strftime(buffer, 8, weekNumberFormat, &date); + weekNumber = atoi(buffer); + + lv_label_set_text_fmt(label_day_of_week, "%s", dateTimeController.DayOfWeekShortToString()); + lv_label_set_text_fmt(label_day_of_year, "%3d-%3d", dayOfYearNumber, daysTillEndOfYearNumber); + lv_label_set_text_fmt(label_week_number, "WK%02d", weekNumber); + + lv_obj_realign(label_day_of_week); + lv_obj_realign(label_day_of_year); + lv_obj_realign(label_week_number); + lv_obj_realign(label_date); + + currentYear = year; + currentMonth = month; + currentDayOfWeek = dayOfWeek; + currentDay = day; + } + } + + heartbeat = heartRateController.HeartRate(); + heartbeatRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped; + if (heartbeat.IsUpdated() || heartbeatRunning.IsUpdated()) { + if (heartbeatRunning.Get()) { + lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x98B69A)); + lv_label_set_text_fmt(heartbeatValue, "%d", heartbeat.Get()); + } else { + lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x1B1B1B)); + lv_label_set_text_static(heartbeatValue, ""); + } + + lv_obj_realign(heartbeatIcon); + lv_obj_realign(heartbeatValue); + } + + stepCount = motionController.NbSteps(); + motionSensorOk = motionController.IsSensorOk(); + if (stepCount.IsUpdated() || motionSensorOk.IsUpdated()) { + lv_label_set_text_fmt(stepValue, "%lu", stepCount.Get()); + lv_obj_realign(stepValue); + lv_obj_realign(stepIcon); + } +} diff --git a/src/displayapp/screens/WatchFaceCasioStyleG7710.h b/src/displayapp/screens/WatchFaceCasioStyleG7710.h new file mode 100644 index 00000000..0cf7bbbf --- /dev/null +++ b/src/displayapp/screens/WatchFaceCasioStyleG7710.h @@ -0,0 +1,91 @@ +#pragma once + +#include +#include +#include +#include +#include +#include "displayapp/screens/Screen.h" +#include "components/datetime/DateTimeController.h" +#include "components/ble/BleController.h" + +namespace Pinetime { + namespace Controllers { + class Settings; + class Battery; + class Ble; + class NotificationManager; + class HeartRateController; + class MotionController; + } + + namespace Applications { + namespace Screens { + + class WatchFaceCasioStyleG7710 : public Screen { + public: + WatchFaceCasioStyleG7710(DisplayApp* app, + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificatioManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, + Controllers::MotionController& motionController); + ~WatchFaceCasioStyleG7710() override; + + void Refresh() override; + + private: + uint8_t displayedHour = -1; + uint8_t displayedMinute = -1; + + uint16_t currentYear = 1970; + Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; + Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; + uint8_t currentDay = 0; + + DirtyValue batteryPercentRemaining {}; + DirtyValue powerPresent {}; + DirtyValue bleState {}; + DirtyValue bleRadioEnabled {}; + DirtyValue> currentDateTime {}; + DirtyValue motionSensorOk {}; + DirtyValue stepCount {}; + DirtyValue heartbeat {}; + DirtyValue heartbeatRunning {}; + DirtyValue notificationState {}; + + lv_obj_t* label_time; + lv_obj_t* line_time; + lv_obj_t* label_time_ampm; + lv_obj_t* label_date; + lv_obj_t* line_date; + lv_obj_t* label_day_of_week; + lv_obj_t* label_week_number; + lv_obj_t* line_day_of_week_number; + lv_obj_t* label_day_of_year; + lv_obj_t* line_day_of_year; + lv_obj_t* backgroundLabel; + lv_obj_t* bleIcon; + lv_obj_t* batteryPlug; + lv_obj_t* heartbeatIcon; + lv_obj_t* heartbeatValue; + lv_obj_t* stepIcon; + lv_obj_t* stepValue; + lv_obj_t* notificationIcon; + lv_obj_t* batteryIcon; + + Controllers::DateTime& dateTimeController; + Controllers::Battery& batteryController; + Controllers::Ble& bleController; + Controllers::NotificationManager& notificatioManager; + Controllers::Settings& settingsController; + Controllers::HeartRateController& heartRateController; + Controllers::MotionController& motionController; + + lv_task_t* taskRefresh; + }; + } + } +} diff --git a/src/displayapp/screens/settings/SettingWatchFace.h b/src/displayapp/screens/settings/SettingWatchFace.h index 62427b4f..801dcd73 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.h +++ b/src/displayapp/screens/settings/SettingWatchFace.h @@ -4,8 +4,10 @@ #include #include +#include "displayapp/screens/ScreenList.h" #include "components/settings/Settings.h" #include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" namespace Pinetime { @@ -17,14 +19,17 @@ namespace Pinetime { SettingWatchFace(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); ~SettingWatchFace() override; - void UpdateSelected(lv_obj_t* object, lv_event_t event); + bool OnTouchEvent(TouchEvents event) override; private: - static constexpr std::array options = {" Digital face", " Analog face", " PineTimeStyle", " Terminal"}; Controllers::Settings& settingsController; + ScreenList<2> screens; - lv_obj_t* cbOption[options.size()]; + static constexpr const char* title = "Watch face"; + static constexpr const char* symbol = Symbols::home; + std::unique_ptr CreateScreen1(); + std::unique_ptr CreateScreen2(); }; } } -} +} \ No newline at end of file diff --git a/src/libs/lv_conf.h b/src/libs/lv_conf.h index 73109c5a..3dfe9d7c 100644 --- a/src/libs/lv_conf.h +++ b/src/libs/lv_conf.h @@ -418,6 +418,9 @@ typedef void* lv_indev_drv_user_data_t; /*Type of user data in the in LV_FONT_DECLARE(jetbrains_mono_42) \ LV_FONT_DECLARE(jetbrains_mono_76) \ LV_FONT_DECLARE(open_sans_light) \ + LV_FONT_DECLARE(lv_font_7segment_115) \ + LV_FONT_DECLARE(lv_font_7segment_40) \ + LV_FONT_DECLARE(lv_font_dots_40) \ LV_FONT_DECLARE(lv_font_sys_48) /* Enable it if you have fonts with a lot of characters.