This commit is contained in:
Marc PASTEUR 2025-12-31 08:48:02 +01:00
parent 169b8d62b1
commit c7b46b5bfe
54 changed files with 124852 additions and 464 deletions

View File

@ -2,7 +2,7 @@
"configurations": [
{
"name": "ESP-IDF",
"compilerPath": "${config:idf.toolsPath}/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc",
"compilerPath": "${config:idf.toolsPath}/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc",
"compileCommands": "${config:idf.buildPath}/compile_commands.json",
"includePath": [
"${config:idf.espIdfPath}/components/**",

53
.vscode/launch.json vendored
View File

@ -41,6 +41,12 @@
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"setupCommands": [
{
"description": "Load LVGL GDB helpers",
"text": "source /home/marc/domotic/components/domotic_display/test_host/managed_components/lvgl__lvgl/scripts/gdb/gdbinit.py"
}
],
"linux": {
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb"
@ -53,6 +59,51 @@
"miDebuggerPath": "C:\\MinGw\\bin\\gdb.exe"
}
},
{
"name": "Debug remindme with gdb",
"type": "cppdbg",
"request": "launch",
"preLaunchTask": "Build - Build IHM",
"program": "${workspaceFolder}/components/RemindMe/test/build/remindme_host_test.elf",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"setupCommands": [
{
"description": "Load LVGL GDB helpers",
"text": "source /home/marc/domotic/components/domotic_display/test_host/managed_components/lvgl__lvgl/scripts/gdb/gdbinit.py"
}
],
"linux": {
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb"
},
"osx": {
"MIMode": "lldb"
},
"windows": {
"MIMode": "gdb",
"miDebuggerPath": "C:\\MinGw\\bin\\gdb.exe"
}
},
{
"name": "Debug comp2 (Linux)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/components/domotic_display/test_host/build/comp2_test",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [
{
"description": "Enable pretty printing",
"text": "-enable-pretty-printing"
}
]
}
]
}

View File

@ -7,12 +7,13 @@
"idf.customExtraVars": {
"OPENOCD_SCRIPTS": "/home/marc/.espressif/tools/openocd-esp32/v0.12.0-esp32-20240318/openocd-esp32/share/openocd/scripts",
"ESP_ROM_ELF_DIR": "/home/marc/.espressif/tools/esp-rom-elfs/20240305/",
"IDF_TARGET": "esp32s3"
"IDF_TARGET": "esp32"
},
"idf.gitPath": "git",
"idf.adapterTargetName": "esp32s3",
"idf.openOcdConfigs": [
"board/esp32s3-builtin.cfg"
"interface/ftdi/esp_ftdi.cfg",
"target/esp32.cfg"
],
"idf.flashType": "UART",
"idf.port": "/dev/ttyUSB0",
@ -112,7 +113,7 @@
"clangd.path": "/home/marc/.espressif/tools/esp-clang/esp-19.1.2_20250312/esp-clang/bin/clangd",
"clangd.arguments": [
"--background-index",
"--query-driver=/home/marc/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc",
"--query-driver=/home/marc/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc",
"--compile-commands-dir=/home/marc/domotic/build"
]
}

View File

@ -0,0 +1,5 @@
cmake_minimum_required(VERSION 3.16)
idf_component_register(SRCS "RemindMe.c"
INCLUDE_DIRS "include"
REQUIRES json spiffs)

View File

@ -0,0 +1,216 @@
#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "cJSON.h"
#include "esp_spiffs.h"
#include "RemindMe.h"
#include <time.h>
static const char *TAG = "JSON_READER";
static void copy_json_string(cJSON *item,
const char *key,
char *dst,
size_t dst_size)
{
cJSON *v = cJSON_GetObjectItem(item, key);
if (cJSON_IsString(v) && v->valuestring)
{
strncpy(dst, v->valuestring, dst_size - 1);
dst[dst_size - 1] = '\0';
}
}
static RemindMeEvent *get_events_from_file(const char *filepath, int *count)
{
*count = 0;
FILE *f = fopen(filepath, "r");
if (!f)
{
ESP_LOGE(TAG, "Impossible d'ouvrir le fichier");
return NULL;
}
fseek(f, 0, SEEK_END);
long size = ftell(f);
fseek(f, 0, SEEK_SET);
char *json_string = malloc(size + 1);
if (!json_string)
{
fclose(f);
return NULL;
}
fread(json_string, 1, size, f);
fclose(f);
json_string[size] = 0;
cJSON *json = cJSON_Parse(json_string);
free(json_string);
if (!cJSON_IsArray(json))
{
cJSON_Delete(json);
return NULL;
}
int n = cJSON_GetArraySize(json);
if (n == 0)
{
cJSON_Delete(json);
return NULL;
}
RemindMeEvent *events = calloc(n, sizeof(RemindMeEvent));
if (!events)
{
cJSON_Delete(json);
return NULL;
}
for (int i = 0; i < n; i++)
{
cJSON *item = cJSON_GetArrayItem(json, i);
copy_json_string(item, "evenement", events[i].evenement, sizeof(events[i].evenement));
copy_json_string(item, "affichage", events[i].affichage, sizeof(events[i].affichage));
copy_json_string(item, "date", events[i].date, sizeof(events[i].date));
copy_json_string(item, "type", events[i].type, sizeof(events[i].type));
}
cJSON_Delete(json);
*count = n;
return events;
}
static void read_json_file(const char *filepath, cJSON **root)
{
FILE *f = fopen(filepath, "r");
if (!f)
{
ESP_LOGE(TAG, "Impossible d'ouvrir le fichier");
return;
}
fseek(f, 0, SEEK_END);
long size = ftell(f);
fseek(f, 0, SEEK_SET);
char *json_string = malloc(size + 1);
if (!json_string)
{
fclose(f);
return;
}
fread(json_string, 1, size, f);
fclose(f);
json_string[size] = 0;
*root = cJSON_Parse(json_string);
free(json_string);
}
/**
* Parse une date au format "YYYY-MM-DD" et retourne le timestamp
*/
time_t parse_date(const char *date_str)
{
struct tm tm = {0};
// Parser la date (format: YYYY-MM-DD)
sscanf(date_str, "%d-%d-%d",
&tm.tm_year, &tm.tm_mon, &tm.tm_mday);
tm.tm_year -= 1900; // Années depuis 1900
tm.tm_mon -= 1; // Mois de 0 à 11
tm.tm_hour = 0;
tm.tm_min = 0;
tm.tm_sec = 0;
return mktime(&tm);
}
/**
* Calcule le nombre de jours entre maintenant et la date donnée
* Retourne un nombre négatif si la date est passée
*/
int days_until(const char *date_str)
{
// Obtenir l'heure actuelle
time_t now;
time(&now);
// Parser la date cible
time_t target = parse_date(date_str);
// Calculer la différence en secondes
double diff_seconds = difftime(target, now);
// Convertir en jours (arrondi)
int days = (int)(diff_seconds / (60 * 60 * 24));
return days;
}
RemindMeEvent *get_events(int *count)
{
RemindMeEvent *evts = get_events_from_file(
"/spiffs/events.json",
count);
for (size_t i = 0; i < *count; i++)
{
sprintf(evts[i].affichage, evts[i].affichage, days_until(evts[i].date));
}
return evts;
}
esp_err_t events_save_atomic(char *eventsJson)
{
FILE *f = fopen("/spiffs/events.tmp", "w");
if (!f)
goto error;
fwrite(eventsJson, 1, strlen(eventsJson), f);
fclose(f);
rename("/spiffs/events.json", "/spiffs/events.bak");
rename("/spiffs/events.tmp", "/spiffs/events.json");
//unlink("/spiffs/events.bak");
free(eventsJson);
return ESP_OK;
error:
free(eventsJson);
return ESP_FAIL;
}
void add_event(RemindMeEvent e){
int count=0;
cJSON *root = cJSON_CreateObject();
read_json_file("/spiffs/events.json", &root);
printf("%s","####################### AVANT\n");
//printf("%s\n",cJSON_Print(root));
if (!cJSON_IsArray(root))
{
ESP_LOGE(TAG, "'root' n'est pas un tableau");
return;
}else{
cJSON *new_event = cJSON_CreateObject();
if (!new_event)
return;
cJSON_AddStringToObject(new_event, "evenement", e.evenement);
cJSON_AddStringToObject(new_event, "affichage", e.affichage);
cJSON_AddStringToObject(new_event, "date", e.date);
cJSON_AddStringToObject(new_event, "type", e.type);
cJSON_AddItemToArray(root, new_event);
}
printf("%s", "####################### APRES\n");
//printf("%s\n", cJSON_Print(root));
char *eventsJson=cJSON_Print(root);
events_save_atomic(eventsJson);
}

View File

@ -0,0 +1,6 @@
## IDF Component Manager Manifest File
dependencies:
## Required IDF version
idf:
version: '>=4.1.0'

View File

@ -0,0 +1,19 @@
#pragma once
typedef struct
{
char evenement[64];
char affichage[128];
char date[32];
char type[40];
} RemindMeEvent;
/**
* Charge les événements depuis le fichier JSON
* @param count (out) nombre d'événements chargés
* @return pointeur vers tableau d'événements ou NULL en cas d'erreur
*
* L'appelant doit libérer la mémoire avec free()
*/
RemindMeEvent *get_events(int *count);
void add_event();

View File

@ -0,0 +1,12 @@
cmake_minimum_required(VERSION 3.16)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
set(COMPONENTS main)
list(APPEND EXTRA_COMPONENT_DIRS
../../RemindMe
)
project(remindme_host_test)

View File

@ -0,0 +1,10 @@
dependencies:
idf:
source:
type: idf
version: 5.5.1
direct_dependencies:
- idf
manifest_hash: 2fc18f414627b3fc737adcef5ecbfa3a4f7cff55fd5f96a20734c8d5302b79ed
target: linux
version: 2.0.0

View File

@ -0,0 +1,4 @@
idf_component_register(
SRCS "main.c"
REQUIRES RemindMe
)

View File

@ -0,0 +1,28 @@
#include "RemindMe.h"
#include "esp_log.h"
int app_main(int argc, char *argv[])
{
int count=0;
RemindMeEvent *events= get_events(&count);
if (!events)
{
ESP_LOGE("test", "Aucun événement chargé");
return 0;
} // Parcourir tous les événements
for (int i = 0; i < count; i++)
{
ESP_LOGI("test", "%s", events[i].affichage);
}
RemindMeEvent e = {
.affichage = "Test dans %d jours",
.date="2026-12-31",
.type="remaining_days",
.evenement="test"
};
add_event(e);
return 0;
}

View File

@ -0,0 +1,9 @@
#include "unity.h"
#include "RemindMe.h"
TEST_CASE("Test lecture JSON", "[RemindMe]")
{
Event event = {0};
esp_err_t ret = read_json_file("/spiffs/test.json", &event);
TEST_ASSERT_EQUAL(ESP_OK, ret);
}

View File

@ -1,5 +1,10 @@
include(${CMAKE_CURRENT_LIST_DIR}/fonts_symbols.cmake)
string(JOIN "," LVGL_SYMBOLS ${LVGL_SYMBOLS_CLASSIQUES})
message(STATUS "LVGL SYMBOL RANGE = ${LVGL_SYMBOLS}")
function (make_font fontName fileName fontSize)
execute_process(COMMAND podman run -v ${PROJECT_DIR}/components/domotic_display/fonts:/app -w /app lvfontconv lv_font_conv --bpp 4 --size ${fontSize} --no-compress --font ${fontName}.ttf --symbols "0123456789.°àéèêûCABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz %,'!? ():/-" --format lvgl -o ${fileName}_${fontSize}.c --font fa-solid-900.ttf --range 61461,0xf0c2,0xf575,0xf077,0xf078,0xf27a)
execute_process(COMMAND podman run -v ${PROJECT_DIR}/components/domotic_display/fonts:/app -w /app lvfontconv lv_font_conv --bpp 4 --size ${fontSize} --no-compress --font ${fontName}.ttf --symbols "0123456789.°àéèêëûCABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz %,'!? ():/-" --format lvgl -o ${fileName}_${fontSize}.c --font fa-solid-900.ttf --range ${LVGL_SYMBOLS})
endfunction()
make_font(Montserrat-Medium montserrat_medium 12 )
@ -7,6 +12,9 @@ make_font(Montserrat-Medium montserrat_medium 18)
make_font(Montserrat-Medium montserrat_medium 24)
make_font(Roboto-Medium roboto_medium 36)
make_font(Roboto-Medium roboto_medium 72)
make_font(Super_Malibu super_malibu 80)
#execute_process(COMMAND podman run -v /home/marc/rgb_lcd/components/domotic_display/fonts:/app -w /app lvfontconv lv_font_conv --bpp 4 --size 36 --no-compress --font Roboto-Medium.ttf --symbols "0123456789.°àéèûCABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz %,'():ê/-" --format lvgl -o roboto_medium_36.c --font fa-solid-900.ttf --range 61461,0xf0c2,0xf575)
#execute_process(COMMAND podman run -v /home/marc/rgb_lcd/components/domotic_display/fonts:/app -w /app lvfontconv lv_font_conv --bpp 4 --size 72 --no-compress --font Roboto-Medium.ttf --symbols "0123456789.°àéèûCABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz %,'():ê/-" --format lvgl -o roboto_medium_72.c --font fa-solid-900.ttf --range 61461,0xf0c2,0xf575)

Binary file not shown.

Binary file not shown.

View File

@ -1,7 +1,7 @@
/*******************************************************************************
* Size: 12 px
* Bpp: 4
* Opts: --bpp 4 --size 12 --no-compress --font Montserrat-Medium.ttf --symbols 0123456789.°àéèêûCABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz %,'!? ():/- --format lvgl -o montserrat_medium_12.c --font fa-solid-900.ttf --range 61461,0xf0c2,0xf575,0xf077,0xf078,0xf27a
* Opts: --bpp 4 --size 12 --no-compress --font Montserrat-Medium.ttf --symbols 0123456789.°àéèêëûCABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz %,'!? ():/- --format lvgl -o montserrat_medium_12.c --font fa-solid-900.ttf --range 0xf00c,0xf00d,0xf011,0xf013,0xf015,0xf019,0xf021,0xf023,0xf1eb,0xf0f3,0xf240,0xf241,0xf242,0xf243,0xf244,0xf060,0xf061,0xf062,0xf063,0xf04b,0xf04c,0xf04d,0xf028,0xf027,0xf026,0xf06e,0xf070,0xf071,0xf05a,0xf128,0xf017,0xf073,0xf0c2,0xf575,0xf077,0xf078,0xf2ca,0xf27a,0xe1b0
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
@ -515,6 +515,13 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xc5, 0xd0, 0x0, 0x0, 0xe, 0x92, 0x3a, 0x20,
0x2b, 0xfe, 0x90,
/* U+00EB "ë" */
0x0, 0xd1, 0xa4, 0x0, 0x3, 0x2, 0x0, 0x0,
0x0, 0x0, 0x0, 0x2b, 0xfd, 0x50, 0xe, 0x81,
0x4e, 0x45, 0xc0, 0x0, 0x6b, 0x7f, 0xee, 0xee,
0xc5, 0xd0, 0x0, 0x0, 0xe, 0x92, 0x3a, 0x20,
0x2b, 0xfe, 0x90,
/* U+00FB "û" */
0x1, 0xdd, 0x10, 0x0, 0xa5, 0x4b, 0x0, 0x0,
0x0, 0x0, 0xf, 0x30, 0x2, 0xf0, 0xf3, 0x0,
@ -522,6 +529,60 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xe, 0x40, 0x4, 0xf0, 0xab, 0x22, 0xcf, 0x1,
0xbf, 0xe6, 0xf0,
/* U+E1B0 "" */
0x0, 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0,
0x0, 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, 0x1,
0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2d, 0xff,
0xff, 0xff, 0x70, 0x0, 0x3, 0xef, 0xfd, 0x58,
0xff, 0xf9, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0xdf,
0xff, 0xb0, 0xef, 0xff, 0xf8, 0x1, 0xff, 0xff,
0xf6, 0x2a, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x30,
0x8, 0xff, 0xb1, 0x0, 0x4f, 0xff, 0x0, 0x8,
0xff, 0x30, 0x0, 0xb, 0xff, 0x0, 0x7, 0xff,
0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xff, 0xff,
0xff, 0xff, 0xfc, 0x0, 0x0, 0x24, 0x44, 0x44,
0x44, 0x40, 0x0,
/* U+F00C "" */
0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0,
0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, 0x5, 0xfc,
0x2, 0x0, 0x0, 0x5, 0xfc, 0x0, 0xec, 0x0,
0x5, 0xfc, 0x0, 0x5, 0xfc, 0x5, 0xfc, 0x0,
0x0, 0x5, 0xfd, 0xfc, 0x0, 0x0, 0x0, 0x5,
0xfc, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0,
0x0, 0x0,
/* U+F00D "" */
0x9, 0x20, 0x0, 0x29, 0x11, 0xfe, 0x10, 0x1d,
0xf1, 0x3, 0xfd, 0x3d, 0xf3, 0x0, 0x3, 0xff,
0xf3, 0x0, 0x0, 0x1d, 0xfd, 0x10, 0x0, 0x1c,
0xf7, 0xfd, 0x10, 0xc, 0xf4, 0x4, 0xfc, 0x2,
0xe5, 0x0, 0x5, 0xe2,
/* U+F011 "" */
0x0, 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, 0x0,
0xe, 0x90, 0x0, 0x0, 0x1, 0xc7, 0xe, 0x90,
0xc9, 0x0, 0xb, 0xf3, 0xe, 0x90, 0x8f, 0x60,
0x3f, 0x60, 0xe, 0x90, 0xb, 0xe0, 0x8f, 0x0,
0xe, 0x90, 0x5, 0xf2, 0x9e, 0x0, 0xd, 0x80,
0x3, 0xf4, 0x7f, 0x0, 0x0, 0x0, 0x5, 0xf2,
0x3f, 0x60, 0x0, 0x0, 0xb, 0xe0, 0xb, 0xf3,
0x0, 0x0, 0x8f, 0x60, 0x1, 0xdf, 0xa6, 0x7c,
0xf9, 0x0, 0x0, 0x8, 0xef, 0xfd, 0x50, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
/* U+F013 "" */
0x0, 0x0, 0x13, 0x30, 0x0, 0x0, 0x0, 0x0,
0xbf, 0xf4, 0x0, 0x0, 0x3, 0x2, 0xef, 0xf9,
0x2, 0x10, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xd0,
0xcf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x4e, 0xff,
0x90, 0x9, 0xff, 0xb0, 0xb, 0xff, 0x20, 0x2,
0xff, 0x40, 0x4e, 0xff, 0x90, 0x9, 0xff, 0xb0,
0xcf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x4f, 0xff,
0xff, 0xff, 0xff, 0xd0, 0x3, 0x2, 0xef, 0xf9,
0x2, 0x10, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0,
0x0, 0x0, 0x14, 0x30, 0x0, 0x0,
/* U+F015 "" */
0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, 0x0, 0x0,
@ -537,6 +598,210 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xfd, 0x0, 0x0, 0x4b, 0xb8, 0x0, 0x7, 0xbb,
0x60, 0x0,
/* U+F017 "" */
0x0, 0x0, 0x13, 0x31, 0x0, 0x0, 0x0, 0x2b,
0xff, 0xff, 0xb2, 0x0, 0x4, 0xff, 0xff, 0xff,
0xff, 0x40, 0x1e, 0xff, 0xf8, 0x8f, 0xff, 0xe1,
0x8f, 0xff, 0xf7, 0x7f, 0xff, 0xf8, 0xdf, 0xff,
0xf7, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0x3e,
0xff, 0xff, 0xef, 0xff, 0xfe, 0x41, 0xbf, 0xfe,
0xbf, 0xff, 0xff, 0xf9, 0x7f, 0xfb, 0x4f, 0xff,
0xff, 0xff, 0xff, 0xf4, 0x9, 0xff, 0xff, 0xff,
0xff, 0x90, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0,
0x0, 0x2, 0x7a, 0xa7, 0x20, 0x0,
/* U+F019 "" */
0x0, 0x0, 0x5, 0x50, 0x0, 0x0, 0x0, 0x0,
0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xb0,
0x0, 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0,
0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0xae,
0x2b, 0xb2, 0xea, 0x0, 0x0, 0x2e, 0xed, 0xde,
0xe3, 0x0, 0x0, 0x3, 0xef, 0xfe, 0x30, 0x0,
0x16, 0x77, 0x3e, 0xe3, 0x77, 0x61, 0xdf, 0xff,
0xc3, 0x3c, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
0xfb, 0x7f, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc,
0x4, 0x44, 0x44, 0x44, 0x44, 0x40,
/* U+F021 "" */
0x0, 0x0, 0x57, 0x74, 0x0, 0x10, 0x0, 0x3e,
0xff, 0xff, 0xd2, 0xd8, 0x3, 0xfd, 0x40, 0x5,
0xef, 0xf9, 0xc, 0xe1, 0x0, 0x2, 0xaf, 0xf9,
0xc, 0x50, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x28, 0x88, 0x20, 0x0,
0x1, 0x60, 0x9f, 0xff, 0x50, 0x0, 0xb, 0xe0,
0x9f, 0xf9, 0x0, 0x0, 0x8f, 0x70, 0x9e, 0x8f,
0xe9, 0x9d, 0xf9, 0x0, 0x36, 0x4, 0xbe, 0xeb,
0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+F023 "" */
0x0, 0x0, 0x56, 0x30, 0x0, 0x0, 0x2, 0xef,
0xff, 0x80, 0x0, 0x0, 0xce, 0x30, 0x8f, 0x40,
0x0, 0xf, 0x70, 0x0, 0xf8, 0x0, 0x2, 0xf6,
0x0, 0xe, 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff,
0xd2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff,
0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff,
0xff, 0xff, 0xff, 0xff, 0x8d, 0xff, 0xff, 0xff,
0xff, 0xf5, 0x27, 0x88, 0x88, 0x88, 0x85, 0x0,
/* U+F026 "" */
0x0, 0x0, 0x0, 0x62, 0x0, 0x0, 0xa, 0xf7,
0x0, 0x1, 0xcf, 0xf7, 0x28, 0x8d, 0xff, 0xf7,
0xdf, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7,
0xff, 0xff, 0xff, 0xf7, 0x7e, 0xff, 0xff, 0xf7,
0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x3e, 0xf7,
0x0, 0x0, 0x2, 0xd5, 0x0, 0x0, 0x0, 0x0,
/* U+F027 "" */
0x0, 0x0, 0x0, 0x62, 0x0, 0x0, 0x0, 0x0,
0xaf, 0x70, 0x0, 0x0, 0x1, 0xcf, 0xf8, 0x0,
0x2, 0x88, 0xdf, 0xff, 0x80, 0x30, 0xdf, 0xff,
0xff, 0xf8, 0x3f, 0x1f, 0xff, 0xff, 0xff, 0x80,
0xc5, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0x17, 0xef,
0xff, 0xff, 0x80, 0x30, 0x0, 0x5, 0xff, 0xf8,
0x0, 0x0, 0x0, 0x3, 0xef, 0x80, 0x0, 0x0,
0x0, 0x2, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0,
/* U+F028 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x6, 0x20, 0x0, 0x3a, 0x0, 0x0,
0x0, 0xa, 0xf7, 0x0, 0x0, 0xca, 0x0, 0x0,
0x1c, 0xff, 0x80, 0xb, 0x91, 0xe4, 0x28, 0x8d,
0xff, 0xf8, 0x3, 0x1e, 0x48, 0xad, 0xff, 0xff,
0xff, 0x83, 0xf1, 0x8a, 0x3e, 0xff, 0xff, 0xff,
0xf8, 0xc, 0x56, 0xb2, 0xff, 0xff, 0xff, 0xff,
0x83, 0xf1, 0x8a, 0x3e, 0x7e, 0xff, 0xff, 0xf8,
0x3, 0x1e, 0x48, 0xa0, 0x0, 0x5f, 0xff, 0x80,
0xb, 0x91, 0xe4, 0x0, 0x0, 0x3e, 0xf8, 0x0,
0x0, 0xca, 0x0, 0x0, 0x0, 0x2d, 0x50, 0x0,
0x3a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0,
/* U+F04B "" */
0x7a, 0x20, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0,
0x0, 0xff, 0xff, 0xd4, 0x0, 0xf, 0xff, 0xff,
0xfa, 0x10, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff,
0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x6f,
0xff, 0xff, 0xfa, 0x10, 0xff, 0xff, 0xd4, 0x0,
0xf, 0xff, 0x80, 0x0, 0x0, 0x7a, 0x20, 0x0,
0x0, 0x0,
/* U+F04C "" */
0xbf, 0xb0, 0x6f, 0xe1, 0xff, 0xf0, 0xbf, 0xf4,
0xff, 0xf0, 0xbf, 0xf4, 0xff, 0xf0, 0xbf, 0xf4,
0xff, 0xf0, 0xbf, 0xf4, 0xff, 0xf0, 0xbf, 0xf4,
0xff, 0xf0, 0xbf, 0xf4, 0xff, 0xf0, 0xbf, 0xf4,
0xbf, 0xb0, 0x6f, 0xe1,
/* U+F04D "" */
0x8f, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff,
0x80,
/* U+F05A "" */
0x0, 0x0, 0x13, 0x31, 0x0, 0x0, 0x0, 0x2b,
0xff, 0xff, 0xa2, 0x0, 0x4, 0xff, 0xff, 0xff,
0xff, 0x40, 0x1e, 0xff, 0xfe, 0xef, 0xff, 0xe1,
0x8f, 0xff, 0xf6, 0x6f, 0xff, 0xf8, 0xdf, 0xff,
0xfc, 0xef, 0xff, 0xfd, 0xff, 0xff, 0xa0, 0x4f,
0xff, 0xff, 0xef, 0xff, 0xf9, 0x3f, 0xff, 0xfe,
0xbf, 0xff, 0xd4, 0x1d, 0xff, 0xfb, 0x4f, 0xff,
0xb4, 0x4b, 0xff, 0xf4, 0x9, 0xff, 0xff, 0xff,
0xff, 0x90, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0,
0x0, 0x2, 0x7a, 0xa7, 0x20, 0x0,
/* U+F060 "" */
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f,
0x20, 0x0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0,
0x0, 0x8f, 0x90, 0x0, 0x0, 0x0, 0x8f, 0xe7,
0x77, 0x77, 0x77, 0x1d, 0xff, 0xff, 0xff, 0xff,
0xf5, 0x3e, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3e,
0xe2, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xe1, 0x0,
0x0, 0x0, 0x0, 0x2b, 0x10, 0x0, 0x0,
/* U+F061 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xae, 0x20, 0x0, 0x0, 0x0, 0x2, 0xee, 0x20,
0x0, 0x0, 0x0, 0x2, 0xee, 0x20, 0x57, 0x77,
0x77, 0x7a, 0xfe, 0x2d, 0xff, 0xff, 0xff, 0xff,
0xf6, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x0, 0x0,
0x0, 0x8, 0xf9, 0x0, 0x0, 0x0, 0x7, 0xf9,
0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0,
/* U+F062 "" */
0x0, 0x0, 0x83, 0x0, 0x0, 0x0, 0xc, 0xff,
0x30, 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0xc,
0xf6, 0xf8, 0xdf, 0x30, 0xaf, 0x51, 0xf6, 0x1d,
0xf0, 0x54, 0x1, 0xf6, 0x1, 0x80, 0x0, 0x1,
0xf6, 0x0, 0x0, 0x0, 0x1, 0xf6, 0x0, 0x0,
0x0, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xf6,
0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0,
/* U+F063 "" */
0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x1, 0xf6,
0x0, 0x0, 0x0, 0x1, 0xf6, 0x0, 0x0, 0x0,
0x1, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xf6, 0x0,
0x0, 0x32, 0x1, 0xf6, 0x0, 0x40, 0xbf, 0x31,
0xf6, 0xc, 0xf1, 0x2e, 0xe4, 0xf7, 0xbf, 0x50,
0x2, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x2e, 0xff,
0x60, 0x0, 0x0, 0x2, 0xb5, 0x0, 0x0,
/* U+F06E "" */
0x0, 0x0, 0x4, 0x9b, 0xa7, 0x10, 0x0, 0x0,
0x0, 0x2c, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0,
0x2e, 0xfe, 0x62, 0x3a, 0xff, 0x90, 0x0, 0x1e,
0xff, 0x20, 0x39, 0x18, 0xff, 0x70, 0x9, 0xff,
0x80, 0x6, 0xfb, 0x1f, 0xff, 0x10, 0xef, 0xf6,
0x49, 0xff, 0xf0, 0xef, 0xf6, 0x9, 0xff, 0x83,
0xff, 0xfb, 0x1f, 0xff, 0x10, 0xd, 0xff, 0x24,
0xa9, 0x19, 0xff, 0x70, 0x0, 0x2e, 0xfe, 0x62,
0x3a, 0xff, 0x90, 0x0, 0x0, 0x2c, 0xff, 0xff,
0xff, 0x70, 0x0, 0x0, 0x0, 0x4, 0x9b, 0xa7,
0x10, 0x0, 0x0,
/* U+F070 "" */
0x6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xbd, 0x30, 0x6, 0xab, 0xa6, 0x0, 0x0,
0x0, 0x0, 0x8f, 0x8d, 0xff, 0xff, 0xfe, 0x40,
0x0, 0x0, 0x0, 0x4f, 0xfd, 0x52, 0x5d, 0xff,
0x60, 0x0, 0x0, 0x34, 0x2d, 0xc1, 0x57, 0xd,
0xff, 0x30, 0x0, 0xc, 0xf7, 0xa, 0xec, 0xf7,
0x5f, 0xfc, 0x0, 0x2, 0xff, 0xf2, 0x7, 0xff,
0xb2, 0xff, 0xf2, 0x0, 0xd, 0xff, 0x50, 0x3,
0xec, 0x5f, 0xfc, 0x0, 0x0, 0x3f, 0xfd, 0x0,
0x1, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x5f, 0xfd,
0x52, 0x40, 0x9f, 0x90, 0x0, 0x0, 0x0, 0x4e,
0xff, 0xff, 0xb1, 0x5f, 0x80, 0x0, 0x0, 0x0,
0x6, 0xab, 0xa6, 0x0, 0x3d, 0xb0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x0,
/* U+F071 "" */
0x0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, 0x0,
0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0,
0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5f,
0xbb, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xef, 0x77,
0xfe, 0x0, 0x0, 0x0, 0x8, 0xff, 0x77, 0xff,
0x80, 0x0, 0x0, 0x2f, 0xff, 0x77, 0xff, 0xf2,
0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0,
0x4, 0xff, 0xff, 0x55, 0xff, 0xff, 0x40, 0xd,
0xff, 0xff, 0xcc, 0xff, 0xff, 0xd0, 0xb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xb0,
/* U+F073 "" */
0x0, 0x33, 0x0, 0x6, 0x0, 0x0, 0xb, 0xb0,
0x3, 0xf3, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff,
0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x44, 0x44,
0x44, 0x44, 0x44, 0x2f, 0xff, 0xff, 0xff, 0xff,
0xf8, 0xfc, 0x8f, 0xc8, 0xfc, 0x8f, 0x8f, 0x80,
0xf8, 0xf, 0x80, 0xf8, 0xff, 0xff, 0xff, 0xff,
0xff, 0x8f, 0xc8, 0xfc, 0x8f, 0xc8, 0xf8, 0xf8,
0xf, 0x80, 0xf8, 0xf, 0x8f, 0xff, 0xff, 0xff,
0xff, 0xf7, 0x47, 0x88, 0x88, 0x88, 0x87, 0x0,
/* U+F077 "" */
0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0,
0x2e, 0xe2, 0x0, 0x0, 0x0, 0x2, 0xee, 0xee,
@ -566,6 +831,89 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xff, 0xff, 0xf8, 0x4, 0xce, 0xee, 0xee, 0xee,
0xee, 0xd7, 0x0,
/* U+F0F3 "" */
0x0, 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, 0x0,
0x9, 0xf2, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff,
0x90, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf6, 0x0,
0x0, 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x7f,
0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, 0xff,
0xff, 0x10, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x50,
0x6, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xe, 0xff,
0xff, 0xff, 0xff, 0xf6, 0x2, 0x33, 0x33, 0x33,
0x33, 0x30, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0,
0x0, 0x0, 0x3, 0x60, 0x0, 0x0,
/* U+F128 "" */
0x4, 0xdf, 0xe9, 0x0, 0x2f, 0xd8, 0xaf, 0xa0,
0x8f, 0x10, 0x8, 0xf0, 0x69, 0x0, 0x7, 0xf1,
0x0, 0x0, 0x2e, 0xd0, 0x0, 0x5, 0xfe, 0x30,
0x0, 0xd, 0xc1, 0x0, 0x0, 0xa, 0x40, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x60, 0x0,
0x0, 0x1e, 0x70, 0x0,
/* U+F1EB "" */
0x0, 0x0, 0x26, 0x89, 0x86, 0x20, 0x0, 0x0,
0x5, 0xdf, 0xff, 0xef, 0xff, 0xd5, 0x0, 0x1c,
0xfc, 0x61, 0x0, 0x1, 0x6c, 0xfc, 0x1d, 0xf5,
0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x42, 0x0,
0x4a, 0xef, 0xea, 0x40, 0x2, 0x40, 0x0, 0xaf,
0xea, 0x8a, 0xef, 0xa0, 0x0, 0x0, 0x1e, 0x70,
0x0, 0x0, 0x7e, 0x10, 0x0, 0x0, 0x0, 0x0,
0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf,
0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x40,
0x0, 0x0, 0x0,
/* U+F240 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f,
0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0xfc, 0x66,
0x66, 0x66, 0x66, 0x7f, 0x80, 0xf7, 0xad, 0xdd,
0xdd, 0xdd, 0x5e, 0xe3, 0xf7, 0xcf, 0xff, 0xff,
0xff, 0x5e, 0xf5, 0xf7, 0xad, 0xdd, 0xdd, 0xdd,
0x4e, 0xe2, 0xfc, 0x77, 0x77, 0x77, 0x77, 0x7f,
0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+F241 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f,
0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0xfc, 0x66,
0x66, 0x66, 0x66, 0x7f, 0x80, 0xf7, 0xad, 0xdd,
0xdd, 0x10, 0xe, 0xe3, 0xf7, 0xcf, 0xff, 0xff,
0x20, 0xe, 0xf5, 0xf7, 0xad, 0xdd, 0xdd, 0x10,
0xe, 0xe2, 0xfc, 0x77, 0x77, 0x77, 0x77, 0x7f,
0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+F242 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f,
0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0xfc, 0x66,
0x66, 0x66, 0x66, 0x7f, 0x80, 0xf7, 0xad, 0xdd,
0x90, 0x0, 0xe, 0xe3, 0xf7, 0xcf, 0xff, 0xa0,
0x0, 0xe, 0xf5, 0xf7, 0xad, 0xdd, 0x90, 0x0,
0xe, 0xe2, 0xfc, 0x77, 0x77, 0x77, 0x77, 0x7f,
0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+F243 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f,
0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0xfc, 0x66,
0x66, 0x66, 0x66, 0x7f, 0x80, 0xf7, 0xad, 0x60,
0x0, 0x0, 0xe, 0xe3, 0xf7, 0xcf, 0x70, 0x0,
0x0, 0xe, 0xf5, 0xf7, 0xad, 0x60, 0x0, 0x0,
0xe, 0xe2, 0xfc, 0x77, 0x77, 0x77, 0x77, 0x7f,
0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+F244 "" */
0x0, 0x11, 0x11, 0x11, 0x11, 0x0, 0x0, 0x6f,
0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0xfc, 0x77,
0x77, 0x77, 0x77, 0x7f, 0x80, 0xf8, 0x0, 0x0,
0x0, 0x0, 0xe, 0xe3, 0xf8, 0x0, 0x0, 0x0,
0x0, 0xe, 0xf5, 0xf8, 0x0, 0x0, 0x0, 0x0,
0xe, 0xe2, 0xfc, 0x77, 0x77, 0x77, 0x77, 0x7f,
0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+F27A "" */
0x4a, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0xef, 0xff,
0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
@ -578,6 +926,15 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x0, 0x0, 0x0, 0x3, 0xf5, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0,
/* U+F2CA "" */
0x0, 0x26, 0x50, 0x0, 0x3, 0xff, 0xfc, 0x0,
0xb, 0xd1, 0x5f, 0x40, 0xd, 0xa0, 0x1f, 0x60,
0xe, 0xa0, 0x1f, 0x70, 0xe, 0xa0, 0x1f, 0x70,
0xe, 0xa3, 0x1f, 0x70, 0x2f, 0x89, 0x2e, 0xb0,
0x8f, 0x3e, 0x97, 0xf1, 0x8f, 0x3f, 0xc6, 0xf1,
0x4f, 0x93, 0x4d, 0xd0, 0x8, 0xff, 0xfe, 0x30,
0x0, 0x26, 0x50, 0x0,
/* U+F575 "" */
0x19, 0x20, 0x1, 0x40, 0x0, 0x0, 0x1e, 0xe2,
0x3e, 0xfc, 0x10, 0x0, 0x2, 0xee, 0xed, 0x6f,
@ -677,13 +1034,47 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 2301, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2336, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2371, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2406, .adv_w = 130, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 2441, .adv_w = 216, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -2},
{.bitmap_index = 2539, .adv_w = 192, .box_w = 12, .box_h = 7, .ofs_x = 0, .ofs_y = 2},
{.bitmap_index = 2581, .adv_w = 192, .box_w = 12, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2623, .adv_w = 240, .box_w = 15, .box_h = 11, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 2706, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2784, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}
{.bitmap_index = 2406, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2441, .adv_w = 130, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 2476, .adv_w = 216, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2567, .adv_w = 168, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2617, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 2653, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2731, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2809, .adv_w = 216, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -2},
{.bitmap_index = 2907, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2985, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3063, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3135, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3207, .adv_w = 120, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3255, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3321, .adv_w = 240, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3419, .adv_w = 144, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 3469, .adv_w = 120, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 3505, .adv_w = 144, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 3546, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3624, .adv_w = 168, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 3679, .adv_w = 168, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 3734, .adv_w = 144, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 3789, .adv_w = 144, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 3844, .adv_w = 216, .box_w = 15, .box_h = 11, .ofs_x = -1, .ofs_y = -1},
{.bitmap_index = 3927, .adv_w = 240, .box_w = 17, .box_h = 13, .ofs_x = -1, .ofs_y = -2},
{.bitmap_index = 4038, .adv_w = 192, .box_w = 14, .box_h = 11, .ofs_x = -1, .ofs_y = -1},
{.bitmap_index = 4115, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 4187, .adv_w = 192, .box_w = 12, .box_h = 7, .ofs_x = 0, .ofs_y = 2},
{.bitmap_index = 4229, .adv_w = 192, .box_w = 12, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 4271, .adv_w = 240, .box_w = 15, .box_h = 11, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 4354, .adv_w = 168, .box_w = 12, .box_h = 13, .ofs_x = -1, .ofs_y = -2},
{.bitmap_index = 4432, .adv_w = 120, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 4476, .adv_w = 240, .box_w = 15, .box_h = 11, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 4559, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 4622, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 4685, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 4748, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 4811, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 4874, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 4952, .adv_w = 120, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 5004, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}
};
/*---------------------
@ -698,8 +1089,12 @@ static const uint8_t glyph_id_ofs_list_0[] = {
};
static const uint16_t unicode_list_3[] = {
0x0, 0x30, 0x38, 0x39, 0x3a, 0x4b, 0xef65, 0xefc7,
0xefc8, 0xf012, 0xf1ca, 0xf4c5
0x0, 0x30, 0x38, 0x39, 0x3a, 0x3b, 0x4b, 0xe100,
0xef5c, 0xef5d, 0xef61, 0xef63, 0xef65, 0xef67, 0xef69, 0xef71,
0xef73, 0xef76, 0xef77, 0xef78, 0xef9b, 0xef9c, 0xef9d, 0xefaa,
0xefb0, 0xefb1, 0xefb2, 0xefb3, 0xefbe, 0xefc0, 0xefc1, 0xefc3,
0xefc7, 0xefc8, 0xf012, 0xf043, 0xf078, 0xf13b, 0xf190, 0xf191,
0xf192, 0xf193, 0xf194, 0xf1ca, 0xf21a, 0xf4c5
};
/*Collect the unicode lists and glyph_id offsets*/
@ -719,7 +1114,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] =
},
{
.range_start = 176, .range_length = 62662, .glyph_id_start = 75,
.unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 12, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
.unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 46, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
@ -741,7 +1136,12 @@ static const uint8_t kern_left_class_mapping[] =
39, 45, 45, 46, 42, 39, 39, 40,
40, 47, 48, 49, 50, 45, 51, 51,
52, 51, 53, 54, 39, 43, 43, 43,
45, 0, 0, 0, 0, 0, 0
43, 45, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0
};
/*Map glyph_ids to kern right classes*/
@ -757,7 +1157,12 @@ static const uint8_t kern_right_class_mapping[] =
32, 34, 35, 32, 32, 36, 36, 33,
36, 33, 36, 37, 38, 39, 40, 40,
41, 40, 42, 43, 31, 33, 33, 33,
39, 0, 0, 0, 0, 0, 0
33, 39, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0
};
/*Kern values between classes*/

View File

@ -1,7 +1,7 @@
/*******************************************************************************
* Size: 18 px
* Bpp: 4
* Opts: --bpp 4 --size 18 --no-compress --font Montserrat-Medium.ttf --symbols 0123456789.°àéèêûCABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz %,'!? ():/- --format lvgl -o montserrat_medium_18.c --font fa-solid-900.ttf --range 61461,0xf0c2,0xf575,0xf077,0xf078,0xf27a
* Opts: --bpp 4 --size 18 --no-compress --font Montserrat-Medium.ttf --symbols 0123456789.°àéèêëûCABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz %,'!? ():/- --format lvgl -o montserrat_medium_18.c --font fa-solid-900.ttf --range 0xf00c,0xf00d,0xf011,0xf013,0xf015,0xf019,0xf021,0xf023,0xf1eb,0xf0f3,0xf240,0xf241,0xf242,0xf243,0xf244,0xf060,0xf061,0xf062,0xf063,0xf04b,0xf04c,0xf04d,0xf028,0xf027,0xf026,0xf06e,0xf070,0xf071,0xf05a,0xf128,0xf017,0xf073,0xf0c2,0xf575,0xf077,0xf078,0xf2ca,0xf27a,0xe1b0
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
@ -839,6 +839,18 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x9, 0x10, 0x0, 0xdf, 0xda, 0xae, 0xf6, 0x0,
0x0, 0x7d, 0xff, 0xc5, 0x0,
/* U+00EB "ë" */
0x0, 0xd, 0x90, 0x8d, 0x0, 0x0, 0x0, 0xc8,
0x7, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8,
0xdf, 0xe9, 0x10, 0x0, 0x1d, 0xfb, 0x8a, 0xfe,
0x20, 0xa, 0xf3, 0x0, 0x3, 0xfb, 0x0, 0xfa,
0x0, 0x0, 0x9, 0xf1, 0x3f, 0xff, 0xff, 0xff,
0xff, 0x33, 0xfa, 0x33, 0x33, 0x33, 0x30, 0xf,
0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x90, 0x0,
0x9, 0x10, 0x0, 0xdf, 0xda, 0xae, 0xf6, 0x0,
0x0, 0x7d, 0xff, 0xc5, 0x0,
/* U+00FB "û" */
0x0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x3f, 0x87,
0xf5, 0x0, 0x0, 0x75, 0x0, 0x47, 0x0, 0x0,
@ -850,6 +862,105 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xc0, 0x0, 0x1e, 0xf8, 0xa, 0xfd, 0x89, 0xee,
0xf8, 0x0, 0x8d, 0xfe, 0x92, 0xf8,
/* U+E1B0 "" */
0x0, 0x0, 0x0, 0x0, 0x1b, 0xd3, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff,
0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf8, 0x0,
0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff,
0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff,
0xff, 0xfe, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0,
0xaf, 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0xfd,
0x10, 0x1, 0xcf, 0xff, 0xff, 0xf0, 0x0, 0xc,
0xff, 0xff, 0xfe, 0x20, 0xcf, 0xff, 0xff, 0xfe,
0x0, 0x0, 0xbf, 0xff, 0xff, 0xfe, 0x1d, 0xff,
0xff, 0xff, 0xf6, 0x0, 0x3f, 0xff, 0xff, 0xff,
0xf1, 0x2, 0xcf, 0xff, 0xff, 0xfc, 0xbf, 0xff,
0xff, 0xff, 0x21, 0x0, 0xc, 0xff, 0xff, 0xc6,
0x44, 0x5a, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xcf,
0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0,
0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1f,
0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x62, 0x22,
0x22, 0x22, 0xff, 0xff, 0x0, 0x0, 0xb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0,
0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfe, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x34,
0x44, 0x44, 0x44, 0x44, 0x43, 0x10, 0x0, 0x0,
/* U+F00C "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf6,
0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x70,
0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf7, 0x0,
0x9c, 0x10, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0,
0xef, 0xd1, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0,
0x4f, 0xfd, 0x10, 0xb, 0xff, 0x70, 0x0, 0x0,
0x4, 0xff, 0xd2, 0xaf, 0xf7, 0x0, 0x0, 0x0,
0x0, 0x4f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0,
0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x4d, 0x70, 0x0, 0x0, 0x0, 0x0,
/* U+F00D "" */
0x37, 0x0, 0x0, 0x0, 0x3, 0x70, 0xdf, 0xb0,
0x0, 0x0, 0x4f, 0xf5, 0x7f, 0xfb, 0x0, 0x4,
0xff, 0xe1, 0x8, 0xff, 0xa0, 0x3f, 0xfe, 0x20,
0x0, 0x8f, 0xfb, 0xff, 0xe2, 0x0, 0x0, 0x8,
0xff, 0xfe, 0x20, 0x0, 0x0, 0x2, 0xff, 0xfa,
0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x90, 0x0,
0x2, 0xef, 0xe3, 0xaf, 0xf8, 0x0, 0x2e, 0xff,
0x30, 0xa, 0xff, 0x80, 0xcf, 0xf3, 0x0, 0x0,
0xaf, 0xf4, 0x9e, 0x40, 0x0, 0x0, 0xa, 0xe2,
/* U+F011 "" */
0x0, 0x0, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0,
0x0, 0x0, 0x0, 0x1, 0x40, 0x1, 0xff, 0x10,
0x4, 0x10, 0x0, 0x0, 0x1d, 0xf5, 0x1, 0xff,
0x10, 0x5f, 0xd1, 0x0, 0x0, 0xcf, 0xf3, 0x1,
0xff, 0x10, 0x2f, 0xfd, 0x0, 0x7, 0xff, 0x40,
0x1, 0xff, 0x10, 0x3, 0xff, 0x70, 0xe, 0xf9,
0x0, 0x1, 0xff, 0x10, 0x0, 0x8f, 0xe0, 0x3f,
0xf2, 0x0, 0x1, 0xff, 0x10, 0x0, 0x1f, 0xf3,
0x5f, 0xe0, 0x0, 0x1, 0xff, 0x10, 0x0, 0xe,
0xf5, 0x6f, 0xd0, 0x0, 0x0, 0xff, 0x0, 0x0,
0xc, 0xf7, 0x5f, 0xe0, 0x0, 0x0, 0x22, 0x0,
0x0, 0xe, 0xf6, 0x2f, 0xf3, 0x0, 0x0, 0x0,
0x0, 0x0, 0x2f, 0xf3, 0xd, 0xfa, 0x0, 0x0,
0x0, 0x0, 0x0, 0xaf, 0xd0, 0x5, 0xff, 0x60,
0x0, 0x0, 0x0, 0x6, 0xff, 0x60, 0x0, 0xaf,
0xf8, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, 0x0,
0xb, 0xff, 0xe9, 0x77, 0x9e, 0xff, 0xb0, 0x0,
0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0,
0x0, 0x0, 0x0, 0x1, 0x7b, 0xdd, 0xb7, 0x10,
0x0, 0x0,
/* U+F013 "" */
0x0, 0x0, 0x0, 0xa, 0xcc, 0xa0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf7,
0x0, 0x0, 0x0, 0x1, 0xca, 0x59, 0xff, 0xff,
0xff, 0x85, 0xac, 0x10, 0xb, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xa0, 0x3f, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x6f, 0xff,
0xff, 0xfc, 0x66, 0xcf, 0xff, 0xff, 0xf5, 0x9,
0xff, 0xff, 0xc0, 0x0, 0xc, 0xff, 0xff, 0x80,
0x0, 0xcf, 0xff, 0x50, 0x0, 0x5, 0xff, 0xfb,
0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x3, 0xff,
0xfb, 0x0, 0x3, 0xef, 0xff, 0x80, 0x0, 0x8,
0xff, 0xfe, 0x30, 0x3f, 0xff, 0xff, 0xf6, 0x0,
0x6f, 0xff, 0xff, 0xf3, 0x5f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf5, 0xe, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x4, 0xff,
0xbe, 0xff, 0xff, 0xff, 0xeb, 0xff, 0x40, 0x0,
0x20, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x12, 0x0,
0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x10,
0x0, 0x0, 0x0,
/* U+F015 "" */
0x0, 0x0, 0x0, 0x0, 0xb, 0xd3, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff,
@ -877,6 +988,397 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+F017 "" */
0x0, 0x0, 0x2, 0x7b, 0xdd, 0xb7, 0x20, 0x0,
0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa,
0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff,
0xff, 0xd2, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xcc,
0xff, 0xff, 0xfd, 0x10, 0xa, 0xff, 0xff, 0xff,
0x22, 0xff, 0xff, 0xff, 0xa0, 0x3f, 0xff, 0xff,
0xff, 0x22, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff,
0xff, 0xff, 0x22, 0xff, 0xff, 0xff, 0xf9, 0xdf,
0xff, 0xff, 0xff, 0x22, 0xff, 0xff, 0xff, 0xfd,
0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x2c, 0xff,
0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0,
0x7f, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, 0xff,
0xd3, 0xd, 0xff, 0xfa, 0x5f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xdf, 0xff, 0xf5, 0xd, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x2, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0,
0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0,
0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x30,
0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xfc, 0x60,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0,
0x0, 0x0, 0x0,
/* U+F019 "" */
0x0, 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x10,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff,
0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0,
0x5, 0xf7, 0x1, 0xff, 0x10, 0x7f, 0x50, 0x0,
0x0, 0x8, 0xff, 0x71, 0xff, 0x17, 0xff, 0x80,
0x0, 0x0, 0x0, 0xcf, 0xf9, 0xff, 0x9f, 0xfc,
0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff,
0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff,
0xfc, 0x0, 0x0, 0x0, 0x2, 0x55, 0x55, 0x1c,
0xff, 0xc1, 0x55, 0x55, 0x20, 0x7f, 0xff, 0xff,
0xb1, 0xbb, 0x1a, 0xff, 0xff, 0xf7, 0xef, 0xff,
0xff, 0xfb, 0x33, 0xbf, 0xff, 0xec, 0xfe, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0xff,
0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
0xfe, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf5, 0x1, 0x33, 0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x10,
/* U+F021 "" */
0x0, 0x0, 0x0, 0x37, 0x98, 0x62, 0x0, 0x0,
0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xb2,
0xb, 0xf2, 0x0, 0x6, 0xff, 0xfd, 0xaa, 0xef,
0xff, 0x4e, 0xf5, 0x0, 0x5f, 0xfc, 0x30, 0x0,
0x4, 0xef, 0xff, 0xf5, 0x0, 0xef, 0xb0, 0x0,
0x0, 0x0, 0x3e, 0xff, 0xf5, 0x7, 0xff, 0x10,
0x0, 0x0, 0xa, 0xff, 0xff, 0xf5, 0x5, 0xf7,
0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf2, 0x0,
0x10, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, 0x10,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x5, 0x66, 0x66, 0x20, 0x0, 0x0, 0x0,
0x5, 0x0, 0x4f, 0xff, 0xff, 0xc0, 0x0, 0x0,
0x0, 0xaf, 0x80, 0x5f, 0xff, 0xfd, 0x70, 0x0,
0x0, 0x3, 0xff, 0x50, 0x5f, 0xff, 0xf4, 0x0,
0x0, 0x0, 0x2e, 0xfd, 0x0, 0x5f, 0xfd, 0xff,
0x92, 0x0, 0x17, 0xff, 0xf2, 0x0, 0x5f, 0xe1,
0xcf, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x1b,
0x70, 0x7, 0xef, 0xff, 0xff, 0x91, 0x0, 0x0,
0x0, 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, 0x0,
0x0,
/* U+F023 "" */
0x0, 0x0, 0x4, 0xad, 0xd9, 0x20, 0x0, 0x0,
0x0, 0x0, 0x8f, 0xff, 0xff, 0xf5, 0x0, 0x0,
0x0, 0x5, 0xff, 0xc7, 0x7e, 0xff, 0x20, 0x0,
0x0, 0xd, 0xfb, 0x0, 0x1, 0xef, 0x90, 0x0,
0x0, 0x1f, 0xf3, 0x0, 0x0, 0x7f, 0xd0, 0x0,
0x0, 0x2f, 0xf1, 0x0, 0x0, 0x5f, 0xe0, 0x0,
0x0, 0x3f, 0xf1, 0x0, 0x0, 0x5f, 0xf0, 0x0,
0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1,
0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,
0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2,
0x1, 0x34, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0,
/* U+F026 "" */
0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0,
0x0, 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x9,
0xff, 0xf3, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3,
0x0, 0x11, 0x2c, 0xff, 0xff, 0xf3, 0x3e, 0xff,
0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, 0xff,
0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff,
0xff, 0xf3, 0x7, 0xaa, 0xbf, 0xff, 0xff, 0xf3,
0x0, 0x0, 0x7, 0xff, 0xff, 0xf3, 0x0, 0x0,
0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3,
0xef, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xf1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x10,
/* U+F027 "" */
0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, 0x0,
0x0, 0x0, 0x0, 0x9, 0xff, 0xf4, 0x0, 0x0,
0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0,
0x0, 0x11, 0x2c, 0xff, 0xff, 0xf4, 0x0, 0x0,
0x3e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x4, 0x40,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xb, 0xf3,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, 0xfa,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xfb,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7, 0xf7,
0xaf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xb, 0xc0,
0x7, 0xaa, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0,
0x0, 0x0, 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0,
0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0,
0x0, 0x0, 0x0, 0x3, 0xef, 0xf4, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2e, 0xf1, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0,
/* U+F028 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x56, 0x0, 0x0, 0x0, 0x4a, 0x10, 0x0, 0x0,
0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x6,
0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff,
0x40, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, 0x0,
0x0, 0xbf, 0xff, 0xf4, 0x0, 0xa, 0xe2, 0xb,
0xf4, 0x0, 0x1, 0x12, 0xcf, 0xff, 0xff, 0x40,
0x0, 0x3f, 0xe0, 0x1f, 0xb0, 0x3e, 0xff, 0xff,
0xff, 0xff, 0xf4, 0x4, 0x40, 0x6f, 0x80, 0xbf,
0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xbf,
0x30, 0xed, 0x6, 0xf4, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf4, 0x3, 0xfa, 0xa, 0xf0, 0x4f, 0x6f,
0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xb0,
0x9f, 0x13, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf4, 0x7, 0xf7, 0xc, 0xf0, 0x5f, 0x5a, 0xff,
0xff, 0xff, 0xff, 0xff, 0x40, 0xbc, 0x2, 0xfb,
0x8, 0xf3, 0x7, 0xaa, 0xbf, 0xff, 0xff, 0xf4,
0x0, 0x0, 0xbf, 0x40, 0xde, 0x0, 0x0, 0x0,
0x7f, 0xff, 0xff, 0x40, 0x0, 0x9f, 0x90, 0x6f,
0x80, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x0,
0x4, 0x70, 0x2e, 0xe0, 0x0, 0x0, 0x0, 0x0,
0x3e, 0xff, 0x40, 0x0, 0x0, 0x2e, 0xf5, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2e, 0xf1, 0x0, 0x0,
0x8, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0,
/* U+F04B "" */
0x28, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf,
0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff,
0xf9, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff,
0xe5, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff,
0xb2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff,
0xff, 0xff, 0xff, 0xe6, 0x0, 0xff, 0xff, 0xff,
0xff, 0xfa, 0x10, 0x0, 0xff, 0xff, 0xff, 0xfd,
0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0x70, 0x0,
0x0, 0x0, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0,
0x0, 0x8f, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+F04C "" */
0x17, 0x74, 0x0, 0x2, 0x77, 0x20, 0xcf, 0xff,
0x40, 0x1f, 0xff, 0xf1, 0xff, 0xff, 0x70, 0x3f,
0xff, 0xf3, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xf3,
0xff, 0xff, 0x70, 0x3f, 0xff, 0xf3, 0xff, 0xff,
0x70, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x70, 0x3f,
0xff, 0xf3, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xf3,
0xff, 0xff, 0x70, 0x3f, 0xff, 0xf3, 0xff, 0xff,
0x70, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x70, 0x3f,
0xff, 0xf3, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xf3,
0xff, 0xff, 0x70, 0x3f, 0xff, 0xf3, 0x6f, 0xfc,
0x10, 0xa, 0xff, 0xa0,
/* U+F04D "" */
0x4, 0x78, 0x88, 0x88, 0x88, 0x87, 0x10, 0x8f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf4, 0x2c, 0xff, 0xff, 0xff, 0xff,
0xff, 0x80,
/* U+F05A "" */
0x0, 0x0, 0x0, 0x47, 0x99, 0x74, 0x0, 0x0,
0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xe6,
0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff,
0xff, 0xb1, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfc, 0x0, 0x9, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xff,
0xff, 0x11, 0xff, 0xff, 0xff, 0xf2, 0x8f, 0xff,
0xff, 0xff, 0x22, 0xff, 0xff, 0xff, 0xf8, 0xdf,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0xff, 0xff, 0xff, 0xe3, 0x13, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xe4, 0x10, 0xdf, 0xff,
0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x60, 0xdf,
0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, 0x60,
0xdf, 0xff, 0xff, 0xfa, 0x5f, 0xff, 0xff, 0xe1,
0x0, 0x1e, 0xff, 0xff, 0xf5, 0xd, 0xff, 0xff,
0xf8, 0x77, 0x8f, 0xff, 0xff, 0xd0, 0x2, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0,
0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0,
0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x20,
0x0, 0x0, 0x0, 0x5, 0xae, 0xff, 0xea, 0x50,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0,
/* U+F060 "" */
0x0, 0x0, 0x0, 0x74, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0,
0x0, 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0,
0x0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0,
0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0,
0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,
0x3f, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, 0x40,
0x3, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x3f, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0,
0x0, 0x3, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x3, 0xd8, 0x0, 0x0, 0x0, 0x0,
/* U+F061 "" */
0x0, 0x0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0xff, 0x90, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x90,
0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,
0x14, 0x44, 0x44, 0x44, 0x44, 0x49, 0xff, 0xd1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfd, 0x10,
0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd1, 0x0,
0x0, 0x0, 0x0, 0x0, 0x5f, 0xfd, 0x10, 0x0,
0x0, 0x0, 0x0, 0x0, 0xff, 0xd1, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xbc, 0x10, 0x0, 0x0,
/* U+F062 "" */
0x0, 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0,
0x0, 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0,
0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xc, 0xff,
0xff, 0xff, 0x60, 0x0, 0x0, 0xcf, 0xfb, 0xff,
0xbf, 0xf6, 0x0, 0xc, 0xff, 0x65, 0xfe, 0xc,
0xff, 0x60, 0xbf, 0xf6, 0x5, 0xfe, 0x0, 0xcf,
0xf5, 0xdf, 0x60, 0x5, 0xfe, 0x0, 0xc, 0xf6,
0x12, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x30, 0x0,
0x0, 0x5, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0,
0x5, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5,
0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfe,
0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0,
0x0, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0,
0x0, 0x0, 0x0, 0x2, 0xfb, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+F063 "" */
0x0, 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0,
0x0, 0x4, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0,
0x5, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5,
0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfe,
0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0,
0x0, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0,
0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x0,
0x7a, 0x10, 0x5, 0xfe, 0x0, 0x4, 0xb2, 0xef,
0xd1, 0x5, 0xfe, 0x0, 0x5f, 0xf7, 0x5f, 0xfd,
0x15, 0xfe, 0x5, 0xff, 0xd1, 0x5, 0xff, 0xc6,
0xfe, 0x4f, 0xfd, 0x10, 0x0, 0x5f, 0xff, 0xff,
0xff, 0xd1, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd,
0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0,
0x0, 0x0, 0x0, 0x5, 0xfd, 0x10, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+F06E "" */
0x0, 0x0, 0x0, 0x0, 0x37, 0x9a, 0x85, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff,
0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0,
0x0, 0x0, 0x1, 0xdf, 0xff, 0xd7, 0x33, 0x5c,
0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xfb,
0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0,
0xaf, 0xff, 0xd0, 0x0, 0xf, 0xc2, 0xa, 0xff,
0xfd, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0xf,
0xfe, 0x2, 0xff, 0xff, 0x80, 0xb, 0xff, 0xff,
0x20, 0x0, 0x8f, 0xff, 0x50, 0xef, 0xff, 0xf1,
0xe, 0xff, 0xff, 0x12, 0xce, 0xff, 0xff, 0x70,
0xdf, 0xff, 0xf3, 0x7, 0xff, 0xff, 0x40, 0xef,
0xff, 0xff, 0x30, 0xff, 0xff, 0xc0, 0x0, 0xef,
0xff, 0xa0, 0x5f, 0xff, 0xf8, 0x6, 0xff, 0xff,
0x30, 0x0, 0x3f, 0xff, 0xf4, 0x2, 0x88, 0x40,
0x1e, 0xff, 0xf7, 0x0, 0x0, 0x6, 0xff, 0xff,
0x70, 0x0, 0x5, 0xef, 0xff, 0xa0, 0x0, 0x0,
0x0, 0x6f, 0xff, 0xff, 0xcb, 0xef, 0xff, 0xf9,
0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff,
0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0,
0x5, 0xbf, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0,
0x0, 0x0, 0x0,
/* U+F070 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xc, 0xfc, 0x10, 0x0, 0x4, 0x8a, 0xa8, 0x61,
0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe3, 0x5,
0xdf, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0,
0x0, 0x6, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff,
0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff,
0xfe, 0x73, 0x24, 0xaf, 0xff, 0xf5, 0x0, 0x0,
0x0, 0x0, 0x1, 0xcf, 0xf2, 0x0, 0x0, 0x5,
0xff, 0xff, 0x40, 0x0, 0x0, 0x7, 0x90, 0x8,
0xfe, 0x30, 0xdd, 0x30, 0x7f, 0xff, 0xe1, 0x0,
0x0, 0x2f, 0xfc, 0x10, 0x5f, 0xf6, 0xef, 0xf2,
0xf, 0xff, 0xfa, 0x0, 0x0, 0x9f, 0xff, 0xe1,
0x2, 0xdf, 0xff, 0xf7, 0xc, 0xff, 0xff, 0x20,
0x0, 0xcf, 0xff, 0xf3, 0x0, 0x1b, 0xff, 0xf9,
0xb, 0xff, 0xff, 0x40, 0x0, 0x5f, 0xff, 0xf6,
0x0, 0x0, 0x7f, 0xf7, 0xd, 0xff, 0xfd, 0x0,
0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xef,
0xaf, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff,
0x60, 0x0, 0x0, 0x2d, 0xff, 0xff, 0x90, 0x0,
0x0, 0x0, 0x4f, 0xff, 0xf8, 0x10, 0x0, 0x0,
0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff,
0xff, 0xfc, 0xbd, 0xb1, 0x6, 0xff, 0x50, 0x0,
0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfd,
0x20, 0x3e, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0,
0x4a, 0xef, 0xff, 0xc7, 0x10, 0x1, 0xcf, 0xc1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0,
0x0, 0x0, 0x9, 0xf6, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20,
/* U+F071 "" */
0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf7, 0x7f,
0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff,
0xf2, 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0,
0xd, 0xff, 0xf2, 0x2f, 0xff, 0xe0, 0x0, 0x0,
0x0, 0x0, 0x8f, 0xff, 0xf2, 0x2f, 0xff, 0xf8,
0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x2f,
0xff, 0xff, 0x20, 0x0, 0x0, 0xb, 0xff, 0xff,
0xf9, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0,
0x0, 0xdf, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff,
0xfd, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x4f,
0xff, 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0,
0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x21, 0x0,
/* U+F073 "" */
0x0, 0x2, 0xa2, 0x0, 0x0, 0x59, 0x10, 0x0,
0x0, 0x9, 0xf9, 0x0, 0x0, 0xdf, 0x50, 0x0,
0x5, 0x6c, 0xfc, 0x66, 0x66, 0xef, 0xa6, 0x40,
0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0xff, 0x84, 0xbf, 0xe4, 0x5f, 0xf8, 0x4b, 0xfc,
0xff, 0x40, 0x8f, 0xc0, 0xf, 0xf4, 0x8, 0xfc,
0xff, 0xa6, 0xcf, 0xe7, 0x8f, 0xfa, 0x6c, 0xfc,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0xff, 0xed, 0xff, 0xfd, 0xef, 0xfe, 0xdf, 0xfc,
0xff, 0x40, 0x8f, 0xc0, 0xf, 0xf4, 0x8, 0xfc,
0xff, 0x50, 0x9f, 0xd0, 0x1f, 0xf5, 0x9, 0xfc,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb,
0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,
0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20,
/* U+F077 "" */
0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x0,
@ -928,6 +1430,159 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x0, 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x10, 0x0, 0x0,
/* U+F0F3 "" */
0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xb4, 0x0,
0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf9,
0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff,
0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff,
0xff, 0xf1, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff,
0xff, 0xff, 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff,
0xff, 0xff, 0xf7, 0x0, 0x0, 0xc, 0xff, 0xff,
0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xef, 0xff,
0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x2f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x9, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x4, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xef,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xbf, 0xf6, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0,
0x0, 0x0,
/* U+F128 "" */
0x0, 0x3b, 0xff, 0xfc, 0x50, 0x0, 0x4f, 0xff,
0xff, 0xff, 0x80, 0xe, 0xfe, 0x65, 0x5c, 0xff,
0x34, 0xff, 0x20, 0x0, 0xd, 0xf8, 0x6f, 0xd0,
0x0, 0x0, 0x9f, 0xa1, 0x94, 0x0, 0x0, 0xc,
0xf9, 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0,
0x0, 0x2c, 0xff, 0xa0, 0x0, 0x0, 0x1e, 0xff,
0x90, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0,
0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x51,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x4, 0xc7, 0x0, 0x0, 0x0, 0x0, 0xbf,
0xf0, 0x0, 0x0, 0x0, 0x6, 0xe9, 0x0, 0x0,
/* U+F1EB "" */
0x0, 0x0, 0x0, 0x0, 0x24, 0x56, 0x53, 0x10,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff,
0xff, 0xff, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0,
0x5, 0xdf, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff,
0xa2, 0x0, 0x0, 0x1c, 0xff, 0xfb, 0x62, 0x0,
0x0, 0x4, 0x8d, 0xff, 0xf7, 0x0, 0x4e, 0xff,
0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf,
0xfa, 0xf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x9f, 0xf7, 0x69, 0x10, 0x0,
0x4, 0x9d, 0xef, 0xeb, 0x71, 0x0, 0x0, 0x5a,
0x10, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff,
0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff,
0xc7, 0x54, 0x69, 0xef, 0xfc, 0x10, 0x0, 0x0,
0x0, 0xc, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x8f,
0xf4, 0x0, 0x0, 0x0, 0x0, 0x26, 0x0, 0x0,
0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x3, 0x50, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff,
0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x4e, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
/* U+F240 "" */
0x0, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x41, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xfe, 0xee,
0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xe0, 0xf,
0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xff, 0x20, 0xff, 0x37, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfe, 0xf, 0xfe, 0x1f, 0xf3, 0x7f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xf3, 0xff,
0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf,
0xff, 0x3f, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xe0, 0xff, 0xf3, 0xff, 0x33, 0x77, 0x77,
0x77, 0x77, 0x77, 0x77, 0xf, 0xf7, 0xe, 0xf8,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x46, 0xff,
0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc0, 0x0, 0x9e, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0xa1, 0x0,
/* U+F241 "" */
0x0, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x41, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf4, 0x0, 0xcf, 0xfe, 0xee,
0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xe0, 0xf,
0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2,
0xff, 0x10, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff,
0x20, 0x0, 0x1f, 0xfe, 0x1f, 0xf3, 0xdf, 0xff,
0xff, 0xff, 0xf2, 0x0, 0x1, 0xff, 0xf3, 0xff,
0x3d, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x1f,
0xff, 0x3f, 0xf3, 0xdf, 0xff, 0xff, 0xff, 0xf2,
0x0, 0x1, 0xff, 0xf3, 0xff, 0x36, 0x77, 0x77,
0x77, 0x77, 0x10, 0x0, 0x1f, 0xf7, 0xe, 0xf8,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0xff,
0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xb0, 0x0, 0x9e, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0xa1, 0x0,
/* U+F242 "" */
0x0, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x41, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf4, 0x0, 0xcf, 0xfe, 0xee,
0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xe0, 0xf,
0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2,
0xff, 0x10, 0xff, 0x3a, 0xff, 0xff, 0xff, 0x10,
0x0, 0x0, 0x1f, 0xfe, 0x1f, 0xf3, 0xaf, 0xff,
0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xff,
0x3a, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x1f,
0xff, 0x3f, 0xf3, 0xaf, 0xff, 0xff, 0xf1, 0x0,
0x0, 0x1, 0xff, 0xf3, 0xff, 0x35, 0x77, 0x77,
0x77, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0xe, 0xf8,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0xff,
0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xb0, 0x0, 0x9e, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0xa1, 0x0,
/* U+F243 "" */
0x0, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x41, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf4, 0x0, 0xcf, 0xfe, 0xee,
0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xe0, 0xf,
0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2,
0xff, 0x10, 0xff, 0x37, 0xff, 0xe0, 0x0, 0x0,
0x0, 0x0, 0x1f, 0xfe, 0x1f, 0xf3, 0x7f, 0xfe,
0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xff,
0x37, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1f,
0xff, 0x3f, 0xf3, 0x7f, 0xfe, 0x0, 0x0, 0x0,
0x0, 0x1, 0xff, 0xf3, 0xff, 0x33, 0x77, 0x70,
0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0xe, 0xf8,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0xff,
0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xb0, 0x0, 0x9e, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0xa1, 0x0,
/* U+F244 "" */
0x0, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x41, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf4, 0x0, 0xcf, 0xfe, 0xee,
0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xe0, 0xf,
0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2,
0xff, 0x10, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x2f, 0xfe, 0x1f, 0xf4, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0xff,
0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f,
0xff, 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x2, 0xff, 0xf3, 0xff, 0x40, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2f, 0xf7, 0xe, 0xf8,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0xff,
0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xb0, 0x0, 0x9e, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0xa1, 0x0,
/* U+F27A "" */
0x7, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
0x70, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
@ -952,6 +1607,22 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0,
0x0, 0x0, 0x0,
/* U+F2CA "" */
0x0, 0x3, 0xbd, 0xc6, 0x0, 0x0, 0x5, 0xff,
0xff, 0xfa, 0x0, 0x0, 0xef, 0xc6, 0xaf, 0xf5,
0x0, 0x3f, 0xf1, 0x0, 0xdf, 0x90, 0x4, 0xff,
0x0, 0xb, 0xfa, 0x0, 0x5f, 0xf0, 0x0, 0xbf,
0xa0, 0x5, 0xff, 0x0, 0xb, 0xfa, 0x0, 0x5f,
0xf0, 0x0, 0xbf, 0xa0, 0x5, 0xff, 0x0, 0xb,
0xfa, 0x0, 0x5f, 0xe0, 0x91, 0xbf, 0xa0, 0x9,
0xfd, 0xf, 0x39, 0xfe, 0x1, 0xff, 0x51, 0xf4,
0x2f, 0xf7, 0x5f, 0xe0, 0xdf, 0xf1, 0x9f, 0xa6,
0xfe, 0xf, 0xff, 0x38, 0xfc, 0x3f, 0xf3, 0x5d,
0x80, 0xdf, 0x90, 0xdf, 0xe4, 0x2, 0xaf, 0xf3,
0x3, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2, 0xbf,
0xff, 0xe6, 0x0, 0x0, 0x0, 0x13, 0x20, 0x0,
0x0,
/* U+F575 "" */
0x6, 0xa1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
0x0, 0xd, 0xfd, 0x10, 0x3, 0xdf, 0xe4, 0x0,
@ -1063,13 +1734,47 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 4776, .adv_w = 176, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 4853, .adv_w = 176, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 4930, .adv_w = 176, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 5007, .adv_w = 195, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 5077, .adv_w = 324, .box_w = 21, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 5277, .adv_w = 288, .box_w = 16, .box_h = 10, .ofs_x = 1, .ofs_y = 3},
{.bitmap_index = 5357, .adv_w = 288, .box_w = 16, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 5437, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 5633, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 5804, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}
{.bitmap_index = 5007, .adv_w = 176, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 5084, .adv_w = 195, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 5154, .adv_w = 324, .box_w = 21, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 5354, .adv_w = 252, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 5450, .adv_w = 216, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 5522, .adv_w = 288, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 5684, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 5855, .adv_w = 324, .box_w = 21, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 6055, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 6226, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 6397, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 6550, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 6702, .adv_w = 180, .box_w = 12, .box_h = 17, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 6804, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 6940, .adv_w = 360, .box_w = 23, .box_h = 18, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 7147, .adv_w = 216, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 7266, .adv_w = 180, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 7350, .adv_w = 216, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 7448, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 7619, .adv_w = 252, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 7731, .adv_w = 252, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 7843, .adv_w = 216, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 7962, .adv_w = 216, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 8081, .adv_w = 324, .box_w = 22, .box_h = 17, .ofs_x = -1, .ofs_y = -2},
{.bitmap_index = 8268, .adv_w = 360, .box_w = 24, .box_h = 20, .ofs_x = -1, .ofs_y = -3},
{.bitmap_index = 8508, .adv_w = 288, .box_w = 20, .box_h = 17, .ofs_x = -1, .ofs_y = -2},
{.bitmap_index = 8678, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 8830, .adv_w = 288, .box_w = 16, .box_h = 10, .ofs_x = 1, .ofs_y = 3},
{.bitmap_index = 8910, .adv_w = 288, .box_w = 16, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 8990, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 9186, .adv_w = 252, .box_w = 17, .box_h = 19, .ofs_x = -1, .ofs_y = -3},
{.bitmap_index = 9348, .adv_w = 180, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 9436, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 9632, .adv_w = 324, .box_w = 21, .box_h = 12, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 9758, .adv_w = 324, .box_w = 21, .box_h = 12, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 9884, .adv_w = 324, .box_w = 21, .box_h = 12, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 10010, .adv_w = 324, .box_w = 21, .box_h = 12, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 10136, .adv_w = 324, .box_w = 21, .box_h = 12, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 10262, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 10433, .adv_w = 180, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 10538, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}
};
/*---------------------
@ -1084,8 +1789,12 @@ static const uint8_t glyph_id_ofs_list_0[] = {
};
static const uint16_t unicode_list_3[] = {
0x0, 0x30, 0x38, 0x39, 0x3a, 0x4b, 0xef65, 0xefc7,
0xefc8, 0xf012, 0xf1ca, 0xf4c5
0x0, 0x30, 0x38, 0x39, 0x3a, 0x3b, 0x4b, 0xe100,
0xef5c, 0xef5d, 0xef61, 0xef63, 0xef65, 0xef67, 0xef69, 0xef71,
0xef73, 0xef76, 0xef77, 0xef78, 0xef9b, 0xef9c, 0xef9d, 0xefaa,
0xefb0, 0xefb1, 0xefb2, 0xefb3, 0xefbe, 0xefc0, 0xefc1, 0xefc3,
0xefc7, 0xefc8, 0xf012, 0xf043, 0xf078, 0xf13b, 0xf190, 0xf191,
0xf192, 0xf193, 0xf194, 0xf1ca, 0xf21a, 0xf4c5
};
/*Collect the unicode lists and glyph_id offsets*/
@ -1105,7 +1814,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] =
},
{
.range_start = 176, .range_length = 62662, .glyph_id_start = 75,
.unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 12, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
.unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 46, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
@ -1127,7 +1836,12 @@ static const uint8_t kern_left_class_mapping[] =
39, 45, 45, 46, 42, 39, 39, 40,
40, 47, 48, 49, 50, 45, 51, 51,
52, 51, 53, 54, 39, 43, 43, 43,
45, 0, 0, 0, 0, 0, 0
43, 45, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0
};
/*Map glyph_ids to kern right classes*/
@ -1143,7 +1857,12 @@ static const uint8_t kern_right_class_mapping[] =
32, 34, 35, 32, 32, 36, 36, 33,
36, 33, 36, 37, 38, 39, 40, 40,
41, 40, 42, 43, 31, 33, 33, 33,
39, 0, 0, 0, 0, 0, 0
33, 39, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0
};
/*Kern values between classes*/
@ -1495,7 +2214,7 @@ lv_font_t montserrat_medium_18 = {
#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 = 20, /*The maximum line height required by the font*/
.line_height = 21, /*The maximum line height required by the font*/
.base_line = 4, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,110 @@
# Symboles perso
# --- Weather ---
set(MY_SYMBOL_CLOUD 0xf0c2) # cloud | UTF-8: "\xEF\x83\x82"
set(MY_SYMBOL_CLOUD_SUN 0xf575) # cloud-sun | UTF-8: "\xEF\x95\xB5"
# --- Navigation ---
set(MY_SYMBOL_UP 0xf077) # chevron-up | UTF-8: "\xEF\x81\xB7"
set(MY_SYMBOL_DOWN 0xf078) # chevron-down | UTF-8: "\xEF\x81\xB8"
# --- Sensors ---
set(MY_SYMBOL_THERMOMETER 0xf2ca) # thermometer | UTF-8: "\xEF\x89\xBA"
set(MY_SYMBOL_MESSAGE 0xf27a) # message | UTF-8: "\xEF\x89\xBA"
# --- Location / House ---
set(MY_THERMOMETER_IN_HOUSE 0xe1b0) # house-user | UTF-8: "\xEE\x86\xB0"
set(MY_THERMOMETER_OUT_HOUSE 0xe1b0) # house-user | UTF-8: "\xEE\x86\xB0"
# ======================================
# LVGL symbols (FontAwesome solid mapped)
# ======================================
# --- Base UI ---
set(LV_SYMBOL_OK 0xf00c) # check
set(LV_SYMBOL_CLOSE 0xf00d) # times
set(LV_SYMBOL_POWER 0xf011) # power-off
set(LV_SYMBOL_SETTINGS 0xf013) # gear
set(LV_SYMBOL_HOME 0xf015) # home
set(LV_SYMBOL_DOWNLOAD 0xf019) # download
set(LV_SYMBOL_REFRESH 0xf021) # refresh
set(LV_SYMBOL_LOCK 0xf023) # lock
set(LV_SYMBOL_WIFI 0xf1eb) # wifi
set(LV_SYMBOL_BELL 0xf0f3) # bell
set(LV_SYMBOL_BATTERY_FULL 0xf240) # battery-full
set(LV_SYMBOL_BATTERY_3 0xf241) # battery-3/4
set(LV_SYMBOL_BATTERY_2 0xf242) # battery-1/2
set(LV_SYMBOL_BATTERY_1 0xf243) # battery-1/4
set(LV_SYMBOL_BATTERY_EMPTY 0xf244) # battery-empty
# --- Navigation ---
set(LV_SYMBOL_LEFT 0xf060) # arrow-left
set(LV_SYMBOL_RIGHT 0xf061) # arrow-right
set(LV_SYMBOL_UP 0xf062) # arrow-up
set(LV_SYMBOL_DOWN 0xf063) # arrow-down
set(LV_SYMBOL_NEXT 0xf061) # alias RIGHT
set(LV_SYMBOL_PREV 0xf060) # alias LEFT
# --- Media / Actions ---
set(LV_SYMBOL_PLAY 0xf04b) # play
set(LV_SYMBOL_PAUSE 0xf04c) # pause
set(LV_SYMBOL_STOP 0xf04d) # stop
set(LV_SYMBOL_EJECT 0xf052) # eject
set(LV_SYMBOL_VOLUME_UP 0xf028)
set(LV_SYMBOL_VOLUME_DOWN 0xf027)
set(LV_SYMBOL_MUTE 0xf026)
# --- Information ---
set(LV_SYMBOL_EYE_OPEN 0xf06e)
set(LV_SYMBOL_EYE_CLOSE 0xf070)
set(LV_SYMBOL_WARNING 0xf071)
set(LV_SYMBOL_INFO 0xf05a)
set(LV_SYMBOL_QUESTION 0xf128)
# --- Time / Status ---
set(LV_SYMBOL_CLOCK 0xf017)
set(LV_SYMBOL_CALENDAR 0xf073)
# --- List of symbols used for font generation ---
set(LVGL_SYMBOLS_CLASSIQUES
${LV_SYMBOL_OK}
${LV_SYMBOL_CLOSE}
${LV_SYMBOL_POWER}
${LV_SYMBOL_SETTINGS}
${LV_SYMBOL_HOME}
${LV_SYMBOL_DOWNLOAD}
${LV_SYMBOL_REFRESH}
${LV_SYMBOL_LOCK}
${LV_SYMBOL_WIFI}
${LV_SYMBOL_BELL}
${LV_SYMBOL_BATTERY_FULL}
${LV_SYMBOL_BATTERY_3}
${LV_SYMBOL_BATTERY_2}
${LV_SYMBOL_BATTERY_1}
${LV_SYMBOL_BATTERY_EMPTY}
${LV_SYMBOL_LEFT}
${LV_SYMBOL_RIGHT}
${LV_SYMBOL_UP}
${LV_SYMBOL_DOWN}
${LV_SYMBOL_PLAY}
${LV_SYMBOL_PAUSE}
${LV_SYMBOL_STOP}
${LV_SYMBOL_VOLUME_UP}
${LV_SYMBOL_VOLUME_DOWN}
${LV_SYMBOL_MUTE}
${LV_SYMBOL_EYE_OPEN}
${LV_SYMBOL_EYE_CLOSE}
${LV_SYMBOL_WARNING}
${LV_SYMBOL_INFO}
${LV_SYMBOL_QUESTION}
${LV_SYMBOL_CLOCK}
${LV_SYMBOL_CALENDAR}
${MY_SYMBOL_CLOUD}
${MY_SYMBOL_CLOUD_SUN}
${MY_SYMBOL_UP}
${MY_SYMBOL_DOWN}
${MY_SYMBOL_THERMOMETER}
${MY_SYMBOL_MESSAGE}
${MY_THERMOMETER_IN_HOUSE}
)

View File

@ -14,6 +14,9 @@ dependencies:
# # `public` flag doesn't have an effect dependencies of the `main` component.
# # All dependencies of `main` are public by default.
# public: true
espressif/esp_lvgl_port: ^2.7.0
espressif/esp_lvgl_port:
rules:
- if: target in ["esp32p4","esp32, "esp32s3"]
version: ^2.7.0
espressif/esp_lcd_qemu_rgb:
version: ^1

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,17 @@
#include "lvgl.h"
extern SemaphoreHandle_t lvgl_mux;
static const char* TAG_BSP="bsp";
bool bsp_display_lock(int timeout_ms)
{
ESP_LOGI(TAG_BSP, "Obtention mutex");
//ESP_LOGI(TAG_BSP, "Obtention mutex");
// Convert timeout in milliseconds to FreeRTOS ticks
// If `timeout_ms` is set to -1, the program will block until the condition is met
const TickType_t timeout_ticks = (timeout_ms == -1) ? portMAX_DELAY : pdMS_TO_TICKS(timeout_ms);
return xSemaphoreTakeRecursive(lvgl_mux, timeout_ticks) == pdTRUE;
//const TickType_t timeout_ticks = (timeout_ms == -1) ? portMAX_DELAY : pdMS_TO_TICKS(timeout_ms);
//return xSemaphoreTakeRecursive(lvgl_mux, timeout_ticks) == pdTRUE;
lv_lock();
return true;
}
void bsp_display_unlock() {
xSemaphoreGiveRecursive(lvgl_mux);
//xSemaphoreGiveRecursive(lvgl_mux);
lv_unlock();
}

View File

@ -17,7 +17,8 @@ void meteo_obs_cb(lv_observer_t *observer, lv_subject_t *subject);
void showMeteoIcon(const char *icon, lv_obj_t *desc_icon, int childNr);
void draw_tabVolets();
void draw_ihm();
void meteoCb(lv_obj_t *base_obj);
void drawHome();
void create_card();

View File

@ -23,6 +23,9 @@ extern "C" {
* TYPEDEFS
**********************/
struct _domotic_theme_t;
typedef struct _domotic_theme_t domotic_theme_t;
/**********************
* GLOBAL PROTOTYPES
**********************/

View File

@ -1,13 +1,12 @@
#pragma once
#include "lvgl.h"
#include "RemindMe.h"
/* input subjects */
/* int: the hour shown on clocks, e.g. 9 */
extern lv_subject_t hourSubj;
/* int: the minute shown on clocks, e.g. 36 */
extern lv_subject_t minuteSubj;
extern lv_subject_t timeGroup;
extern lv_subject_t timeSubj;
extern lv_color_t base;
extern lv_color_t accent;
extern lv_color_t bgColor;
extern RemindMeEvent *events;

View File

@ -9,18 +9,22 @@
*********************/
#if LV_USE_THEME_SIMPLE_DOMOTIC
#include "lv_theme_domotic.h"
#include "lvgl_private.h"
#include <stdio.h>
#include <stdlib.h>
/*********************
* DEFINES
*********************/
LV_FONT_DECLARE(montserrat_medium_12)
LV_FONT_DECLARE(montserrat_medium_18)
LV_FONT_DECLARE(montserrat_medium_24)
LV_FONT_DECLARE(roboto_medium_72)
struct _my_theme_t;
typedef struct _my_theme_t my_theme_t;
void * theme_domotic;
#define theme_def (*(my_theme_t **)(&LV_GLOBAL_DEFAULT()->theme_simple))
#define theme_def (*(domotic_theme_t **)(&theme_domotic))
#define COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4)
#define COLOR_WHITE lv_color_white()
@ -40,6 +44,8 @@ typedef struct {
lv_style_t dark;
lv_style_t dim;
lv_style_t scrollbar;
lv_style_t btn;
lv_style_t card;
#if LV_USE_ARC
lv_style_t arc_line;
lv_style_t arc_knob;
@ -49,9 +55,13 @@ typedef struct {
#endif
} my_theme_styles_t;
struct _my_theme_t {
struct _domotic_theme_t {
lv_theme_t base;
my_theme_styles_t styles;
lv_color_t color_scr;
lv_color_t color_text;
lv_color_t color_card;
lv_color_t color_grey;
bool inited;
};
@ -73,8 +83,52 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj);
* STATIC FUNCTIONS
**********************/
static void style_init(my_theme_t * theme)
static void style_init(domotic_theme_t * theme)
{
theme->color_scr = lv_palette_lighten(LV_PALETTE_BLUE_GREY, 4);
theme->color_text = lv_palette_lighten(LV_PALETTE_BLUE_GREY, 4);
theme->color_card = lv_color_white();
theme->color_grey = lv_palette_lighten(LV_PALETTE_BLUE_GREY, 2);
style_init_reset(&theme->styles.scr);
lv_style_set_bg_opa(&theme->styles.scr, LV_OPA_COVER);
lv_style_set_bg_color(&theme->styles.scr, theme->color_scr);
lv_style_set_text_color(&theme->styles.scr, theme->color_text);
lv_style_set_text_font(&theme->styles.scr, theme->base.font_normal);
//lv_style_set_pad_row(&theme->styles.scr, PAD_SMALL);
//lv_style_set_pad_column(&theme->styles.scr, PAD_SMALL);
//lv_style_set_rotary_sensitivity(&theme->styles.scr, theme->disp_dpi / 4 * 256);
style_init_reset(&theme->styles.btn);
//lv_style_set_radius(&theme->styles.btn,LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 16 : theme->disp_size == DISP_MEDIUM ? 12: 8));
lv_style_set_bg_opa(&theme->styles.btn, LV_OPA_COVER);
lv_style_set_bg_color(&theme->styles.btn, theme->color_grey);
/*if (!(theme->base.flags & MODE_DARK))
{
lv_style_set_shadow_color(&theme->styles.btn, lv_palette_main(LV_PALETTE_GREY));
lv_style_set_shadow_width(&theme->styles.btn, LV_DPX(3));
lv_style_set_shadow_opa(&theme->styles.btn, LV_OPA_50);
lv_style_set_shadow_offset_y(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, LV_DPX(4)));
}*/
lv_style_set_text_color(&theme->styles.btn, theme->color_text);
//lv_style_set_pad_hor(&theme->styles.btn, PAD_DEF);
//lv_style_set_pad_ver(&theme->styles.btn, PAD_SMALL);
//lv_style_set_pad_column(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, 5));
//lv_style_set_pad_row(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, 5));
style_init_reset(&theme->styles.card);
//lv_style_set_radius(&theme->styles.card, RADIUS_DEFAULT);
lv_style_set_bg_opa(&theme->styles.card, 10);
lv_style_set_bg_color(&theme->styles.card, theme->color_card);
lv_style_set_border_color(&theme->styles.card, theme->color_grey);
//lv_style_set_border_width(&theme->styles.card, BORDER_WIDTH);
lv_style_set_border_post(&theme->styles.card, true);
lv_style_set_text_color(&theme->styles.card, theme->color_text);
lv_style_set_text_font(&theme->styles.card, theme->base.font_normal);
lv_style_set_pad_all(&theme->styles.card, 16);
lv_style_set_pad_row(&theme->styles.card, 10);
lv_style_set_pad_column(&theme->styles.card, 10);
lv_style_set_line_color(&theme->styles.card, lv_palette_main(LV_PALETTE_GREY));
//lv_style_set_line_width(&theme->styles.card, LV_DPX_CALC(theme->disp_dpi, 1));
}
/**********************
@ -83,7 +137,7 @@ static void style_init(my_theme_t * theme)
bool lv_theme_domotic_is_inited(void)
{
my_theme_t * theme = theme_def;
domotic_theme_t * theme = theme_def;
if(theme == NULL) return false;
return theme->inited;
}
@ -99,7 +153,7 @@ lv_theme_t * lv_theme_domotic_get(void)
void lv_theme_domotic_deinit(void)
{
my_theme_t * theme = theme_def;
domotic_theme_t * theme = theme_def;
if(theme) {
if(theme->inited) {
lv_style_t * theme_styles = (lv_style_t *)(&(theme->styles));
@ -119,10 +173,10 @@ lv_theme_t * lv_theme_domotic_init(lv_display_t * disp)
*styles' data if LVGL is used in a binding (e.g. MicroPython)
*In a general case styles could be in simple `static lv_style_t my_style...` variables*/
if(!lv_theme_domotic_is_inited()) {
theme_def = lv_malloc_zeroed(sizeof(my_theme_t));
theme_def = lv_malloc_zeroed(sizeof(domotic_theme_t));
}
my_theme_t * theme = theme_def;
domotic_theme_t * theme = theme_def;
theme->base.disp = disp;
theme->base.font_small = &montserrat_medium_12;
@ -130,8 +184,8 @@ lv_theme_t * lv_theme_domotic_init(lv_display_t * disp)
theme->base.font_large = &montserrat_medium_24;
theme->base.apply_cb = theme_apply;
lv_theme_t * th_act = lv_display_get_theme(NULL);
lv_theme_set_parent((lv_theme_t *)theme, th_act);
lv_theme_t * th_simple = lv_theme_simple_init(disp);
lv_theme_set_parent((lv_theme_t *)theme, th_simple);
style_init(theme);
@ -148,7 +202,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
{
LV_UNUSED(th);
my_theme_t * theme = theme_def;
domotic_theme_t * theme = theme_def;
lv_obj_t * parent = lv_obj_get_parent(obj);
if(parent == NULL) {
@ -157,6 +211,29 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
return;
}
// On ne passe pas par une variable KCONFIG pour ne pas avoir a recompiler
const char *borderEnv = getenv("DOM_SHOW_BORDER");
int border = atoi(borderEnv ? borderEnv : "0");
if(border)
lv_obj_set_style_border_width(obj,1,0);
if (lv_obj_check_type(obj, &lv_obj_class))
{
lv_obj_add_style(obj, &theme->styles.card, 0);
lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR);
//lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED);
}
//lv_obj_set_style_text_color(obj, lv_color_white(), 0);
//lv_obj_set_style_text_font(obj, ((my_theme_t*)theme_domotic)->base.font_normal,0);
if (lv_obj_check_type(obj, &lv_button_class)){
lv_obj_add_style(obj, &theme->styles.btn,0);
lv_obj_set_style_text_color(obj, lv_color_black(), 0);
lv_obj_set_style_text_font(obj, theme->base.font_large, 0);
//lv_obj_set_style_bg_color(obj, lv_color_hex(0x6B6969), 0);
lv_obj_set_style_pad_all(obj,10,0);
lv_obj_set_style_margin_all(obj, 0, 0);
}
}
/**********************

View File

@ -1,8 +1,6 @@
#include "model.h"
lv_subject_t hourSubj;
/* int: the minute shown on clocks, e.g. 36 */
lv_subject_t minuteSubj;
lv_subject_t timeGroup;
lv_subject_t timeSubj;
RemindMeEvent *events;
//lv_color_t base = LV_COLOR_MAKE(126, 94, 133);
//lv_color_t accent = LV_COLOR_MAKE(204, 16, 16);

View File

@ -10,6 +10,7 @@ list(APPEND EXTRA_COMPONENT_DIRS
../../meteofrance
../../stateManagement
../../eventsManager
../../RemindMe
)
idf_build_set_property(COMPILE_DEFINITIONS "NO_DEBUG_STORAGE" APPEND)

View File

@ -0,0 +1,14 @@
[
{
"evenement": "Fête",
"affichage": "Noel est dans %d jour(s)",
"date": "2025-12-25",
"type": "remaining_days"
},
{
"evenement": "Ecole",
"affichage": "La rentrée est dans %d jour(s)",
"date": "2026-01-05",
"type": "remaining_days"
}
]

View File

@ -11,7 +11,8 @@ dependencies:
type: service
version: 9.4.0
direct_dependencies:
- idf
- lvgl/lvgl
manifest_hash: b69f67d8253596e504fba179d3e69969cb4958216d37d471849a023add797535
manifest_hash: c3178a7d5dcb1c033d1e27022341dbe9157f2399224612db51cd652145d429de
target: linux
version: 2.0.0

View File

@ -2,6 +2,7 @@ set(LV_BUILD_USE_KCONFIG ON)
idf_component_register(SRCS
"test_ihm.c"
"../../ihm.c"
"../../lv_theme_domotic.c"
"../../model.c"
"driver_backends.c"
"sdl.c"
@ -10,12 +11,15 @@ idf_component_register(SRCS
"../../fonts/montserrat_medium_24.c"
"../../fonts/roboto_medium_36.c"
"../../fonts/roboto_medium_72.c"
"../../fonts/vlump_96.c"
"../../fonts/super_malibu_80.c"
"../../images/wifi_ko.c"
"../../images/wifi_ok.c"
INCLUDE_DIRS
"../../include"
"../mock"
WHOLE_ARCHIVE
REQUIRES lvgl meteofrance)
REQUIRES lvgl meteofrance RemindMe)
message("Including SDL2 support")
find_package(PkgConfig REQUIRED)

View File

@ -1,5 +1,6 @@
#define LV_USE_SDL 1
#define LV_FONT_DEFAULT &roboto_medium_36
#include <stdio.h>
#include "esp_wifi.h"
@ -12,6 +13,7 @@
#include "simulator_settings.h"
#include "esp_log.h"
#include "eventsManager.h"
#include "RemindMe.h"
esp_mqtt_client_handle_t client;
SemaphoreHandle_t lvgl_mux;
@ -116,27 +118,6 @@ static void configure_simulator(int argc, char **argv)
}
static void
clock_timer_cb(lv_timer_t *t)
{
/* slowly increment the time */
int32_t minutes = lv_subject_get_int(&minuteSubj);
minutes += 1;
if (minutes > 59)
{
minutes = 0;
int32_t hour = lv_subject_get_int(&hourSubj);
hour += 1;
if (hour > 12)
{
hour = 1;
}
lv_subject_set_int(&hourSubj, hour);
}
lv_subject_set_int(&minuteSubj, minutes);
}
int app_main(int argc, char *argv[])
{
/* code */
@ -159,19 +140,33 @@ int app_main(int argc, char *argv[])
lv_sdl_mousewheel_create();
lv_sdl_mousewheel_create();
size_t watermark = uxTaskGetStackHighWaterMark(NULL);
ESP_LOGI("STACK", "Remaining stack: %d bytes", watermark);
//size_t watermark = uxTaskGetStackHighWaterMark(NULL);
//ESP_LOGI("STACK", "Remaining stack: %d bytes", watermark);
lv_subject_init_int(&hourSubj, 9);
lv_subject_init_int(&minuteSubj, 36);
lv_subject_t *grp[2] = {&hourSubj, &minuteSubj};
lv_subject_init_group(&timeGroup, grp,2);
time_t now;
struct tm timeinfo;
time(&now);
localtime_r(&now, &timeinfo);
/*lv_timer_t *clock_timer = */lv_timer_create(clock_timer_cb, 1000, NULL);
lv_subject_init_pointer(&timeSubj, &timeinfo);
/*lv_timer_t *clock_timer = lv_timer_create(clock_timer_cb, 1000, NULL);*/
//draw_ihm();
startEvtManager();
int count=0;
events=get_events(&count);
if (!events)
{
ESP_LOGE("test", "Aucun événement chargé");
return 0;
} // Parcourir tous les événements
for (int i = 0; i < count; i++)
{
ESP_LOGI("test", "%s", events[i].affichage);
}
xTaskCreate(drawIhm, "LVGL", 128 * 1024, getIHMQueueHandle(), 3, NULL);
send_event(EVT_WIFI_CONNECTED,NULL);
meteodailyforecast_data dts = {
@ -185,9 +180,13 @@ int app_main(int argc, char *argv[])
}
};
extern lv_subject_t forecastD1Subj;
extern lv_subject_t forecastD2Subj;
extern lv_subject_t forecastD3Subj;
ESP_LOGI("test_ihm", "Setting forecastD1Subj");
lv_subject_set_pointer(&forecastD1Subj, &dts);
lv_subject_set_pointer(&forecastD2Subj, &dts);
lv_subject_set_pointer(&forecastD3Subj, &dts);
/* Enter the run loop of the selected backend */
driver_backends_run_loop();

View File

@ -1,3 +1,3 @@
idf_component_register(SRCS "eventsManager.c"
idf_component_register(SRCS "eventsManager.c" obtain_time.c
INCLUDE_DIRS "include"
REQUIRES mqtt)

View File

@ -3,6 +3,8 @@
#include "eventsManager.h"
#include "esp_log.h"
#include "mqtt_client.h"
#include "obtain_time.h"
#include <time.h>
EventGroupHandle_t domotic_event_group;
QueueHandle_t ihm_queue;
@ -13,6 +15,14 @@ static const char *TAG = "evtMgr";
void startEvtManager(){
domotic_event_group = xEventGroupCreate();
ihm_queue = xQueueCreate(10,sizeof(xIHMEvent_t *));
/* Tache updateTime */
BaseType_t ret2 = xTaskCreate(&updateTime, "updateTimeTask", 3 * 1024, NULL, 5, NULL);
if (ret2 != pdPASS)
{
ESP_LOGE(TAG, "Impossiblke de creer la tache updateTimeTask %i", ret2);
}
/* Tache updateTime - FIN*/
}
QueueHandle_t getIHMQueueHandle(){
@ -48,14 +58,23 @@ void send_event(domo_events evt, void* pDatas) {
}
case EVT_TIME_SETTED:
const char *msg = (const char *)pDatas;
char *msg_copy = malloc(strlen(msg) + 1);
if (!msg_copy) {
struct tm *msg = (struct tm *)pDatas;
struct tm *msg_copy = malloc(sizeof(struct tm));
if (!msg_copy)
{
ESP_LOGE(TAG, "malloc failed for message string");
free(ihmEvt);
return;
}
strcpy(msg_copy, msg);
// Vérifier que msg n'est pas NULL avant de copier
if (msg == NULL)
{
fprintf(stderr, "msg est NULL !\n");
free(msg_copy);
return;
}
*msg_copy = *msg;
ihmEvt->eEventType = IHM_EVT_TIME_SETTED;
ihmEvt->pvData = msg_copy;
ihmEvt->bNeedToFreeData = true;

View File

@ -1,3 +1,4 @@
#pragma once
#include <stdbool.h>
#include "freertos/FreeRTOS.h"

View File

@ -1,4 +1,5 @@
#pragma once
#include "eventsManager.h"
void obtain_time();
void updateTime(void *pvParameter);

View File

@ -1,17 +1,38 @@
#include "esp_log.h"
#include "obtain_time.h"
#include <time.h>
#ifdef CONFIG_IDF_TARGET_LINUX
#else
#include "esp_netif_sntp.h"
#include "esp_sntp.h"
#include "obtain_time.h"
#include "esp_lvgl_port.h"
#include "ihm.h"
#include "eventsManager.h"
#endif
static const char *TAG = "sntp";
extern lv_subject_t dateHeureSubj;
char *days[7]={"Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"};
char *months[12]={"Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"};
#ifdef CONFIG_IDF_TARGET_LINUX
void updateTime(void *pvParameter)
{
while (1)
{
char strftime_buf[64];
// Set timezone to Eastern Standard Time and print local time
time_t now;
struct tm timeinfo;
time(&now);
localtime_r(&now, &timeinfo);
// strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
sprintf(strftime_buf, "%s %d %s %02d:%02d", days[timeinfo.tm_wday], timeinfo.tm_mday, months[timeinfo.tm_mon], timeinfo.tm_hour, timeinfo.tm_min);
localtime_r(&now, &timeinfo);
ESP_LOGE(TAG, "%s", strftime_buf);
send_event(EVT_TIME_SETTED, &timeinfo);
vTaskDelay(10000 / portTICK_PERIOD_MS);
}
}
#else
void time_sync_notification_cb(struct timeval *tv)
{
ESP_LOGI(TAG, "Notification of a time synchronization event");
@ -22,36 +43,29 @@ void time_sync_notification_cb(struct timeval *tv)
struct tm timeinfo;
time(&now);
localtime_r(&now, &timeinfo);
//strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
// strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
sprintf(strftime_buf, "%s %d %s %02d:%02d", days[timeinfo.tm_wday], timeinfo.tm_mday, months[timeinfo.tm_mon], timeinfo.tm_hour, timeinfo.tm_min);
localtime_r(&now, &timeinfo);
send_event(EVT_TIME_SETTED,&strftime_buf);
send_event(EVT_TIME_SETTED, &strftime_buf);
}
void obtain_time()
{
}
void updateTime(void *pvParameter)
{
// Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
// number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above)
EventBits_t bits = xEventGroupWaitBits(domotic_event_group,
// Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
// number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above)
EventBits_t bits = xEventGroupWaitBits(domotic_event_group,
WIFI_CONNECTED_BIT,
pdFALSE,
pdFALSE,
portMAX_DELAY);
if (bits & WIFI_CONNECTED_BIT)
{
ESP_LOGI(TAG, "Initializing and starting SNTP");
esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG("pool.ntp.org");
config.sync_cb = time_sync_notification_cb; // Note: This is only needed if we want
esp_netif_sntp_init(&config);
}
if (bits & WIFI_CONNECTED_BIT)
{
ESP_LOGI(TAG, "Initializing and starting SNTP");
esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG("pool.ntp.org");
config.sync_cb = time_sync_notification_cb; // Note: This is only needed if we want
esp_netif_sntp_init(&config);
}
char strftime_buf[64];
time_t now = 0;
@ -62,8 +76,9 @@ void updateTime(void *pvParameter)
tzset();
struct tm timeinfo = {0};
localtime_r(&now, &timeinfo);
sprintf(strftime_buf, "%s %d %s %02d:%02d (%lli mn depuis reboot)", days[timeinfo.tm_wday], timeinfo.tm_mday, months[timeinfo.tm_mon], timeinfo.tm_hour, timeinfo.tm_min, (esp_timer_get_time()/1000/1000/60));
send_event(EVT_TIME_SETTED,&strftime_buf);
sprintf(strftime_buf, "%s %d %s %02d:%02d (%lli mn depuis reboot)", days[timeinfo.tm_wday], timeinfo.tm_mday, months[timeinfo.tm_mon], timeinfo.tm_hour, timeinfo.tm_min, (esp_timer_get_time() / 1000 / 1000 / 60));
send_event(EVT_TIME_SETTED, &strftime_buf);
vTaskDelay(60000 / portTICK_PERIOD_MS);
}
}
#endif

View File

@ -28,17 +28,16 @@ dependencies:
type: idf
version: 5.5.1
lvgl/lvgl:
component_hash: 17e68bfd21f0edf4c3ee838e2273da840bf3930e5dbc3bfa6c1190c3aed41f9f
dependencies: []
source:
registry_url: https://components.espressif.com/
type: service
path: /home/marc/domotic/components/lvgl__lvgl
type: local
version: 9.4.0
direct_dependencies:
- espressif/esp_lcd_qemu_rgb
- espressif/esp_lvgl_port
- idf
- lvgl/lvgl
manifest_hash: 4a989d30745f733fc51683ed96b30ee3e7197a9e4e574ab641985cab5013c2be
manifest_hash: 6dfd2d16dd4d21f701b251046402dbd6cb442f0c69beab0ba9af1b2ef32c7367
target: esp32s3
version: 2.0.0

View File

@ -1006,13 +1006,6 @@ void app_main(void)
ESP_LOGE(TAG, "Impossiblke de creer la tache imageDownload_task %i", ret1);
}
/* Tache updateTime */
BaseType_t ret2 = xTaskCreate(&updateTime, "updateTimeTask", 3 * 1024, NULL, 5, NULL);
if (ret2 != pdPASS)
{
ESP_LOGE(TAG, "Impossiblke de creer la tache updateTimeTask %i", ret2);
}
/* Tache updateTime - FIN*/
mqtt_app_start(mqtt_cb, domotic_event_group);

View File

@ -36,6 +36,10 @@ CONFIG_LV_USE_CLIB_STRING=y
CONFIG_LV_USE_CLIB_SPRINTF=y
CONFIG_LV_DEF_REFR_PERIOD=10
CONFIG_LV_USE_DRAW_SW_COMPLEX_GRADIENTS=y
CONFIG_LV_USE_OBJ_ID=y
CONFIG_LV_USE_OBJ_NAME=y
CONFIG_LV_OBJ_ID_AUTO_ASSIGN=y
CONFIG_LV_USE_LOG=y
CONFIG_LV_LOG_PRINTF=y
CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM=y