From d88ac242c3cc28690fe078b64a19d994df2990e3 Mon Sep 17 00:00:00 2001 From: Marc Date: Wed, 31 Jul 2024 22:13:10 +0200 Subject: [PATCH] ok --- .vscode/settings.json | 27 +- components/http/CMakeLists.txt | 2 + components/http/http.c | 159 +++ components/http/include/http.h | 49 + components/jsmn/CMakeLists.txt | 2 + components/jsmn/include/jsmn.h | 471 +++++++ components/jsmn/jsmn.c | 7 + components/meteofrance/CMakeLists.txt | 3 + components/meteofrance/include/meteofrance.h | 40 + components/meteofrance/meteofrance.c | 266 ++++ components/weather/CMakeLists.txt | 3 + components/weather/Kconfig.projbuild | 11 + components/weather/component.mk | 2 + components/weather/include/weather.h | 40 + components/weather/weather.c | 183 +++ main/CMakeLists.txt | 18 +- main/fonts/montserrat_medium_12.c | 881 +++++++++++++ main/fonts/montserrat_medium_18.c | 1158 ++++++++++++++++++ main/fonts/notomedium16.c | 692 +++++++++++ main/images/E.svg | 8 + main/images/ENE.svg | 8 + main/images/ESE.svg | 10 + main/images/N.svg | 10 + main/images/NNO.svg | 9 + main/images/NO.svg | 9 + main/images/O.svg | 9 + main/images/ONO.svg | 9 + main/images/OSO.svg | 9 + main/images/S.svg | 9 + main/images/SE.svg | 9 + main/images/SO.svg | 9 + main/images/SSE.svg | 9 + main/images/SSO.svg | 9 + main/images/Variable.svg | 10 + main/images/images.txt | 27 + main/images/p14bisj.png | Bin 0 -> 1668 bytes main/images/p14bisj.svg | 55 + main/images/p14j.png | Bin 0 -> 1668 bytes main/images/p14j.svg | 55 + main/images/p16bisj.png | Bin 0 -> 1994 bytes main/images/p16bisj.svg | 47 + main/images/p1j.png | Bin 0 -> 1341 bytes main/images/p1j.svg | 1 + main/images/p1n.png | Bin 0 -> 1747 bytes main/images/p1n.svg | 1 + main/images/p24j.png | Bin 0 -> 2376 bytes main/images/p24j.svg | 1 + main/images/p25j.png | Bin 0 -> 1971 bytes main/images/p25j.svg | 1 + main/images/p26j.png | Bin 0 -> 1721 bytes main/images/p26j.svg | 1 + main/images/p26j.svg.1 | 1 + main/images/p26n.png | Bin 0 -> 1970 bytes main/images/p26n.svg | 1 + main/images/p27j.png | Bin 0 -> 1203 bytes main/images/p27j.svg | 1 + main/images/p29j.png | Bin 0 -> 1561 bytes main/images/p29j.svg | 1 + main/images/p2j.png | Bin 0 -> 2157 bytes main/images/p2j.svg | 13 + main/images/p2n.png | Bin 0 -> 2488 bytes main/images/p2n.svg | 32 + main/images/p3j.png | Bin 0 -> 1120 bytes main/images/p3j.svg | 1 + main/images/p4j.png | Bin 0 -> 1838 bytes main/images/p4j.svg | 17 + main/images/p4n.png | Bin 0 -> 1879 bytes main/images/p4n.svg | 34 + main/main.c | 776 ++++++++---- sdkconfig | 37 +- 70 files changed, 4974 insertions(+), 279 deletions(-) create mode 100644 components/http/CMakeLists.txt create mode 100644 components/http/http.c create mode 100644 components/http/include/http.h create mode 100644 components/jsmn/CMakeLists.txt create mode 100644 components/jsmn/include/jsmn.h create mode 100644 components/jsmn/jsmn.c create mode 100644 components/meteofrance/CMakeLists.txt create mode 100644 components/meteofrance/include/meteofrance.h create mode 100644 components/meteofrance/meteofrance.c create mode 100644 components/weather/CMakeLists.txt create mode 100644 components/weather/Kconfig.projbuild create mode 100644 components/weather/component.mk create mode 100644 components/weather/include/weather.h create mode 100644 components/weather/weather.c create mode 100644 main/fonts/montserrat_medium_12.c create mode 100644 main/fonts/montserrat_medium_18.c create mode 100644 main/fonts/notomedium16.c create mode 100644 main/images/E.svg create mode 100644 main/images/ENE.svg create mode 100644 main/images/ESE.svg create mode 100644 main/images/N.svg create mode 100644 main/images/NNO.svg create mode 100644 main/images/NO.svg create mode 100644 main/images/O.svg create mode 100644 main/images/ONO.svg create mode 100644 main/images/OSO.svg create mode 100644 main/images/S.svg create mode 100644 main/images/SE.svg create mode 100644 main/images/SO.svg create mode 100644 main/images/SSE.svg create mode 100644 main/images/SSO.svg create mode 100644 main/images/Variable.svg create mode 100644 main/images/images.txt create mode 100644 main/images/p14bisj.png create mode 100644 main/images/p14bisj.svg create mode 100644 main/images/p14j.png create mode 100644 main/images/p14j.svg create mode 100644 main/images/p16bisj.png create mode 100644 main/images/p16bisj.svg create mode 100644 main/images/p1j.png create mode 100644 main/images/p1j.svg create mode 100644 main/images/p1n.png create mode 100644 main/images/p1n.svg create mode 100644 main/images/p24j.png create mode 100644 main/images/p24j.svg create mode 100644 main/images/p25j.png create mode 100644 main/images/p25j.svg create mode 100644 main/images/p26j.png create mode 100644 main/images/p26j.svg create mode 100644 main/images/p26j.svg.1 create mode 100644 main/images/p26n.png create mode 100644 main/images/p26n.svg create mode 100644 main/images/p27j.png create mode 100644 main/images/p27j.svg create mode 100644 main/images/p29j.png create mode 100644 main/images/p29j.svg create mode 100644 main/images/p2j.png create mode 100644 main/images/p2j.svg create mode 100644 main/images/p2n.png create mode 100644 main/images/p2n.svg create mode 100644 main/images/p3j.png create mode 100644 main/images/p3j.svg create mode 100644 main/images/p4j.png create mode 100644 main/images/p4j.svg create mode 100644 main/images/p4n.png create mode 100644 main/images/p4n.svg diff --git a/.vscode/settings.json b/.vscode/settings.json index 1d461f8..203a465 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,30 @@ "board/esp32s3-builtin.cfg" ], "idf.flashType": "UART", - "idf.portWin": "COM12" + "idf.portWin": "COM12", + "files.associations": { + "string_view": "c", + "regex": "c", + "bitset": "c", + "chrono": "c", + "random": "c", + "limits": "c", + "string": "c", + "format": "c", + "*.tcc": "c", + "ctime": "c", + "iomanip": "c", + "task.h": "c", + "semaphore": "c", + "typeinfo": "c", + "freertos.h": "c", + "esp_err.h": "c", + "esp_lcd_panel_rgb.h": "c", + "esp_lcd_touch_gt911.h": "c", + "esp_lcd_panel_io.h": "c", + "esp_check.h": "c", + "compare": "c", + "cstdint": "c" + }, + "search.useIgnoreFiles": false } \ No newline at end of file diff --git a/components/http/CMakeLists.txt b/components/http/CMakeLists.txt new file mode 100644 index 0000000..78f19f0 --- /dev/null +++ b/components/http/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "http.c" + INCLUDE_DIRS "include") diff --git a/components/http/http.c b/components/http/http.c new file mode 100644 index 0000000..87539ee --- /dev/null +++ b/components/http/http.c @@ -0,0 +1,159 @@ +/* + http.c - HTTP request routines + + File based on https://github.com/espressif/esp-idf/tree/master/examples/03_http_request + + This file is part of the ESP32 Everest Run project + https://github.com/krzychb/esp32-everest-run + + Copyright (c) 2016 Krzysztof Budzynski + This work is licensed under the Apache License, Version 2.0, January 2004 + See the file LICENSE for details. +*/ + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "esp_log.h" + +#include +#include "lwip/err.h" +#include "lwip/sockets.h" +#include "lwip/sys.h" +#include "lwip/netdb.h" +#include "lwip/dns.h" + +#include "http.h" + +#define RECV_BUFFER_SIZE 64 +static const char* TAG = "HTTP"; + + +void http_client_on_connected(http_client_data *client, http_callback http_on_connected_cb) +{ + client->http_connected_cb = http_on_connected_cb; +} + +void http_client_on_process_chunk(http_client_data *client, http_callback http_process_chunk_cb) +{ + client->http_process_chunk_cb = http_process_chunk_cb; +} + +void http_client_on_disconnected(http_client_data *client, http_callback http_disconnected_cb) +{ + client->http_disconnected_cb = http_disconnected_cb; +} + +esp_err_t http_client_request(http_client_data *client, const char *web_server, const char *request_string) +{ + const struct addrinfo hints = { + .ai_family = AF_INET, + .ai_socktype = SOCK_STREAM, + }; + struct addrinfo *res; + struct in_addr *addr; + int s, r; + char recv_buf[RECV_BUFFER_SIZE]; + + client->recv_buf = recv_buf; + client->recv_buf_size = sizeof(recv_buf); + + int err = getaddrinfo(web_server, "80", &hints, &res); + + if (err != 0 || res == NULL) { + ESP_LOGE(TAG, "DNS lookup failed err=%d res=%p", err, res); + vTaskDelay(1000 / portTICK_PERIOD_MS); + return ESP_ERR_HTTP_DNS_LOOKUP_FAILED; + } + + /* Code to print the resolved IP. + Note: inet_ntoa is non-reentrant, look at ipaddr_ntoa_r for "real" code + */ + addr = &((struct sockaddr_in *)res->ai_addr)->sin_addr; + ESP_LOGI(TAG, "DNS lookup succeeded. IP=%s", inet_ntoa(*addr)); + + s = socket(res->ai_family, res->ai_socktype, 0); + if (s < 0) { + ESP_LOGE(TAG, "... Failed to allocate socket."); + freeaddrinfo(res); + vTaskDelay(1000 / portTICK_PERIOD_MS); + return ESP_ERR_HTTP_FAILED_TO_ALLOCATE_SOCKET; + } + ESP_LOGI(TAG, "... allocated socket"); + + if (connect(s, res->ai_addr, res->ai_addrlen) != 0) { + ESP_LOGE(TAG, "... socket connect failed errno=%d", errno); + close(s); + freeaddrinfo(res); + vTaskDelay(4000 / portTICK_PERIOD_MS); + return ESP_ERR_HTTP_SOCKET_CONNECT_FAILED; + } + + ESP_LOGI(TAG, "... connected"); + freeaddrinfo(res); + if (client->http_connected_cb) { + client->http_connected_cb((uint32_t*) client); + } + + if (write(s, request_string, strlen(request_string)) < 0) { + ESP_LOGE(TAG, "... socket send failed"); + close(s); + vTaskDelay(4000 / portTICK_PERIOD_MS); + return ESP_ERR_HTTP_SOCKET_SEND_FAILED; + } + ESP_LOGI(TAG, "... socket send success"); + + /* Read HTTP response */ + do { + bzero(recv_buf, sizeof(recv_buf)); + r = read(s, recv_buf, sizeof(recv_buf)-1); + if (client->http_process_chunk_cb) { + client->http_process_chunk_cb((uint32_t*) client); + } + } while (r > 0); + + ESP_LOGI(TAG, "... done reading from socket. Last read return=%d errno=%d", r, errno); + close(s); + if (client->http_disconnected_cb) { + client->http_disconnected_cb((uint32_t*) client); + } + return ESP_OK; +} + +/* Out of HTTP response return pointer to response body + Function return NULL if end of header cannot be identified + */ +const char* find_response_body(char * response) +{ + // Identify end of the response headers + // http://stackoverflow.com/questions/11254037/how-to-know-when-the-http-headers-part-is-ended + char * eol; // end of line + char * bol; // beginning of line + bool nheaderfound = false; // end of response headers has been found + + bol = response; + while ((eol = index(bol, '\n')) != NULL) { + // update bol based upon the value of eol + bol = eol + 1; + // test if end of headers has been reached + if ( (!(strncmp(bol, "\r\n", 2))) || (!(strncmp(bol, "\n", 1))) ) + { + // note that end of headers has been found + nheaderfound = true; + // update the value of bol to reflect the beginning of the line + // immediately after the headers + if (bol[0] != '\n') { + bol += 1; + } + bol += 1; + break; + } + } + if (nheaderfound) { + return bol; + } else { + return NULL; + } +} + + diff --git a/components/http/include/http.h b/components/http/include/http.h new file mode 100644 index 0000000..7a72b79 --- /dev/null +++ b/components/http/include/http.h @@ -0,0 +1,49 @@ +/* + http.h - HTTP request routines + + This file is part of the ESP32 Everest Run project + https://github.com/krzychb/esp32-everest-run + + Copyright (c) 2016 Krzysztof Budzynski + This work is licensed under the Apache License, Version 2.0, January 2004 + See the file LICENSE for details. +*/ +#ifndef HTTP_H +#define HTTP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_err.h" + +typedef void (*http_callback)(uint32_t *args); + +typedef struct { + char *recv_buf; /*!< Pointer to a receive buffer, data from the socket are collected here */ + int recv_buf_size; /*!< Size of the receive buffer */ + char *proc_buf; /*!< Pointer to processing buffer, chunks of data from receive buffer and collected here. */ + int proc_buf_size; /*!< Size of processing buffer*/ + http_callback http_connected_cb; /*!< Pointer to function called once socket connection is established */ + http_callback http_process_chunk_cb; /*!< Pointer to function called to process contents of receive buffer, once it is filled up */ + http_callback http_disconnected_cb; /*!< Pointer to function called after disconnecting from the socket */ +} http_client_data; + +#define ESP_ERR_HTTP_BASE 0x40000 +#define ESP_ERR_HTTP_DNS_LOOKUP_FAILED (ESP_ERR_HTTP_BASE + 1) +#define ESP_ERR_HTTP_FAILED_TO_ALLOCATE_SOCKET (ESP_ERR_HTTP_BASE + 2) +#define ESP_ERR_HTTP_SOCKET_CONNECT_FAILED (ESP_ERR_HTTP_BASE + 3) +#define ESP_ERR_HTTP_SOCKET_SEND_FAILED (ESP_ERR_HTTP_BASE + 4) + +const char* find_response_body(char * response); +void http_client_on_connected(http_client_data *client, http_callback http_connected_cb); +void http_client_on_process_chunk(http_client_data *client, http_callback http_process_chunk_cb); +void http_client_on_disconnected(http_client_data *client, http_callback http_disconnected_cb); +esp_err_t http_client_request(http_client_data *client, const char *web_server, const char *request_string); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/jsmn/CMakeLists.txt b/components/jsmn/CMakeLists.txt new file mode 100644 index 0000000..776aa30 --- /dev/null +++ b/components/jsmn/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "jsmn.c" + INCLUDE_DIRS "include") diff --git a/components/jsmn/include/jsmn.h b/components/jsmn/include/jsmn.h new file mode 100644 index 0000000..a1f17b7 --- /dev/null +++ b/components/jsmn/include/jsmn.h @@ -0,0 +1,471 @@ +/* + * MIT License + * + * Copyright (c) 2010 Serge Zaitsev + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef JSMN_H +#define JSMN_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef JSMN_STATIC +#define JSMN_API static +#else +#define JSMN_API extern +#endif + +/** + * JSON type identifier. Basic types are: + * o Object + * o Array + * o String + * o Other primitive: number, boolean (true/false) or null + */ +typedef enum { + JSMN_UNDEFINED = 0, + JSMN_OBJECT = 1 << 0, + JSMN_ARRAY = 1 << 1, + JSMN_STRING = 1 << 2, + JSMN_PRIMITIVE = 1 << 3 +} jsmntype_t; + +enum jsmnerr { + /* Not enough tokens were provided */ + JSMN_ERROR_NOMEM = -1, + /* Invalid character inside JSON string */ + JSMN_ERROR_INVAL = -2, + /* The string is not a full JSON packet, more bytes expected */ + JSMN_ERROR_PART = -3 +}; + +/** + * JSON token description. + * type type (object, array, string etc.) + * start start position in JSON data string + * end end position in JSON data string + */ +typedef struct jsmntok { + jsmntype_t type; + int start; + int end; + int size; +#ifdef JSMN_PARENT_LINKS + int parent; +#endif +} jsmntok_t; + +/** + * JSON parser. Contains an array of token blocks available. Also stores + * the string being parsed now and current position in that string. + */ +typedef struct jsmn_parser { + unsigned int pos; /* offset in the JSON string */ + unsigned int toknext; /* next token to allocate */ + int toksuper; /* superior token node, e.g. parent object or array */ +} jsmn_parser; + +/** + * Create JSON parser over an array of tokens + */ +JSMN_API void jsmn_init(jsmn_parser *parser); + +/** + * Run JSON parser. It parses a JSON data string into and array of tokens, each + * describing + * a single JSON object. + */ +JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, + jsmntok_t *tokens, const unsigned int num_tokens); + +#ifndef JSMN_HEADER +/** + * Allocates a fresh unused token from the token pool. + */ +static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, jsmntok_t *tokens, + const size_t num_tokens) { + jsmntok_t *tok; + if (parser->toknext >= num_tokens) { + return NULL; + } + tok = &tokens[parser->toknext++]; + tok->start = tok->end = -1; + tok->size = 0; +#ifdef JSMN_PARENT_LINKS + tok->parent = -1; +#endif + return tok; +} + +/** + * Fills token type and boundaries. + */ +static void jsmn_fill_token(jsmntok_t *token, const jsmntype_t type, + const int start, const int end) { + token->type = type; + token->start = start; + token->end = end; + token->size = 0; +} + +/** + * Fills next available token with JSON primitive. + */ +static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, + const size_t len, jsmntok_t *tokens, + const size_t num_tokens) { + jsmntok_t *token; + int start; + + start = parser->pos; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + switch (js[parser->pos]) { +#ifndef JSMN_STRICT + /* In strict mode primitive must be followed by "," or "}" or "]" */ + case ':': +#endif + case '\t': + case '\r': + case '\n': + case ' ': + case ',': + case ']': + case '}': + goto found; + default: + /* to quiet a warning from gcc*/ + break; + } + if (js[parser->pos] < 32 || js[parser->pos] >= 127) { + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } +#ifdef JSMN_STRICT + /* In strict mode primitive must be followed by a comma/object/array */ + parser->pos = start; + return JSMN_ERROR_PART; +#endif + +found: + if (tokens == NULL) { + parser->pos--; + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + parser->pos--; + return 0; +} + +/** + * Fills next token with JSON string. + */ +static int jsmn_parse_string(jsmn_parser *parser, const char *js, + const size_t len, jsmntok_t *tokens, + const size_t num_tokens) { + jsmntok_t *token; + + int start = parser->pos; + + /* Skip starting quote */ + parser->pos++; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c = js[parser->pos]; + + /* Quote: end of string */ + if (c == '\"') { + if (tokens == NULL) { + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_STRING, start + 1, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + return 0; + } + + /* Backslash: Quoted symbol expected */ + if (c == '\\' && parser->pos + 1 < len) { + int i; + parser->pos++; + switch (js[parser->pos]) { + /* Allowed escaped symbols */ + case '\"': + case '/': + case '\\': + case 'b': + case 'f': + case 'r': + case 'n': + case 't': + break; + /* Allows escaped symbol \uXXXX */ + case 'u': + parser->pos++; + for (i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; + i++) { + /* If it isn't a hex character we have an error */ + if (!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ + (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ + (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ + parser->pos = start; + return JSMN_ERROR_INVAL; + } + parser->pos++; + } + parser->pos--; + break; + /* Unexpected symbol */ + default: + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } + } + parser->pos = start; + return JSMN_ERROR_PART; +} + +/** + * Parse JSON string and fill tokens. + */ +JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, + jsmntok_t *tokens, const unsigned int num_tokens) { + int r; + int i; + jsmntok_t *token; + int count = parser->toknext; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c; + jsmntype_t type; + + c = js[parser->pos]; + switch (c) { + case '{': + case '[': + count++; + if (tokens == NULL) { + break; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + return JSMN_ERROR_NOMEM; + } + if (parser->toksuper != -1) { + jsmntok_t *t = &tokens[parser->toksuper]; +#ifdef JSMN_STRICT + /* In strict mode an object or array can't become a key */ + if (t->type == JSMN_OBJECT) { + return JSMN_ERROR_INVAL; + } +#endif + t->size++; +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + } + token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); + token->start = parser->pos; + parser->toksuper = parser->toknext - 1; + break; + case '}': + case ']': + if (tokens == NULL) { + break; + } + type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); +#ifdef JSMN_PARENT_LINKS + if (parser->toknext < 1) { + return JSMN_ERROR_INVAL; + } + token = &tokens[parser->toknext - 1]; + for (;;) { + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + token->end = parser->pos + 1; + parser->toksuper = token->parent; + break; + } + if (token->parent == -1) { + if (token->type != type || parser->toksuper == -1) { + return JSMN_ERROR_INVAL; + } + break; + } + token = &tokens[token->parent]; + } +#else + for (i = parser->toknext - 1; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + parser->toksuper = -1; + token->end = parser->pos + 1; + break; + } + } + /* Error if unmatched closing bracket */ + if (i == -1) { + return JSMN_ERROR_INVAL; + } + for (; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + parser->toksuper = i; + break; + } + } +#endif + break; + case '\"': + r = jsmn_parse_string(parser, js, len, tokens, num_tokens); + if (r < 0) { + return r; + } + count++; + if (parser->toksuper != -1 && tokens != NULL) { + tokens[parser->toksuper].size++; + } + break; + case '\t': + case '\r': + case '\n': + case ' ': + break; + case ':': + parser->toksuper = parser->toknext - 1; + break; + case ',': + if (tokens != NULL && parser->toksuper != -1 && + tokens[parser->toksuper].type != JSMN_ARRAY && + tokens[parser->toksuper].type != JSMN_OBJECT) { +#ifdef JSMN_PARENT_LINKS + parser->toksuper = tokens[parser->toksuper].parent; +#else + for (i = parser->toknext - 1; i >= 0; i--) { + if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) { + if (tokens[i].start != -1 && tokens[i].end == -1) { + parser->toksuper = i; + break; + } + } + } +#endif + } + break; +#ifdef JSMN_STRICT + /* In strict mode primitives are: numbers and booleans */ + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 't': + case 'f': + case 'n': + /* And they must not be keys of the object */ + if (tokens != NULL && parser->toksuper != -1) { + const jsmntok_t *t = &tokens[parser->toksuper]; + if (t->type == JSMN_OBJECT || + (t->type == JSMN_STRING && t->size != 0)) { + return JSMN_ERROR_INVAL; + } + } +#else + /* In non-strict mode every unquoted value is a primitive */ + default: +#endif + r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); + if (r < 0) { + return r; + } + count++; + if (parser->toksuper != -1 && tokens != NULL) { + tokens[parser->toksuper].size++; + } + break; + +#ifdef JSMN_STRICT + /* Unexpected char in strict mode */ + default: + return JSMN_ERROR_INVAL; +#endif + } + } + + if (tokens != NULL) { + for (i = parser->toknext - 1; i >= 0; i--) { + /* Unmatched opened object or array */ + if (tokens[i].start != -1 && tokens[i].end == -1) { + return JSMN_ERROR_PART; + } + } + } + + return count; +} + +/** + * Creates a new parser based over a given buffer with an array of tokens + * available. + */ +JSMN_API void jsmn_init(jsmn_parser *parser) { + parser->pos = 0; + parser->toknext = 0; + parser->toksuper = -1; +} + +#endif /* JSMN_HEADER */ + +#ifdef __cplusplus +} +#endif + +#endif /* JSMN_H */ \ No newline at end of file diff --git a/components/jsmn/jsmn.c b/components/jsmn/jsmn.c new file mode 100644 index 0000000..ca159c3 --- /dev/null +++ b/components/jsmn/jsmn.c @@ -0,0 +1,7 @@ +#include +#include "jsmn.h" + +void func(void) +{ + +} diff --git a/components/meteofrance/CMakeLists.txt b/components/meteofrance/CMakeLists.txt new file mode 100644 index 0000000..b32baf4 --- /dev/null +++ b/components/meteofrance/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "meteofrance.c" + INCLUDE_DIRS "include" + REQUIRES http jsmn json esp_http_client esp-tls) diff --git a/components/meteofrance/include/meteofrance.h b/components/meteofrance/include/meteofrance.h new file mode 100644 index 0000000..47754a9 --- /dev/null +++ b/components/meteofrance/include/meteofrance.h @@ -0,0 +1,40 @@ + + +struct node { + struct node *next; + int e; + }; + +struct Hashtable { + unsigned Tablesize; + struct node *Cells; + }; + +struct forecast_temp{ + float min; + float max; + char desc[20]; + char icon[8]; +}; + +struct meteoforecast_data{ + int datetime; + struct forecast_temp previsions; +}; + +typedef void (*weather_data_callback)(struct meteoforecast_data *datas); + +typedef struct { + unsigned int humidity; + float temperature; + float pressure; + unsigned long retreival_period; + weather_data_callback data_retreived_cb; +} weather_data; + +void printftemp(struct forecast_temp *tmp); +void printffd(struct meteoforecast_data *tmp); + +void on_weather_data_retrieval(weather_data_callback data_retreived_cb); +void initialise_weather_data_retrieval(unsigned long retreival_period); + diff --git a/components/meteofrance/meteofrance.c b/components/meteofrance/meteofrance.c new file mode 100644 index 0000000..610b5cc --- /dev/null +++ b/components/meteofrance/meteofrance.c @@ -0,0 +1,266 @@ +/* + weather.c - Weather data retrieval from api.openweathermap.org + + This file is part of the ESP32 Everest Run project + https://github.com/krzychb/esp32-everest-run + + Copyright (c) 2016 Krzysztof Budzynski + This work is licensed under the Apache License, Version 2.0, January 2004 + See the file LICENSE for details. +*/ + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "esp_log.h" + +#include +#include + +#include "meteofrance.h" +#include "jsmn.h" +#include "cJSON.h" +#include "esp_http_client.h" +#include "esp_tls.h" + +static const char* TAG = "Weather"; + +/* Constants that aren't configurable in menuconfig + Typically only LOCATION_ID may need to be changed + */ +#define WEB_SERVER "webservice.meteofrance.com" //"192.168.0.10" //"www.example.com"// //"webservice.meteofrance.com" +#define WEB_PORT 80//5403 //80 +#define WEB_URL "/forecast" +#define TOKEN "__Wj7dVSTjV9YGu1guveLyDq0g7S7TfTjaHBTPTpO0kj8__" +// Location ID to get the weather data for +//#define LOCATION_ID "756135" +#define LATITUDE "49.22017054145735" +#define LONGITUDE "3.92188756221628" +#define WEB_QUERY "token="TOKEN"&lat="LATITUDE"&lon="LONGITUDE + +#define MAX_HTTP_OUTPUT_BUFFER 32000 + +static weather_data weather; +static struct meteoforecast_data datas[5]; + +inline int MIN(int a, int b) { return a > b ? b : a; } + +void printftemp(struct forecast_temp *tmp){ + printf(" Temps Min:%f, Max:%f", tmp->min, tmp->max); +} +#define MAX_SIZE 80 + +void printffd(struct meteoforecast_data *tmp){ + struct tm * pTime=localtime( & tmp->datetime ); + char buffer[ MAX_SIZE ]; + strftime(buffer, MAX_SIZE, "%d/%m/%Y", pTime); + printf(" date:%d, Min:%.1f Max:%.1f Desc:%s\n", tmp->datetime, tmp->previsions.min, tmp->previsions.max, tmp->previsions.desc); +} + +esp_err_t _http_event_handler(esp_http_client_event_t *evt) +{ + static char *output_buffer; // Buffer to store response of http request from event handler + static int output_len; // Stores number of bytes read + switch(evt->event_id) { + case HTTP_EVENT_ERROR: + ESP_LOGD(TAG, "HTTP_EVENT_ERROR"); + break; + case HTTP_EVENT_ON_CONNECTED: + ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED"); + break; + case HTTP_EVENT_HEADER_SENT: + ESP_LOGD(TAG, "HTTP_EVENT_HEADER_SENT"); + break; + case HTTP_EVENT_ON_HEADER: + ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value); + break; + case HTTP_EVENT_ON_DATA: + ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len); + // Clean the buffer in case of a new request + if (output_len == 0 && evt->user_data) { + // we are just starting to copy the output data into the use + memset(evt->user_data, 0, MAX_HTTP_OUTPUT_BUFFER); + } + /* + * Check for chunked encoding is added as the URL for chunked encoding used in this example returns binary data. + * However, event handler can also be used in case chunked encoding is used. + */ + if (!esp_http_client_is_chunked_response(evt->client)) { + // If user_data buffer is configured, copy the response into the buffer + int copy_len = 0; + if (evt->user_data) { + // The last byte in evt->user_data is kept for the NULL character in case of out-of-bound access. + copy_len = MIN(evt->data_len, (MAX_HTTP_OUTPUT_BUFFER - output_len)); + if (copy_len) { + memcpy(evt->user_data + output_len, evt->data, copy_len); + } + } else { + int content_len = esp_http_client_get_content_length(evt->client); + if (output_buffer == NULL) { + // We initialize output_buffer with 0 because it is used by strlen() and similar functions therefore should be null terminated. + output_buffer = (char *) calloc(content_len + 1, sizeof(char)); + output_len = 0; + if (output_buffer == NULL) { + ESP_LOGE(TAG, "Failed to allocate memory for output buffer"); + return ESP_FAIL; + } + } + copy_len = MIN(evt->data_len, (content_len - output_len)); + if (copy_len) { + memcpy(output_buffer + output_len, evt->data, copy_len); + } + } + output_len += copy_len; + } + + break; + case HTTP_EVENT_ON_FINISH: + ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH"); + if (output_buffer != NULL) { + // Response is accumulated in output_buffer. Uncomment the below line to print the accumulated response + // ESP_LOG_BUFFER_HEX(TAG, output_buffer, output_len); + free(output_buffer); + output_buffer = NULL; + } + output_len = 0; + break; + case HTTP_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED"); + int mbedtls_err = 0; + esp_err_t err = esp_tls_get_and_clear_last_error((esp_tls_error_handle_t)evt->data, &mbedtls_err, NULL); + if (err != 0) { + ESP_LOGI(TAG, "Last esp error code: 0x%x", err); + ESP_LOGI(TAG, "Last mbedtls failure: 0x%x", mbedtls_err); + } + if (output_buffer != NULL) { + free(output_buffer); + output_buffer = NULL; + } + output_len = 0; + break; + case HTTP_EVENT_REDIRECT: + ESP_LOGD(TAG, "HTTP_EVENT_REDIRECT"); + esp_http_client_set_header(evt->client, "From", "user@example.com"); + esp_http_client_set_header(evt->client, "Accept", "text/html"); + esp_http_client_set_redirection(evt->client); + break; + } + return ESP_OK; +} + +char *JSON_Types(int type) { + if (type == cJSON_Invalid) return ("cJSON_Invalid"); + if (type == cJSON_False) return ("cJSON_False"); + if (type == cJSON_True) return ("cJSON_True"); + if (type == cJSON_NULL) return ("cJSON_NULL"); + if (type == cJSON_Number) return ("cJSON_Number"); + if (type == cJSON_String) return ("cJSON_String"); + if (type == cJSON_Array) return ("cJSON_Array"); + if (type == cJSON_Object) return ("cJSON_Object"); + if (type == cJSON_Raw) return ("cJSON_Raw"); + return NULL; +} + +void JSON_Parse(const cJSON * const root) { + //ESP_LOGI(TAG, "root->type=%s", JSON_Types(root->type)); + cJSON *current_element = NULL; + //ESP_LOGI(TAG, "roo->child=%p", root->child); + //ESP_LOGI(TAG, "roo->next =%p", root->next); + int i=0; + cJSON *df = cJSON_GetObjectItem(root,"daily_forecast"); + if(!cJSON_IsArray(df)){ + ESP_LOGE(TAG,"Pas de tableau ^^"); + }else{ + cJSON_ArrayForEach(current_element, df) { + struct meteoforecast_data datasT; + ESP_LOGI(TAG, "type=%s", JSON_Types(current_element->type)); + cJSON *dt = cJSON_GetObjectItem(current_element,"dt"); + if(cJSON_IsNumber(dt)){ + datasT.datetime=dt->valueint; + cJSON *temps = cJSON_GetObjectItem(current_element,"T"); + datasT.previsions.min=cJSON_GetObjectItem(temps,"min")->valuedouble; + datasT.previsions.max=cJSON_GetObjectItem(temps,"max")->valuedouble; + + cJSON *weather12=cJSON_GetObjectItem(current_element,"weather12H"); + strncpy(datasT.previsions.desc,cJSON_GetObjectItem(weather12,"desc")->valuestring,19); + strncpy(datasT.previsions.icon,cJSON_GetObjectItem(weather12,"icon")->valuestring,7); + ESP_LOGE(TAG,"Donnees lues"); + printffd(&datasT); + datas[i++]=datasT; + if(i==3){break;} + } + } + } +} + +static bool process_response_body(const char * body) +{ + cJSON *root = cJSON_Parse(body); + JSON_Parse(root); + cJSON_Delete(root); + return true; +} + + +static void http_request_task(void *pvParameter) +{ + while(1) { + char *local_response_buffer = heap_caps_malloc((MAX_HTTP_OUTPUT_BUFFER + 1)*(sizeof(char)),MALLOC_CAP_SPIRAM); + //char local_response_buffer[MAX_HTTP_OUTPUT_BUFFER + 1] = {0}; + /** + * NOTE: All the configuration parameters for http_client must be spefied either in URL or as host and path parameters. + * If host and path parameters are not set, query parameter will be ignored. In such cases, + * query parameter should be specified in URL. + * + * If URL as well as host and path parameters are specified, values of host and path will be considered. + */ + esp_http_client_config_t config = { + .host = WEB_SERVER, + .port = WEB_PORT, + .path = WEB_URL, + .query = WEB_QUERY, + .event_handler = _http_event_handler, + .user_data = local_response_buffer, // Pass address of local buffer to get response + .disable_auto_redirect = true, + }; + esp_http_client_handle_t client = esp_http_client_init(&config); + char url[50]; + esp_http_client_get_url(client,url,50); + ESP_LOGE(TAG,"%s",url); + + // GET + esp_err_t err = esp_http_client_perform(client); + if (err == ESP_OK) { + ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %"PRId64, + esp_http_client_get_status_code(client), + esp_http_client_get_content_length(client)); + } else { + ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err)); + } + ESP_LOGE(TAG, "%s",local_response_buffer); + + bool weather_data_phrased = false; + weather_data_phrased = process_response_body(local_response_buffer); + weather.data_retreived_cb(datas); + esp_http_client_cleanup(client); + + //http_client_request(&http_client, WEB_SERVER, get_request); + vTaskDelay(weather.retreival_period / portTICK_PERIOD_MS); + } +} + +void on_weather_data_retrieval(weather_data_callback data_retreived_cb) +{ + weather.data_retreived_cb = data_retreived_cb; +} + +void initialise_weather_data_retrieval(unsigned long retreival_period) +{ + weather.retreival_period = retreival_period; + + //http_client_on_process_chunk(&http_client, process_chunk); + //http_client_on_disconnected(&http_client, disconnected); + + xTaskCreate(&http_request_task, "http_request_task", 10 * 2048, NULL, 5, NULL); + ESP_LOGI(TAG, "HTTP request task started"); +} diff --git a/components/weather/CMakeLists.txt b/components/weather/CMakeLists.txt new file mode 100644 index 0000000..b119fce --- /dev/null +++ b/components/weather/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "weather.c" + INCLUDE_DIRS "include" + REQUIRES http jsmn) diff --git a/components/weather/Kconfig.projbuild b/components/weather/Kconfig.projbuild new file mode 100644 index 0000000..9dcd636 --- /dev/null +++ b/components/weather/Kconfig.projbuild @@ -0,0 +1,11 @@ +menu "Wather data retreival from OpenWeatherMap" + +config OPENWEATHERMAP_API_KEY + string "OpenWeatherMap API key" + default "12345678901234567890123456789012" + help + API key obtained from 'https://home.openweathermap.org/' site. + + You need to set up a free account on this site first. + +endmenu diff --git a/components/weather/component.mk b/components/weather/component.mk new file mode 100644 index 0000000..2581b04 --- /dev/null +++ b/components/weather/component.mk @@ -0,0 +1,2 @@ +COMPONENT_ADD_INCLUDEDIRS := . + diff --git a/components/weather/include/weather.h b/components/weather/include/weather.h new file mode 100644 index 0000000..a39d17d --- /dev/null +++ b/components/weather/include/weather.h @@ -0,0 +1,40 @@ +/* + weather.h - Weather data retrieval from api.openweathermap.org + + This file is part of the ESP32 Everest Run project + https://github.com/krzychb/esp32-everest-run + + Copyright (c) 2016 Krzysztof Budzynski + This work is licensed under the Apache License, Version 2.0, January 2004 + See the file LICENSE for details. +*/ +#ifndef WEATHER_H +#define WEATHER_H + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void (*weather_data_callback)(uint32_t *args); + +typedef struct { + unsigned int humidity; + float temperature; + float pressure; + unsigned long retreival_period; + weather_data_callback data_retreived_cb; +} weather_data; + +#define ESP_ERR_WEATHER_BASE 0x50000 +#define ESP_ERR_WEATHER_RETREIVAL_FAILED (ESP_ERR_WEATHER_BASE + 1) + +void on_weather_data_retrieval(weather_data_callback data_retreived_cb); +void initialise_weather_data_retrieval(unsigned long retreival_period); + +#ifdef __cplusplus +} +#endif + +#endif // WEATHER_H diff --git a/components/weather/weather.c b/components/weather/weather.c new file mode 100644 index 0000000..a7f85c6 --- /dev/null +++ b/components/weather/weather.c @@ -0,0 +1,183 @@ +/* + weather.c - Weather data retrieval from api.openweathermap.org + + This file is part of the ESP32 Everest Run project + https://github.com/krzychb/esp32-everest-run + + Copyright (c) 2016 Krzysztof Budzynski + This work is licensed under the Apache License, Version 2.0, January 2004 + See the file LICENSE for details. +*/ + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "esp_log.h" + +#include +#include + +#include "weather.h" +#include "http.h" +#include "jsmn.h" + +static const char* TAG = "Weather"; + +/* Constants that aren't configurable in menuconfig + Typically only LOCATION_ID may need to be changed + */ +#define WEB_SERVER "api.openweathermap.org" +#define WEB_URL "http://api.openweathermap.org/data/2.5/weather" +// Location ID to get the weather data for +//#define LOCATION_ID "756135" +#define LATITUDE "49.22017054145735" +#define LONGITUDE "3.92188756221628" + +// The API key below is configurable in menuconfig +#define OPENWEATHERMAP_API_KEY "24d95e3a2c27a1843590b91bf2cbf37b__" + +static const char *get_request = "GET " WEB_URL"?lat="LATITUDE"&lon="LONGITUDE"&appid="OPENWEATHERMAP_API_KEY" HTTP/1.1\n" + "Host: "WEB_SERVER"\n" + "Connection: close\n" + "User-Agent: esp-idf/1.0 esp32\n" + "\n"; + +static weather_data weather; +static http_client_data http_client = {0}; + +/* Collect chunks of data received from server + into complete message and save it in proc_buf + */ +static void process_chunk(uint32_t *args) +{ + http_client_data* client = (http_client_data*)args; + + int proc_buf_new_size = client->proc_buf_size + client->recv_buf_size; + char *copy_from; + + if (client->proc_buf == NULL){ + client->proc_buf = malloc(proc_buf_new_size); + copy_from = client->proc_buf; + } else { + proc_buf_new_size -= 1; // chunks of data are '\0' terminated + client->proc_buf = realloc(client->proc_buf, proc_buf_new_size); + copy_from = client->proc_buf + proc_buf_new_size - client->recv_buf_size; + } + if (client->proc_buf == NULL) { + ESP_LOGE(TAG, "Failed to allocate memory"); + } + client->proc_buf_size = proc_buf_new_size; + memcpy(copy_from, client->recv_buf, client->recv_buf_size); +} + +static int jsoneq(const char *json, jsmntok_t *tok, const char *s) { + if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start && + strncmp(json + tok->start, s, tok->end - tok->start) == 0) { + return 0; + } + return -1; +} + +static bool process_response_body(const char * body) +{ + /* Using great little JSON parser http://zserge.com/jsmn.html + find specific weather information: + - Humidity, + - Temperature, + - Pressure + in HTTP response body that happens to be a JSON string + + Return true if phrasing was successful or false if otherwise + */ + + #define JSON_MAX_TOKENS 100 + jsmn_parser parser; + jsmntok_t t[JSON_MAX_TOKENS]; + jsmn_init(&parser); + ESP_LOGE(TAG,"%s",body); + int r = jsmn_parse(&parser, body, strlen(body), t, JSON_MAX_TOKENS); + if (r < 0) { + ESP_LOGE(TAG, "JSON parse error %d", r); + return false; + } + if (r < 1 || t[0].type != JSMN_OBJECT) { + ESP_LOGE(TAG, "JSMN_OBJECT expected"); + return false; + } else { + ESP_LOGI(TAG, "Token(s) found %d", r); + char subbuff[8]; + int str_length; + for (int i = 1; i < r; i++) { + if (jsoneq(body, &t[i], "humidity") == 0) { + str_length = t[i+1].end - t[i+1].start; + memcpy(subbuff, body + t[i+1].start, str_length); + subbuff[str_length] = '\0'; + weather.humidity = atoi(subbuff); + i++; + } else if (jsoneq(body, &t[i], "temp") == 0) { + str_length = t[i+1].end - t[i+1].start; + memcpy(subbuff, body + t[i+1].start, str_length); + subbuff[str_length] = '\0'; + weather.temperature = atof(subbuff); + i++; + } else if (jsoneq(body, &t[i], "pressure") == 0) { + str_length = t[i+1].end - t[i+1].start; + memcpy(subbuff, body + t[i+1].start, str_length); + subbuff[str_length] = '\0'; + weather.pressure = atof(subbuff); + i++; + } + } + return true; + } +} + + +static void disconnected(uint32_t *args) +{ + http_client_data* client = (http_client_data*)args; + bool weather_data_phrased = false; + + const char * response_body = find_response_body(client->proc_buf); + if (response_body) { + weather_data_phrased = process_response_body(response_body); + } else { + ESP_LOGE(TAG, "No HTTP header found"); + } + + free(client->proc_buf); + client->proc_buf = NULL; + client->proc_buf_size = 0; + + // execute callback if data was retrieved + if (weather_data_phrased) { + if (weather.data_retreived_cb) { + weather.data_retreived_cb((uint32_t*) &weather); + } + } + ESP_LOGD(TAG, "Free heap %u", xPortGetFreeHeapSize()); +} + +static void http_request_task(void *pvParameter) +{ + while(1) { + http_client_request(&http_client, WEB_SERVER, get_request); + vTaskDelay(weather.retreival_period / portTICK_PERIOD_MS); + } +} + +void on_weather_data_retrieval(weather_data_callback data_retreived_cb) +{ + weather.data_retreived_cb = data_retreived_cb; +} + +void initialise_weather_data_retrieval(unsigned long retreival_period) +{ + weather.retreival_period = retreival_period; + + http_client_on_process_chunk(&http_client, process_chunk); + http_client_on_disconnected(&http_client, disconnected); + + xTaskCreate(&http_request_task, "http_request_task", 2 * 2048, NULL, 5, NULL); + ESP_LOGI(TAG, "HTTP request task started"); +} diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index e6ad442..c13f477 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,11 +1,21 @@ -idf_component_register(SRCS "main.c" - INCLUDE_DIRS "." ${LV_DEMO_DIR} - REQUIRES esp_wifi nvs_flash mqtt) +idf_component_register(SRC_DIRS . fonts + INCLUDE_DIRS "." + REQUIRES esp_wifi nvs_flash mqtt meteofrance) lvgl_port_create_c_image("images/esp_logo.png" "images/" "ARGB8888" "NONE") +lvgl_port_create_c_image("images/p1j.png" "images/" "ARGB8888" "NONE") +lvgl_port_create_c_image("images/p2j.png" "images/" "ARGB8888" "NONE") +lvgl_port_create_c_image("images/p3j.png" "images/" "ARGB8888" "NONE") +lvgl_port_create_c_image("images/p14j.png" "images/" "ARGB8888" "NONE") +lvgl_port_create_c_image("images/p24j.png" "images/" "ARGB8888" "NONE") +lvgl_port_create_c_image("images/p25j.png" "images/" "ARGB8888" "NONE") +lvgl_port_create_c_image("images/p26j.png" "images/" "ARGB8888" "NONE") +lvgl_port_create_c_image("images/p27j.png" "images/" "ARGB8888" "NONE") +lvgl_port_create_c_image("images/p29j.png" "images/" "ARGB8888" "NONE") + lvgl_port_add_images(${COMPONENT_LIB} "images/") set_source_files_properties( PROPERTIES COMPILE_OPTIONS - "-DLV_LVGL_H_INCLUDE_SIMPLE;-Wno-format;" + "-DLV_LVGL_H_INCLUDE_SIMPLE;-Wno-format;-DLV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(montserrat_medium_12) LV_FONT_DECLARE(montserrat_medium_18)" ) diff --git a/main/fonts/montserrat_medium_12.c b/main/fonts/montserrat_medium_12.c new file mode 100644 index 0000000..a1e71c7 --- /dev/null +++ b/main/fonts/montserrat_medium_12.c @@ -0,0 +1,881 @@ +/******************************************************************************* + * 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 + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#ifndef MONTSERRAT_MEDIUM_12 +#define MONTSERRAT_MEDIUM_12 1 +#endif + +#if MONTSERRAT_MEDIUM_12 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0027 "'" */ + 0x3c, 0x3b, 0x3b, 0x15, + + /* U+002E "." */ + 0x2a, 0x4, 0xd0, + + /* U+0030 "0" */ + 0x0, 0x9e, 0xe9, 0x0, 0xa, 0xd4, 0x4d, 0xa0, + 0x1f, 0x20, 0x2, 0xf1, 0x5e, 0x0, 0x0, 0xd5, + 0x6c, 0x0, 0x0, 0xc6, 0x5e, 0x0, 0x0, 0xd5, + 0x1f, 0x20, 0x2, 0xf1, 0xa, 0xd4, 0x4d, 0xa0, + 0x0, 0x9e, 0xe9, 0x0, + + /* U+0031 "1" */ + 0xef, 0xf3, 0x22, 0xf3, 0x0, 0xf3, 0x0, 0xf3, + 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, + 0x0, 0xf3, + + /* U+0032 "2" */ + 0x19, 0xef, 0xc2, 0x8, 0xb4, 0x3a, 0xe0, 0x0, + 0x0, 0x2f, 0x10, 0x0, 0x5, 0xe0, 0x0, 0x2, + 0xe5, 0x0, 0x1, 0xd7, 0x0, 0x1, 0xd8, 0x0, + 0x1, 0xda, 0x22, 0x21, 0x8f, 0xff, 0xff, 0x70, + + /* U+0033 "3" */ + 0x9f, 0xff, 0xff, 0x1, 0x22, 0x2d, 0x80, 0x0, + 0x9, 0xb0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x7c, + 0xf8, 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0xe, + 0x4b, 0x94, 0x39, 0xf1, 0x3b, 0xff, 0xc3, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x9b, 0x0, 0x0, 0x4, 0xe1, 0x0, + 0x0, 0x1e, 0x50, 0x0, 0x0, 0xaa, 0x0, 0x0, + 0x5, 0xe1, 0xd, 0x40, 0x1e, 0x40, 0xd, 0x40, + 0x8f, 0xff, 0xff, 0xfd, 0x12, 0x22, 0x2e, 0x62, + 0x0, 0x0, 0xe, 0x40, + + /* U+0035 "5" */ + 0xc, 0xff, 0xff, 0x0, 0xe5, 0x22, 0x20, 0xf, + 0x10, 0x0, 0x1, 0xff, 0xeb, 0x30, 0x2, 0x23, + 0x9f, 0x10, 0x0, 0x0, 0xd6, 0x0, 0x0, 0xd, + 0x69, 0xb4, 0x38, 0xf1, 0x2a, 0xef, 0xc4, 0x0, + + /* U+0036 "6" */ + 0x0, 0x6d, 0xfd, 0x50, 0x8, 0xd5, 0x23, 0x20, + 0x1f, 0x20, 0x0, 0x0, 0x4d, 0x6d, 0xea, 0x10, + 0x6f, 0xc4, 0x3c, 0xa0, 0x5f, 0x30, 0x2, 0xf0, + 0x2f, 0x20, 0x2, 0xf0, 0xa, 0xc3, 0x2b, 0xa0, + 0x1, 0xaf, 0xfa, 0x10, + + /* U+0037 "7" */ + 0xaf, 0xff, 0xff, 0xba, 0x92, 0x22, 0xd7, 0x76, + 0x0, 0x3f, 0x10, 0x0, 0xa, 0x90, 0x0, 0x1, + 0xf2, 0x0, 0x0, 0x7c, 0x0, 0x0, 0xe, 0x50, + 0x0, 0x5, 0xe0, 0x0, 0x0, 0xc8, 0x0, 0x0, + + /* U+0038 "8" */ + 0x3, 0xcf, 0xea, 0x10, 0xe, 0x81, 0x2c, 0xa0, + 0x2f, 0x10, 0x5, 0xd0, 0xe, 0x70, 0x1b, 0x90, + 0x6, 0xff, 0xff, 0x20, 0x3f, 0x50, 0x18, 0xe0, + 0x6c, 0x0, 0x0, 0xf2, 0x3f, 0x61, 0x29, 0xe0, + 0x5, 0xcf, 0xfb, 0x20, + + /* U+0039 "9" */ + 0x7, 0xef, 0xc3, 0x6, 0xe3, 0x15, 0xe1, 0x98, + 0x0, 0xb, 0x87, 0xd2, 0x3, 0xfb, 0xa, 0xff, + 0xd9, 0xc0, 0x0, 0x10, 0x8b, 0x0, 0x0, 0xd, + 0x70, 0x62, 0x4b, 0xd0, 0x1c, 0xfe, 0xa1, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x6f, 0x30, 0x0, 0x0, 0x0, 0xdd, + 0x90, 0x0, 0x0, 0x4, 0xe3, 0xf1, 0x0, 0x0, + 0xb, 0x80, 0xc7, 0x0, 0x0, 0x1f, 0x20, 0x6e, + 0x0, 0x0, 0x8c, 0x0, 0x1f, 0x50, 0x0, 0xef, + 0xee, 0xef, 0xb0, 0x6, 0xe2, 0x11, 0x14, 0xf2, + 0xc, 0x70, 0x0, 0x0, 0xb9, + + /* U+0042 "B" */ + 0xbf, 0xff, 0xfb, 0x20, 0xb7, 0x11, 0x2a, 0xd0, + 0xb7, 0x0, 0x3, 0xf0, 0xb7, 0x0, 0x8, 0xc0, + 0xbf, 0xff, 0xff, 0x50, 0xb8, 0x22, 0x26, 0xf2, + 0xb7, 0x0, 0x0, 0xc7, 0xb7, 0x11, 0x15, 0xf4, + 0xbf, 0xff, 0xfd, 0x60, + + /* U+0043 "C" */ + 0x0, 0x3b, 0xef, 0xb3, 0x0, 0x5f, 0x93, 0x38, + 0xe0, 0xe, 0x60, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x4, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0x60, 0x0, 0x0, 0x0, + 0x5f, 0x93, 0x38, 0xe0, 0x0, 0x3b, 0xff, 0xb3, + 0x0, + + /* U+0044 "D" */ + 0xbf, 0xff, 0xea, 0x30, 0xb, 0x82, 0x23, 0x9f, + 0x40, 0xb7, 0x0, 0x0, 0x7e, 0xb, 0x70, 0x0, + 0x0, 0xf3, 0xb7, 0x0, 0x0, 0xe, 0x5b, 0x70, + 0x0, 0x0, 0xf3, 0xb7, 0x0, 0x0, 0x7e, 0xb, + 0x82, 0x23, 0x9f, 0x40, 0xbf, 0xff, 0xeb, 0x30, + 0x0, + + /* U+0045 "E" */ + 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, + 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, + 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x50, + + /* U+0046 "F" */ + 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, + 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, + 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x3b, 0xef, 0xc4, 0x0, 0x5f, 0x94, 0x38, + 0xe1, 0xe, 0x70, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x8, 0x24, 0xe0, + 0x0, 0x0, 0xe3, 0xe, 0x60, 0x0, 0xe, 0x30, + 0x5f, 0x93, 0x37, 0xf3, 0x0, 0x3b, 0xef, 0xc4, + 0x0, + + /* U+0048 "H" */ + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xbf, 0xff, 0xff, 0xf7, 0xb8, 0x22, 0x22, 0xc7, + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xb7, 0x0, 0x0, 0xb7, + + /* U+0049 "I" */ + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, + + /* U+004A "J" */ + 0x4, 0xff, 0xff, 0x0, 0x22, 0x5f, 0x0, 0x0, + 0x3f, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x3f, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0x4e, 0xd, 0x52, 0xba, + 0x5, 0xdf, 0xb2, + + /* U+004B "K" */ + 0xb7, 0x0, 0x7, 0xd1, 0xb7, 0x0, 0x5e, 0x20, + 0xb7, 0x4, 0xe3, 0x0, 0xb7, 0x3e, 0x40, 0x0, + 0xb9, 0xef, 0x20, 0x0, 0xbf, 0x89, 0xd0, 0x0, + 0xba, 0x0, 0xca, 0x0, 0xb7, 0x0, 0x1e, 0x70, + 0xb7, 0x0, 0x3, 0xf3, + + /* U+004C "L" */ + 0xb7, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x0, + + /* U+004D "M" */ + 0xb8, 0x0, 0x0, 0x1, 0xf2, 0xbf, 0x10, 0x0, + 0x9, 0xf3, 0xbe, 0xa0, 0x0, 0x2e, 0xf3, 0xb7, + 0xe3, 0x0, 0xb7, 0xf3, 0xb6, 0x7b, 0x4, 0xd0, + 0xf3, 0xb6, 0xd, 0x4c, 0x50, 0xf3, 0xb6, 0x5, + 0xfc, 0x0, 0xf3, 0xb6, 0x0, 0xb3, 0x0, 0xf3, + 0xb6, 0x0, 0x0, 0x0, 0xf3, + + /* U+004E "N" */ + 0xb9, 0x0, 0x0, 0xb7, 0xbf, 0x50, 0x0, 0xb7, + 0xbc, 0xf2, 0x0, 0xb7, 0xb7, 0xad, 0x0, 0xb7, + 0xb7, 0xd, 0x90, 0xb7, 0xb7, 0x2, 0xf5, 0xb7, + 0xb7, 0x0, 0x6f, 0xd7, 0xb7, 0x0, 0xa, 0xf7, + 0xb7, 0x0, 0x0, 0xd7, + + /* U+004F "O" */ + 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x5, 0xf9, 0x33, + 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, + 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, + 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd5, 0xe, 0x60, + 0x0, 0x5, 0xf1, 0x5, 0xf9, 0x33, 0x8f, 0x60, + 0x0, 0x3b, 0xef, 0xb4, 0x0, + + /* U+0050 "P" */ + 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, + 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, + 0xb7, 0x0, 0x2c, 0xa0, 0xbf, 0xff, 0xfa, 0x10, + 0xb8, 0x22, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x4, 0xf9, 0x33, + 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, + 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, + 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd6, 0xf, 0x60, + 0x0, 0x5, 0xf1, 0x5, 0xf8, 0x32, 0x7f, 0x60, + 0x0, 0x4c, 0xff, 0xc5, 0x0, 0x0, 0x0, 0xc, + 0xb0, 0x28, 0x0, 0x0, 0x1, 0xbf, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0052 "R" */ + 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, + 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, + 0xb7, 0x0, 0x1b, 0xb0, 0xbf, 0xff, 0xfb, 0x10, + 0xb8, 0x22, 0xb9, 0x0, 0xb7, 0x0, 0x1f, 0x30, + 0xb7, 0x0, 0x7, 0xd0, + + /* U+0053 "S" */ + 0x3, 0xcf, 0xeb, 0x31, 0xf7, 0x23, 0x74, 0x4e, + 0x0, 0x0, 0x1, 0xf9, 0x20, 0x0, 0x2, 0xbf, + 0xd7, 0x0, 0x0, 0x4, 0xca, 0x0, 0x0, 0x4, + 0xe5, 0xb4, 0x23, 0xbb, 0x8, 0xdf, 0xea, 0x10, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xf2, 0x23, 0xf3, 0x22, 0x0, + 0x1f, 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, + 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, + 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, 0x0, + + /* U+0055 "U" */ + 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, + 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, + 0xd6, 0x0, 0x0, 0xe4, 0xc7, 0x0, 0x0, 0xf3, + 0x9a, 0x0, 0x2, 0xf1, 0x2f, 0x83, 0x5d, 0xa0, + 0x4, 0xcf, 0xe8, 0x0, + + /* U+0056 "V" */ + 0xc, 0x70, 0x0, 0x0, 0xd5, 0x6, 0xe0, 0x0, + 0x4, 0xe0, 0x0, 0xf4, 0x0, 0xa, 0x80, 0x0, + 0x9b, 0x0, 0x1f, 0x20, 0x0, 0x2f, 0x20, 0x7b, + 0x0, 0x0, 0xc, 0x80, 0xe4, 0x0, 0x0, 0x5, + 0xe5, 0xe0, 0x0, 0x0, 0x0, 0xee, 0x70, 0x0, + 0x0, 0x0, 0x8f, 0x10, 0x0, + + /* U+0057 "W" */ + 0x7c, 0x0, 0x0, 0xe8, 0x0, 0x2, 0xf0, 0x2f, + 0x10, 0x3, 0xfd, 0x0, 0x7, 0xa0, 0xd, 0x60, + 0x8, 0x9f, 0x20, 0xc, 0x50, 0x8, 0xb0, 0xe, + 0x3b, 0x70, 0x1f, 0x0, 0x3, 0xf0, 0x3e, 0x6, + 0xc0, 0x6b, 0x0, 0x0, 0xe5, 0x89, 0x1, 0xf1, + 0xb6, 0x0, 0x0, 0x9a, 0xd4, 0x0, 0xb7, 0xf1, + 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x6f, 0xc0, 0x0, + 0x0, 0xf, 0xa0, 0x0, 0x1f, 0x70, 0x0, + + /* U+0058 "X" */ + 0x5f, 0x10, 0x0, 0xe5, 0xa, 0xb0, 0x9, 0xa0, + 0x1, 0xe6, 0x4e, 0x10, 0x0, 0x4f, 0xe4, 0x0, + 0x0, 0xd, 0xe0, 0x0, 0x0, 0x7d, 0xd8, 0x0, + 0x2, 0xf3, 0x2f, 0x30, 0xc, 0x80, 0x7, 0xd0, + 0x8d, 0x0, 0x0, 0xc9, + + /* U+0059 "Y" */ + 0xc, 0x80, 0x0, 0xa, 0x80, 0x3f, 0x10, 0x3, + 0xe0, 0x0, 0xaa, 0x0, 0xc6, 0x0, 0x1, 0xf3, + 0x5d, 0x0, 0x0, 0x7, 0xce, 0x40, 0x0, 0x0, + 0xe, 0xb0, 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0xb7, 0x0, + 0x0, + + /* U+005A "Z" */ + 0x6f, 0xff, 0xff, 0xf5, 0x2, 0x22, 0x29, 0xd0, + 0x0, 0x0, 0x3f, 0x30, 0x0, 0x1, 0xe6, 0x0, + 0x0, 0xb, 0xa0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x4, 0xf2, 0x0, 0x0, 0x1e, 0x82, 0x22, 0x21, + 0x7f, 0xff, 0xff, 0xf8, + + /* U+0061 "a" */ + 0x8, 0xdf, 0xc3, 0x0, 0xa4, 0x29, 0xd0, 0x0, + 0x0, 0x1f, 0x10, 0x8d, 0xee, 0xf2, 0x4e, 0x10, + 0xf, 0x24, 0xe0, 0x7, 0xf2, 0x9, 0xed, 0x8f, + 0x20, + + /* U+0062 "b" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x7c, 0xfc, 0x40, 0xef, 0x52, + 0x7f, 0x2e, 0x60, 0x0, 0xb8, 0xe4, 0x0, 0x8, + 0xae, 0x60, 0x0, 0xb8, 0xef, 0x52, 0x8f, 0x2e, + 0x6d, 0xfc, 0x40, + + /* U+0063 "c" */ + 0x2, 0xbf, 0xe8, 0x0, 0xda, 0x24, 0xc3, 0x5d, + 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x5d, 0x0, + 0x0, 0x0, 0xda, 0x24, 0xd3, 0x2, 0xbf, 0xe8, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, + 0x0, 0x0, 0x1, 0xf1, 0x2, 0xbf, 0xd6, 0xf1, + 0xe, 0x92, 0x3d, 0xf1, 0x5d, 0x0, 0x4, 0xf1, + 0x7b, 0x0, 0x1, 0xf1, 0x5d, 0x0, 0x3, 0xf1, + 0xe, 0x91, 0x2d, 0xf1, 0x2, 0xbf, 0xe6, 0xf1, + + /* U+0065 "e" */ + 0x2, 0xbf, 0xd5, 0x0, 0xe8, 0x14, 0xe4, 0x5c, + 0x0, 0x6, 0xb7, 0xfe, 0xee, 0xec, 0x5d, 0x0, + 0x0, 0x0, 0xe9, 0x23, 0xa2, 0x2, 0xbf, 0xe9, + 0x0, + + /* U+0066 "f" */ + 0x1, 0xcf, 0x60, 0x9a, 0x11, 0xb, 0x60, 0xd, + 0xff, 0xf3, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, + 0x60, 0x0, 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, + 0x0, + + /* U+0067 "g" */ + 0x2, 0xbf, 0xe6, 0xe2, 0xe, 0xa2, 0x3c, 0xf2, + 0x5d, 0x0, 0x2, 0xf2, 0x7b, 0x0, 0x0, 0xf2, + 0x5d, 0x0, 0x2, 0xf2, 0xe, 0xa2, 0x3d, 0xf2, + 0x2, 0xbf, 0xe5, 0xf2, 0x0, 0x0, 0x2, 0xf0, + 0xc, 0x62, 0x3b, 0xa0, 0x6, 0xdf, 0xea, 0x10, + + /* U+0068 "h" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x7d, 0xfc, 0x20, 0xee, 0x42, + 0xac, 0xe, 0x60, 0x2, 0xf0, 0xe4, 0x0, 0xf, + 0x1e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, 0x2e, + 0x40, 0x0, 0xf2, + + /* U+0069 "i" */ + 0xd, 0x40, 0x82, 0x0, 0x0, 0xe4, 0xe, 0x40, + 0xe4, 0xe, 0x40, 0xe4, 0xe, 0x40, 0xe4, + + /* U+006A "j" */ + 0x0, 0xd, 0x50, 0x0, 0x72, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, 0xd4, 0x0, + 0xd, 0x40, 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, + 0xd4, 0x0, 0xd, 0x40, 0x22, 0xf2, 0xd, 0xf8, + 0x0, + + /* U+006B "k" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x40, 0xb, 0xa0, 0xe4, 0xb, + 0xb0, 0xe, 0x4b, 0xc0, 0x0, 0xee, 0xfd, 0x0, + 0xe, 0xc1, 0xd9, 0x0, 0xe4, 0x2, 0xf4, 0xe, + 0x40, 0x6, 0xe1, + + /* U+006C "l" */ + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe4, 0xe4, + + /* U+006D "m" */ + 0xe7, 0xdf, 0xb2, 0x9e, 0xe8, 0xe, 0xd3, 0x2c, + 0xfb, 0x23, 0xe5, 0xe6, 0x0, 0x4f, 0x10, 0x9, + 0x9e, 0x40, 0x3, 0xf0, 0x0, 0x8a, 0xe4, 0x0, + 0x3f, 0x0, 0x8, 0xae, 0x40, 0x3, 0xf0, 0x0, + 0x8a, 0xe4, 0x0, 0x3f, 0x0, 0x8, 0xa0, + + /* U+006E "n" */ + 0xe6, 0xdf, 0xc2, 0xe, 0xe4, 0x1a, 0xc0, 0xe6, + 0x0, 0x1f, 0xe, 0x40, 0x0, 0xf1, 0xe4, 0x0, + 0xf, 0x2e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, + 0x20, + + /* U+006F "o" */ + 0x2, 0xbf, 0xe8, 0x0, 0xe, 0xa2, 0x3e, 0x80, + 0x5d, 0x0, 0x4, 0xf0, 0x7b, 0x0, 0x1, 0xf1, + 0x5d, 0x0, 0x4, 0xf0, 0xd, 0xa2, 0x3e, 0x80, + 0x2, 0xbf, 0xe8, 0x0, + + /* U+0070 "p" */ + 0xe7, 0xdf, 0xc4, 0xe, 0xf4, 0x16, 0xf2, 0xe6, + 0x0, 0xa, 0x8e, 0x40, 0x0, 0x8a, 0xe7, 0x0, + 0xb, 0x8e, 0xf5, 0x28, 0xf2, 0xe6, 0xcf, 0xc4, + 0xe, 0x40, 0x0, 0x0, 0xe4, 0x0, 0x0, 0xe, + 0x40, 0x0, 0x0, + + /* U+0071 "q" */ + 0x2, 0xbf, 0xd5, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, + 0x5d, 0x0, 0x4, 0xf1, 0x7b, 0x0, 0x1, 0xf1, + 0x5d, 0x0, 0x4, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, + 0x2, 0xbf, 0xd5, 0xf1, 0x0, 0x0, 0x1, 0xf1, + 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, + + /* U+0072 "r" */ + 0xe6, 0xd8, 0xee, 0x61, 0xe7, 0x0, 0xe4, 0x0, + 0xe4, 0x0, 0xe4, 0x0, 0xe4, 0x0, + + /* U+0073 "s" */ + 0x9, 0xef, 0xc2, 0x6d, 0x22, 0x61, 0x7d, 0x20, + 0x0, 0x9, 0xfe, 0x91, 0x0, 0x2, 0xc9, 0x56, + 0x22, 0xb8, 0x4c, 0xfe, 0xa0, + + /* U+0074 "t" */ + 0x5, 0x30, 0x0, 0xb6, 0x0, 0xdf, 0xff, 0x30, + 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, + 0x60, 0x0, 0xaa, 0x11, 0x2, 0xdf, 0x60, + + /* U+0075 "u" */ + 0xf3, 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xf3, + 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xe4, 0x0, + 0x4f, 0xa, 0xb2, 0x2c, 0xf0, 0x1b, 0xfe, 0x6f, + 0x0, + + /* U+0076 "v" */ + 0xd, 0x50, 0x0, 0x98, 0x6, 0xc0, 0x0, 0xf2, + 0x1, 0xf2, 0x6, 0xb0, 0x0, 0xa8, 0xc, 0x50, + 0x0, 0x3e, 0x3e, 0x0, 0x0, 0xd, 0xd8, 0x0, + 0x0, 0x6, 0xf2, 0x0, + + /* U+0077 "w" */ + 0xc5, 0x0, 0x3f, 0x10, 0x7, 0x86, 0xa0, 0x9, + 0xf6, 0x0, 0xd3, 0x1f, 0x0, 0xe7, 0xb0, 0x2d, + 0x0, 0xb5, 0x4c, 0xe, 0x18, 0x80, 0x6, 0xa9, + 0x60, 0xa6, 0xd3, 0x0, 0x1e, 0xe1, 0x4, 0xed, + 0x0, 0x0, 0xbb, 0x0, 0xe, 0x80, 0x0, + + /* U+0078 "x" */ + 0x5d, 0x0, 0x4e, 0x10, 0xa9, 0x1e, 0x40, 0x1, + 0xed, 0x90, 0x0, 0x8, 0xf1, 0x0, 0x2, 0xeb, + 0xa0, 0x0, 0xc7, 0xd, 0x60, 0x7c, 0x0, 0x3f, + 0x20, + + /* U+0079 "y" */ + 0xd, 0x50, 0x0, 0x98, 0x7, 0xb0, 0x0, 0xe2, + 0x1, 0xf2, 0x5, 0xc0, 0x0, 0xa7, 0xb, 0x50, + 0x0, 0x4d, 0x1e, 0x0, 0x0, 0xe, 0xb9, 0x0, + 0x0, 0x8, 0xf3, 0x0, 0x0, 0x5, 0xd0, 0x0, + 0x5, 0x2c, 0x60, 0x0, 0x1c, 0xf9, 0x0, 0x0, + + /* U+007A "z" */ + 0x7f, 0xff, 0xfb, 0x0, 0x2, 0xf3, 0x0, 0xc, + 0x70, 0x0, 0x9c, 0x0, 0x4, 0xe1, 0x0, 0x1e, + 0x50, 0x0, 0x8f, 0xff, 0xfd, + + /* U+00B0 "°" */ + 0x6, 0xb7, 0x3, 0x80, 0x84, 0x64, 0x3, 0x73, + 0x80, 0x84, 0x6, 0xb7, 0x0, + + /* U+00E9 "é" */ + 0x0, 0x1, 0xe5, 0x0, 0x0, 0xb5, 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+00EA "ê" */ + 0x0, 0x4f, 0xa0, 0x0, 0x2c, 0x29, 0x60, 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 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 52, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 40, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 4, .adv_w = 44, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 43, .adv_w = 71, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 61, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 93, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 125, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 161, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 193, .adv_w = 118, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 229, .adv_w = 115, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 261, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 297, .adv_w = 118, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 329, .adv_w = 141, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 374, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 410, .adv_w = 139, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 451, .adv_w = 159, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 492, .adv_w = 129, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 524, .adv_w = 122, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 556, .adv_w = 148, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 597, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 633, .adv_w = 60, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 642, .adv_w = 98, .box_w = 6, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 669, .adv_w = 138, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 705, .adv_w = 114, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 737, .adv_w = 183, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 782, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 818, .adv_w = 161, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 863, .adv_w = 139, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 899, .adv_w = 161, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 959, .adv_w = 140, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 995, .adv_w = 119, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1027, .adv_w = 113, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1059, .adv_w = 152, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1095, .adv_w = 137, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1140, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1203, .adv_w = 129, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1239, .adv_w = 124, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1280, .adv_w = 126, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1316, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1341, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1376, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1401, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1441, .adv_w = 118, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1466, .adv_w = 68, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1491, .adv_w = 132, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1531, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1566, .adv_w = 54, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1581, .adv_w = 55, .box_w = 5, .box_h = 13, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 1614, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1649, .adv_w = 54, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1659, .adv_w = 203, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1698, .adv_w = 131, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1723, .adv_w = 122, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1751, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1786, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1826, .adv_w = 79, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1840, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1861, .adv_w = 79, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1884, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1909, .adv_w = 107, .box_w = 8, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1937, .adv_w = 173, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1976, .adv_w = 106, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2001, .adv_w = 107, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 2041, .adv_w = 100, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2062, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 2075, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2110, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_0[] = { + 0x0, 0x7, 0xe +}; + +static const uint16_t unicode_list_4[] = { + 0x0, 0x39, 0x3a +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 32, .range_length = 15, .glyph_id_start = 1, + .unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 3, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 48, .range_length = 10, .glyph_id_start = 4, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 65, .range_length = 26, .glyph_id_start = 14, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 97, .range_length = 26, .glyph_id_start = 40, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 59, .glyph_id_start = 66, + .unicode_list = unicode_list_4, .glyph_id_ofs_list = NULL, .list_length = 3, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = +{ + 0, 0, 1, 2, 3, 0, 4, 5, + 6, 7, 8, 9, 10, 3, 11, 12, + 13, 14, 15, 16, 17, 18, 18, 19, + 20, 21, 18, 18, 14, 22, 14, 23, + 24, 25, 19, 26, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 30, + 36, 36, 37, 33, 30, 30, 31, 31, + 38, 39, 40, 41, 36, 42, 42, 43, + 42, 44, 45, 34, 34 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = +{ + 0, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 3, 9, 10, 11, 12, 13, + 14, 13, 13, 13, 14, 13, 13, 15, + 13, 13, 13, 13, 14, 13, 14, 13, + 16, 17, 18, 19, 19, 20, 21, 22, + 23, 24, 25, 25, 25, 0, 25, 24, + 26, 27, 24, 24, 28, 28, 25, 28, + 25, 28, 29, 30, 31, 32, 32, 33, + 32, 34, 35, 25, 25 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = +{ + 9, -11, 1, 9, 4, 3, -8, 1, + 9, 1, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, -11, 0, -2, -2, 2, + 2, -2, 0, -2, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -12, 1, -2, + 0, -1, -1, -2, 0, 0, -1, 0, + 0, -2, 0, 0, -4, 0, -4, 0, + -5, -6, -6, -4, 0, 0, 0, 0, + -2, 0, 0, 2, 0, 1, -2, 0, + 1, 0, 2, -1, 0, 0, 0, -4, + 0, -1, 0, 0, 1, 0, 0, 2, + 0, -1, 0, -2, 0, -3, 0, 0, + 0, -2, 0, 0, 0, 0, 0, -1, + 1, -1, -1, 0, -2, 0, 0, 0, + -1, -1, 0, -2, -2, 0, 0, 1, + 0, 0, 0, 0, -1, 0, -2, -2, + -2, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, -1, -2, 0, -3, -6, + 4, 0, -5, -1, -2, 0, -1, -9, + 2, -1, 0, 0, 2, 1, -1, -10, + 0, -10, -2, -17, -1, 5, 0, 2, + 0, 0, 0, 0, 0, 0, -3, -2, + 0, -6, 0, 0, 0, 0, -1, -1, + 0, -1, -2, 0, 0, 0, 0, 0, + -2, 0, -2, 0, -1, -2, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, -2, 0, -2, -1, 2, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 1, 0, 0, 0, 0, -2, 0, -2, + -1, -2, 0, 0, 0, 2, 0, -2, + 0, 0, 0, 0, -2, -3, 0, -4, + 6, -10, -4, 2, 0, -2, -12, -3, + 0, -3, 0, -12, 0, -3, -5, -1, + 0, 0, 1, -1, 2, -1, -7, 0, + -10, -5, -4, -5, -6, -2, -5, 0, + -4, -5, 1, 1, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, -1, 0, -2, 0, -3, -4, -4, + -1, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 1, -1, 0, 0, -8, 6, + -2, -8, 0, 2, -3, 0, -10, -1, + -2, 2, 0, -2, 3, 0, -7, -3, + -7, -6, -8, 0, 0, 0, -1, 0, + 0, 0, -1, -1, -2, -5, -6, 0, + -18, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -4, 2, + -1, -1, -5, -2, 0, -2, -2, -3, + 0, -3, 0, -1, -2, -1, -1, -3, + -2, 0, -1, 0, -4, 0, 0, 0, + -4, 0, -3, 0, -3, -3, 2, -3, + -4, 0, -2, -2, -2, 0, 0, 0, + 0, 0, -2, 0, 0, -3, 0, -2, + 0, -4, -5, -6, -2, 0, 0, 0, + 0, 15, 0, 0, 1, 0, 0, -2, + 0, 2, 0, 2, -3, 0, -1, -2, + -6, -1, -1, -1, -1, 0, 0, -1, + 0, 0, 0, 0, -2, -2, -2, 0, + -1, 0, -1, 0, 0, 0, -1, -2, + -1, -2, -2, -2, 0, 8, -2, -2, + 3, 0, 0, -9, -3, 2, -3, 1, + -6, 0, -2, -3, -1, 1, 0, 0, + -3, 0, 0, -4, 0, -3, -2, -3, + -2, -2, 0, -3, 1, -4, -3, 6, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, -2, 0, + 0, -2, -2, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, -4, 4, 0, -1, -9, + 0, 0, -4, -2, -5, 0, -5, 0, + -3, -8, -2, -8, -7, -9, 0, -2, + 0, -4, -2, -1, -2, -3, -5, -3, + -7, -8, -4, -2, 0, 6, -4, -7, + 0, 1, -6, 0, -10, -1, -2, 1, + 0, -2, 0, -1, -12, -2, -10, -2, + -14, 0, 1, 0, -1, 0, 0, 0, + 0, -1, -1, -7, -1, 0, -12, 0, + -5, 0, 0, -1, -3, -6, -2, 0, + -1, 0, -9, -2, 0, -6, 0, -6, + -2, -3, -5, -2, -3, -3, 0, -2, + -4, -2, -4, 0, 1, 0, -1, -6, + 0, 4, 0, 0, 0, 0, 0, -1, + -4, 0, 0, 0, 0, 0, 0, 0, + -2, 0, -2, 0, 0, -4, -2, 0, + -1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 3, -6, 4, 0, + -2, 0, -1, 2, 0, -2, 0, -2, + 0, 0, 0, 0, 0, -2, 0, 0, + -2, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 2, -6, -4, 8, 3, 2, -17, -1, + 4, -2, 0, -7, 0, -2, -2, -2, + 2, -2, -2, -6, -2, 0, -5, 0, + -11, -2, 6, -2, -7, 1, -2, -6, + -6, -2, 8, 0, -7, -5, 6, 0, + 1, -14, -2, 2, -3, -1, -7, -3, + -4, -3, -3, -2, 0, 0, -4, -4, + -2, -11, 0, -11, -3, 0, -7, -11, + -1, -6, -3, -6, -5, 5, 0, 0, + -6, 2, 0, 0, -10, 0, -2, -4, + -3, -6, -4, -5, 0, -2, -6, -2, + -4, -4, -6, -2, -3, 0, -6, -2, + 0, -2, -4, -4, -5, -5, -7, -2, + -4, 0, -7, -6, 6, -2, 1, -18, + -3, 4, -4, -3, -8, -2, -6, -2, + -3, -2, -2, -4, -6, -1, 0, -12, + 0, -12, -4, 5, -7, -13, -4, -7, + -8, -10, -6, 4, 0, 4, -4, 4, + 0, 0, -6, -1, 0, -1, 0, 0, + 0, -2, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, -1, -1, -2, 0, 0, 0, 0, + 0, 0, -4, -1, 0, 0, 0, -4, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, -4, -3, -2, 0, -5, -2, -4, + 0, 0, -5, 0, -2, -2, 0, 0, + 0, 0, -16, -4, -8, -2, -7, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, -3, -3, -2, -3, 0, 4, -1, + -4, -1, -3, -4, 0, -2, -1, -1, + 0, 0, -1, 0, 0, -17, -2, -3, + 0, -4, 0, 0, -1, -2, 0, 0, + 0, 0, 1, 0, -1, -3, -1, 3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, -4, 0, 0, -5, -2, + -4, 0, 0, -5, 0, -2, 0, 0, + 0, 0, 0, -19, 0, -4, -7, -10, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -3, -1, -3, 0, -2, + 2, 9, 3, 4, -5, 2, 8, 2, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -2, 15, + 8, 15, 0, 0, 0, 2, 0, 0, + 7, 0, 0, 0, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, -16, -2, -2, -8, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -2, 2, + 3, 2, -6, 0, 0, -2, 2, 0, + 0, 0, 0, 0, -5, 0, -2, -1, + -4, 0, -2, 0, -4, -1, 0, -1, + -3, 0, -2, -5, -4, -2, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -16, + -2, -2, -8, -9, 0, 0, 0, 0, + 0, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, 1, -1, 1, -1, + -5, 0, 4, 0, 2, -8, -2, -5, + 0, -3, -7, -4, -5, -8, -7, 0, + -2, -1, -2, -1, 0, -1, -1, 3, + 0, 3, -1, 0, 6, 0, 0, 0, + -1, -2, -2, 0, 0, -5, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, 2, -3, -4, -1, 0, -6, -1, + -4, -1, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, -2, 0, -2, + 0, 0, -1, 0, -6, 1, 2, 2, + 0, -5, 1, 3, 1, 6, -5, 0, + -1, 0, -1, -8, 0, 0, -6, -5, + 0, -3, 0, -3, 0, -3, 0, -1, + 3, 0, -2, -6, -2, 7, 0, 0, + -2, 2, 0, 0, -6, 0, -1, -1, + 0, 0, 0, -2, 0, -2, -8, -2, + -4, 0, -6, 0, -2, 0, -3, 0, + 1, 0, -2, 0, -2, -6, 0, -2, + 2, 0, 1, 0, -2, -1, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 4, -12, 1, 8, + 6, 3, -8, 1, 8, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = +{ + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 45, + .right_class_cnt = 35, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR == 8 +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +#endif + +#if LVGL_VERSION_MAJOR >= 8 +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 5, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LVGL_VERSION_MAJOR == 8 + .cache = &cache +#endif +}; + + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t montserrat_medium_12 = { +#else +lv_font_t montserrat_medium_12 = { +#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 = 13, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9 + .fallback = NULL, +#endif + .user_data = NULL, +}; + + + +#endif /*#if MONTSERRAT_MEDIUM_12*/ + diff --git a/main/fonts/montserrat_medium_18.c b/main/fonts/montserrat_medium_18.c new file mode 100644 index 0000000..3ef3fd6 --- /dev/null +++ b/main/fonts/montserrat_medium_18.c @@ -0,0 +1,1158 @@ +/******************************************************************************* + * 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 + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#ifndef MONTSERRAT_MEDIUM_18 +#define MONTSERRAT_MEDIUM_18 1 +#endif + +#if MONTSERRAT_MEDIUM_18 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0027 "'" */ + 0xda, 0xd9, 0xd9, 0xc8, 0xc8, 0x0, + + /* U+002E "." */ + 0x5, 0x60, 0x1f, 0xf2, 0xc, 0xd0, + + /* U+0030 "0" */ + 0x0, 0x4, 0xbe, 0xeb, 0x40, 0x0, 0x0, 0x6f, + 0xfb, 0xbf, 0xf6, 0x0, 0x2, 0xfd, 0x10, 0x1, + 0xdf, 0x20, 0xa, 0xf3, 0x0, 0x0, 0x3f, 0x90, + 0xe, 0xe0, 0x0, 0x0, 0xe, 0xe0, 0xf, 0xb0, + 0x0, 0x0, 0xb, 0xf0, 0x1f, 0xa0, 0x0, 0x0, + 0xa, 0xf1, 0xf, 0xb0, 0x0, 0x0, 0xb, 0xf0, + 0xe, 0xe0, 0x0, 0x0, 0xe, 0xe0, 0x9, 0xf3, + 0x0, 0x0, 0x3f, 0x90, 0x2, 0xfd, 0x10, 0x1, + 0xdf, 0x20, 0x0, 0x6f, 0xfb, 0xbf, 0xf6, 0x0, + 0x0, 0x4, 0xbe, 0xeb, 0x40, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xc8, 0xaa, 0xfc, 0x0, 0xf, 0xc0, + 0x0, 0xfc, 0x0, 0xf, 0xc0, 0x0, 0xfc, 0x0, + 0xf, 0xc0, 0x0, 0xfc, 0x0, 0xf, 0xc0, 0x0, + 0xfc, 0x0, 0xf, 0xc0, 0x0, 0xfc, 0x0, 0xf, + 0xc0, + + /* U+0032 "2" */ + 0x1, 0x8d, 0xfe, 0xc5, 0x0, 0x4f, 0xfd, 0xac, + 0xff, 0x70, 0x3c, 0x30, 0x0, 0x2f, 0xf0, 0x0, + 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, 0xc, + 0xf1, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x2, 0xee, 0x20, 0x0, 0x0, 0x2e, 0xf3, 0x0, + 0x0, 0x2, 0xef, 0x30, 0x0, 0x0, 0x2e, 0xf3, + 0x0, 0x0, 0x2, 0xef, 0x30, 0x0, 0x0, 0x2e, + 0xfc, 0xaa, 0xaa, 0xa7, 0x5f, 0xff, 0xff, 0xff, + 0xfb, + + /* U+0033 "3" */ + 0x5f, 0xff, 0xff, 0xff, 0xf0, 0x3a, 0xaa, 0xaa, + 0xcf, 0xc0, 0x0, 0x0, 0x1, 0xee, 0x10, 0x0, + 0x0, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x9f, 0x60, + 0x0, 0x0, 0x4, 0xfe, 0x61, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3e, 0xf2, + 0x0, 0x0, 0x0, 0x7, 0xf6, 0x0, 0x0, 0x0, + 0x6, 0xf6, 0x69, 0x10, 0x0, 0x1d, 0xf2, 0x9f, + 0xfc, 0xbc, 0xff, 0x80, 0x4, 0xae, 0xfe, 0xb5, + 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x4f, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0xed, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, 0x0, + 0x0, 0x5, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xc0, 0x3, 0xc5, 0x0, 0x0, 0xde, 0x10, 0x4, + 0xf7, 0x0, 0xb, 0xf4, 0x0, 0x4, 0xf7, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x39, 0x99, + 0x99, 0x9b, 0xfc, 0x98, 0x0, 0x0, 0x0, 0x5, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, + + /* U+0035 "5" */ + 0x2, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xfc, 0xaa, + 0xaa, 0xa0, 0x5, 0xf5, 0x0, 0x0, 0x0, 0x7, + 0xf3, 0x0, 0x0, 0x0, 0x9, 0xf1, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc7, 0x0, 0x7, 0xaa, + 0xab, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xb, 0xf6, + 0x0, 0x0, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0x3, 0xfa, 0x2c, 0x20, 0x0, 0xb, 0xf6, 0x6f, + 0xfd, 0xbb, 0xef, 0xb0, 0x3, 0x9d, 0xff, 0xc7, + 0x0, + + /* U+0036 "6" */ + 0x0, 0x1, 0x8d, 0xfe, 0xc6, 0x0, 0x4, 0xef, + 0xca, 0xad, 0x90, 0x1, 0xee, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0x40, 0x0, 0x0, 0x0, 0xe, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xfb, 0x2a, 0xef, 0xd7, + 0x0, 0x1f, 0xdf, 0xd9, 0x9d, 0xfb, 0x1, 0xff, + 0xa0, 0x0, 0xa, 0xf5, 0xf, 0xf2, 0x0, 0x0, + 0x3f, 0x90, 0xbf, 0x20, 0x0, 0x3, 0xf8, 0x4, + 0xfa, 0x0, 0x0, 0xaf, 0x40, 0x9, 0xfd, 0x99, + 0xdf, 0xa0, 0x0, 0x5, 0xcf, 0xfc, 0x60, 0x0, + + /* U+0037 "7" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7, 0xfb, 0xaa, + 0xaa, 0xaf, 0xe0, 0x7f, 0x40, 0x0, 0x5, 0xf8, + 0x6, 0xf4, 0x0, 0x0, 0xcf, 0x10, 0x0, 0x0, + 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x50, 0x0, 0x0, 0x0, 0xe, 0xe0, + 0x0, 0x0, 0x0, 0x6, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x4f, 0x90, + 0x0, 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x2a, 0xef, 0xfc, 0x70, 0x0, 0x3f, 0xfb, + 0x89, 0xdf, 0xb0, 0xa, 0xf5, 0x0, 0x0, 0xbf, + 0x30, 0xbf, 0x10, 0x0, 0x8, 0xf4, 0x4, 0xfc, + 0x42, 0x26, 0xfd, 0x0, 0x6, 0xff, 0xff, 0xfe, + 0x10, 0x5, 0xfe, 0x85, 0x6a, 0xfd, 0x10, 0xee, + 0x10, 0x0, 0x7, 0xf8, 0x2f, 0xa0, 0x0, 0x0, + 0x1f, 0xb2, 0xfb, 0x0, 0x0, 0x2, 0xfb, 0xd, + 0xf4, 0x0, 0x0, 0xaf, 0x70, 0x3f, 0xfb, 0x89, + 0xdf, 0xc0, 0x0, 0x29, 0xdf, 0xfc, 0x60, 0x0, + + /* U+0039 "9" */ + 0x0, 0x6c, 0xff, 0xc6, 0x0, 0x0, 0xaf, 0xd9, + 0x8c, 0xfa, 0x0, 0x3f, 0xb0, 0x0, 0x7, 0xf6, + 0x7, 0xf5, 0x0, 0x0, 0xf, 0xd0, 0x6f, 0x60, + 0x0, 0x2, 0xff, 0x11, 0xff, 0x51, 0x4, 0xdf, + 0xf2, 0x4, 0xef, 0xff, 0xfb, 0x9f, 0x30, 0x0, + 0x57, 0x73, 0xa, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xa0, 0x0, + 0x0, 0x0, 0x3e, 0xf2, 0x0, 0x8e, 0xba, 0xcf, + 0xf5, 0x0, 0x5, 0xbe, 0xfd, 0x92, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf6, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdd, 0xb, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0x60, 0x4f, 0x70, 0x0, 0x0, 0x0, 0xb, + 0xe0, 0x0, 0xdd, 0x0, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x6, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0x10, + 0x0, 0xe, 0xc0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x7, 0xf8, 0x88, 0x88, + 0x88, 0xfa, 0x0, 0x0, 0xed, 0x0, 0x0, 0x0, + 0xb, 0xf1, 0x0, 0x5f, 0x60, 0x0, 0x0, 0x0, + 0x4f, 0x80, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xee, 0x0, + + /* U+0042 "B" */ + 0x1f, 0xff, 0xff, 0xfe, 0xb4, 0x0, 0x1f, 0xd8, + 0x88, 0x8a, 0xff, 0x70, 0x1f, 0xb0, 0x0, 0x0, + 0x2f, 0xf0, 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0x2f, 0xc0, 0x1f, 0xd8, + 0x88, 0x8a, 0xfe, 0x30, 0x1f, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x1f, 0xb0, 0x0, 0x1, 0x4d, 0xf3, + 0x1f, 0xb0, 0x0, 0x0, 0x4, 0xf9, 0x1f, 0xb0, + 0x0, 0x0, 0x2, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x8, 0xf8, 0x1f, 0xd8, 0x88, 0x89, 0xcf, 0xe1, + 0x1f, 0xff, 0xff, 0xff, 0xd9, 0x10, + + /* U+0043 "C" */ + 0x0, 0x0, 0x4a, 0xef, 0xeb, 0x50, 0x0, 0x1, + 0xbf, 0xfc, 0xac, 0xff, 0xb0, 0x0, 0xbf, 0xb2, + 0x0, 0x1, 0x9c, 0x0, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xb2, 0x0, 0x1, 0xac, 0x10, + 0x1, 0xbf, 0xfc, 0xbc, 0xff, 0xb0, 0x0, 0x0, + 0x4b, 0xef, 0xeb, 0x50, 0x0, + + /* U+0044 "D" */ + 0x1f, 0xff, 0xff, 0xfd, 0xa4, 0x0, 0x1, 0xfe, + 0xaa, 0xaa, 0xcf, 0xfa, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x2b, 0xfa, 0x1, 0xfb, 0x0, 0x0, 0x0, + 0xc, 0xf4, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x3f, + 0xb1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xee, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0xd, 0xf1, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xee, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x3f, 0xb1, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xf4, 0x1f, 0xb0, 0x0, 0x0, 0x2b, 0xfa, 0x1, + 0xfe, 0xaa, 0xaa, 0xcf, 0xfa, 0x0, 0x1f, 0xff, + 0xff, 0xfd, 0xa4, 0x0, 0x0, + + /* U+0045 "E" */ + 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1, 0xfe, 0xaa, + 0xaa, 0xaa, 0x70, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x1, 0xfd, 0x99, 0x99, 0x99, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1, 0xfe, 0xaa, 0xaa, + 0xaa, 0xa0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x0, + + /* U+0046 "F" */ + 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xea, 0xaa, + 0xaa, 0xa7, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf0, 0x1f, 0xe9, 0x99, 0x99, 0x90, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x1, + 0xbf, 0xfc, 0xbb, 0xff, 0xc1, 0x0, 0xbf, 0xb2, + 0x0, 0x0, 0x7d, 0x10, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x39, 0x30, 0xfc, 0x0, + 0x0, 0x0, 0x6, 0xf5, 0xc, 0xf1, 0x0, 0x0, + 0x0, 0x6f, 0x50, 0x6f, 0xb0, 0x0, 0x0, 0x6, + 0xf5, 0x0, 0xbf, 0xb2, 0x0, 0x0, 0x9f, 0x50, + 0x0, 0xaf, 0xfd, 0xbc, 0xff, 0xd2, 0x0, 0x0, + 0x4a, 0xef, 0xeb, 0x60, 0x0, + + /* U+0048 "H" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xea, + 0xaa, 0xaa, 0xaa, 0xfb, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + + /* U+0049 "I" */ + 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, + 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, + 0xb1, 0xfb, 0x1f, 0xb0, + + /* U+004A "J" */ + 0x0, 0xef, 0xff, 0xff, 0x70, 0x8, 0xaa, 0xab, + 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, + 0x0, 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, + 0x70, 0x0, 0x0, 0x6, 0xf6, 0xa, 0x70, 0x0, + 0xcf, 0x30, 0xcf, 0xda, 0xdf, 0xc0, 0x0, 0x8d, + 0xfe, 0x90, 0x0, + + /* U+004B "K" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1d, 0xe2, 0x1f, 0xb0, + 0x0, 0x1, 0xdf, 0x30, 0x1f, 0xb0, 0x0, 0xc, + 0xf4, 0x0, 0x1f, 0xb0, 0x0, 0xbf, 0x50, 0x0, + 0x1f, 0xb0, 0xb, 0xf7, 0x0, 0x0, 0x1f, 0xb0, + 0xaf, 0x80, 0x0, 0x0, 0x1f, 0xb9, 0xff, 0xb0, + 0x0, 0x0, 0x1f, 0xff, 0xbb, 0xf8, 0x0, 0x0, + 0x1f, 0xfb, 0x1, 0xdf, 0x50, 0x0, 0x1f, 0xd0, + 0x0, 0x2f, 0xf2, 0x0, 0x1f, 0xb0, 0x0, 0x4, + 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, 0x7f, 0xb0, + 0x1f, 0xb0, 0x0, 0x0, 0x9, 0xf8, + + /* U+004C "L" */ + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xea, 0xaa, 0xaa, 0xa5, 0x1f, 0xff, 0xff, 0xff, + 0xf8, + + /* U+004D "M" */ + 0x1f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x41, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xf4, 0x1f, + 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, 0x41, 0xff, + 0xf5, 0x0, 0x0, 0x2, 0xfe, 0xf4, 0x1f, 0xad, + 0xe0, 0x0, 0x0, 0xbe, 0x8f, 0x41, 0xfa, 0x4f, + 0x80, 0x0, 0x4f, 0x67, 0xf4, 0x1f, 0xa0, 0xaf, + 0x20, 0xd, 0xd0, 0x7f, 0x41, 0xfa, 0x2, 0xfa, + 0x7, 0xf4, 0x7, 0xf4, 0x1f, 0xa0, 0x8, 0xf5, + 0xea, 0x0, 0x7f, 0x41, 0xfa, 0x0, 0xe, 0xff, + 0x20, 0x6, 0xf4, 0x1f, 0xa0, 0x0, 0x5f, 0x80, + 0x0, 0x6f, 0x41, 0xfa, 0x0, 0x0, 0x60, 0x0, + 0x6, 0xf4, 0x1f, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0x40, + + /* U+004E "N" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xf8, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xff, 0x50, 0x0, + 0x1, 0xfb, 0x1f, 0xdf, 0xf2, 0x0, 0x1, 0xfb, + 0x1f, 0xb6, 0xfd, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x9f, 0xa0, 0x1, 0xfb, 0x1f, 0xb0, 0xc, 0xf6, + 0x1, 0xfb, 0x1f, 0xb0, 0x1, 0xef, 0x31, 0xfb, + 0x1f, 0xb0, 0x0, 0x4f, 0xe2, 0xfb, 0x1f, 0xb0, + 0x0, 0x7, 0xfd, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0xbf, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1d, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x2, 0xfb, + + /* U+004F "O" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0xbc, 0xff, 0xc1, 0x0, 0x0, + 0xbf, 0xb2, 0x0, 0x1, 0xaf, 0xd0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xfe, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf2, 0x1f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x30, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf2, 0xc, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xfe, 0x0, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x9f, 0x80, 0x0, 0xbf, 0xb2, 0x0, 0x1, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xfc, 0xbc, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x4a, 0xef, 0xeb, 0x50, + 0x0, 0x0, + + /* U+0050 "P" */ + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xea, + 0xaa, 0xbe, 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xb0, 0x0, 0x0, 0xe, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, 0x1f, 0xb0, + 0x0, 0x0, 0xe, 0xf0, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xea, 0xaa, 0xbe, 0xfd, 0x10, + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0xbc, 0xff, 0xc1, 0x0, 0x0, + 0xbf, 0xb2, 0x0, 0x1, 0xaf, 0xd0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xfe, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf1, 0x1f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x30, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf2, 0xd, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xfe, 0x0, 0x7f, 0xa0, 0x0, 0x0, + 0x0, 0x8f, 0x80, 0x0, 0xcf, 0xa1, 0x0, 0x0, + 0x9f, 0xd0, 0x0, 0x1, 0xcf, 0xfb, 0xab, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x6c, 0xef, 0xfd, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xe6, 0x34, + 0xa7, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, 0x43, 0x0, + + /* U+0052 "R" */ + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xea, + 0xaa, 0xbe, 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xb0, 0x0, 0x0, 0xe, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, 0x1f, 0xb0, + 0x0, 0x0, 0xe, 0xe0, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xd9, 0x99, 0xae, 0xfd, 0x10, + 0x1f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xb0, + 0x0, 0x1f, 0xd0, 0x0, 0x1f, 0xb0, 0x0, 0x6, + 0xf9, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0xbf, 0x40, + 0x1f, 0xb0, 0x0, 0x0, 0x1e, 0xe0, + + /* U+0053 "S" */ + 0x0, 0x29, 0xdf, 0xfd, 0x81, 0x0, 0x3f, 0xfc, + 0x9a, 0xdf, 0xc0, 0xb, 0xf4, 0x0, 0x0, 0x23, + 0x0, 0xed, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x61, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xfd, 0x70, 0x0, 0x0, + 0x0, 0x48, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x40, 0x0, 0x0, 0x0, 0x6, 0xf6, 0xb, + 0x50, 0x0, 0x0, 0xcf, 0x31, 0xdf, 0xeb, 0x9a, + 0xef, 0x90, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0x89, 0xaa, 0xad, + 0xfb, 0xaa, 0xa5, 0x0, 0x0, 0x9f, 0x20, 0x0, + 0x0, 0x0, 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x20, 0x0, 0x0, 0x0, 0x9, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, + 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x20, + 0x0, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, 0x9, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x20, 0x0, 0x0, + + /* U+0055 "U" */ + 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, + 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, + 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, + 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, + 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, + 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf6, + 0x2f, 0xb0, 0x0, 0x0, 0x7, 0xf5, 0xe, 0xf0, + 0x0, 0x0, 0xb, 0xf2, 0x8, 0xfa, 0x0, 0x0, + 0x7f, 0xb0, 0x0, 0xcf, 0xfb, 0xbe, 0xfe, 0x20, + 0x0, 0x7, 0xcf, 0xfd, 0x81, 0x0, + + /* U+0056 "V" */ + 0xc, 0xf2, 0x0, 0x0, 0x0, 0x2, 0xf9, 0x6, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xf3, 0x0, 0xef, + 0x0, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x8f, 0x60, + 0x0, 0x0, 0x7f, 0x50, 0x0, 0x1f, 0xd0, 0x0, + 0x0, 0xee, 0x0, 0x0, 0xa, 0xf4, 0x0, 0x5, + 0xf7, 0x0, 0x0, 0x3, 0xfb, 0x0, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0xdf, 0x20, 0x2f, 0xa0, 0x0, + 0x0, 0x0, 0x6f, 0x80, 0x9f, 0x30, 0x0, 0x0, + 0x0, 0xe, 0xe1, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x80, 0x0, 0x0, + + /* U+0057 "W" */ + 0x4f, 0x90, 0x0, 0x0, 0xc, 0xf3, 0x0, 0x0, + 0x2, 0xf8, 0xe, 0xe0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x8, 0xf3, 0x9, 0xf3, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0xd, 0xe0, 0x4, 0xf8, + 0x0, 0x0, 0xcd, 0x8f, 0x20, 0x0, 0x2f, 0x80, + 0x0, 0xfe, 0x0, 0x2, 0xf8, 0x3f, 0x80, 0x0, + 0x7f, 0x30, 0x0, 0xaf, 0x30, 0x7, 0xf3, 0xe, + 0xd0, 0x0, 0xde, 0x0, 0x0, 0x5f, 0x80, 0xc, + 0xd0, 0x8, 0xf2, 0x2, 0xf9, 0x0, 0x0, 0xf, + 0xd0, 0x2f, 0x80, 0x3, 0xf7, 0x7, 0xf4, 0x0, + 0x0, 0xa, 0xf2, 0x7f, 0x30, 0x0, 0xed, 0xc, + 0xe0, 0x0, 0x0, 0x5, 0xf7, 0xde, 0x0, 0x0, + 0x9f, 0x4f, 0x90, 0x0, 0x0, 0x0, 0xfe, 0xf8, + 0x0, 0x0, 0x3f, 0xdf, 0x40, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x9, 0xfa, + 0x0, 0x0, + + /* U+0058 "X" */ + 0x2f, 0xd0, 0x0, 0x0, 0xb, 0xf3, 0x6, 0xfa, + 0x0, 0x0, 0x7f, 0x70, 0x0, 0xbf, 0x50, 0x2, + 0xfc, 0x0, 0x0, 0x1e, 0xe1, 0xd, 0xf2, 0x0, + 0x0, 0x5, 0xfb, 0x8f, 0x50, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x0, + 0x0, 0x9, 0xf6, 0x5f, 0xa0, 0x0, 0x0, 0x4f, + 0xb0, 0xa, 0xf6, 0x0, 0x1, 0xee, 0x10, 0x1, + 0xef, 0x20, 0xb, 0xf5, 0x0, 0x0, 0x4f, 0xc0, + 0x6f, 0xa0, 0x0, 0x0, 0x8, 0xf8, + + /* U+0059 "Y" */ + 0xc, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0x60, 0x3f, + 0xb0, 0x0, 0x0, 0xe, 0xd0, 0x0, 0x9f, 0x50, + 0x0, 0x8, 0xf3, 0x0, 0x1, 0xee, 0x0, 0x2, + 0xfa, 0x0, 0x0, 0x6, 0xf8, 0x0, 0xbf, 0x10, + 0x0, 0x0, 0xc, 0xf1, 0x4f, 0x70, 0x0, 0x0, + 0x0, 0x3f, 0xbd, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xfb, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xa, 0xaa, + 0xaa, 0xaa, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0x20, 0x0, 0x0, 0x0, 0xc, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x5, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xa0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfb, 0xaa, 0xaa, 0xaa, 0xa2, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+0061 "a" */ + 0x1, 0x7c, 0xff, 0xd6, 0x0, 0x9, 0xfc, 0x99, + 0xef, 0x80, 0x1, 0x30, 0x0, 0xd, 0xf0, 0x0, + 0x0, 0x0, 0x9, 0xf2, 0x1, 0x9e, 0xff, 0xff, + 0xf3, 0xa, 0xf8, 0x43, 0x3a, 0xf3, 0xf, 0xb0, + 0x0, 0x8, 0xf3, 0xf, 0xb0, 0x0, 0xe, 0xf3, + 0x9, 0xf9, 0x46, 0xdf, 0xf3, 0x0, 0x8d, 0xfe, + 0x87, 0xf3, + + /* U+0062 "b" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x56, + 0xdf, 0xea, 0x20, 0x5, 0xfd, 0xfc, 0x9b, 0xff, + 0x30, 0x5f, 0xf5, 0x0, 0x4, 0xfe, 0x5, 0xfa, + 0x0, 0x0, 0x8, 0xf4, 0x5f, 0x60, 0x0, 0x0, + 0x4f, 0x75, 0xf6, 0x0, 0x0, 0x4, 0xf7, 0x5f, + 0xa0, 0x0, 0x0, 0x8f, 0x45, 0xff, 0x50, 0x0, + 0x4f, 0xe0, 0x5f, 0xcf, 0xc9, 0xbf, 0xf3, 0x5, + 0xf4, 0x6d, 0xfe, 0xa2, 0x0, + + /* U+0063 "c" */ + 0x0, 0x7, 0xdf, 0xeb, 0x30, 0x0, 0xcf, 0xd9, + 0xaf, 0xf4, 0x9, 0xf7, 0x0, 0x2, 0xc3, 0xf, + 0xd0, 0x0, 0x0, 0x0, 0x3f, 0x80, 0x0, 0x0, + 0x0, 0x3f, 0x80, 0x0, 0x0, 0x0, 0xf, 0xc0, + 0x0, 0x0, 0x0, 0x9, 0xf7, 0x0, 0x2, 0xc3, + 0x0, 0xcf, 0xd9, 0xaf, 0xf3, 0x0, 0x7, 0xdf, + 0xeb, 0x30, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x1, 0xfa, 0x0, 0x8, + 0xdf, 0xe8, 0x2f, 0xa0, 0x1d, 0xfd, 0x9b, 0xfd, + 0xfa, 0xa, 0xf8, 0x0, 0x2, 0xef, 0xa0, 0xfd, + 0x0, 0x0, 0x6, 0xfa, 0x3f, 0x80, 0x0, 0x0, + 0x2f, 0xa3, 0xf8, 0x0, 0x0, 0x2, 0xfa, 0xf, + 0xc0, 0x0, 0x0, 0x5f, 0xa0, 0xaf, 0x60, 0x0, + 0x1e, 0xfa, 0x1, 0xdf, 0xb7, 0x9e, 0xdf, 0xa0, + 0x0, 0x8d, 0xfe, 0x91, 0xfa, + + /* U+0065 "e" */ + 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+0066 "f" */ + 0x0, 0x1a, 0xee, 0x90, 0xa, 0xf9, 0x88, 0x0, + 0xfb, 0x0, 0x0, 0x1f, 0x90, 0x0, 0xbf, 0xff, + 0xff, 0x55, 0x8f, 0xc7, 0x72, 0x1, 0xfa, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, + 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, 0x1f, 0xa0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x8, 0xdf, 0xe9, 0x1e, 0xc0, 0x1d, 0xfd, + 0x9b, 0xfe, 0xec, 0xa, 0xf8, 0x0, 0x1, 0xdf, + 0xc0, 0xfd, 0x0, 0x0, 0x4, 0xfc, 0x3f, 0x90, + 0x0, 0x0, 0xf, 0xc3, 0xf8, 0x0, 0x0, 0x0, + 0xfc, 0xf, 0xd0, 0x0, 0x0, 0x4f, 0xc0, 0xaf, + 0x80, 0x0, 0x1d, 0xfc, 0x1, 0xdf, 0xd9, 0xaf, + 0xdf, 0xc0, 0x0, 0x8d, 0xfe, 0x91, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x90, 0x27, 0x0, 0x0, + 0xb, 0xf4, 0x7, 0xff, 0xb9, 0xae, 0xfa, 0x0, + 0x4, 0xae, 0xff, 0xc6, 0x0, + + /* U+0068 "h" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x5f, 0x56, 0xdf, 0xea, + 0x10, 0x5f, 0xef, 0xca, 0xdf, 0xd0, 0x5f, 0xf4, + 0x0, 0xa, 0xf6, 0x5f, 0x90, 0x0, 0x2, 0xf9, + 0x5f, 0x60, 0x0, 0x0, 0xfa, 0x5f, 0x50, 0x0, + 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, + 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, + 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, + + /* U+0069 "i" */ + 0x6f, 0x69, 0xf9, 0x4, 0x0, 0x0, 0x5f, 0x55, + 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, + 0x55, 0xf5, 0x5f, 0x55, 0xf5, + + /* U+006A "j" */ + 0x0, 0x4, 0xf7, 0x0, 0x7, 0xfa, 0x0, 0x0, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf7, 0x0, + 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, + 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, + 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, + 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x6, 0xf5, + 0x4b, 0x9f, 0xe1, 0x5e, 0xfc, 0x30, + + /* U+006B "k" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x50, + 0x0, 0x1d, 0xf3, 0x5, 0xf5, 0x0, 0x2d, 0xf3, + 0x0, 0x5f, 0x50, 0x2e, 0xf4, 0x0, 0x5, 0xf5, + 0x2e, 0xf4, 0x0, 0x0, 0x5f, 0x9e, 0xfe, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0xfa, 0x0, 0x0, 0x5f, + 0xe3, 0xc, 0xf6, 0x0, 0x5, 0xf6, 0x0, 0x1e, + 0xf3, 0x0, 0x5f, 0x50, 0x0, 0x3f, 0xd0, 0x5, + 0xf5, 0x0, 0x0, 0x7f, 0xa0, + + /* U+006C "l" */ + 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, + 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, + 0x55, 0xf5, 0x5f, 0x55, 0xf5, + + /* U+006D "m" */ + 0x5f, 0x58, 0xdf, 0xe8, 0x0, 0x8d, 0xfe, 0x80, + 0x5, 0xfe, 0xfa, 0x9d, 0xfb, 0xdf, 0xa9, 0xdf, + 0xb0, 0x5f, 0xf2, 0x0, 0xd, 0xff, 0x30, 0x0, + 0xcf, 0x35, 0xf9, 0x0, 0x0, 0x7f, 0xa0, 0x0, + 0x6, 0xf6, 0x5f, 0x60, 0x0, 0x5, 0xf7, 0x0, + 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, 0x5f, 0x60, + 0x0, 0x4, 0xf7, 0x5f, 0x50, 0x0, 0x5, 0xf6, + 0x0, 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, 0x5f, + 0x60, 0x0, 0x4, 0xf7, 0x5f, 0x50, 0x0, 0x5, + 0xf6, 0x0, 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, + 0x5f, 0x60, 0x0, 0x4, 0xf7, + + /* U+006E "n" */ + 0x5f, 0x57, 0xdf, 0xea, 0x10, 0x5f, 0xef, 0xa8, + 0xcf, 0xd0, 0x5f, 0xf3, 0x0, 0x9, 0xf6, 0x5f, + 0x90, 0x0, 0x2, 0xf9, 0x5f, 0x60, 0x0, 0x0, + 0xfa, 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, + 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, + 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, + 0x0, 0xfb, + + /* U+006F "o" */ + 0x0, 0x7, 0xdf, 0xea, 0x30, 0x0, 0xd, 0xfd, + 0x9a, 0xff, 0x50, 0x9, 0xf7, 0x0, 0x2, 0xef, + 0x10, 0xfd, 0x0, 0x0, 0x6, 0xf7, 0x3f, 0x80, + 0x0, 0x0, 0x2f, 0x93, 0xf8, 0x0, 0x0, 0x2, + 0xf9, 0xf, 0xd0, 0x0, 0x0, 0x6f, 0x60, 0x9f, + 0x80, 0x0, 0x2e, 0xf1, 0x0, 0xcf, 0xd9, 0xaf, + 0xf4, 0x0, 0x0, 0x7d, 0xfe, 0xa3, 0x0, + + /* U+0070 "p" */ + 0x5f, 0x46, 0xdf, 0xea, 0x20, 0x5, 0xfd, 0xfa, + 0x8a, 0xff, 0x30, 0x5f, 0xf4, 0x0, 0x3, 0xfe, + 0x5, 0xfa, 0x0, 0x0, 0x8, 0xf4, 0x5f, 0x60, + 0x0, 0x0, 0x4f, 0x75, 0xf6, 0x0, 0x0, 0x4, + 0xf7, 0x5f, 0xa0, 0x0, 0x0, 0x9f, 0x45, 0xff, + 0x50, 0x0, 0x4f, 0xe0, 0x5f, 0xdf, 0xc9, 0xbf, + 0xf3, 0x5, 0xf5, 0x6d, 0xfe, 0xa2, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, + 0xf5, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x8, 0xdf, 0xe8, 0x1f, 0xa0, 0x1d, 0xfd, + 0x9b, 0xfc, 0xfa, 0xa, 0xf7, 0x0, 0x2, 0xef, + 0xa0, 0xfd, 0x0, 0x0, 0x6, 0xfa, 0x3f, 0x80, + 0x0, 0x0, 0x2f, 0xa3, 0xf8, 0x0, 0x0, 0x2, + 0xfa, 0xf, 0xd0, 0x0, 0x0, 0x6f, 0xa0, 0xaf, + 0x80, 0x0, 0x2e, 0xfa, 0x1, 0xdf, 0xd9, 0xaf, + 0xdf, 0xa0, 0x0, 0x8d, 0xfe, 0x82, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa0, + 0x0, 0x0, 0x0, 0x1, 0xfa, + + /* U+0072 "r" */ + 0x5f, 0x46, 0xdb, 0x5f, 0xcf, 0xd9, 0x5f, 0xf5, + 0x0, 0x5f, 0xa0, 0x0, 0x5f, 0x70, 0x0, 0x5f, + 0x50, 0x0, 0x5f, 0x50, 0x0, 0x5f, 0x50, 0x0, + 0x5f, 0x50, 0x0, 0x5f, 0x50, 0x0, + + /* U+0073 "s" */ + 0x1, 0x8d, 0xfe, 0xc7, 0x0, 0xcf, 0xb8, 0xad, + 0xd0, 0x3f, 0x90, 0x0, 0x1, 0x2, 0xfb, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb8, 0x40, 0x0, 0x5, + 0x9c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, 0x60, + 0x50, 0x0, 0x5, 0xf7, 0x5f, 0xea, 0x9a, 0xfe, + 0x10, 0x6c, 0xef, 0xd9, 0x20, + + /* U+0074 "t" */ + 0x1, 0xfa, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0xbf, + 0xff, 0xff, 0x55, 0x8f, 0xc7, 0x72, 0x1, 0xfa, + 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, + 0xf, 0xc0, 0x0, 0x0, 0xbf, 0xa9, 0x90, 0x1, + 0xbe, 0xe9, + + /* U+0075 "u" */ + 0x7f, 0x40, 0x0, 0x3, 0xf8, 0x7f, 0x40, 0x0, + 0x3, 0xf8, 0x7f, 0x40, 0x0, 0x3, 0xf8, 0x7f, + 0x40, 0x0, 0x3, 0xf8, 0x7f, 0x40, 0x0, 0x3, + 0xf8, 0x7f, 0x40, 0x0, 0x4, 0xf8, 0x6f, 0x60, + 0x0, 0x6, 0xf8, 0x2f, 0xc0, 0x0, 0x1e, 0xf8, + 0xa, 0xfd, 0x89, 0xee, 0xf8, 0x0, 0x8d, 0xfe, + 0x92, 0xf8, + + /* U+0076 "v" */ + 0xd, 0xe0, 0x0, 0x0, 0xd, 0xd0, 0x6, 0xf6, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0xfc, 0x0, 0x0, + 0xaf, 0x10, 0x0, 0x9f, 0x30, 0x1, 0xf9, 0x0, + 0x0, 0x2f, 0x90, 0x7, 0xf3, 0x0, 0x0, 0xb, + 0xf0, 0xe, 0xc0, 0x0, 0x0, 0x5, 0xf6, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0xed, 0xbe, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf1, 0x0, 0x0, + + /* U+0077 "w" */ + 0xbe, 0x0, 0x0, 0xc, 0xf1, 0x0, 0x0, 0xae, + 0x5, 0xf4, 0x0, 0x2, 0xff, 0x60, 0x0, 0xf, + 0x80, 0xf, 0x90, 0x0, 0x8f, 0xeb, 0x0, 0x5, + 0xf2, 0x0, 0xae, 0x0, 0xd, 0xb8, 0xf1, 0x0, + 0xbd, 0x0, 0x4, 0xf4, 0x3, 0xf5, 0x2f, 0x70, + 0x1f, 0x70, 0x0, 0xe, 0xa0, 0x9e, 0x0, 0xcc, + 0x6, 0xf1, 0x0, 0x0, 0x9f, 0x1e, 0x90, 0x6, + 0xf2, 0xcc, 0x0, 0x0, 0x3, 0xfa, 0xf3, 0x0, + 0x1f, 0xaf, 0x60, 0x0, 0x0, 0xd, 0xfd, 0x0, + 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x8f, 0x70, + 0x0, 0x5, 0xfb, 0x0, 0x0, + + /* U+0078 "x" */ + 0x3f, 0xb0, 0x0, 0xc, 0xf2, 0x7, 0xf7, 0x0, + 0x7f, 0x60, 0x0, 0xbf, 0x33, 0xfa, 0x0, 0x0, + 0x1e, 0xde, 0xd0, 0x0, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x3f, + 0xbc, 0xf2, 0x0, 0x0, 0xde, 0x12, 0xfc, 0x0, + 0xa, 0xf4, 0x0, 0x5f, 0x90, 0x6f, 0x80, 0x0, + 0xa, 0xf5, + + /* U+0079 "y" */ + 0xd, 0xe0, 0x0, 0x0, 0xd, 0xd0, 0x6, 0xf6, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0xfc, 0x0, 0x0, + 0x9f, 0x10, 0x0, 0x9f, 0x30, 0x1, 0xfa, 0x0, + 0x0, 0x2f, 0x90, 0x6, 0xf3, 0x0, 0x0, 0xc, + 0xf0, 0xd, 0xc0, 0x0, 0x0, 0x5, 0xf6, 0x3f, + 0x60, 0x0, 0x0, 0x0, 0xed, 0xae, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xf, 0xb0, + 0x0, 0x0, 0x1, 0x0, 0x7f, 0x40, 0x0, 0x0, + 0x1f, 0xaa, 0xfb, 0x0, 0x0, 0x0, 0x19, 0xee, + 0xa1, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x2f, 0xff, 0xff, 0xff, 0x91, 0x77, 0x77, 0x7e, + 0xf4, 0x0, 0x0, 0x6, 0xf8, 0x0, 0x0, 0x3, + 0xfc, 0x0, 0x0, 0x1, 0xee, 0x10, 0x0, 0x0, + 0xbf, 0x40, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x0, + 0x4f, 0xb0, 0x0, 0x0, 0x1e, 0xf8, 0x77, 0x77, + 0x54, 0xff, 0xff, 0xff, 0xfb, + + /* U+00B0 "°" */ + 0x1, 0xaf, 0xd5, 0x0, 0xb8, 0x3, 0xe4, 0x1e, + 0x0, 0x6, 0xa2, 0xe0, 0x0, 0x6a, 0xc, 0x70, + 0x1d, 0x50, 0x2c, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, + + /* U+00E9 "é" */ + 0x0, 0x0, 0x0, 0xcf, 0x40, 0x0, 0x0, 0x0, + 0xce, 0x20, 0x0, 0x0, 0x0, 0x58, 0x10, 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 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 77, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 60, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 6, .adv_w = 65, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 90, .adv_w = 107, .box_w = 5, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 123, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 188, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 253, .adv_w = 193, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 331, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 396, .adv_w = 178, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 468, .adv_w = 172, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 540, .adv_w = 185, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 612, .adv_w = 178, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 684, .adv_w = 211, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 782, .adv_w = 218, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 860, .adv_w = 208, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 945, .adv_w = 238, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1030, .adv_w = 193, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1102, .adv_w = 183, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1167, .adv_w = 222, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1252, .adv_w = 234, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1330, .adv_w = 89, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1350, .adv_w = 148, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1409, .adv_w = 207, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1487, .adv_w = 171, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1552, .adv_w = 275, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1650, .adv_w = 234, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1728, .adv_w = 242, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1826, .adv_w = 208, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1904, .adv_w = 242, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2024, .adv_w = 209, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2102, .adv_w = 179, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2174, .adv_w = 169, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2246, .adv_w = 228, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2324, .adv_w = 205, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2415, .adv_w = 324, .box_w = 20, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2545, .adv_w = 194, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2623, .adv_w = 186, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2708, .adv_w = 189, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2786, .adv_w = 172, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2836, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2913, .adv_w = 164, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2963, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3040, .adv_w = 176, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3095, .adv_w = 102, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3144, .adv_w = 199, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 3221, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3291, .adv_w = 80, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3312, .adv_w = 82, .box_w = 6, .box_h = 18, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 3366, .adv_w = 177, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3443, .adv_w = 80, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3464, .adv_w = 304, .box_w = 17, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3549, .adv_w = 196, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3599, .adv_w = 183, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3654, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3731, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 3808, .adv_w = 118, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3838, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3883, .adv_w = 119, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3925, .adv_w = 195, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3975, .adv_w = 161, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4035, .adv_w = 259, .box_w = 17, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4120, .adv_w = 159, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4170, .adv_w = 161, .box_w = 12, .box_h = 14, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 4254, .adv_w = 150, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4299, .adv_w = 121, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 4324, .adv_w = 176, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_0[] = { + 0x0, 0x7, 0xe +}; + +static const uint16_t unicode_list_4[] = { + 0x0, 0x39 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 32, .range_length = 15, .glyph_id_start = 1, + .unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 3, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 48, .range_length = 10, .glyph_id_start = 4, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 65, .range_length = 26, .glyph_id_start = 14, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 97, .range_length = 26, .glyph_id_start = 40, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 58, .glyph_id_start = 66, + .unicode_list = unicode_list_4, .glyph_id_ofs_list = NULL, .list_length = 2, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = +{ + 0, 0, 1, 2, 3, 0, 4, 5, + 6, 7, 8, 9, 10, 3, 11, 12, + 13, 14, 15, 16, 17, 18, 18, 19, + 20, 21, 18, 18, 14, 22, 14, 23, + 24, 25, 19, 26, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 30, + 36, 36, 37, 33, 30, 30, 31, 31, + 38, 39, 40, 41, 36, 42, 42, 43, + 42, 44, 45, 34 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = +{ + 0, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 3, 9, 10, 11, 12, 13, + 14, 13, 13, 13, 14, 13, 13, 15, + 13, 13, 13, 13, 14, 13, 14, 13, + 16, 17, 18, 19, 19, 20, 21, 22, + 23, 24, 25, 25, 25, 0, 25, 24, + 26, 27, 24, 24, 28, 28, 25, 28, + 25, 28, 29, 30, 31, 32, 32, 33, + 32, 34, 35, 25 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = +{ + 13, -16, 2, 14, 6, 5, -12, 2, + 14, 1, 12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, -16, 0, -3, -4, 3, + 3, -3, 0, -4, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -18, 2, -3, + 0, -1, -1, -3, 0, 0, -2, 0, + 0, -2, 0, 0, -7, 0, -6, 0, + -7, -10, -10, -5, 0, 0, 0, 0, + -2, 0, 0, 3, 0, 2, -3, 0, + 1, 0, 3, -1, 0, 0, 0, -5, + 0, -1, 0, 0, 1, 0, 0, 4, + 0, -2, 0, -3, 0, -5, 0, 0, + 0, -3, 0, 0, 0, 0, 0, -1, + 1, -2, -2, 0, -3, 0, 0, 0, + -1, -1, 0, -3, -3, 0, 0, 1, + 0, 0, 0, 0, -2, 0, -3, -3, + -3, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, -2, -4, 0, -4, -9, + 6, 0, -7, -1, -3, 0, -1, -14, + 3, -2, 0, 0, 3, 1, -2, -15, + 0, -15, -2, -25, -2, 8, 0, 4, + 0, 0, 0, 0, 1, 0, -5, -4, + 0, -9, 0, 0, 0, 0, -1, -1, + 0, -1, -4, 0, 0, 0, 0, 0, + -3, 0, -3, 0, -2, -3, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, -2, 0, -3, -2, 3, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 2, 0, 0, 0, 0, -3, 0, -3, + -2, -3, 0, 0, 0, 2, 0, -2, + 0, 0, 0, 0, -3, -4, 0, -5, + 9, -15, -6, 3, 0, -2, -19, -5, + 0, -5, 0, -18, 0, -5, -8, -2, + 0, 0, 1, -1, 2, -2, -11, 0, + -14, -7, -6, -7, -9, -3, -8, -1, + -5, -8, 2, 1, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, -1, 0, -3, 0, -5, -6, -6, + -1, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 1, -2, 0, 0, -12, 10, + -2, -12, 0, 3, -4, 0, -14, -1, + -4, 4, 0, -3, 4, 0, -10, -4, + -11, -10, -12, 0, 0, 0, -1, 0, + 0, 0, -1, -1, -3, -8, -10, -1, + -27, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, -1, -3, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, -6, 3, + -2, -1, -7, -3, 0, -4, -3, -5, + 0, -4, 0, -1, -2, -1, -2, -5, + -3, 0, -2, 0, -6, 0, 0, 0, + -6, 0, -5, 0, -5, -5, 3, -5, + -6, 0, -3, -3, -3, 0, 0, 0, + 0, 0, -3, 0, 0, -4, 0, -3, + 0, -6, -7, -9, -2, 0, 0, 0, + 0, 23, 0, 0, 1, 0, 0, -4, + 0, 3, 0, 3, -4, 0, -2, -3, + -9, -2, -2, -2, -1, 0, 0, -1, + 0, 0, 0, 0, -3, -2, -2, 0, + -2, 0, -2, 0, 0, 0, -2, -3, + -2, -3, -3, -3, 0, 12, -3, -4, + 4, 0, 0, -14, -5, 3, -5, 2, + -9, 0, -2, -4, -1, 1, 0, 0, + -5, 0, 0, -5, 0, -5, -3, -4, + -3, -3, 0, -5, 1, -5, -5, 9, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, -4, 0, + 0, -3, -3, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, -6, 6, 1, -2, -14, + 0, 0, -6, -3, -8, 0, -7, 0, + -4, -12, -3, -12, -11, -14, 0, -4, + 0, -7, -3, -1, -3, -5, -8, -5, + -11, -12, -7, -3, 0, 9, -6, -11, + 0, 1, -9, 0, -14, -2, -3, 1, + 0, -4, 0, -2, -19, -3, -15, -3, + -21, 0, 1, 0, -2, 0, 0, 0, + 0, -1, -2, -11, -2, 0, -19, 0, + -8, 0, 0, -1, -4, -9, -3, 0, + -2, 0, -13, -3, 0, -10, 0, -9, + -2, -5, -7, -3, -5, -4, 0, -3, + -5, -3, -5, 0, 1, 0, -2, -10, + 0, 6, 0, 0, 0, 0, 0, -2, + -6, 0, 0, 0, 0, 0, 0, 0, + -3, 0, -3, 0, 0, -6, -3, 0, + -1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 4, -9, 6, 0, + -3, 0, -2, 3, 0, -3, 0, -3, + 0, 0, 0, 0, 0, -3, 0, 0, + -4, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 2, -9, -6, 12, 5, 3, -25, -2, + 6, -3, 0, -10, 0, -3, -3, -3, + 3, -4, -2, -9, -2, 0, -8, 0, + -16, -4, 8, -4, -11, 1, -4, -10, + -10, -3, 12, 0, -11, -7, 9, 0, + 1, -21, -2, 3, -5, -2, -11, -4, + -6, -4, -4, -2, 0, 0, -7, -6, + -3, -16, 0, -16, -4, 0, -10, -17, + -1, -9, -5, -10, -8, 8, 0, 0, + -10, 3, 0, 0, -15, 0, -3, -6, + -5, -10, -7, -7, 0, -4, -9, -3, + -7, -5, -9, -3, -5, 0, -9, -3, + 0, -3, -6, -7, -8, -8, -11, -4, + -6, 0, -11, -10, 10, -3, 1, -27, + -5, 6, -6, -5, -12, -3, -9, -3, + -4, -2, -3, -6, -9, -1, 0, -19, + 0, -17, -7, 7, -11, -20, -6, -10, + -12, -14, -10, 6, 0, 6, -5, 6, + 0, 0, -9, -1, 0, -1, 0, 0, + 0, -2, 0, 0, 0, 0, 0, -3, + 0, 0, 1, 0, -3, 0, 0, 0, + 0, -2, -2, -3, 0, 0, 0, 0, + 0, 0, -6, -1, 0, 0, 0, -6, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, -5, -4, -3, 0, -8, -3, -7, + 0, 0, -8, 0, -3, -3, 0, 0, + 0, 0, -23, -5, -12, -3, -10, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, -4, -5, -2, -5, 0, 6, -2, + -7, -2, -5, -5, 0, -3, -1, -2, + 0, 0, -1, 0, 0, -25, -2, -4, + 0, -6, 0, 0, -2, -2, 0, 0, + 0, 0, 2, 0, -2, -5, -2, 5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, -6, 0, 0, -8, -3, + -6, 0, 0, -8, 0, -3, 0, 0, + 0, 0, 0, -28, 0, -6, -11, -14, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -4, -1, -4, 0, -3, + 3, 14, 5, 6, -8, 3, 12, 3, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -2, 23, + 12, 23, 0, 0, 0, 3, 0, 0, + 11, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, -24, -3, -2, -12, -14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, -3, 2, + 5, 3, -9, 0, -1, -2, 3, 0, + 0, 0, 0, 0, -7, 0, -3, -2, + -6, 0, -3, 0, -6, -2, 0, -2, + -5, 0, -3, -8, -6, -3, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -24, + -3, -2, -12, -14, 0, 0, 0, 0, + 0, 14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, 1, -2, 1, -2, + -8, 1, 6, 1, 2, -12, -3, -7, + 0, -5, -11, -5, -8, -12, -11, 0, + -2, -2, -3, -2, 0, -2, -1, 4, + 0, 4, -2, 0, 9, 0, 0, 0, + -2, -3, -3, 0, 0, -8, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, 3, -5, -5, -2, 0, -8, -2, + -6, -2, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, -4, 0, -3, + 0, 0, -1, 0, -10, 2, 3, 3, + -1, -8, 2, 4, 2, 9, -8, 0, + -2, 0, -2, -12, 0, 0, -9, -8, + 0, -5, 0, -4, 0, -4, 0, -2, + 4, 0, -2, -9, -3, 11, 0, 0, + -3, 2, 0, 0, -10, 0, -2, -1, + 0, 0, 0, -2, 0, -3, -12, -3, + -6, 0, -9, 0, -3, 0, -5, 0, + 2, 0, -3, 0, -3, -9, 0, -3, + 3, 0, 1, 0, -3, -2, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 1, 0, + -3, -3, 0, 0, 6, -18, 1, 12, + 9, 5, -12, 2, 12, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = +{ + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 45, + .right_class_cnt = 35, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR == 8 +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +#endif + +#if LVGL_VERSION_MAJOR >= 8 +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 5, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LVGL_VERSION_MAJOR == 8 + .cache = &cache +#endif +}; + + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t montserrat_medium_18 = { +#else +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 = 18, /*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, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9 + .fallback = NULL, +#endif + .user_data = NULL, +}; + + + +#endif /*#if MONTSERRAT_MEDIUM_18*/ + diff --git a/main/fonts/notomedium16.c b/main/fonts/notomedium16.c new file mode 100644 index 0000000..abe093e --- /dev/null +++ b/main/fonts/notomedium16.c @@ -0,0 +1,692 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 1 + * Opts: --bpp 1 --size 16 --no-compress --font Montserrat-Medium.ttf --symbols 0123456789.°éCABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz --format lvgl -o notomedium16.c + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#ifndef NOTOMEDIUM16 +#define NOTOMEDIUM16 1 +#endif + +#if NOTOMEDIUM16 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+002E "." */ + 0xf0, + + /* U+0030 "0" */ + 0x1c, 0x31, 0x98, 0xd8, 0x3c, 0x1e, 0xf, 0x7, + 0x83, 0xc1, 0xb1, 0x98, 0xc7, 0xc0, + + /* U+0031 "1" */ + 0xf8, 0xc6, 0x31, 0x8c, 0x63, 0x18, 0xc6, 0x30, + + /* U+0032 "2" */ + 0x7c, 0xc6, 0x3, 0x3, 0x3, 0x7, 0xe, 0x1c, + 0x38, 0x30, 0x60, 0xff, + + /* U+0033 "3" */ + 0x7f, 0x1, 0x81, 0x80, 0x80, 0xc0, 0xf0, 0x1c, + 0x3, 0x1, 0x80, 0xd0, 0xcf, 0xc0, + + /* U+0034 "4" */ + 0x6, 0x3, 0x80, 0xc0, 0x60, 0x30, 0xc, 0xc6, + 0x33, 0xc, 0xff, 0xc0, 0xc0, 0x30, 0xc, + + /* U+0035 "5" */ + 0x3f, 0x30, 0x18, 0xc, 0x6, 0x3, 0xf0, 0xc, + 0x3, 0x1, 0x80, 0xf0, 0xcf, 0xc0, + + /* U+0036 "6" */ + 0x1f, 0x18, 0x98, 0x18, 0xc, 0x6, 0xf3, 0x8d, + 0xc3, 0xc1, 0xb0, 0xd8, 0xc3, 0xc0, + + /* U+0037 "7" */ + 0xff, 0xe0, 0xb0, 0xc0, 0x40, 0x60, 0x30, 0x10, + 0x18, 0xc, 0x4, 0x6, 0x2, 0x0, + + /* U+0038 "8" */ + 0x3e, 0x71, 0xb0, 0x78, 0x36, 0x31, 0xf1, 0x8d, + 0x83, 0xc1, 0xe0, 0xd8, 0xc7, 0xc0, + + /* U+0039 "9" */ + 0x3c, 0x31, 0xb0, 0x58, 0x3c, 0x1b, 0x1c, 0xf6, + 0x3, 0x1, 0x81, 0x91, 0x8f, 0x80, + + /* U+0041 "A" */ + 0x6, 0x0, 0xe0, 0xf, 0x0, 0x90, 0x19, 0x81, + 0x18, 0x30, 0x83, 0xc, 0x7f, 0xc6, 0x6, 0x40, + 0x6c, 0x3, + + /* U+0042 "B" */ + 0xfe, 0x30, 0xcc, 0x1b, 0x6, 0xc1, 0xb0, 0xcf, + 0xf3, 0x6, 0xc0, 0xf0, 0x3c, 0x1f, 0xfc, + + /* U+0043 "C" */ + 0xf, 0x86, 0x19, 0x81, 0x70, 0xc, 0x1, 0x80, + 0x30, 0x6, 0x0, 0xe0, 0xc, 0x8, 0xc3, 0x7, + 0xc0, + + /* U+0044 "D" */ + 0xff, 0x18, 0x33, 0x3, 0x60, 0x3c, 0x7, 0x80, + 0xf0, 0x1e, 0x3, 0xc0, 0x78, 0x1b, 0x6, 0x7f, + 0x80, + + /* U+0045 "E" */ + 0xff, 0x60, 0x30, 0x18, 0xc, 0x6, 0x3, 0xfd, + 0x80, 0xc0, 0x60, 0x30, 0x1f, 0xf0, + + /* U+0046 "F" */ + 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, + + /* U+0047 "G" */ + 0x1f, 0x8c, 0x36, 0x3, 0x0, 0xc0, 0x30, 0xc, + 0xf, 0x3, 0xc0, 0xd8, 0x33, 0xc, 0x7e, + + /* U+0048 "H" */ + 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3f, + 0xff, 0x3, 0xc0, 0xf0, 0x3c, 0xf, 0x3, + + /* U+0049 "I" */ + 0xff, 0xff, 0xff, + + /* U+004A "J" */ + 0x7e, 0xc, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x6, + 0xf, 0x33, 0xc0, + + /* U+004B "K" */ + 0xc0, 0xb0, 0x6c, 0x33, 0x18, 0xcc, 0x36, 0xf, + 0xc3, 0x98, 0xc7, 0x30, 0xcc, 0x1b, 0x3, + + /* U+004C "L" */ + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xff, + + /* U+004D "M" */ + 0xc0, 0x3c, 0x3, 0xe0, 0x7e, 0x7, 0xd0, 0xbd, + 0x9b, 0xc9, 0x3c, 0xf3, 0xc6, 0x3c, 0x63, 0xc0, + 0x3c, 0x3, + + /* U+004E "N" */ + 0xc0, 0xf8, 0x3e, 0xf, 0xc3, 0xd8, 0xf3, 0x3c, + 0xcf, 0x1b, 0xc3, 0xf0, 0x7c, 0x1f, 0x3, + + /* U+004F "O" */ + 0xf, 0x83, 0xc, 0x60, 0x6c, 0x6, 0xc0, 0x3c, + 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0x76, 0x6, 0x30, + 0xc1, 0xf8, + + /* U+0050 "P" */ + 0xfe, 0x61, 0xb0, 0x78, 0x3c, 0x1e, 0xf, 0xd, + 0xfc, 0xc0, 0x60, 0x30, 0x18, 0x0, + + /* U+0051 "Q" */ + 0xf, 0x83, 0xc, 0x60, 0x64, 0x6, 0xc0, 0x3c, + 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0x76, 0x6, 0x30, + 0xc1, 0xf8, 0x3, 0x10, 0xf, + + /* U+0052 "R" */ + 0xfe, 0x61, 0xb0, 0x78, 0x3c, 0x1e, 0xf, 0xd, + 0xfc, 0xc6, 0x61, 0x30, 0xd8, 0x30, + + /* U+0053 "S" */ + 0x3f, 0x30, 0xb0, 0x18, 0xe, 0x3, 0xf0, 0xfc, + 0x7, 0x1, 0x80, 0xf0, 0xcf, 0xc0, + + /* U+0054 "T" */ + 0xff, 0x86, 0x3, 0x1, 0x80, 0xc0, 0x60, 0x30, + 0x18, 0xc, 0x6, 0x3, 0x1, 0x80, + + /* U+0055 "U" */ + 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3c, + 0xf, 0x3, 0xc0, 0xd0, 0x26, 0x18, 0xfc, + + /* U+0056 "V" */ + 0xc0, 0x28, 0xd, 0x81, 0x30, 0x63, 0xc, 0x61, + 0x4, 0x60, 0xc8, 0x1b, 0x1, 0xe0, 0x38, 0x3, + 0x0, + + /* U+0057 "W" */ + 0x81, 0x81, 0x60, 0xc1, 0xb0, 0x70, 0xc8, 0x78, + 0x46, 0x24, 0x23, 0x13, 0x30, 0x99, 0x90, 0x48, + 0x48, 0x34, 0x2c, 0x1e, 0x1e, 0x6, 0x6, 0x3, + 0x3, 0x0, + + /* U+0058 "X" */ + 0x60, 0xcc, 0x10, 0xc6, 0xd, 0x80, 0xe0, 0x1c, + 0x3, 0x80, 0xd0, 0x13, 0x6, 0x31, 0x83, 0x20, + 0x60, + + /* U+0059 "Y" */ + 0xc0, 0x70, 0x36, 0x18, 0x84, 0x33, 0x6, 0x81, + 0xe0, 0x30, 0xc, 0x3, 0x0, 0xc0, 0x30, + + /* U+005A "Z" */ + 0xff, 0x81, 0xc0, 0xc0, 0xc0, 0xc0, 0x60, 0x60, + 0x60, 0x30, 0x30, 0x30, 0x1f, 0xf0, + + /* U+0061 "a" */ + 0x7c, 0x46, 0x3, 0x3, 0x7f, 0xc3, 0xc3, 0xc7, + 0x7b, + + /* U+0062 "b" */ + 0xc0, 0x60, 0x30, 0x1b, 0xce, 0x36, 0xf, 0x7, + 0x83, 0xc1, 0xe0, 0xf8, 0xdb, 0xc0, + + /* U+0063 "c" */ + 0x3e, 0x63, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x63, + 0x1e, + + /* U+0064 "d" */ + 0x1, 0x80, 0xc0, 0x67, 0xb6, 0x3e, 0xf, 0x7, + 0x83, 0xc1, 0xe0, 0xd8, 0xe7, 0xb0, + + /* U+0065 "e" */ + 0x3c, 0x66, 0xc3, 0xc1, 0xff, 0xc0, 0xc0, 0x62, + 0x3e, + + /* U+0066 "f" */ + 0x3d, 0x86, 0x3e, 0x61, 0x86, 0x18, 0x61, 0x86, + 0x18, + + /* U+0067 "g" */ + 0x3d, 0xb1, 0xf0, 0x78, 0x3c, 0x1e, 0xf, 0x6, + 0xc7, 0x3d, 0x80, 0xd0, 0xcf, 0xc0, + + /* U+0068 "h" */ + 0xc0, 0xc0, 0xc0, 0xde, 0xe6, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, + + /* U+0069 "i" */ + 0xf3, 0xff, 0xff, + + /* U+006A "j" */ + 0x18, 0xc0, 0x31, 0x8c, 0x63, 0x18, 0xc6, 0x31, + 0x8f, 0xc0, + + /* U+006B "k" */ + 0xc0, 0x60, 0x30, 0x18, 0x6c, 0x66, 0x63, 0x61, + 0xf8, 0xec, 0x63, 0x30, 0xd8, 0x20, + + /* U+006C "l" */ + 0xff, 0xff, 0xff, + + /* U+006D "m" */ + 0xde, 0xf3, 0x9e, 0x6c, 0x30, 0xf0, 0xc3, 0xc3, + 0xf, 0xc, 0x3c, 0x30, 0xf0, 0xc3, 0xc3, 0xc, + + /* U+006E "n" */ + 0xde, 0xe6, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, + + /* U+006F "o" */ + 0x3e, 0x31, 0xb0, 0x78, 0x3c, 0x1e, 0xf, 0x6, + 0xc6, 0x3e, 0x0, + + /* U+0070 "p" */ + 0xde, 0x71, 0xb0, 0x78, 0x3c, 0x1e, 0xf, 0x7, + 0xc6, 0xde, 0x60, 0x30, 0x18, 0x0, + + /* U+0071 "q" */ + 0x3d, 0xb1, 0xf0, 0x78, 0x3c, 0x1e, 0xf, 0x6, + 0xc7, 0x3d, 0x80, 0xc0, 0x60, 0x30, + + /* U+0072 "r" */ + 0xdf, 0x31, 0x8c, 0x63, 0x18, 0xc0, + + /* U+0073 "s" */ + 0x7d, 0x8b, 0x7, 0x7, 0xc3, 0xc1, 0xc3, 0xfc, + + /* U+0074 "t" */ + 0x61, 0x8f, 0x98, 0x61, 0x86, 0x18, 0x61, 0x83, + 0xc0, + + /* U+0075 "u" */ + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x67, + 0x7b, + + /* U+0076 "v" */ + 0xc1, 0xa0, 0x98, 0xcc, 0x62, 0x21, 0xb0, 0x50, + 0x38, 0x18, 0x0, + + /* U+0077 "w" */ + 0xc3, 0x5, 0xc, 0x34, 0x38, 0x99, 0xa2, 0x24, + 0x98, 0x93, 0x43, 0xc5, 0x6, 0x1c, 0x18, 0x60, + + /* U+0078 "x" */ + 0x43, 0x31, 0xd, 0x83, 0x81, 0x80, 0xe0, 0xd8, + 0xc6, 0x43, 0x0, + + /* U+0079 "y" */ + 0xc1, 0xa0, 0x98, 0xcc, 0x42, 0x21, 0xb0, 0x50, + 0x38, 0x8, 0xc, 0x24, 0x1e, 0x0, + + /* U+007A "z" */ + 0xfe, 0xc, 0x30, 0xc1, 0x6, 0x18, 0x60, 0xfe, + + /* U+00B0 "°" */ + 0x76, 0xe3, 0x1d, 0xb8, + + /* U+00E9 "é" */ + 0xc, 0x18, 0x0, 0x3c, 0x66, 0xc3, 0xc1, 0xff, + 0xc0, 0xc0, 0x62, 0x3e +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 58, .box_w = 2, .box_h = 2, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1, .adv_w = 171, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15, .adv_w = 95, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23, .adv_w = 147, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 35, .adv_w = 146, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 49, .adv_w = 171, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 64, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 78, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 92, .adv_w = 153, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 106, .adv_w = 165, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 120, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 134, .adv_w = 187, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 152, .adv_w = 194, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 167, .adv_w = 185, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 184, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 201, .adv_w = 172, .box_w = 9, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 215, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 227, .adv_w = 198, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 242, .adv_w = 208, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 257, .adv_w = 79, .box_w = 2, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 260, .adv_w = 131, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 271, .adv_w = 184, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 286, .adv_w = 152, .box_w = 8, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 298, .adv_w = 244, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 316, .adv_w = 208, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 331, .adv_w = 215, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 349, .adv_w = 185, .box_w = 9, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 363, .adv_w = 215, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 384, .adv_w = 186, .box_w = 9, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 398, .adv_w = 159, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 412, .adv_w = 150, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 426, .adv_w = 202, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 441, .adv_w = 182, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 458, .adv_w = 288, .box_w = 17, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 484, .adv_w = 172, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 501, .adv_w = 166, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 516, .adv_w = 168, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 530, .adv_w = 153, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 539, .adv_w = 175, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 553, .adv_w = 146, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 562, .adv_w = 175, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 576, .adv_w = 157, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 585, .adv_w = 90, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 594, .adv_w = 177, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 608, .adv_w = 174, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 620, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 623, .adv_w = 73, .box_w = 5, .box_h = 15, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 633, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 647, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 650, .adv_w = 271, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 666, .adv_w = 174, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 675, .adv_w = 163, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 686, .adv_w = 175, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 700, .adv_w = 175, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 714, .adv_w = 105, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 720, .adv_w = 128, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 728, .adv_w = 106, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 737, .adv_w = 173, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 746, .adv_w = 143, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 757, .adv_w = 230, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 773, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 784, .adv_w = 143, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 798, .adv_w = 133, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 806, .adv_w = 107, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 810, .adv_w = 157, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint8_t glyph_id_ofs_list_0[] = { + 0, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10 +}; + +static const uint16_t unicode_list_3[] = { + 0x0, 0x39 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 46, .range_length = 12, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = glyph_id_ofs_list_0, .list_length = 12, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL + }, + { + .range_start = 65, .range_length = 26, .glyph_id_start = 12, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 97, .range_length = 26, .glyph_id_start = 38, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 58, .glyph_id_start = 64, + .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 2, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = +{ + 0, 1, 2, 0, 3, 4, 5, 6, + 7, 8, 9, 2, 10, 11, 12, 13, + 14, 15, 16, 17, 17, 18, 19, 20, + 17, 17, 13, 21, 13, 22, 23, 24, + 18, 25, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 29, 35, 35, + 36, 32, 29, 29, 30, 30, 37, 38, + 39, 40, 35, 41, 41, 42, 41, 43, + 44, 33 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, + 2, 8, 9, 10, 11, 12, 13, 12, + 12, 12, 13, 12, 12, 14, 12, 12, + 12, 12, 13, 12, 13, 12, 15, 16, + 17, 18, 18, 19, 20, 21, 22, 23, + 24, 24, 24, 0, 24, 23, 25, 26, + 23, 23, 27, 27, 24, 27, 24, 27, + 28, 29, 30, 31, 31, 32, 31, 33, + 34, 24 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = +{ + 0, -3, -3, 3, 3, -2, 0, -3, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -16, -3, 0, -1, -1, -3, 0, + 0, -2, 0, 0, -2, 0, 0, -6, + 0, -5, 0, -6, -8, -8, -5, 0, + 0, 0, 0, -2, 0, 0, 3, 0, + 2, -3, 0, 1, 3, -1, 0, 0, + 0, -5, 0, -1, 0, 0, 1, 0, + 0, 3, 0, -2, 0, -3, 0, -4, + 0, 0, 0, -3, 0, 0, 0, 0, + 0, -1, 1, -2, -2, 0, 0, 0, + 0, -1, -1, 0, -3, -3, 0, 0, + 1, 0, 0, 0, 0, -2, 0, -3, + -3, -3, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, -2, -3, 0, -4, + 5, 0, -6, -1, -3, 0, -1, -12, + 3, -2, 0, 0, 3, 1, -2, -13, + 0, -14, -2, -22, -2, 7, 0, 3, + 0, 0, 0, 0, 1, 0, -5, -3, + 0, -8, 0, 0, 0, -1, -1, 0, + -1, -3, 0, 0, 0, 0, 0, -3, + 0, -3, 0, -2, -3, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -3, 3, 0, 0, 0, + 0, 0, 0, -2, 0, 0, 2, 0, + 0, 0, 0, -3, 0, -3, -2, -3, + 0, 0, 0, 2, 0, -2, 0, 0, + 0, 0, -3, -4, 0, -5, -13, -5, + 3, 0, -2, -17, -5, 0, -5, 0, + -16, 0, -5, -7, -2, 0, 0, 1, + -1, 2, -2, -10, 0, -13, -6, -5, + -6, -8, -3, -7, -1, -5, -7, 2, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, -1, 0, -3, + 0, -4, -6, -6, -1, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 1, -2, + 0, 0, 8, -2, -11, 0, 3, -4, + 0, -13, -1, -3, 3, 0, -3, 4, + 0, -9, -4, -9, -8, -11, 0, 0, + 0, -1, 0, 0, 0, -1, -1, -3, + -7, -8, -1, -24, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, 0, -1, -3, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, -6, + 3, -2, -1, -7, -3, 0, -3, -3, + -4, 0, -4, 0, -1, -2, -1, -2, + -4, -3, 0, -2, 0, -6, 0, 0, + 0, -5, 0, -4, 0, -4, -4, 3, + -5, 0, -3, -3, -3, 0, 0, 0, + 0, 0, -3, 0, 0, -4, 0, -3, + 0, -6, -6, -8, -2, 0, 0, 0, + 0, 20, 0, 0, 1, 0, 0, -3, + 0, 3, 3, -4, 0, -2, -3, -8, + -2, -2, -2, -1, 0, 0, -1, 0, + 0, 0, 0, -3, -2, -2, 0, -2, + 0, -2, 0, 0, 0, -2, -3, -2, + -2, -3, -2, 0, -3, -3, 4, 0, + 0, -12, -4, 3, -4, 2, -8, 0, + -2, -4, -1, 1, 0, 0, -4, 0, + 0, -5, 0, -4, -3, -4, -3, -3, + 0, -4, 1, -5, -4, 8, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, -3, 0, 0, -3, -3, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + 0, -2, 0, 0, 0, -6, 5, 1, + -2, -12, 0, 0, -6, -3, -7, 0, + -6, 0, -4, -11, -3, -10, -10, -12, + 0, -3, 0, -6, -3, -1, -3, -4, + -7, -5, -9, -10, -6, -3, 8, -6, + -9, 0, 1, -8, 0, -13, -2, -3, + 1, 0, -3, 0, -2, -17, -3, -13, + -3, -19, 0, 1, 0, -2, 0, 0, + 0, 0, -1, -2, -10, -2, 0, -17, + -7, 0, 0, -1, -4, -8, -3, 0, + -2, 0, -12, -3, 0, -8, 0, -8, + -2, -4, -6, -3, -4, -4, 0, -3, + -5, -3, -5, 0, 1, 0, -2, -8, + 0, 5, 0, 0, 0, 0, -2, -5, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -3, 0, 0, -5, -3, 0, -1, + 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 4, 5, 0, -3, 0, + -2, 3, 0, -3, 0, -3, 0, 0, + 0, 0, 0, -3, 0, 0, -3, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -4, -8, -5, + 10, 5, 3, -22, -2, 5, -3, 0, + -9, 0, -3, -3, -2, 3, -3, -2, + -8, -2, 0, -7, 0, -14, -3, 7, + -3, -10, 1, -3, -8, -8, -3, 10, + -9, -6, 8, 0, 1, -19, -2, 3, + -4, -2, -9, -4, -6, -4, -4, -2, + 0, 0, -6, -5, -3, -14, 0, -14, + -4, 0, -9, -15, -1, -8, -4, -8, + -7, 7, 0, -8, 3, 0, 0, -14, + 0, -3, -6, -4, -8, -6, -6, 0, + -3, -8, -3, -6, -5, -8, -3, -4, + 0, -8, -3, 0, -3, -5, -6, -7, + -7, -10, -3, -5, -9, -8, 8, -3, + 1, -24, -5, 5, -6, -4, -11, -3, + -8, -3, -4, -2, -3, -5, -8, -1, + 0, -17, 0, -15, -6, 6, -10, -17, + -5, -9, -11, -13, -8, 5, 5, -5, + 5, 0, 0, -8, -1, 0, -1, 0, + 0, 0, -2, 0, 0, 0, 0, 0, + -3, 0, 0, 1, 0, -3, 0, 0, + 0, 0, -2, -2, -3, 0, 0, 0, + 0, 0, -6, -1, 0, 0, 0, -6, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, -5, -3, 0, -7, -3, -6, 0, + 0, -7, 0, -3, -3, 0, 0, 0, + 0, -21, -5, -10, -3, -9, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, -5, -2, -4, 5, -2, -6, -2, + -4, -5, 0, -3, -1, -2, 0, 0, + -1, 0, 0, -23, -2, -4, 0, -6, + 0, 0, -2, -2, 0, 0, 0, 0, + 2, 0, -2, -4, -2, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, -7, -3, -5, 0, 0, -7, + 0, -3, 0, 0, 0, 0, 0, -25, + 0, -5, -9, -13, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -4, + -1, -4, -3, 3, 13, 4, 6, -7, + 3, 11, 3, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -2, 20, 11, 20, 0, 0, 0, + 3, 0, 0, 9, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -22, -3, -2, -10, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, -3, + 2, 5, 3, -8, 0, -1, -2, 3, + 0, 0, 0, 0, 0, -6, 0, -2, + -2, -5, 0, -3, 0, -6, -2, 0, + -2, -4, 0, -3, -7, -5, -3, 0, + 0, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -22, + -3, -2, -10, -13, 0, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, -3, 1, -2, 1, -2, -7, + 1, 6, 1, 2, -10, -3, -6, 0, + -4, -10, -5, -7, -11, -10, 0, -2, + -2, -3, -2, 0, -2, -1, 4, 0, + 4, -2, 0, 8, 0, 0, -2, -3, + -3, 0, 0, -7, 0, -1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -3, 3, -4, + -5, -2, 0, -7, -2, -6, -2, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, -3, 0, -3, 0, 0, -1, + -8, 2, 3, 3, -1, -7, 2, 4, + 2, 8, -7, 0, -2, 0, -2, -10, + 0, 0, -8, -7, 0, -4, 0, -4, + 0, -4, 0, -2, 4, 0, -2, -8, + -3, 9, 0, -3, 2, 0, 0, -8, + 0, -2, -1, 0, 0, 0, -2, 0, + -2, -10, -3, -6, 0, -8, 0, -3, + 0, -5, 0, 2, 0, -3, 0, -3, + -8, 0, -3, 3, 1, 0, -3, -2, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + 1, 0, -3, -3, 0, 0, -16, 1, + 11, 8, 4, -10, 2, 11, 0, 9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = +{ + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 44, + .right_class_cnt = 34, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR == 8 +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +#endif + +#if LVGL_VERSION_MAJOR >= 8 +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 4, + .bpp = 1, + .kern_classes = 1, + .bitmap_format = 0, +#if LVGL_VERSION_MAJOR == 8 + .cache = &cache +#endif +}; + + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t notomedium16 = { +#else +lv_font_t notomedium16 = { +#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 = 15, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9 + .fallback = NULL, +#endif + .user_data = NULL, +}; + + + +#endif /*#if NOTOMEDIUM16*/ + diff --git a/main/images/E.svg b/main/images/E.svg new file mode 100644 index 0000000..3b22d27 --- /dev/null +++ b/main/images/E.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/main/images/ENE.svg b/main/images/ENE.svg new file mode 100644 index 0000000..98c9ea5 --- /dev/null +++ b/main/images/ENE.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/main/images/ESE.svg b/main/images/ESE.svg new file mode 100644 index 0000000..ea46c7a --- /dev/null +++ b/main/images/ESE.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/main/images/N.svg b/main/images/N.svg new file mode 100644 index 0000000..2c9c9b0 --- /dev/null +++ b/main/images/N.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/main/images/NNO.svg b/main/images/NNO.svg new file mode 100644 index 0000000..da95d7d --- /dev/null +++ b/main/images/NNO.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/main/images/NO.svg b/main/images/NO.svg new file mode 100644 index 0000000..9c69f46 --- /dev/null +++ b/main/images/NO.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/main/images/O.svg b/main/images/O.svg new file mode 100644 index 0000000..74ba9c7 --- /dev/null +++ b/main/images/O.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/main/images/ONO.svg b/main/images/ONO.svg new file mode 100644 index 0000000..b1142fa --- /dev/null +++ b/main/images/ONO.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/main/images/OSO.svg b/main/images/OSO.svg new file mode 100644 index 0000000..1e5f4c1 --- /dev/null +++ b/main/images/OSO.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/main/images/S.svg b/main/images/S.svg new file mode 100644 index 0000000..3e31dd5 --- /dev/null +++ b/main/images/S.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/main/images/SE.svg b/main/images/SE.svg new file mode 100644 index 0000000..7d20d7c --- /dev/null +++ b/main/images/SE.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/main/images/SO.svg b/main/images/SO.svg new file mode 100644 index 0000000..d4d955e --- /dev/null +++ b/main/images/SO.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/main/images/SSE.svg b/main/images/SSE.svg new file mode 100644 index 0000000..9b5c96f --- /dev/null +++ b/main/images/SSE.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/main/images/SSO.svg b/main/images/SSO.svg new file mode 100644 index 0000000..0dad2e5 --- /dev/null +++ b/main/images/SSO.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/main/images/Variable.svg b/main/images/Variable.svg new file mode 100644 index 0000000..d541ce2 --- /dev/null +++ b/main/images/Variable.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/main/images/images.txt b/main/images/images.txt new file mode 100644 index 0000000..ad6eac8 --- /dev/null +++ b/main/images/images.txt @@ -0,0 +1,27 @@ +E +ENE +ESE +N +NNO +NO +O +ONO +OSO +S +SE +SO +SSE +SSO +Variable +p14bisj +p14j +p16bisj +p1j +p1n +p26j +p26n +p29j +p2j +p2n +p4j +p4n diff --git a/main/images/p14bisj.png b/main/images/p14bisj.png new file mode 100644 index 0000000000000000000000000000000000000000..5054cde083256782756c91201e7dd536ece19d3d GIT binary patch literal 1668 zcmV-~27CF5P)Mdw zLt-+c!c2$(Gh)pORUja07((18MWD2od;7n&()ZCy6o=3^PNwY)y>i-H`Cw+Dm4_ft|*3M|W79PbNQUY-EG)d15Fs~wH?9F?vq`3^0o$_I7Zem+iL={2 zzwZs8V!WC$I0!%Q?&|)@h7B9WOn)-Q+gkZENf3*OWcKy-y|r@X%B-kORV}~YUkmJD z>X(a+@}sQ9S!Zi&Yg1=ZdyEi8XEoX=^E2jq#Bm-iE-p?5@cDh!if)}rj`Z~Oueg`F ze*@UlT{Ctf!kaTG8c+Y7{x%Uw4F>{Co12?g0o!MjXL;`O=dN76(&F`bt6ExGGN+0k zBc!OH=-pW$qZgZ-n)+3BBz@t+b9Kk+P61z?rH=b> z94GL>yXRNG@bb$aj_04WLC^B#c}{Ao$5PEeb?W1ch_2tbKK<2Kw|_Y;J?$P!V^3%2 zEmwM4joa;hWOfq%OHX&txtF$W`}U2luHJaxm}5sQZMSaS1a1P>nl)>teDDq*KKw1) zWgh}E01(K2V8zFc*BW<)LZQCg+}usGlQ2qlPWJi-i;5o4>FPRp4(@wBPwUV)9a>si zJdSa$01M)MsyZ?f9I2a^Ht##1w9X%o*YEz-!GmwNx3~La?Gv80W{P8+?TjM=Ktxg# zAp*d?%#+bo)U&4eK%lrb+MCFSoI1;?QZ|~lt0FFpkygy+=idPlC7dGM76O}KPKp^1X zTU}kz)!8|0ENif%qvK!kF$sM}N{dQ=>TmVGG%zsGuBxASIz#t{y014~|Lu$4`~Hsi zFaG@_RUI+LTxFceC+s^COMYISXVH=+Wgd@b(NxEqiRkR^zI&^qV<>tr&=)l3a%X4f z(0K84A_O2eH+O!9%a!Y>W~j?GtI3Oq0>df8!@d6Q?%N4&ae7o;3Y1s=qwjM7s+ysy zZ>XwNUc0lnvY~%hG)`5^RkZ}5sv+>gjt>S(BK9S!S_x3`Uhe}{m->G=S-rXWj;IP~ zwP5E(EKdUE01~veipthVvjXe`RyaZWgV$W~qf5Rovj8EB~aqI=LX@}<3N7PU@R zGvPvZUb>rWtdtY;KA+hRpsIU-$3$dgXG8xUgFO8EXT?!fH>2C7=e5gy585u*@jYuZ zeUUY<0c%A>D=+o$Gd2%TRX6byQRnNRq1__U|NPGZy{L*R+XSm8V&4R~L?q}K>nUJ3 zCQCW+?`LY&7Ln%_?VhS^!i6ZhS>P0asy+lf1e~h89Pj`uoZ(>f1@HuLBGSZWM5Aj~ z0UqFVfhVvQbU`qf`R@N*2qJ|>&9TT`A#g!Ny2a>cfipFaFCB>ZRs-( + + + +22Plan de travail 1 + + + + + + + + + + + + + + + + + + + + + diff --git a/main/images/p14j.png b/main/images/p14j.png new file mode 100644 index 0000000000000000000000000000000000000000..5054cde083256782756c91201e7dd536ece19d3d GIT binary patch literal 1668 zcmV-~27CF5P)Mdw zLt-+c!c2$(Gh)pORUja07((18MWD2od;7n&()ZCy6o=3^PNwY)y>i-H`Cw+Dm4_ft|*3M|W79PbNQUY-EG)d15Fs~wH?9F?vq`3^0o$_I7Zem+iL={2 zzwZs8V!WC$I0!%Q?&|)@h7B9WOn)-Q+gkZENf3*OWcKy-y|r@X%B-kORV}~YUkmJD z>X(a+@}sQ9S!Zi&Yg1=ZdyEi8XEoX=^E2jq#Bm-iE-p?5@cDh!if)}rj`Z~Oueg`F ze*@UlT{Ctf!kaTG8c+Y7{x%Uw4F>{Co12?g0o!MjXL;`O=dN76(&F`bt6ExGGN+0k zBc!OH=-pW$qZgZ-n)+3BBz@t+b9Kk+P61z?rH=b> z94GL>yXRNG@bb$aj_04WLC^B#c}{Ao$5PEeb?W1ch_2tbKK<2Kw|_Y;J?$P!V^3%2 zEmwM4joa;hWOfq%OHX&txtF$W`}U2luHJaxm}5sQZMSaS1a1P>nl)>teDDq*KKw1) zWgh}E01(K2V8zFc*BW<)LZQCg+}usGlQ2qlPWJi-i;5o4>FPRp4(@wBPwUV)9a>si zJdSa$01M)MsyZ?f9I2a^Ht##1w9X%o*YEz-!GmwNx3~La?Gv80W{P8+?TjM=Ktxg# zAp*d?%#+bo)U&4eK%lrb+MCFSoI1;?QZ|~lt0FFpkygy+=idPlC7dGM76O}KPKp^1X zTU}kz)!8|0ENif%qvK!kF$sM}N{dQ=>TmVGG%zsGuBxASIz#t{y014~|Lu$4`~Hsi zFaG@_RUI+LTxFceC+s^COMYISXVH=+Wgd@b(NxEqiRkR^zI&^qV<>tr&=)l3a%X4f z(0K84A_O2eH+O!9%a!Y>W~j?GtI3Oq0>df8!@d6Q?%N4&ae7o;3Y1s=qwjM7s+ysy zZ>XwNUc0lnvY~%hG)`5^RkZ}5sv+>gjt>S(BK9S!S_x3`Uhe}{m->G=S-rXWj;IP~ zwP5E(EKdUE01~veipthVvjXe`RyaZWgV$W~qf5Rovj8EB~aqI=LX@}<3N7PU@R zGvPvZUb>rWtdtY;KA+hRpsIU-$3$dgXG8xUgFO8EXT?!fH>2C7=e5gy585u*@jYuZ zeUUY<0c%A>D=+o$Gd2%TRX6byQRnNRq1__U|NPGZy{L*R+XSm8V&4R~L?q}K>nUJ3 zCQCW+?`LY&7Ln%_?VhS^!i6ZhS>P0asy+lf1e~h89Pj`uoZ(>f1@HuLBGSZWM5Aj~ z0UqFVfhVvQbU`qf`R@N*2qJ|>&9TT`A#g!Ny2a>cfipFaFCB>ZRs-( + + + +22Plan de travail 1 + + + + + + + + + + + + + + + + + + + + + diff --git a/main/images/p16bisj.png b/main/images/p16bisj.png new file mode 100644 index 0000000000000000000000000000000000000000..a3fd4f955a326efefdbb059078c9409ccc57cfb4 GIT binary patch literal 1994 zcmV;*2Q~PKP)sO$w2qjRd-fb!j0vt|_!i@E{8xLcyEtjy*0db7lmu%d4R;b@MCq^Mf&?%1(o z&akSC0X>YUs^Rf@{%Dwn55bGDFA|DWA3yr;I#soL6fn(^6DEvbH)YC{)PXeicsyf# zKHm(F$1~>380bKc(eiq|zeLy)9dB)Eeb4T&FE9+FN8?Z^9c+0)7D7tDOH4+jM z9&K!D+#Rj2FZ4#-IgqB&2m~6g0nW>lCy(`dz0*-%8BCqb%*>S+E?&6eE%$CLEiKLL zkKe;cmMd#(C>Yv5nC9VdxMA<^-FpBWk%%cGF9HdJsRfYWNSKQ9E7NA4^Lo7x^~JsG z2XXuM?LSUSPy6Pmlu_w@@!G3cwf@@w746@5vh@7LI?J-cHmCFC@%N5jL~#wyMt7)c z=*F!Z3zsZja<+E~eaM?Sb?P)j^{X;~r#dq$%UJ*G4er#mR6h}Xfk0rq-EP~Gl$<e*F`%gV}Xdx(vtfZOeM`2Bucf4mbXPCV*NbnXJicEl{pD*NXr#lN33 zcix(jBS+o~U^Z2ebmi~e);3RDL^x$azgiCL-M4zB~$q5EqniNJy$A`=akQ@_BE$p@3jf8zE7=OEgt>H$$%RN3{ znf7wFhtkN!SV*>pn@G5&TghHQX5D1j-*}3byT2^CpZYW1$v-A$Xtn0+=PubJ@&bN>UAYy#&_ddmKCn9sy@AK+v|V+{L{~>EW-#pL!k>m zj~{q3eGmrhy0(7|ac0*yw^`wH5`crF9HI4&N)zzxH9$?++ zz=H*6>W=~h3TDh~Tsuvh-yEZna{PzSZ=G3CQvZ43Np-fbTd&%7VAhuSa|=r94|ViV z)qSeEG`jatzJ3Ww@^T&l}9(GmoQ8|c+s;V2v1`ZdNsw3DE_<<;S0LJ)P zE6n7Y+md{#(P-v1RX!APTK-n|<2{Y$~w)83+#$HV<`K_m+r+6YTYm1GSEv zl+U{4is%JHW+W6gzYkizd45W%s!G?U3i$|!HsnfJRWt3gpO`3S=~YA6ArZ+#IJtS@ zh)Pv;04sn40ES`Y3vzISh^4A7U=Hw?VKt(L=5uE}a)3~#2ZblqrpUt)Bhv9CmjIuL$Ta{99z(Qa-6FszBAyq% z&;&!7k9O|BQs9_~Gz^8_zMM#5+fKCKs@ZY<^r1V~(YZoZgSN5hk?Yyw?zuSPh$D_T c;`p-oKZKSQvyMt}J^%m!07*qoM6N<$g8h-_k^lez literal 0 HcmV?d00001 diff --git a/main/images/p16bisj.svg b/main/images/p16bisj.svg new file mode 100644 index 0000000..1192aa5 --- /dev/null +++ b/main/images/p16bisj.svg @@ -0,0 +1,47 @@ + + + + +26Plan de travail 1 + + + + + + + + + + + + + + + + + diff --git a/main/images/p1j.png b/main/images/p1j.png new file mode 100644 index 0000000000000000000000000000000000000000..456aaf4300e8d1b913023c4dfc688a02e8b76c96 GIT binary patch literal 1341 zcmV-D1;YA?P)oM9V@f>tfz_jSG;RZ64Q9NgB@VN#VUXLIIlyq_Oot zc&w2ljkg|o=81a&x@+443R-hK?^>a7b@e|JVp$jS-lp~y5t*+9R1@arowKOc`{jzB zk#*zW9}58@;Xy0-RZhj8If=2E0GY;HU}ndN2j8XB(Zxg-^8ES5q^ao>0D8hP!<{{9 z)*heno|;*9HMNDi0_X$wx|2C_-PcddH693BtK0fi)Xz*rnGAqT-S`YmB4W<3qsGeo zr|w)rSp)#EtHFDi?CJXR$tQ95_E_VAedsM8J$NZ&O zGD@6g{H1u3R#rxJe|DrX$UIo7j1NVLqb#IUDhZ$U)1j@QnlLMmKk}F2EsF^8m*PpY z`uL27%Bxr&PM1n0<@}T7dZ8T!a>KFz2KAp#u@4a2>EO0MYX2ze?Y zSM{{v{&q67IgrPg)rww8$nx?;9H8!ollx*w){N+xz5!V?pt*kyhc*N0a{0Vc4JrxI zb-8W#MZjIrQj9>rX0w?X}94AF-L8_6aE#r#1;_1e8X0 zUL?F|392NM^bqLT`OqftMlLs9+s&uptGEUWpm9R=%;R@O!B^U;D2P7a^33CRLt6rK zL~1uj<-hFAq9G)}0SjsK85wQ4ZUX?wkU%Q76yQK(gEZD2sQN1l$>a__6@+qVd#SM* z{jj~Rp6c!x1NOR;{9q=unNiN<4n0-%R~AAvDLwGb(Dr0^&Cd>B*ACh(-?KxsqFr~p z2X6+*ZiHhx(G4Q?4ojr_NN?|zhhSa^ZAU*bhqv>$w4$w4kUOCj?K=1M-f{K!?>7dS z7c#jY9z}^0^@hlf45k6Dgaeyhqqn?+@BM5H*Vm%d3>gx}P<>q<9QesLKm4U>iOSX* z(b_{TH6J!s#|yroFPYIePH3nk&HC-LsM_x|nh!f55*|dKZ*e;I%uSBYGo;JT8( z&*!f^kD61w^fSNx|0Hi8bLu6Aqg_^KRGid(FR2 zTX4l-TuZeeVoySVmmL+Mod=QfO>Re+7aSQ(7YbKfuC=zbOsnNDjsz^vfT%Z$qac)t z>Bh^#{{LF0%`lflwfy^FKo}9g2!nRKM-X61@I#F;m&qNTkMa|{8~gHa1!hpWd_GBJ zrcH=60635qvt#9Q(>2v&M~4m_I&|pJAtHYRu>JczNrHm*00000NkvXXu0mjfCo79@ literal 0 HcmV?d00001 diff --git a/main/images/p1j.svg b/main/images/p1j.svg new file mode 100644 index 0000000..5e6a895 --- /dev/null +++ b/main/images/p1j.svg @@ -0,0 +1 @@ +Plan de travail 1 \ No newline at end of file diff --git a/main/images/p1n.png b/main/images/p1n.png new file mode 100644 index 0000000000000000000000000000000000000000..17a334f3f4f14460ae7af7d7e1b4b0bcad997033 GIT binary patch literal 1747 zcmV;^1}yoBP)NklWkU$Y0k`d z?>XPxd(SyD04b!9LJBFQki!25Xrd>qsj0yiE?l)@tlCtSNuo%3N;!cLN-^dm0ICMS z1qku`8XFr!6Xkcpgp`zQ64KJ{W{V=EGsbkyODTjS5pu7o>100uut)Jf5kgR9qDzG_wZ+}*oBJU4WQ3vpb)d*;lUK(aw_$qobnC@Cosii+kt0cbktd?}@+ z%N#p*ZrRkc&;nS#DbF<1OQM~RV6tb+0!`=EaUMg zrAQRbmb5fE-Db0AW@JpBDoJ7vLP*HSa1=y&L#s)0R<3+uN;2^n-dc>YEK2F2^70oy z!Wg8n&t0ym(#DNzmOArt7Mo0>3vpm?YWm}NZS6O|G6oSv8N9Q8{VVy)mMyGYzkc(l zv3w9hyBZr$-2cynFvc7J@Ff6L^!4?hSiAPMJ(@-s0D#phJe%YCyvx(z4M|4Q@ zZ&!~VI8a+pDGLXK19wz4LiG3wg}`&+!nXr@W8;ko0RSZw3f(rDOwilwyB-xWXUp=4{dwfjp}Nxm0O4@pu3ixU0D?es0Kg48vzej8zIX3l($}YUPM@CN zvt`R$UjhJ>mdXsfCD>~l&fXj;S<2n2mbd|`|@m#bLQd-x3< z_R7jihuiI@+qS*?6#xLwb7;q#ukMv3$u)+`zCQlLkw_%M004r)-~%Im9)dmwI=8rXe`001C_Dw?KgM*NKM$X8TUjGGms&@H68x|*XD z%Tb%>IaJ`v-4Ki0-r;Q?4u#RA>OvF<$u>Pa-9oy$!j_Shd*}9bb3{>?7K?l9mbW8% zO$bSHHHJW`Dko+c5F*QAVWd54_KaomxcBb$_D8Ri-BeLf$_a^C281wX8I`Kd7Ab3- zNr&g<`A2JmhT50J2VS=jMM0wi5_lmq9ycd9d-$0kaN>CL*3})}QC3!(F&?M7x;kN; z2C|kiYLjS0i`%Id6yyx|P#Bvml+u`Qw65;(jww?f->_@f=KaqJ9aE# zAvLhI@F*cZ|6pr8Zf|pcuubb%lU*|CGLOr0~U!1VLQ->+yIVLXq` zk|c_nMnaTQn#dm^5Nv2T*`p^mLqgiyud0QGGc1fD2>@VVAV|8qdwyKJ=&6b!aLrmn+oxLD=pE(u|*4Cnoh zj;>HR9BwQwE_gED%1ENM*=%)45-(9o6+-AJL4;uc z*|YjqBPk*6?JZhiVKHNj4X4y=*KQ4*JbC`x`SWLm>~`xD2qDwhaR>pn*<@!?QQm^- zg?ZYgOIKQaK3|XD@9(3O(a~Hk;`80^=eXN+nC{-FC_Pv7;UM~{Dh`EqOAVu}!AeSPF+bMuLWnQGLyWJLS} zTvqmME<(ILF;yQZWkgj`r;%^vd(QSeVeC*i}_kHbs#pi6W8- zA>$TXN+GOiygwN1xZm8|oV0)_Cj4*w5NdE$)i1K5aH1rM0wJoPX@qi|5aD?#g7IMB p)TvW(+maMgNFjw3Qb-|5{0(ElryokrF6aON002ovPDHLkV1mjiOtAm} literal 0 HcmV?d00001 diff --git a/main/images/p1n.svg b/main/images/p1n.svg new file mode 100644 index 0000000..f5a7231 --- /dev/null +++ b/main/images/p1n.svg @@ -0,0 +1 @@ +2Plan de travail 1 \ No newline at end of file diff --git a/main/images/p24j.png b/main/images/p24j.png new file mode 100644 index 0000000000000000000000000000000000000000..90a24427dae515121009ec898a0f8fbaa164ba04 GIT binary patch literal 2376 zcmV-O3Agr%P)gV06~}+)eecb_-y|e~$R4(IY?74FJ&`$o}-gC}#{^x(6^DOUs zVHm?0#xVYuAQv)uVc}A9(KV6d9Wk>+HB}+j5DBRl6>!q1uln9}*!pp>LWZQiprGJV*L9x& zF6rSqC?czJa&q?6)h)kB9M7FzsZQ{o*?qfR8W}s}B0MghDQ-zi^w*zr;d5WgQ-2Ib z1Pr0I^78UVsOq2l5CJepRo~jOWy@T{GA99;t%t90D#C^=0zhp8TCHT!_Amo7tE!g9 z1T!86Xs!JG{6)ZWRjqJc_in>5B2@Kpz}F)*3V7MZ^Pq`?>9nRze;)Qcovs`|tH{QQSEZQ3-zUG2Za zmOJSB?+-umdcCLf^Ygbq_Sj=-0|oZkT6J}G>wp}fI!NNPQ?n``_l<}w?TDZKk~>ao z%UdrFGDR7likWy7; zrWGFxzvWcr*d)vGhT?+yue!RrDY?11c27shZ@-&2Z%#K1+2rxK3nIcCJ0YR1eDcKF z!$pUEi)!oR$DD6|5xF}jC+BxP?Ll1{2Se8xbO1=VZIfo(q`5V0cnM0-NbDf0j9NDsE%P64VeO8r3pIy^y`^uXCF5^ZV4u;AoEG#s88H33%5L9&% zgRD89)qN8*k^&eB7R42p4VgzoPAyxu%;{+lS!=0kN7n_jU-;~*ZqG(qJ2e#-VK+vA z2?-UaNIX+9V2+5UrkanYXI(Y>pP#&Yu03Qz>g((GB_$=*0ZDxp;IrBen*UJ|* zbsFib?q$^d50RApjRE;XdTGqb$@!&-JkgiWXI1rO#xu=NKq4qAy{3EoElZjBTp>}@ zXP~Z2_~5>0+9Uyzj@z*hl0GyLGu$~`GRUw-e6^L7=@n6d#_?@dd`h>D_V&j)x@ zQpwt}6M#=|UQFQ3={~tb)>`X|{1aT|z570{jOsGw0&4**+sFo4DU&(iHh7`|B*w-w zv57Kw{tIWxdWmyhq^zn++>UnQuUm*+S4-*YRTz;zDe#e(e6^%#gT1;9JA0Zc95+VTPjI}uSMBEk!xmc{AcZX{vBLMA>}Na}5O4$2?8 z)>1cHke9oj<^b`)TkDT#SfIV}1~uf-w)SzOFx@DLb1*M%!4dP}fW|(6>iqzbSyRTf z6deSh=Edh}IrI@RbLSyqP`zy{R!#qJ6(JGwz}`lmie9OvyQ0gK4ZI;D?GNs6Scphl zNlENJSKNgF-dS~E=>Aq59fO%fyk`ggG)I6LU-p>axB8-%Y@-N9LzAsj885^Eb!D&b|C`V9oLC zZ{1&V?YI5`tnsF#{&eKp`!y_MWG=AARd-j<5<)T~V#pFyI}2AG3rq!GLsdA~xEL|k z07zW=b>6v|4aj@t<^&4mpnRaPwJXism|3&Um?xgPcf&ilf!M}%g1dBS-p_Wa9=ii5 zN?pEUL%+Y}`HEP-OCwZukr=w8%d{BSEh04!9%!Blq+8zBHvx8R=76jKIl_BB-h?QRysBRmTI9fY&>-O17e3%)oVY zegqltrRBVZxDeqO#`9f|BZ0q(NJ(csy4!I*+q--|;7OU-atHv$Rmb>ZyUqZf5s~`! uyEFp9A8tEubQ{<8Kg=+OF^pmSf8gK1c&~uW37Plan de travail 1 \ No newline at end of file diff --git a/main/images/p25j.png b/main/images/p25j.png new file mode 100644 index 0000000000000000000000000000000000000000..56361d9a986c407af5d8673e4441b4e16f3bad82 GIT binary patch literal 1971 zcmV;k2Tb^hP)b4hFE$NMe%RkSrnDdr$vJHYC~IunEh5`<>aD zz32OTea}6=d(OQOM;vj)5l0+@heT_*Y15`5R;zWS-EMDMv0}y7ce1F#;Fdzl%F4zn zr8bJl6M(&IxE^>zL_98+>&6|eFiP|*#O-#^6p;^rjhjOpCAwzk)RXYXW@(IDiGxZUpMB2o^huAv64^;5tS5&2n| z7|jlc>xh@Y@KoGrzl$DiDvREvqxhWzDKTr#d zi4f;w5!sWIlk;X_VWAPuVC&Ycd4^%QfW^SDK6Ev(GbJTu)3RmD+6JtmZ^0Ie<>!6J zx{yR<5dd?w)}Gqh+U?;;x7)oq5D1(CiU}0~FcEmUxw-jNd3pJFqbt2P`WBrvm>@l{ z#O-$9+jGF}cCQkVog$JNh5tCyG~e@hJktl7xUZ1o0}ap@B9a^Y@9}u@MdbAXhDZV` z%F4>d4#cUK5QoF@7I1EWiF@LjX_}w*xc(y%o{YCZuEkL@TwqiPB1CKbP&9TKfx2GTiQ^h+ zXwF6J=vq~4T^osum5^IbX`<0eqS4xYEjAO&a6jj+M8AnEr9Og8VM73iQJsrOVf+L5X^@P`(kd)0 zGz`O71cXjyu!@elkTK=#z;bsBpPYMwh+CQn38O}nJnK8yhYcqvBqY{g3J-_k;^MPb zt91hKd*A}lYptCfaz8DzEJ)JL*A?ruCayHy!{vr?VPjg;(z)kP+Zn&7f)Ov4GXCv- zD4RXJZLEXL*-uA zVsst?HTuUOp8_OJnw%f>GjFtY_65-T`6--_K8`IrJ8b@#2@z3`X{dQ+W=hEWj45hi zf>Q75mili4Sf+asYtBKLz~}3ZH;)6xkf0A~t;Lo#bXL%>VfQXFf3ld|-#&}k+S)hl z9TK9Y0Ie%R2(3jl1@m+5m&~uf2&f!uoh3Vf=%(KQh=qk9M_!xaYy$2Ro7EX~t=sWe zzItIjNs}fs^cTOT>A*X*UA!1Je@uGh=_+l5<^@{R!oJ+|CtJn?dG}}8F)p8ONqE>H zk~sg23_o}tK#RFhOxf3Ez9``JeFi)LfN9cLv6se*y|=6(CPF%UKm}@Ql0WIoDQy%W z@{!}nOB-5!wYicRSR$#b(REcmmw(OOBioO@{429=Rh!n@ z2C%-$w`6^luNpvWJxptDXsxq5{k*5wRr;28ar3m+bz19)?=!dGBU%f>B1A&^W8KMX zS-@Aa~iVuiL2Y?n9LbqQ5a9l*LZaD584KmT*!GRv!J0cSH<6lgK ztf_372;?Rtw7nlfntB1~>Q`ntFUW2TlD?mhb@(pm>MPCTTC=}LvHJi_ixhzTvot@o zQFos4ySY0iM8tdq_@H$1(3VhEKO(6809xxDP-B2Y09nd6RiNYih2&#hOXeY<0zji5 zmYYw&JRk=+++Q8H-R!N-ls}|5G=}|Ds_lAJTT4ptTkcgLS44aO)@i9H{gtiv?Jg8U z0IhYNh39Plan de travail 1 \ No newline at end of file diff --git a/main/images/p26j.png b/main/images/p26j.png new file mode 100644 index 0000000000000000000000000000000000000000..e3bbf644640df123ad3a7da4d443ac3af13ccddd GIT binary patch literal 1721 zcmV;q21fabP)hh8Lz!-JATDpJ2*IYVq)XkA!*aJAS4o{YC)(%f~``ukkXP!k-CY}UzOSh zOGRpF74JhxEm9TQ0zyo{l4?*+_`h-0?Sy&GM4eb1X>CaW>8}M;ijZi*8r#>Asu8PW(W~c6!mOP z&C}6BH5S##i!VN;Y~AYGsIa&j;L5Ct%%3sww1XLL01(2W z66<_3j4MsVhSO4Y2xB}C&swOg7AKI-Jw?iuw7kIECaJ}I*jcA zRTE~)9Fxbttq+#Evzh<^2CPeE4(qIbds*y_2d>37M#JB4%STtuCpi!ZIGFkC0J;FA z01Ob(KfGRV3IL|2cGX!a^A3RFj2(TzI8(Y3mc6EPOcMwt*Ew4L-ILNbeP9W>9l&|m z?27G<1cSkEF!Kcfe*y4w0KWoon3;zHfx!I$Aa$b~U@F1Kjq-}Qip~5QZe1xYQRAO} z6<{KUduHqh^>*jlQu6tH4N}S{0W@V8Zeiv>`+UCb0B!>SH8HeBhD*xq7I8h~1XY&s zg(d(ngtgx8yakt5AP{(znIB>15E1n;^Dq(po|&8H^AOP=4TFB8sto9Q4V#XeumNyX za|nH8JsfQz5Y-fH#OL$%GV{*>fQZ1%JBa8lX8tLFXEID_82Zo3j;`CoLnK+tB^)!$ z@kzWL(`Gd!6Ux;otSTEutrCV}C9AJy$#T0!GQNqyU~r9;@(l9a444@%r#1Gqo@dp% zv9a1rIag8*I61Ku7n98yDit{cWbjD8WXUVIoAldF;K6EmReLnT_=*0K+axCU6yEb4BS5czb+X-W*0#mddnJt~A4@caEI z{eJ(tY)M)Bym#;3Cz;s;;1mGerl?d^Irx<=BhNc(I{U>fj?;RTs*l9;I&EabW&r;R z27`BI8nktOIB?*AT3=sZnkz3H4(q+Wz4}CW=e)e zSuko@R{Q?_`_ndpMLEVl^;BPnrdiJ?lWLcyalEQxCbYTph#b1Ge$Bbi7o3IiGxLx4 z?c4W@>tjVf{T@7caII;I6N!YjftgfY7nR}h%8u9iAMB`dSHD!@N_|?W1`+MNAyz2q zeE9wTegJo6E`Uvdl-9%$m0Qzu@t7#bxw4!aQyLl@8&!|TGxzhA_eXCb1OkCJX3l5= z0GLSyfXy@ga9T5S@$p+%K&y*laCD1ZDUL)U0>GS+qAo3FZpoEXD&uJ;0HA5p00hZ= zq=t9z-ktWHE2uvs%BeNNY0sQg zF!k3~+&1}Nu)fLKqHrFGM{crQG86dSA~pxM&x2eSLi$ zilRKk%w5dvyecN?uGpLH9jo7NlY`|nTY=-7pW$4*d-%wy?+m0BM6nr^wGIIF+NOvLz!TJioTmXhSaKt=D%p-Q>kyS$Q9*dRSiDQWv=|NA z_OYW(I8EycyREq%OWqNeB9Dt&J*kZ14@<3Gbntt~d8N9HWh`SE|KIp8mV$oE;PAKh P00000NkvXXu0mjfdx=E4 literal 0 HcmV?d00001 diff --git a/main/images/p26j.svg b/main/images/p26j.svg new file mode 100644 index 0000000..8190304 --- /dev/null +++ b/main/images/p26j.svg @@ -0,0 +1 @@ +40Plan de travail 1 \ No newline at end of file diff --git a/main/images/p26j.svg.1 b/main/images/p26j.svg.1 new file mode 100644 index 0000000..8190304 --- /dev/null +++ b/main/images/p26j.svg.1 @@ -0,0 +1 @@ +40Plan de travail 1 \ No newline at end of file diff --git a/main/images/p26n.png b/main/images/p26n.png new file mode 100644 index 0000000000000000000000000000000000000000..347900d2595bbb6f26c2704380d5b7ff9489e0c6 GIT binary patch literal 1970 zcmV;j2Tk~iP)`m5BufB?TG{ z&7zd(7P3Ed=-{`rvX%>-ogX?W)u!j<+*eb?o zteUM(r_~68R?ir;d-wjNVa=M#?*fosfBksVJMWyn0RV)sNrz*!r?azD3MYP4GQv4e z1#pye{+uK+XIEG6w31z8WBpe*Zme5dQ&Ul)kI`#C9lGtkdbPW&wzfLGukZTbtk%}| z?^%I0Jj1PgTWx|+xMfV^YSt`nT&?V z0AOU~&gGLQ|Jpt?;~trs8ux79zVlV5)9DX&$`~;^9KIC*dKcP2)Q;AP6MtAMirT_s z$J)9BvhwnLb4$zi{qZJ4aX>aSG}^K6#n+B`JX21WYicYU-=Zk@oIQK?_Ix%`$;jr- zo3(9iZ-7!dOJdEM@}w79et1-?6_W!pNs^`yTTi|%X3K;liIs)oiGmLV?6VLda##`Cb6)0W<)3fl~TWU0wCdb8TOFrMV&A zY%C3N!B3s~dpiI~lH?6HZUBt&W%KD5%*g)z`>EM%P9cOO0+kxJ zIo|-_-%9pov*|grIo?oLSCwpt)2|HGkKdUb416bqh27}xts%m?b?dZhdew|blJqtq zB=BUH19+ZN`V?dA4MNCjg+SV(qLtq%DajvF^2ZpPZEQN7!LVvoUX|HwTC34$G5`p& z%tlgEQ}2kP_M^78H_t0>R-@4YP@KmUi5xm~sA>+0S#ZuDA%y%~X$=6FOvWvJeYgCN zWTYZLKPN~R8yjN+fV{j%zm}9_`4%C;ql-p^M<*s6AcSn(wCUN^=g-@I?RHNGHCDer zMpTQfc(f>`PpB;j0~*`A|H0(sRFKeQ(q~mv{DB(NQ5!=-v~D!x*o&B!M*NMM~^usMpvw|TElRhBxcs!92 z(dl&W0=N@yP$lT~F|*(M`){GAr$1sJ8jU8qy84OM>gw`urlcepY&M%}wNoUrW5x?YR zg@ll!0Nw-8rS_3!_OT@SuS=5D<8-=y-_gCd)@^g@t^%dN>sn}*Bfj}uuI(P2e z>AAva-r4E;_0JX-7q8lok&*sOCErz*MHn0$hGS?DS>E73|FD>WyPDAHM-@{Jhr@i} zz=7FuC0Z9N0ALQsXis|j`oBQs0lnYe1pvtQ-NI_;g&^I>r7O@gQGvVD^Uj6=7*kSG z;sHzq1Yu9V;b7agZH1K5^o8t}`Gb3mknBa#Q}; z>ee&zQK zvE^gXYTa;p<~^NuK@heyH#grmszja0&Ye5|MF`mh;HHwEfWu))0FA%Lm0EldGTr!~ zuK_9rj{`U%ief=iQ`1#tzYhsVjvUbesAP;45JL2Gb(Jg56z2BzZxHP~2>^8UW4LQE zUOVyLOKl-;7=U3y$i?R7=6T10FXU~!5?n83egL3?CVQcK#tuqRN*=@I2le+b{v!*5 z1B8I*1AtgE0RX4|9}>VK5%K&iCxe3+XqpE!ZH7_c<%L(xk3}KExcpf*$|eEeI9V}& z$qomLLIglQF-o0unOCAR4n)IYG>68p!GS#OlM^3;pq;E#F4K`>aWcYjMaY=eQwgs| z%jF_vM0%SOcu79&ixEF+;2eZsNBm;%V+l)G!j};L1FIOH=kt%8g#Z8m07*qoM6N<$ Eg37$MVE_OC literal 0 HcmV?d00001 diff --git a/main/images/p26n.svg b/main/images/p26n.svg new file mode 100644 index 0000000..8506f0a --- /dev/null +++ b/main/images/p26n.svg @@ -0,0 +1 @@ +41Plan de travail 1 \ No newline at end of file diff --git a/main/images/p27j.png b/main/images/p27j.png new file mode 100644 index 0000000000000000000000000000000000000000..97ba1cb47b7001ab29532a8316ff3bb4f8aae8ff GIT binary patch literal 1203 zcmV;k1WfyhP)FKGC zL?Yig9F8l7VT=QKoS9z+@I{uCc3s!+D0F~eFesS0ps%nPP2IBE} zjir8OLBlYH0Q^=!(-koD?>C+kiNqTK9$iJ5ZH8f-jzl8wcXxO1%q2865(ot5i0BYA zUt2|UF!T2wk7r=%nE)JFO`Rob0ldY`Bf74?o=uc<+l$3wZYkv}%-jT^GG9j`nj@l9 zPNy^4*48!;0J^R}LPSG_PM@R4F|XJA_KJA18e|fS#qKf;;{gCkW|lFs;SkP) z6hiE3Z*NaKoYz{^6kXT-QpyWN^d%7u2_a4pQ9>#88~_Ob#0nZ4X&+)sHylkVbu=^R zD6$9Wx_+35x-!B}07r!oT>yRt(7a>*A|AVb;+BGdf!gQsm-Ij?EoTpAej+ng)D;N^ zgMx@Y%pnP2>9*iD()STjGmmFlxi-Xl@njFS<&j=h^Dof@~KFtgi)rjBkzrf6=^Xc5FKTYG6%~#R5?FSe# z`yRy1-+H~?-pu%VY`-r7n8_vBETp`J(7X zd_Lb<04)GcWz+n!@gZD#xE`uT-i(#)`5R+XyO5Z!GfSBvqGQQqa(tkd`hfT-9%3E`RV(;9Gawe{BJieiP?&8h)_5T1Dm&%6{Gf@`T)G9xVcJ^(1& zGYt?vqr0)DKXWBB0`N|%O8qLfE-VOO#U-#%ihgOd3IX?)?@L|+;UwJy)19agO1C16 zVa+qQQ2-wlqg+W=gaMi>7sr_~CmJwSiW!OqU&U>F8C9j8!^XzO#>VD<#lL6xn1v?b ROU?iQ002ovPDHLkV1gj42Plan de travail 1 \ No newline at end of file diff --git a/main/images/p29j.png b/main/images/p29j.png new file mode 100644 index 0000000000000000000000000000000000000000..865932abd98b424849dbb952b2f16dd02fdcd718 GIT binary patch literal 1561 zcmV+!2Il#RP)@k2C>aT~T^G8Rbxc*Y3EDmIu#Ihf8c#?=;3TWWx>jOn zlh&vc#D;G2{-LT}AJVlCLuxfutJJcJNmHXDm39=il@6Q%jS1LuoN(_wdkFbsbL}{( z36tv2)Ac#$cYf!4&;8xs?;2{%iDDh*5~lcBM(vByMY zJFo&!;6vcIuIv81udi?HMip5J6$wcs63ac$`?HAL;hRL{gzLIr?(OXzt!{ahW0!L# z5{ZcCd7C}YI}bb|B9Ex*w~OOcb)ASj4?KLM3Z09R9f`-|-M}lr@@u9M;0M53;D>%= zJkRUu?d^T9(#iY#`@^A7s9jZU$8pZ|_4TDIFTD_7A%_ni4qmx(ATrl%#+aPvdB=Ksdj2+LOQlllM5OF~H4nDt^Z6Hn zhl(8)A5rGZz`(#aL}ZhQq($T}j^jj(F;4?+A2+wEZt3ai`O|D$weHk3gM)+C@bK`9 zz}9P%qN*5Ujv8aOc%JtvaO=mJLqr}23WQX>Bk_3rXO!6aMdVn-8EtNvINLGXK3uno ztQDUA-RxW>di6rV*bjmoT$Sl<-0 zY%FzI>Wmb`SgW&~Jhx%C>F9NHFQDF%IF54ym?-79)nTc7sleu4s7H@C(d1?TSmu0$ zL1z!bJsqa;?;f@~0BVeRsyKI5gD3OKI)gF>Oywx*l{_Z&)*9?$>cZvG=h>{(ujoInF3nIF)MQ%J2`o3 zcf@AAIe-LaI%nOUMI!Flnok}7+V<_+^NS(`V9%aCnOH3LSS%L%jEF3;ZM)UB?bi3h z-L1hbsmEz_&rih$?!JVh^)IJ$pKY~myLD*UgRQ~M=bl!Z$v-oU61Z~|QST{P!^Ki_ z-moJ|IkG=${}<41TF0p0d|r)khpgeml>frsuBOn{Tn51Iyh7mK^d)0)o2=$?shl^Y zBjwOXZ*2tH0Rr8lpgcEQ1VE#cUkiY(*mqtAc(R-bxCugXcKuoavnq$VW!y3FYBov&m3`uvm&^DG5;6nziH4@<-h;+6w6g_&K_5zMvWRZKAHRvo~I(Nz2pjV00000 LNkvXXu0mjfm-ijt literal 0 HcmV?d00001 diff --git a/main/images/p29j.svg b/main/images/p29j.svg new file mode 100644 index 0000000..40dc7ff --- /dev/null +++ b/main/images/p29j.svg @@ -0,0 +1 @@ +45Plan de travail 1 \ No newline at end of file diff --git a/main/images/p2j.png b/main/images/p2j.png new file mode 100644 index 0000000000000000000000000000000000000000..fe0add7a993da5d09346b1c352f414a85b30cf8d GIT binary patch literal 2157 zcmV-z2$J`SP) z0qy^3XYSlH=eINWoHGNo)mB?=wbfQz|39J|Y5UBX$DDkgd@gI__q!FM7o!_C*=8CW zAOC(LX*YKoBX)u?L>&NkkQe5oP4(TE+W2*xz+hKCay*> zZ|C#F{~$VGHtNHML5jt_{gTzA0H<4@Fexr(6iR6gX$*CgHFDLZ?;BtoB7CK@^ADAc z_^~07nTaQMlhh9aq^|T?;m6yp;Oy-b1wAGp*VKe9lwsj=2#@NqOpYPD>-{GBrxrO; zjX*CK3ctPZKL;t59veoC?*SwLKyt%!%J1B7rowGpkq(D)#o5Tx5c#OinT~%pvR`>~ z;Sr%`g!P+T?#1#A0Xg#Ti4iIJ5yP}w2-wURm16eYtsTD{B#vDGP*ExEl;7DKpSN<{ zP@iTJ03iGjq95Zy_MSsbN&^5BCOSH|93(mrZyE?Qi=(5HPYI$uN{YNBN&+Cm+%zT# z6L%JDL~g()S;{(q#<(+}ZuR_cjc|%=E#jOZOYi zPfH)|oMXu?jwSlH6#TJ5#+$K}hy{^JxtfN$ zMcK0*n@wtarF{3m^+EuEso4-Sv%76`wif`1*{k^Y%zEv#cyP~me(;c#;z8fDx`(^c zGq()pKJgP)t>q1lTtUR0X&DHz6I1RFX|k{nM*7zeQ?xxqi$z0p|a?kcoty&>5h|wrn4QPGYms6h$A@q z;ubbpUy0eOAlk~jU#;h(UkWln1lzM!xQYu4F;$?Uwq|ExBEsoP2O9cz)SX+AX#8u{ z$+XO1HvLUh(q99s3`lsFqc;O0Oh(njcP&vqn{nRzJD>Z&2T-~$5C)GL!#it1A4gz)ul9oYI#ju0{18A~K)hLy2 z>dcN}P#7%oeYIDQKlRf+yLYehr>+4)gg?fbzj$G~*4qbMOnG*l2)u}NQIsk(Nk03fHn^U z*acjzW`&3yiCX9Uiw#?bQ+d^xL3-}5$W~qlczF>!+4W=8JHC#Nl!KncvfX;s5eEiN z-z7jA00^Q~>C8lRFpSNlHm1akw~VlUu^Q02YArthh*wD@e_{*?iHhf5di#m!l$%>^ zd}!Z+wL>)kAnn<6 zLtXyZErYpJ*`)2-mK-6%3&+OC6B_~n0Al^omEU1{v2_RcVBr*&8j>riX4^e{jP?vu`op4x5u}fFQz72yMe!Ko52-5(dIoXWUH~mF+ z1q+^*{d+Od^E1T$9k9~F@Ld51hn4s*tquNtSFFSov8Z z`?BN2fV*skugFp&PI^`#1SLsFcWwv-0P^`mCxpO4sU7$u@9Ex~{xm)C?U2Awa?^-fm;H`aUx5k0?b{>=gbfMdswS?mwKq!iulSTdVUxn<9i zO(I;^O=7HB)x+4U1!1ZgnMxR&Gm^3Ijvd|0&I+4;iT$?|Q@$E#LfOyUxh;2YrGYo>HvY)y#a+VCmkG3E^@Osv*yvaYaVjSB?iaTAd`z@f j!PZt=ZMD@_TW#UL)%adFy@%Qu00000NkvXXu0mjfilhhZ literal 0 HcmV?d00001 diff --git a/main/images/p2j.svg b/main/images/p2j.svg new file mode 100644 index 0000000..66160f3 --- /dev/null +++ b/main/images/p2j.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/main/images/p2n.png b/main/images/p2n.png new file mode 100644 index 0000000000000000000000000000000000000000..48ceeb8e7aeb0611a0cfb38b7af8ff49a5099212 GIT binary patch literal 2488 zcmV;p2}kycP)qxh9Xo!Z6VTuY16df`%-4J1__b#0K+dY zm+6LvhTP@!cUg(l*VhN6EGi{ZVIm<5Yl|$P29+8*)zsAFU#f3$sRjUG$&v@;oH;Y9 z4a1s21P9<3w7YKIsu}Tk3y6%eSZqGK@4gM0UAuPC#l~>SMAocXQ^a{PW*E$w=$x%v zH($45!ySJO9M^zOUYd}H0ZZ(TpLx>A4gX*{uK&w<{GipalWu~}<3Z+?7bZ*QMB zGKX`{v^K&sXD&*&wjQ2TF__ej5K$R`*8tp-NFftoLSs?jh<~z?doA-1Pok`{Vz0wVSsHJ9cdQ;jG%| zL!)J929xoppV{#$5xi7tsB5Am06+*hH{X0``2F`A1}CInfCS$c?|GVY_7l?(*IK5i zl7g2>A!?jZXzs$VEnAk(r1o^4IFWwgg`cjTH}}dX#@hJn+dE%8bhx=clS%h@p6`z5 zrx3JOc57>V;G&7_i}$WMc`Es)5PWe!ikj-OP=9SjQDfQ3 z!w%lI_M0y;#_}5A=`)E#zkczxx3wlWnN0UhmIMGW24l{g+GI;hi+3U2^HOW?(e6!* z(F3Ls6+$q3W@OrlX^xo&0Iju<2J@pOcCS)Y<@rwC>UFn1$JqHjq@|@}4*+l(&ft|D^{+)y`;3P-Y|@i;36Om9#mSpN>T2L*>lo2-c;Y#cD&{7H~#q2ZmqQ@ zB355tZ(QhNnNNh#Ax*R_o%J2ZG%i?W7~>KEOwN%8gRjnw)z(Ify1M!@oO7Oj%)HwcyG}wm<*zUtWLpH^+_~ zN}P?eAd$SP^@EK+>jSXT^;DDq4o&bi2~TMw=P5JiY13C^jQlj|P}b9dQ%M&fjfyZJ z&Yq$(gF^=o9Ef*%UM{u%yZ2vx?b4-NgN{`j4w^h#66h%nSwkV)3fY$7SW+mq(IbTym7_zeN>V=ECPj>7+e9-Oa>pQH*iT~W9juq@Z+OwWBdd%RWf-%_aY|;-O zcAZDu5X|D71wa}V#XxE3+*n&%=gvpAzW8!%{(N!k9rtVr1?^aQQ6N<|%{o2WhH1*E z@B0H4)-lk024(?(*2I&E zq3~$EP*6sy%AFg+K_F!1+wgsr{P~t&ZLD8=*SBZZ&RkIzws~bZFyVfph{TEBRCOlj zCkU*cfI~jiGt29uM#LmS>sAH*^s>6DcgO1T@eF(!hiaG)Q?4EefHDh%rMTD{J zc^A0f|KY9Il&|_n%MuyjSeHgJ3vLI@62~%p&-2Z(C46E&hZmrt*f|v~4faWcM>)ge z2M&e)+3c4(!?c>BDJPyZu9e5C&??gNRjz z5G}J|8k`3LvdRv~Dy?;qQob<}LWUvE>m5aonGl=>HPj84L}d5wh79NEA1i*Yy<;idMy|XLj)b$oMGECCO9gU@=c|DL+kTNnWoH*S8i>~$TEfifmL4; z5de7ay?46Crr1@Bt_d?Pt2yJYWw17_=?sDLsuY2=uXM_F{ei6OpC$qcAr$BN0Sh5~ z&I?yK2ISp53ce5vfJ#f9wt)dZ2B-i4Os}ae=9~+`m`}u#IZvM@N`f&aXc(G^5$Bww z6yr8GA-Iy#_|o@BHm58i~4r;~1p(t40_`uAla0sz~#ZPQIne`_^Ouj}JId;7B4 zY@4sNpU!D}GIkgPnWoH1DGR;?`vx;5Y1eZV;mDF$<*w0VmqcU)jg5_cM2UDJG5A*2 z_4@mUGUeHvKe2a&Aw0{nvW3nB5wXsJR7LmcbaBp8oxY-NBmHFrm-Qny5wU&8y0>xg z4FM^p2W^=(152Zhhudw z``-#g#P@yHeIFBSqu{)lGiG0cA0nch(v;MiJ|-!iUluDrI-cTJ_W#KK_{oT3d>J$r zFvcz_g^5Tp@RJOD|I&Ho@yi|K6s9nRDNJDsBlthH8cmVwO~%gv0000 + + + + + + + + + + + + + diff --git a/main/images/p3j.png b/main/images/p3j.png new file mode 100644 index 0000000000000000000000000000000000000000..bd9eb1a1208bfaac54dd9f82b1506095d314ba20 GIT binary patch literal 1120 zcmV-m1fTnfP)V*?T=$x!573M(7 zL~!7=8}343xZrFkU8NU=)yW)n#FL)pv<yLSwT7NQuNQNWB`3{Ecd9q%clo~0 zdEWPdFMMAB2L}fS2L}fS2M4>Dml|t{7zez=*wi`BL=5m6er*nci3H?+JxMkzxiDkswKu zKbcJK-Ol3Kg@V1->~`l`O=Mz zjY9^EZU%M`fcxLpZ2+U3@voYinucr%GBq`I3Jh;=$LyXVJJ#IXeA2}CNicj3;EAoi zC!))uAimz%*tk&4+}xwZ@mMhiIg5b$dwYBLXVzp{ejW_hP#^>VFvecoR5!1WkB>iE z%-q}{25uH(V1nQl#m0k3jj(i8wi50%v<*TslL7%tKZ}V(OlYj0C%h! zWJ5&S#MP?{T-WOWfD8O{09D2Mcs!oa3*CnlNs`Vb5{ZsN`kWy99^dyXaq8AoZMoRt zL_{}!y8gwCqO1XcEXzRv&lT%)A3+q$xWErH&c+jo#9Lcw^InL3eSHmnpRcF7#usq8 z#DdR~bb53B+Qh`kR|s9#(`P?B`^><=z>nEItHvxG z4!a78`uqDUTOuvrGO)Ica{7!1eJ5E?#Iv>h(^3oeej~w5=A1B3j}J*DwkB(_}(n_dIk+LRygC8R+l!Trqv|Z#L}uO6ak0Ym^mH46 z4(98Zd&`eJYzP1lMRB)4w5P7Ft~9f5TM#1Zvde2LG*w#zfD%pfX4dTs!stKw!?m=u zbnoHneISR8K|rQ2V>>YnLybnGF#uR!UtiDc*%riG>Wu>U(=IbI9F1s)Ks?6_87Plan de travail 1 \ No newline at end of file diff --git a/main/images/p4j.png b/main/images/p4j.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab2d7b24e7b7de20243bb61079117e08cf6ff44 GIT binary patch literal 1838 zcmV+}2hsS6P)A6O75>h>_q};DSjR-p)_hk+Bk_@|HM<<8Qb&s=FNNe9v1dEPCJh0#|4Du z+ud{SJ?DJ)=$?1Z16pXIg%(<9p@sh+&_P%?fG51 zP8YY^=e7~y>EUoL5_?pG_rp*>z*TJv!N!25BMW*z8hn4;N=P<{+jVmlJ z%jyno4H?lsdc<@&_Sl~Sm0GIkgkZx`ol7KsHu-@Q$8WM=A^ zNrxQ{#Ql!nb!-{PZnvb9d;a1%hyJlHCvwT6)A9J3Og(W`zqU;^zB{`5ywA zQoqync5g{PFt@g2KY+%Gkf9C`tR3xkE)iBP05E%Pm9~S}4IwDon{**Hqu@)-t|$aD z4glahwIM$AL%birA5po?dWkS2fFP4C`r%SpTSNfZ*mpOOMfZLO8-i~DAb{Z2 z?!*)=$Wpcs;q^G8JUJ4gz0bYB8>oc{N&dAlI8iL?M6s;F3_-N&762qXX5C~u)*^** zkytsuwg!lUD6yxQLID8ecTfyKV?>4qd#_%an0ef2aa2l4mYPkqSrdl=Kp^jg^MCs| z&vU$KB4C8wH(;0FS(g}32-2>@DwGERtq}vTWe--%ajjS36fz-6`k2JR+-a zLQ}*ei*-fk*?pMl{Q&|ig>4ycBqdBf@?~OT05DKr6hurCTomu#xN;-?)JOL9%r`_N zzGpDEytvjuurdsLiInN(Kp>Mifxzj9rEJLB+N}G40U}~j8w-m9fWSbM1M^`o;I9Mt zenUivz85SnjNWEoCjjWS?&}npc?emXw2T4}NJRrgExm=MEg%?Bj>nK|LlzmLPyqmz z-5{J^Dp^bvt#-8LPZ|SnVvR^(^-qR6XXkYm-NYUMgF9{r%cUlI6#x*#Oj3bO#gGA9 z8vwL{V4zH(suiqeBAyPeg{1lv02tGm)9pR4QvCL3x|V(mH!_5hiJ_@CLJUaTH>}pv zYM@F4Q7QY(j5%NHXR98s$5&=yiqYeL zu80h`Pc6E~E>zZ1!gwYBwND)At2(FDMI@bmIu(-EH!H1*G?|!lXMEJZ5lJ-40RXIh z#g$Um(KA|f91X=z5pimx-1c67SY@Y%c*UeRFB}d8I9PQ-iUDOH z+DwTOa^8>iz2b)sUfXz{ndS>#?rdKJKkXVWGtA!(EiGohL=X>dlv`A?Nze31cWy7~ zLK5)T>b_MlBD!cIy|-BIPW$ZK(`qpIt&SbB7l?l3H4;x#J;m7AnE1}OrjCGd1cb)s zc7_j#mlMe|7m2o>J2u0%{QF&4I2DsHN2Q>T8dKW@F9ftU{7((>QZjiq*K7>i`Zs=Z za>R+pF(?A@5DV^MgBTHP0ANO$1af33ZIrpTvVw`dH4IGuGhiOJnTPGIcec<%3oW$J c!ha9{26b5a?_>8ERsaA107*qoM6N<$f_y|<-v9sr literal 0 HcmV?d00001 diff --git a/main/images/p4j.svg b/main/images/p4j.svg new file mode 100644 index 0000000..d3ee72a --- /dev/null +++ b/main/images/p4j.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/main/images/p4n.png b/main/images/p4n.png new file mode 100644 index 0000000000000000000000000000000000000000..a2a464e611064d5df829a822ac8fa6cb7bc99fa7 GIT binary patch literal 1879 zcmV-d2dMaoP)43q6+Y+QH_x8&cwfeLBHS!?jng)wNdq)NnL5NZ*;q0DImlu zHAtv5N}{5msI-Zj;8=FmI+8UhEefP&spBj-b{0Fa{-n;kk!`s;N2G7_D zLTEl|EYI;d=YHS2%en6uAcG7t$RL9ZG61}nx$EkDj+HB;N;vFf03%juX{p)N)Fkf7 zV0SZFU7b%YE)M5A99emYGRJm6~v0!vkVc%Yp=b&R_XDns-udC#QBf9 z4<9)2`wm2fG%YgR+Ut#H*tq+P$p+vYTwAy9syK6IcBWE6 zS{n=zuQWBC{OPr8HxI_o#)b`R@(&&Q@sWzk(r4pET)f!ZG%doi=o4L!q;xtFVX@EW zQ`6#>j&nmpLyi#HtKw}XCB@2-!#_Hhlasw6-mdHB$hW`qlYQZE)RdB0!Ql9HDP_tV znR5)Zx1a7$)jz3_zh4U!m@#8ryiec1u6VR?XilNq_}QB6<)!(%=Eq;|x%JNZ&MTb& z01h>4+@Y!ovoSg}GTh$!$G&77ii)zjQ@sh;3i;EG8-=Q#@@3BffUOW!r91#wybwez1R`FP z>(C0EN_3JMF(Jg90;(vyz+MKKv6!VzWh2JWc6s!U=*0k-bW;;4*~$Kvk`N%$2vLlM zV(tko=9(gxK$$Ug*so4fqy+b58~`FEsR<~7$Vf(xNH`XjFvZ2rn5Ez$BIq_O8HmJW zFcOnN%@ComZfVmW&9EYdCBd*n!Y6775sDhoP}GQOMl2E^HybZBK(HzbT%Xj`tajP) z;GDBm?_jnwvUYX(@P!NXSdibjpEHXA0CfNJqw>I5AaB~Iupr;%d-BnvcJZOGKJ>ez zt-k>P0OXc4$9ZeM&yL0|yH|Y5^OS?LhhBd9TTj05!gv3W3gKi(xsGhzx~o!3D4G7Q zC>+~b4|XCV4@CjYxLrU1)bW1z5yLPH0Dx?lYm9Mj&d<5FuKIB)Np@Yndd7B80=jQ? z^?(q9fJ^`9s+SKWyIC)C2m?f1+OmZRMX#n`4oo~uQ{Qf4*>)kFn=QEqHx#itc8^83- zUH|}3e!?k=rYT5DsZWw(5)sl8!x$Hgp&XA|&WNEq5R>yw=k`mCQ3wF?rwz@`?+-ru z_|rjTEU))Y)Go$JL|HUl;UTfQFEr-V4+O+8Nja9xF|BL7qFAFsDEaZW%iR}$u;!r$ z4+x@UXFkSaLKjlT0A`lhf`S-h5|Pc`Du6nPtA~>Lr~QW5(6Dob5SSZp+w<%btDf53 z_^P5PmC53UhQ`jl+kUR)(xtv(NlZt?F~$|$mK1WTZ`^jZsHEHk01z&sFRU&fwY#q^ zT8P*Cjci2;RL`&Un>Vj7-1pMge(rX=KA$X>h~(&K;BPnk?{pnM{@&TXzFT7e6wx$& zLI`8#cxDVn(|xf@yZLba`ai7d>iaAymArWSjT^W1lc&zKtyo!gp{OXYSXCXBVDq42 zrZw^L$5;Py?p)V^X<9K|*F%1s5b5Y>Nq7Zb2#fA()z|M>_Me&$n>Vj7+_>>G zHDzTbl|oozd^{X%Ydd?ntE)GpD5fwBh|Pb|`mZ$~=ELjVR?fLnwv-&Ru=Mfq<<~kp z4=3CJQo)j%Vt)TSLxv&xg%FGCMNNaqn%K1Ik*kXp0q}p+GQI0f?6R_G9%D*=@+P)0 z5&48^W(EJ}n%K#5uUofQsi?T^2#1}_=?t50x7)f`|5nH#gA6jrAcG75;NM=aXiC!W RBgy~(002ovPDHLkV1kuIvfKaw literal 0 HcmV?d00001 diff --git a/main/images/p4n.svg b/main/images/p4n.svg new file mode 100644 index 0000000..1d76805 --- /dev/null +++ b/main/images/p4n.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + diff --git a/main/main.c b/main/main.c index c5aa0d4..d4e6871 100644 --- a/main/main.c +++ b/main/main.c @@ -1,8 +1,3 @@ -/* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ #include "freertos/FreeRTOS.h" #include "freertos/event_groups.h" #include "esp_err.h" @@ -18,66 +13,69 @@ #include "esp_event.h" #include "nvs_flash.h" #include "mqtt_client.h" +#include "meteofrance.h" #include "esp_lcd_touch_gt911.h" +LV_FONT_DECLARE(montserrat_medium_12) +LV_FONT_DECLARE(montserrat_medium_18) /* LCD size */ -#define EXAMPLE_LCD_H_RES (800) -#define EXAMPLE_LCD_V_RES (480) +#define EXAMPLE_LCD_H_RES (800) +#define EXAMPLE_LCD_V_RES (480) /* LCD settings */ -#define EXAMPLE_LCD_LVGL_FULL_REFRESH (0) -#define EXAMPLE_LCD_LVGL_DIRECT_MODE (1) -#define EXAMPLE_LCD_LVGL_AVOID_TEAR (1) -#define EXAMPLE_LCD_RGB_BOUNCE_BUFFER_MODE (1) -#define EXAMPLE_LCD_DRAW_BUFF_DOUBLE (1) -#define EXAMPLE_LCD_DRAW_BUFF_HEIGHT (100) -#define EXAMPLE_LCD_RGB_BUFFER_NUMS (2) -#define EXAMPLE_LCD_RGB_BOUNCE_BUFFER_HEIGHT (10) +#define EXAMPLE_LCD_LVGL_FULL_REFRESH (0) +#define EXAMPLE_LCD_LVGL_DIRECT_MODE (1) +#define EXAMPLE_LCD_LVGL_AVOID_TEAR (1) +#define EXAMPLE_LCD_RGB_BOUNCE_BUFFER_MODE (1) +#define EXAMPLE_LCD_DRAW_BUFF_DOUBLE (1) +#define EXAMPLE_LCD_DRAW_BUFF_HEIGHT (100) +#define EXAMPLE_LCD_RGB_BUFFER_NUMS (2) +#define EXAMPLE_LCD_RGB_BOUNCE_BUFFER_HEIGHT (10) /* LCD pins */ -#define EXAMPLE_LCD_GPIO_VSYNC (GPIO_NUM_41) -#define EXAMPLE_LCD_GPIO_HSYNC (GPIO_NUM_39) -#define EXAMPLE_LCD_GPIO_DE (GPIO_NUM_40) -#define EXAMPLE_LCD_GPIO_PCLK (GPIO_NUM_42) -#define EXAMPLE_LCD_GPIO_DISP (GPIO_NUM_NC) -#define EXAMPLE_LCD_GPIO_DATA0 (GPIO_NUM_8) -#define EXAMPLE_LCD_GPIO_DATA1 (GPIO_NUM_3) -#define EXAMPLE_LCD_GPIO_DATA2 (GPIO_NUM_46) -#define EXAMPLE_LCD_GPIO_DATA3 (GPIO_NUM_9) -#define EXAMPLE_LCD_GPIO_DATA4 (GPIO_NUM_1) -#define EXAMPLE_LCD_GPIO_DATA5 (GPIO_NUM_5) -#define EXAMPLE_LCD_GPIO_DATA6 (GPIO_NUM_6) -#define EXAMPLE_LCD_GPIO_DATA7 (GPIO_NUM_7) -#define EXAMPLE_LCD_GPIO_DATA8 (GPIO_NUM_15) -#define EXAMPLE_LCD_GPIO_DATA9 (GPIO_NUM_16) -#define EXAMPLE_LCD_GPIO_DATA10 (GPIO_NUM_4) -#define EXAMPLE_LCD_GPIO_DATA11 (GPIO_NUM_45) -#define EXAMPLE_LCD_GPIO_DATA12 (GPIO_NUM_48) -#define EXAMPLE_LCD_GPIO_DATA13 (GPIO_NUM_47) -#define EXAMPLE_LCD_GPIO_DATA14 (GPIO_NUM_21) -#define EXAMPLE_LCD_GPIO_DATA15 (GPIO_NUM_14) +#define EXAMPLE_LCD_GPIO_VSYNC (GPIO_NUM_41) +#define EXAMPLE_LCD_GPIO_HSYNC (GPIO_NUM_39) +#define EXAMPLE_LCD_GPIO_DE (GPIO_NUM_40) +#define EXAMPLE_LCD_GPIO_PCLK (GPIO_NUM_42) +#define EXAMPLE_LCD_GPIO_DISP (GPIO_NUM_NC) +#define EXAMPLE_LCD_GPIO_DATA0 (GPIO_NUM_8) +#define EXAMPLE_LCD_GPIO_DATA1 (GPIO_NUM_3) +#define EXAMPLE_LCD_GPIO_DATA2 (GPIO_NUM_46) +#define EXAMPLE_LCD_GPIO_DATA3 (GPIO_NUM_9) +#define EXAMPLE_LCD_GPIO_DATA4 (GPIO_NUM_1) +#define EXAMPLE_LCD_GPIO_DATA5 (GPIO_NUM_5) +#define EXAMPLE_LCD_GPIO_DATA6 (GPIO_NUM_6) +#define EXAMPLE_LCD_GPIO_DATA7 (GPIO_NUM_7) +#define EXAMPLE_LCD_GPIO_DATA8 (GPIO_NUM_15) +#define EXAMPLE_LCD_GPIO_DATA9 (GPIO_NUM_16) +#define EXAMPLE_LCD_GPIO_DATA10 (GPIO_NUM_4) +#define EXAMPLE_LCD_GPIO_DATA11 (GPIO_NUM_45) +#define EXAMPLE_LCD_GPIO_DATA12 (GPIO_NUM_48) +#define EXAMPLE_LCD_GPIO_DATA13 (GPIO_NUM_47) +#define EXAMPLE_LCD_GPIO_DATA14 (GPIO_NUM_21) +#define EXAMPLE_LCD_GPIO_DATA15 (GPIO_NUM_14) /* Touch settings */ -#define EXAMPLE_TOUCH_I2C_NUM (0) -#define EXAMPLE_TOUCH_I2C_CLK_HZ (400000) +#define EXAMPLE_TOUCH_I2C_NUM (0) +#define EXAMPLE_TOUCH_I2C_CLK_HZ (400000) /* LCD touch pins */ -#define EXAMPLE_TOUCH_I2C_SCL (GPIO_NUM_18) -#define EXAMPLE_TOUCH_I2C_SDA (GPIO_NUM_17) +#define EXAMPLE_TOUCH_I2C_SCL (GPIO_NUM_18) +#define EXAMPLE_TOUCH_I2C_SDA (GPIO_NUM_17) -#define EXAMPLE_LCD_PANEL_35HZ_RGB_TIMING() \ - { \ - .pclk_hz = 18 * 1000 * 1000, \ - .h_res = EXAMPLE_LCD_H_RES, \ - .v_res = EXAMPLE_LCD_V_RES, \ - .hsync_pulse_width = 40, \ - .hsync_back_porch = 40, \ - .hsync_front_porch = 48, \ - .vsync_pulse_width = 23, \ - .vsync_back_porch = 32, \ - .vsync_front_porch = 13, \ - .flags.pclk_active_neg = true, \ +#define EXAMPLE_LCD_PANEL_35HZ_RGB_TIMING() \ + { \ + .pclk_hz = 18 * 1000 * 1000, \ + .h_res = EXAMPLE_LCD_H_RES, \ + .v_res = EXAMPLE_LCD_V_RES, \ + .hsync_pulse_width = 40, \ + .hsync_back_porch = 40, \ + .hsync_front_porch = 48, \ + .vsync_pulse_width = 23, \ + .vsync_back_porch = 32, \ + .vsync_front_porch = 13, \ + .flags.pclk_active_neg = true, \ } static const char *TAG = "EXAMPLE"; @@ -93,9 +91,8 @@ static esp_lcd_touch_handle_t touch_handle = NULL; static lv_display_t *lvgl_disp = NULL; static lv_indev_t *lvgl_touch_indev = NULL; - lv_obj_t * chart; - lv_chart_series_t * ser1; - +lv_obj_t *chart; +lv_chart_series_t *ser1; static esp_err_t app_lcd_init(void) { @@ -144,7 +141,8 @@ static esp_err_t app_lcd_init(void) return ret; err: - if (lcd_panel) { + if (lcd_panel) + { esp_lcd_panel_del(lcd_panel); } return ret; @@ -159,8 +157,7 @@ static esp_err_t app_touch_init(void) .sda_pullup_en = GPIO_PULLUP_DISABLE, .scl_io_num = EXAMPLE_TOUCH_I2C_SCL, .scl_pullup_en = GPIO_PULLUP_DISABLE, - .master.clk_speed = EXAMPLE_TOUCH_I2C_CLK_HZ - }; + .master.clk_speed = EXAMPLE_TOUCH_I2C_CLK_HZ}; ESP_RETURN_ON_ERROR(i2c_param_config(EXAMPLE_TOUCH_I2C_NUM, &i2c_conf), TAG, "I2C configuration failed"); ESP_RETURN_ON_ERROR(i2c_driver_install(EXAMPLE_TOUCH_I2C_NUM, i2c_conf.mode, 0, 0, 0), TAG, "I2C initialization failed"); @@ -190,11 +187,11 @@ static esp_err_t app_lvgl_init(void) { /* Initialize LVGL */ const lvgl_port_cfg_t lvgl_cfg = { - .task_priority = 4, /* LVGL task priority */ - .task_stack = 6144, /* LVGL task stack size */ - .task_affinity = -1, /* LVGL task pinned to core (-1 is no affinity) */ - .task_max_sleep_ms = 500, /* Maximum sleep in LVGL task */ - .timer_period_ms = 5 /* LVGL timer tick period in ms */ + .task_priority = 4, /* LVGL task priority */ + .task_stack = 6144, /* LVGL task stack size */ + .task_affinity = -1, /* LVGL task pinned to core (-1 is no affinity) */ + .task_max_sleep_ms = 500, /* Maximum sleep in LVGL task */ + .timer_period_ms = 5 /* LVGL timer tick period in ms */ }; ESP_RETURN_ON_ERROR(lvgl_port_init(&lvgl_cfg), TAG, "LVGL port initialization failed"); @@ -231,8 +228,7 @@ static esp_err_t app_lvgl_init(void) #if LVGL_VERSION_MAJOR >= 9 .swap_bytes = false, #endif - } - }; + }}; const lvgl_port_display_rgb_cfg_t rgb_cfg = { .flags = { #if EXAMPLE_LCD_RGB_BOUNCE_BUFFER_MODE @@ -245,8 +241,7 @@ static esp_err_t app_lvgl_init(void) #else .avoid_tearing = false, #endif - } - }; + }}; lvgl_disp = lvgl_port_add_disp_rgb(&disp_cfg, &rgb_cfg); /* Add touch input (for selected screen) */ @@ -261,14 +256,17 @@ static esp_err_t app_lvgl_init(void) static void _app_button_cb(lv_event_t *e) { + lvgl_port_lock(0); lv_disp_rotation_t rotation = lv_disp_get_rotation(lvgl_disp); rotation++; - if (rotation > LV_DISPLAY_ROTATION_270) { + if (rotation > LV_DISPLAY_ROTATION_270) + { rotation = LV_DISPLAY_ROTATION_0; } /* LCD HW rotation */ lv_disp_set_rotation(lvgl_disp, rotation); + lvgl_port_unlock(); } static void app_main_display(void) @@ -288,9 +286,9 @@ static void app_main_display(void) lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0); #if LVGL_VERSION_MAJOR == 8 lv_label_set_recolor(label, true); - lv_label_set_text(label, "#FF0000 "LV_SYMBOL_BELL" Hello world Espressif and LVGL "LV_SYMBOL_BELL"#\n#FF9400 "LV_SYMBOL_WARNING" For simplier initialization, use BSP "LV_SYMBOL_WARNING" #"); + lv_label_set_text(label, "#FF0000 " LV_SYMBOL_BELL " Hello world Espressif and LVGL " LV_SYMBOL_BELL "#\n#FF9400 " LV_SYMBOL_WARNING " For simplier initialization, use BSP " LV_SYMBOL_WARNING " #"); #else - lv_label_set_text(label, LV_SYMBOL_BELL" Hello world Espressif and LVGL "LV_SYMBOL_BELL"\n "LV_SYMBOL_WARNING" For simplier initialization, use BSP "LV_SYMBOL_WARNING); + lv_label_set_text(label, LV_SYMBOL_BELL " Hello world Espressif and LVGL " LV_SYMBOL_BELL "\n " LV_SYMBOL_WARNING " For simplier initialization, use BSP " LV_SYMBOL_WARNING); #endif lv_obj_align(label, LV_ALIGN_CENTER, 0, 20); @@ -310,170 +308,362 @@ lv_subject_t tempIntSubj; lv_subject_t tempExtSubj; lv_subject_t hauteurCuveSubj; lv_subject_t hauteurCuveEvolSubj; +lv_subject_t tempD1Subj; +lv_subject_t tempD2Subj; +lv_subject_t tempD3Subj; +lv_subject_t *tmpSubj[3] = {&tempD1Subj, &tempD2Subj, &tempD3Subj}; char *upEvent = "monter"; char *downEvent = "descendre"; -char *topicTempExt="house/temp/282A802600008059"; -char *topicHauteurCuve="house/cuve/hauteur"; -char *topicTempInt="house/temp/287DCF1E00008020"; -char *topicHauteurCuveEvol="house/cuve/hauteurEvol"; +char *topicTempExt = "house/temp/282A802600008059"; +char *topicHauteurCuve = "house/cuve/hauteur"; +char *topicTempInt = "house/temp/287DCF1E00008020"; +char *topicHauteurCuveEvol = "house/cuve/hauteurEvol"; esp_mqtt_client_handle_t client; static void event_handler(lv_event_t *e) { - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t *obj = (lv_obj_t *)lv_event_get_target(e); - char *evtData = (char *)lv_event_get_user_data(e); + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t *obj = (lv_obj_t *)lv_event_get_target(e); + char *evtData = (char *)lv_event_get_user_data(e); - switch (code) - { - case LV_EVENT_PRESSED: - // LV_LOG_USER("%s was pressed\n", evtData); - break; - case LV_EVENT_CLICKED: - ESP_LOGI(TAG, "%s was clicked\n", evtData); - esp_mqtt_client_publish(client,"volets", evtData,0,0,0); - break; - case LV_EVENT_LONG_PRESSED: - LV_LOG_USER("%s was long pressed\n", evtData); - break; - case LV_EVENT_LONG_PRESSED_REPEAT: - LV_LOG_USER("%s was long press repeat\n", evtData); - break; - default: - break; - } + switch (code) + { + case LV_EVENT_PRESSED: + // LV_LOG_USER("%s was pressed\n", evtData); + break; + case LV_EVENT_CLICKED: + ESP_LOGI(TAG, "%s was clicked\n", evtData); + esp_mqtt_client_publish(client, "volets", evtData, 0, 0, 0); + break; + case LV_EVENT_LONG_PRESSED: + LV_LOG_USER("%s was long pressed\n", evtData); + break; + case LV_EVENT_LONG_PRESSED_REPEAT: + LV_LOG_USER("%s was long press repeat\n", evtData); + break; + default: + break; + } +} +LV_IMAGE_DECLARE(p1j); +LV_IMAGE_DECLARE(p2j); +LV_IMAGE_DECLARE(p3j); +LV_IMAGE_DECLARE(p14j); +LV_IMAGE_DECLARE(p24j); +LV_IMAGE_DECLARE(p25j); +LV_IMAGE_DECLARE(p26j); +LV_IMAGE_DECLARE(p27j); +LV_IMAGE_DECLARE(p29j); + +static void weatherdata_obs_cb(lv_observer_t *observer, lv_subject_t *subject) +{ + // Retrieve weatherdata + struct meteoforecast_data *data = subject->value.pointer; + char buff[40] = {}; + // sprintf(buff,"%s %.1f %.1f", data->previsions.desc, data->previsions.min, data->previsions.max); + lv_obj_t *parent = (lv_obj_t *)(observer->target); + lv_obj_t *desc_icon = lv_obj_get_child(parent, 0); + lv_obj_t *temps = lv_obj_get_child(parent, 1); + if (strcmp(data->previsions.icon, "p1j") == 0) + { + lv_image_set_src(lv_obj_get_child(desc_icon, 0), &p1j); + }else if (strcmp(data->previsions.icon, "p2j") == 0) + { + lv_image_set_src(lv_obj_get_child(desc_icon, 0), &p2j); + }else if (strcmp(data->previsions.icon, "p3j") == 0) + { + lv_image_set_src(lv_obj_get_child(desc_icon, 0), &p3j); + }else if (strcmp(data->previsions.icon, "p14j") == 0) + { + lv_image_set_src(lv_obj_get_child(desc_icon, 0), &p14j); + }else if (strcmp(data->previsions.icon, "p24j") == 0) + { + lv_image_set_src(lv_obj_get_child(desc_icon, 0), &p24j); + }else if (strcmp(data->previsions.icon, "p25j") == 0) + { + lv_image_set_src(lv_obj_get_child(desc_icon, 0), &p25j); + }else if (strcmp(data->previsions.icon, "p26j") == 0) + { + lv_image_set_src(lv_obj_get_child(desc_icon, 0), &p26j); + }else if (strcmp(data->previsions.icon, "p27j") == 0) + { + lv_image_set_src(lv_obj_get_child(desc_icon, 0), &p27j); + }else if (strcmp(data->previsions.icon, "p29j") == 0) + { + lv_image_set_src(lv_obj_get_child(desc_icon, 0), &p29j); + } + lv_label_set_text(lv_obj_get_child(desc_icon, 1), data->previsions.desc); + lv_label_set_text_fmt(lv_obj_get_child(temps, 0), "%.1f°C", data->previsions.max); + lv_label_set_text_fmt(lv_obj_get_child(temps, 1), "%.1f°C", data->previsions.min); } +static lv_style_t style_container; + +struct weatherDay_fragment_t +{ + /* IMPORTANT: don't miss this part */ + lv_fragment_t base; + /* States, object references and data fields for this fragment */ + int dayNr; + const char *title; + float minTemp; + float maxTemp; +}; +static void weatherDay_fragment_ctor(lv_fragment_t *self, int args) +{ + ((struct weatherDay_fragment_t *)self)->dayNr = args; +} + +static lv_style_t style_font_16; +static lv_style_t style_font_12; + +static lv_obj_t *weatherDay_fragment_create_obj(lv_fragment_t *self, lv_obj_t *parent) +{ + lvgl_port_lock(0); + + lv_obj_t *sup = lv_obj_create(parent); + lv_obj_set_flex_flow(sup, LV_FLEX_FLOW_ROW); + lv_obj_add_style(sup, &style_container, 0); + lv_obj_set_size(sup, LV_SIZE_CONTENT, LV_SIZE_CONTENT); + + static lv_style_t no_padding; + lv_style_init(&no_padding); + lv_style_set_pad_all(&no_padding, 0); + + lv_obj_t *container = lv_obj_create(sup); + lv_obj_set_flex_flow(container, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(container,LV_FLEX_ALIGN_CENTER,LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_add_style(container, &no_padding, 0); + lv_obj_set_width(container, 100); + lv_obj_set_height(container, 90); + + lv_obj_t *img1 = lv_image_create(container); + lv_obj_add_style(img1, &no_padding, 0); + lv_obj_set_style_bg_color(img1,lv_palette_lighten(LV_PALETTE_BLUE_GREY, 4),0); + lv_image_set_inner_align(img1, LV_IMAGE_ALIGN_TOP_LEFT); + lv_image_set_offset_y(img1, -8); + lv_image_set_offset_x(img1, -8); + lv_obj_set_size(img1,40,40); + lv_image_set_src(img1, &p1j); + //lv_obj_set_style_border_width(img1,2,0); + //lv_obj_set_style_border_color(img1, lv_palette_main(LV_PALETTE_BLUE_GREY), 0); + lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0); + + lv_obj_t *desc = lv_label_create(container); + lv_obj_add_style(desc, &style_font_12, 0); + + lv_obj_t *container2 = lv_obj_create(sup); + lv_obj_set_width(container2, LV_SIZE_CONTENT); + lv_obj_set_height(container2, 90); + lv_obj_add_style(container2, &no_padding, 0); + lv_obj_set_style_pad_top(container2,5,0); + lv_obj_set_style_pad_bottom(container2,5,0); + lv_obj_set_flex_flow(container2, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(container2, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_START); + + static lv_style_t tempStyle; + lv_style_init(&tempStyle); + //lv_style_set_text_font(&tempStyle,¬omedium16); + + lv_obj_t *max = lv_label_create(container2); + lv_obj_add_style(max, &tempStyle,0); + lv_obj_add_style(max, &style_font_16, 0); + lv_obj_set_style_text_color(max,lv_color_hex(0xFF0000),0); + lv_obj_t *min = lv_label_create(container2); + lv_obj_add_style(min, &tempStyle,0); + lv_obj_add_style(min, &style_font_16, 0); + lv_obj_set_style_text_color(min,lv_color_hex(0x3000FF),0); + lv_subject_add_observer_obj(tmpSubj[((struct weatherDay_fragment_t *)self)->dayNr], weatherdata_obs_cb, sup, NULL); + lvgl_port_unlock(); + return container; +} +const lv_fragment_class_t sample_cls = { + /* Initialize something needed */ + .constructor_cb = weatherDay_fragment_ctor, + /* Create view objects */ + .create_obj_cb = weatherDay_fragment_create_obj, + /* IMPORTANT: size of your fragment struct */ + .instance_size = sizeof(struct weatherDay_fragment_t), +}; void draw_ihm() { - lv_subject_init_string(&tempExtSubj, tempExtStr, NULL, 6, "--"); - lv_subject_init_string(&tempIntSubj, tempIntStr, NULL, 6, "--"); - lv_subject_init_string(&hauteurCuveSubj, hauteurCuveStr, NULL, 9, "--"); - lv_subject_init_string(&hauteurCuveEvolSubj, hauteurCuveEvolStr, NULL, 9, "--"); + lv_subject_init_string(&tempExtSubj, tempExtStr, NULL, 6, "--"); + lv_subject_init_string(&tempIntSubj, tempIntStr, NULL, 6, "--"); + lv_subject_init_string(&hauteurCuveSubj, hauteurCuveStr, NULL, 9, "--"); + lv_subject_init_string(&hauteurCuveEvolSubj, hauteurCuveEvolStr, NULL, 9, "--"); + lv_subject_init_pointer(&tempD1Subj, "--"); + lv_subject_init_pointer(&tempD2Subj, "--"); + lv_subject_init_pointer(&tempD3Subj, "--"); - // keys.clear(); - lv_obj_clean(lv_scr_act()); + // keys.clear(); + lv_obj_clean(lv_scr_act()); - static lv_style_t style_btn; - lv_style_init(&style_btn); - // lv_style_set_bg_color(&style_btn, lv_color_hex(0x115588)); - // lv_style_set_bg_opa(&style_btn, LV_OPA_50); - // lv_style_set_border_width(&style_btn, 2); - // lv_style_set_border_color(&style_btn, lv_color_black()); - lv_style_set_width(&style_btn, 180); - lv_style_set_height(&style_btn, 180); + static lv_style_t style_btn; + lv_style_init(&style_btn); - // Un style pour les conteneurs (température, cuve ...) - static lv_style_t style_container; - lv_style_init(&style_container); - lv_style_set_pad_all(&style_container, 5); - // lv_style_set_height(&style_container,LV_SIZE_CONTENT); - lv_style_set_height(&style_container, 80); - lv_style_set_width(&style_container, 200); - lv_style_set_bg_color(&style_container, lv_palette_lighten(LV_PALETTE_BLUE_GREY, 4)); - lv_style_set_align(&style_container, LV_ALIGN_BOTTOM_LEFT); - lv_style_set_flex_cross_place(&style_container, LV_FLEX_ALIGN_END); + lv_style_init(&style_font_16); + lv_style_set_text_font(&style_font_16, &montserrat_medium_18); - static lv_style_t style_lbvValue; - lv_style_init(&style_lbvValue); - lv_style_set_text_font(&style_lbvValue, &lv_font_montserrat_40); + lv_style_init(&style_font_12); + lv_style_set_text_font(&style_font_12, &montserrat_medium_12); - lv_obj_set_flex_flow(lv_screen_active(), LV_FLEX_FLOW_ROW); - lv_obj_set_style_pad_column(lv_screen_active(), 1, 0); + // lv_style_set_bg_color(&style_btn, lv_color_hex(0x115588)); + // lv_style_set_bg_opa(&style_btn, LV_OPA_50); + // lv_style_set_border_width(&style_btn, 2); + // lv_style_set_border_color(&style_btn, lv_color_black()); + lv_style_set_width(&style_btn, 80); + lv_style_set_height(&style_btn, 100); - /*Create a container with COLUMN flex direction*/ - lv_obj_t *cont_col = lv_obj_create(lv_screen_active()); - lv_obj_set_style_pad_all(cont_col, 5, 0); - lv_obj_set_size(cont_col, 250, 480); - lv_obj_align(cont_col, LV_ALIGN_TOP_LEFT, 0, 0); - lv_obj_set_flex_flow(cont_col, LV_FLEX_FLOW_COLUMN); + // Un style pour les conteneurs (température, cuve ...) + lv_style_init(&style_container); + lv_style_set_pad_all(&style_container, 5); + // lv_style_set_height(&style_container,LV_SIZE_CONTENT); + lv_style_set_height(&style_container, 80); + lv_style_set_width(&style_container, 200); + lv_style_set_bg_color(&style_container, lv_palette_lighten(LV_PALETTE_BLUE_GREY, 4)); + lv_style_set_align(&style_container, LV_ALIGN_BOTTOM_LEFT); + lv_style_set_flex_cross_place(&style_container, LV_FLEX_ALIGN_END); - /*Create a container with COLUMN flex direction*/ - lv_obj_t *cont_col2 = lv_obj_create(lv_screen_active()); - lv_obj_set_style_pad_all(cont_col2, 5, 0); - lv_obj_set_flex_align(cont_col2, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + static lv_style_t style_lbvValue; + lv_style_init(&style_lbvValue); + lv_style_set_text_font(&style_lbvValue, &lv_font_montserrat_40); - lv_obj_set_height(cont_col2, 480); - lv_obj_set_width(cont_col2, LV_SIZE_CONTENT); - lv_obj_align_to(cont_col2, cont_col, LV_ALIGN_OUT_TOP_RIGHT, 0, 0); - lv_obj_set_flex_flow(cont_col2, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_flow(lv_screen_active(), LV_FLEX_FLOW_ROW); + lv_obj_set_style_pad_column(lv_screen_active(), 1, 0); - lv_obj_t *label1 = lv_label_create(cont_col); - lv_label_set_text(label1, "Temperatures"); - lv_obj_set_pos(label1, 0, 0); + /*Create a container with COLUMN flex direction*/ + lv_obj_t *cont_col = lv_obj_create(lv_screen_active()); + lv_obj_set_style_pad_all(cont_col, 5, 0); + lv_obj_set_size(cont_col, 250, 480); + lv_obj_align(cont_col, LV_ALIGN_TOP_LEFT, 0, 0); + lv_obj_set_flex_flow(cont_col, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(cont_col,LV_FLEX_ALIGN_CENTER,LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - /*Create a container with COLUMN flex direction*/ - lv_obj_t *cont_tempExt = lv_obj_create(cont_col); - lv_obj_add_style(cont_tempExt, &style_container, 0); - // lv_obj_set_height(cont_tempExt,50); - lv_obj_set_flex_flow(cont_tempExt, LV_FLEX_FLOW_ROW); - lv_obj_t *lblExt = lv_label_create(cont_tempExt); - lv_label_set_text(lblExt, "ext."); - lv_obj_t *lblTempExt = lv_label_create(cont_tempExt); - lv_obj_add_style(lblTempExt, &style_lbvValue, 0); - lv_label_set_text(lblTempExt, ""); - lv_label_bind_text(lblTempExt, &tempExtSubj, "%s °C"); + /*Create a container with COLUMN flex direction*/ + lv_obj_t *cont_col2 = lv_obj_create(lv_screen_active()); + lv_obj_set_style_pad_all(cont_col2, 5, 0); + lv_obj_set_flex_align(cont_col2, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - /*Create a container with COLUMN flex direction*/ - lv_obj_t *cont_tempInt = lv_obj_create(cont_col); - lv_obj_add_style(cont_tempInt, &style_container, 0); - // lv_obj_set_height(cont_tempInt,50); - lv_obj_set_flex_flow(cont_tempInt, LV_FLEX_FLOW_ROW); - lv_obj_t *lblInt = lv_label_create(cont_tempInt); - lv_label_set_text(lblInt, "int."); - lv_obj_t *lblTempInt = lv_label_create(cont_tempInt); - lv_obj_add_style(lblTempInt, &style_lbvValue, 0); - lv_label_set_text(lblTempInt, ""); - lv_label_bind_text(lblTempInt, &tempIntSubj, "%s °C"); + /*Create a container with COLUMN flex direction*/ + lv_obj_t *cont_col3 = lv_obj_create(lv_screen_active()); + lv_obj_set_style_pad_all(cont_col3, 5, 0); + lv_obj_set_size(cont_col3, 300, 480); + lv_obj_set_flex_flow(cont_col3, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(cont_col3, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - /*Create a container with COLUMN flex direction*/ - lv_obj_t *cont_Cuve = lv_obj_create(cont_col); - lv_obj_add_style(cont_Cuve, &style_container, 0); - lv_obj_set_flex_flow(cont_Cuve, LV_FLEX_FLOW_ROW_WRAP); - // lv_obj_set_height(cont_Cuve,80); + lv_obj_set_height(cont_col2, 480); + lv_obj_set_width(cont_col2, LV_SIZE_CONTENT); + lv_obj_align_to(cont_col2, cont_col, LV_ALIGN_OUT_TOP_RIGHT, 0, 0); + lv_obj_set_flex_flow(cont_col2, LV_FLEX_FLOW_COLUMN); - lv_obj_t *lblHauteurEau = lv_label_create(cont_Cuve); - lv_label_set_text(lblHauteurEau, "Cuve: "); - lv_obj_t *lblHauteurCuve = lv_label_create(cont_Cuve); - lv_obj_add_style(lblHauteurCuve, &style_lbvValue, 0); - lv_label_bind_text(lblHauteurCuve, &hauteurCuveSubj, "%s cm"); + lv_obj_t *label1 = lv_label_create(cont_col); + lv_obj_set_style_text_font(label1, &montserrat_medium_18,0); + lv_label_set_text(label1, "Températures"); + lv_obj_set_pos(label1, 0, 0); - lv_obj_t *btnUp = lv_button_create(cont_col2); - lv_obj_add_style(btnUp, &style_btn, 0); - lv_obj_add_event_cb(btnUp, event_handler, LV_EVENT_ALL, upEvent); - lv_obj_align(btnUp, LV_ALIGN_CENTER, 0, -40); - lv_obj_remove_flag(btnUp, LV_OBJ_FLAG_PRESS_LOCK); - lv_obj_t *label = lv_label_create(btnUp); - lv_obj_add_style(label, &style_lbvValue, 0); - lv_label_set_text(label, LV_SYMBOL_UP); - lv_obj_center(label); + /*Create a container with COLUMN flex direction*/ + lv_obj_t *cont_tempExt = lv_obj_create(cont_col); + lv_obj_add_style(cont_tempExt, &style_container, 0); + // lv_obj_set_height(cont_tempExt,50); + lv_obj_set_flex_flow(cont_tempExt, LV_FLEX_FLOW_ROW); + lv_obj_t *lblExt = lv_label_create(cont_tempExt); + lv_label_set_text(lblExt, "ext."); + lv_obj_t *lblTempExt = lv_label_create(cont_tempExt); + lv_obj_add_style(lblTempExt, &style_lbvValue, 0); + lv_label_set_text(lblTempExt, ""); + lv_label_bind_text(lblTempExt, &tempExtSubj, "%s °C"); - lv_obj_t *btnDwn = lv_button_create(cont_col2); - lv_obj_add_style(btnDwn, &style_btn, 0); - lv_obj_add_event_cb(btnDwn, event_handler, LV_EVENT_ALL, downEvent); - lv_obj_align(btnDwn, LV_ALIGN_CENTER, 0, -40); - lv_obj_remove_flag(btnDwn, LV_OBJ_FLAG_PRESS_LOCK); - label = lv_label_create(btnDwn); - lv_obj_add_style(label, &style_lbvValue, 0); - lv_label_set_text(label, LV_SYMBOL_DOWN); - lv_obj_center(label); + /*Create a container with COLUMN flex direction*/ + lv_obj_t *cont_tempInt = lv_obj_create(cont_col); + lv_obj_add_style(cont_tempInt, &style_container, 0); + // lv_obj_set_height(cont_tempInt,50); + lv_obj_set_flex_flow(cont_tempInt, LV_FLEX_FLOW_ROW); + lv_obj_t *lblInt = lv_label_create(cont_tempInt); + lv_label_set_text(lblInt, "int."); + lv_obj_t *lblTempInt = lv_label_create(cont_tempInt); + lv_obj_add_style(lblTempInt, &style_lbvValue, 0); + lv_label_set_text(lblTempInt, ""); + lv_label_bind_text(lblTempInt, &tempIntSubj, "%s °C"); - /*Create a chart*/ - chart = lv_chart_create(lv_screen_active()); - lv_obj_set_size(chart, 200, 200); - lv_chart_set_type(chart, LV_CHART_TYPE_LINE); /*Show lines and points too*/ - lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, 0, 130); - ser1 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);; - ser1->y_points[0] = lv_rand(0, 40); - ser1->y_points[1] = lv_rand(0, 40); - ser1->y_points[2] = lv_rand(0, 40); + /*Create a container with COLUMN flex direction*/ + lv_obj_t *cont_Cuve = lv_obj_create(cont_col); + lv_obj_add_style(cont_Cuve, &style_container, 0); + lv_obj_set_flex_flow(cont_Cuve, LV_FLEX_FLOW_ROW_WRAP); + // lv_obj_set_height(cont_Cuve,80); - lv_chart_refresh(chart); /*Required after direct set*/ + lv_obj_t *lblHauteurEau = lv_label_create(cont_Cuve); + lv_label_set_text(lblHauteurEau, "Cuve: "); + lv_obj_t *lblHauteurCuve = lv_label_create(cont_Cuve); + lv_obj_add_style(lblHauteurCuve, &style_lbvValue, 0); + lv_label_bind_text(lblHauteurCuve, &hauteurCuveSubj, "%s cm"); + lv_obj_t *btnUp = lv_button_create(cont_col2); + lv_obj_add_style(btnUp, &style_btn, 0); + lv_obj_add_event_cb(btnUp, event_handler, LV_EVENT_ALL, upEvent); + lv_obj_align(btnUp, LV_ALIGN_CENTER, 0, -40); + lv_obj_remove_flag(btnUp, LV_OBJ_FLAG_PRESS_LOCK); + lv_obj_t *label = lv_label_create(btnUp); + lv_obj_add_style(label, &style_lbvValue, 0); + lv_label_set_text(label, LV_SYMBOL_UP); + lv_obj_center(label); + + lv_obj_t *btnDwn = lv_button_create(cont_col2); + lv_obj_add_style(btnDwn, &style_btn, 0); + lv_obj_add_event_cb(btnDwn, event_handler, LV_EVENT_ALL, downEvent); + lv_obj_align(btnDwn, LV_ALIGN_CENTER, 0, -40); + lv_obj_remove_flag(btnDwn, LV_OBJ_FLAG_PRESS_LOCK); + label = lv_label_create(btnDwn); + lv_obj_add_style(label, &style_lbvValue, 0); + lv_label_set_text(label, LV_SYMBOL_DOWN); + lv_obj_center(label); + + /*Create a chart*/ + /* + chart = lv_chart_create(lv_screen_active()); + lv_obj_set_size(chart, 200, 200); + lv_chart_set_type(chart, LV_CHART_TYPE_LINE); //Show lines and points too + lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, 0, 130); + ser1 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);; + ser1->y_points[0] = lv_rand(0, 40); + ser1->y_points[1] = lv_rand(0, 40); + ser1->y_points[2] = lv_rand(0, 40); + lv_chart_refresh(chart); //Required after direct set + */ + /* + lv_obj_t *tempD1Cont = lv_obj_create(cont_col3); + lv_obj_add_style(tempD1Cont, &style_container, 0); + lv_obj_t *tempD1 = lv_label_create(tempD1Cont); + lv_obj_add_style(tempD1, &style_lbvValue, 0); + lv_label_bind_text(tempD1, &tempD1Subj, "%i"); + lv_subject_add_observer_obj(&tempD1Subj, weatherdata_obs_cb, tempD1, NULL); + lv_obj_t *tempD2Cont = lv_obj_create(cont_col3); + lv_obj_add_style(tempD2Cont, &style_container, 0); + lv_obj_t *tempD2 = lv_label_create(tempD2Cont); + lv_obj_add_style(tempD2, &style_lbvValue, 0); + lv_label_bind_text(tempD2, &tempD2Subj, "%i"); + lv_subject_add_observer_obj(&tempD2Subj, weatherdata_obs_cb, tempD2, NULL); + + lv_obj_t *tempD3Cont = lv_obj_create(cont_col3); + lv_obj_add_style(tempD3Cont, &style_container, 0); + lv_obj_t *tempD3 = lv_label_create(tempD3Cont); + lv_obj_add_style(tempD3, &style_lbvValue, 0); + lv_label_bind_text(tempD3, &tempD3Subj, "%i"); + lv_subject_add_observer_obj(&tempD3Subj, weatherdata_obs_cb, tempD3, NULL); + */ + lv_fragment_manager_t *manager = lv_fragment_manager_create(NULL); + + lv_fragment_t *fragment = lv_fragment_create(&sample_cls, 0); + lv_fragment_manager_add(manager, fragment, &cont_col3); + + fragment = lv_fragment_create(&sample_cls, 1); + lv_fragment_manager_add(manager, fragment, &cont_col3); + + fragment = lv_fragment_create(&sample_cls, 2); + lv_fragment_manager_add(manager, fragment, &cont_col3); } /* The examples use WiFi configuration that you can set via project configuration menu @@ -481,9 +671,9 @@ void draw_ihm() If you'd rather not, just change the below entries to strings with the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" */ -#define EXAMPLE_ESP_WIFI_SSID "wifimms3" -#define EXAMPLE_ESP_WIFI_PASS "mmswifi0611" -#define EXAMPLE_ESP_MAXIMUM_RETRY 5 +#define EXAMPLE_ESP_WIFI_SSID "wifimms3" +#define EXAMPLE_ESP_WIFI_PASS "mmswifi0611" +#define EXAMPLE_ESP_MAXIMUM_RETRY 5 #if CONFIG_ESP_WPA3_SAE_PWE_HUNT_AND_PECK #define ESP_WIFI_SAE_MODE WPA3_SAE_PWE_HUNT_AND_PECK @@ -520,26 +710,34 @@ static EventGroupHandle_t s_wifi_event_group; * - we are connected to the AP with an IP * - we failed to connect after the maximum amount of retries */ #define WIFI_CONNECTED_BIT BIT0 -#define WIFI_FAIL_BIT BIT1 +#define WIFI_FAIL_BIT BIT1 static int s_retry_num = 0; -static void wifi_event_handler(void* arg, esp_event_base_t event_base, - int32_t event_id, void* event_data) +static void wifi_event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) { - if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { esp_wifi_connect(); - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { - if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { + } + else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) + { esp_wifi_connect(); s_retry_num++; ESP_LOGI(TAG, "retry to connect to the AP"); - } else { + } + else + { xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); } - ESP_LOGI(TAG,"connect to the AP fail"); - } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { - ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; + ESP_LOGI(TAG, "connect to the AP fail"); + } + else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data; ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); s_retry_num = 0; xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); @@ -584,56 +782,67 @@ void wifi_init_sta(void) .sae_h2e_identifier = EXAMPLE_H2E_IDENTIFIER, }, }; - ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) ); - ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) ); - ESP_ERROR_CHECK(esp_wifi_start() ); + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); ESP_LOGI(TAG, "wifi_init_sta finished."); /* 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(s_wifi_event_group, - WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, - pdFALSE, - pdFALSE, - portMAX_DELAY); + WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, + pdFALSE, + pdFALSE, + portMAX_DELAY); /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually * happened. */ - if (bits & WIFI_CONNECTED_BIT) { + if (bits & WIFI_CONNECTED_BIT) + { ESP_LOGI(TAG, "connected to ap SSID:%s password:%s", EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS); - } else if (bits & WIFI_FAIL_BIT) { + } + else if (bits & WIFI_FAIL_BIT) + { ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s", EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS); - } else { + } + else + { ESP_LOGE(TAG, "UNEXPECTED EVENT"); } } static void log_error_if_nonzero(const char *message, int error_code) { - if (error_code != 0) { + if (error_code != 0) + { ESP_LOGE(TAG, "Last error %s: 0x%x", message, error_code); } } -void splitIt(char * payload, unsigned int length, int * datas){ - char *sep=","; +void splitIt(char *payload, unsigned int length, float *datas) +{ + char *sep = ","; char *token; char *saveptr1; token = strtok_r(payload, sep, &saveptr1); - datas[0]=atoi(token); + datas[0] = atoff(token); + ESP_LOGE(TAG,"%f",datas[0]); token = strtok_r(NULL, sep, &saveptr1); - datas[1]=atoi(token); + datas[1] = atoff(token); + ESP_LOGE(TAG,"%f",datas[1]); token = strtok_r(NULL, sep, &saveptr1); - datas[2]=atoi(token); + datas[2] = atoff(token); + ESP_LOGE(TAG,"%f",datas[2]); token = strtok_r(NULL, sep, &saveptr1); - datas[3]=atoi(token); + datas[3] = atoff(token); + ESP_LOGE(TAG,"%f",datas[3]); } /* @@ -652,7 +861,8 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ esp_mqtt_event_handle_t event = event_data; esp_mqtt_client_handle_t client = event->client; int msg_id; - switch ((esp_mqtt_event_id_t)event_id) { + switch ((esp_mqtt_event_id_t)event_id) + { case MQTT_EVENT_CONNECTED: ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "data_3", 0, 1, 0); @@ -695,46 +905,56 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ ESP_LOGI(TAG, "MQTT_EVENT_DATA"); printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); printf("DATA=%.*s\r\n", event->data_len, event->data); - if(strncmp(event->topic, topicTempExt,27)==0){ + if (strncmp(event->topic, topicTempExt, 27) == 0) + { lvgl_port_lock(0); lv_subject_copy_string(&tempExtSubj, event->data); lvgl_port_unlock(); - }else if(strncmp(event->topic, topicTempInt,27)==0){ + } + else if (strncmp(event->topic, topicTempInt, 27) == 0) + { lvgl_port_lock(0); lv_subject_copy_string(&tempIntSubj, event->data); lvgl_port_unlock(); - }else if(strncmp(event->topic, topicHauteurCuveEvol,22)==0){ - int datas[4] ={}; + } + else if (strncmp(event->topic, topicHauteurCuveEvol, 22) == 0) + { + /* float datas[4] = {}; splitIt(event->data, event->data_len, datas); - ser1->y_points[0]=130-datas[0]; - ser1->y_points[1]=130-datas[1]; - ser1->y_points[2]=130-datas[2]; - ser1->y_points[3]=130-datas[3]; + ser1->y_points[0] = 130 - (int)datas[0]; + ser1->y_points[1] = 130 - (int)datas[1]; + ser1->y_points[2] = 130 - (int)datas[2]; + ser1->y_points[3] = 130 - (int)datas[3]; lvgl_port_lock(0); lv_chart_refresh(chart); lvgl_port_unlock(); + */ - //lv_subject_copy_string(&hauteurCuveEvolSubj, event->data); - }else if(strncmp(event->topic, topicHauteurCuve,18)==0){ + // lv_subject_copy_string(&hauteurCuveEvolSubj, event->data); + } + else if (strncmp(event->topic, topicHauteurCuve, 18) == 0) + { lvgl_port_lock(0); - char *datas=NULL; - datas = (char *) malloc( event->data_len * sizeof(char) ); + char *datas = NULL; + datas = (char *)malloc(event->data_len * sizeof(char)); stpncpy(datas, event->data, event->data_len); - datas[event->data_len]='\0'; + datas[event->data_len] = '\0'; lv_subject_copy_string(&hauteurCuveSubj, datas); lvgl_port_unlock(); - }else{ + } + else + { ESP_LOGE(TAG, "None match :-("); } break; case MQTT_EVENT_ERROR: ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); - if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) + { log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err); log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err); - log_error_if_nonzero("captured as transport's socket errno", event->error_handle->esp_transport_sock_errno); + log_error_if_nonzero("captured as transport's socket errno", event->error_handle->esp_transport_sock_errno); ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno)); - } break; default: @@ -747,19 +967,24 @@ static void mqtt_app_start(void) { esp_mqtt_client_config_t mqtt_cfg = { .broker.address.uri = "mqtt://192.168.0.10", - }; + .network.timeout_ms = 1000}; #if CONFIG_BROKER_URL_FROM_STDIN char line[128]; - if (strcmp(mqtt_cfg.broker.address.uri, "FROM_STDIN") == 0) { + if (strcmp(mqtt_cfg.broker.address.uri, "FROM_STDIN") == 0) + { int count = 0; printf("Please enter url of mqtt broker\n"); - while (count < 128) { + while (count < 128) + { int c = fgetc(stdin); - if (c == '\n') { + if (c == '\n') + { line[count] = '\0'; break; - } else if (c > 0 && c < 127) { + } + else if (c > 0 && c < 127) + { line[count] = c; ++count; } @@ -767,7 +992,9 @@ static void mqtt_app_start(void) } mqtt_cfg.broker.address.uri = line; printf("Broker url: %s\n", line); - } else { + } + else + { ESP_LOGE(TAG, "Configuration mismatch: wrong broker url"); abort(); } @@ -779,6 +1006,31 @@ static void mqtt_app_start(void) esp_mqtt_client_start(client); } +void weather_data_retreived(struct meteoforecast_data datas[3]) +{ + // struct meteoforecast_data* weather = (meteoforecast_data*) args; + struct meteoforecast_data j1 = {}; + ESP_LOGE(TAG, "debut debug"); + printf("%i\n", datas[0].datetime); + printf("%s\n", datas[0].previsions.desc); + printf("%f\n", datas[0].previsions.min); + printf("%i\n", datas[1].datetime); + printf("%s\n", datas[1].previsions.desc); + printf("%f\n", datas[1].previsions.min); + printf("%i\n", datas[2].datetime); + printf("%s\n", datas[2].previsions.desc); + printf("%f\n", datas[2].previsions.min); + ESP_LOGE(TAG, "fin debug"); + + if (lvgl_port_lock(0)) + { + lv_subject_set_pointer(&tempD1Subj, &datas[0]); + lv_subject_set_pointer(&tempD2Subj, &datas[1]); + lv_subject_set_pointer(&tempD3Subj, &datas[2]); + lvgl_port_unlock(); + } +} + void app_main(void) { /* LCD HW initialization */ @@ -790,11 +1042,12 @@ void app_main(void) /* LVGL initialization */ ESP_ERROR_CHECK(app_lvgl_init()); - //Initialize NVS + // Initialize NVS esp_err_t ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); @@ -806,10 +1059,13 @@ void app_main(void) wifi_init_sta(); mqtt_app_start(); + initialise_weather_data_retrieval(60000); + on_weather_data_retrieval(weather_data_retreived); + ESP_LOGW(TAG, "Weather data retrieval initialized"); /* Show LVGL objects */ lvgl_port_lock(0); - //app_main_display(); + // app_main_display(); draw_ihm(); lvgl_port_unlock(); } diff --git a/sdkconfig b/sdkconfig index 1c95757..7af350b 100644 --- a/sdkconfig +++ b/sdkconfig @@ -675,6 +675,14 @@ CONFIG_ESP_EVENT_POST_FROM_ISR=y CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y # end of Event Loop Library +# +# ESP HTTP client +# +# CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set +# end of ESP HTTP client + # # Hardware Settings # @@ -1464,9 +1472,21 @@ CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y # CONFIG_MQTT_MSG_ID_INCREMENTAL is not set # CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set # CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set -# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +CONFIG_MQTT_USE_CUSTOM_CONFIG=y +CONFIG_MQTT_TCP_DEFAULT_PORT=1883 +CONFIG_MQTT_SSL_DEFAULT_PORT=8883 +CONFIG_MQTT_WS_DEFAULT_PORT=80 +CONFIG_MQTT_WSS_DEFAULT_PORT=443 +CONFIG_MQTT_BUFFER_SIZE=1024 +CONFIG_MQTT_TASK_STACK_SIZE=6144 +# CONFIG_MQTT_DISABLE_API_LOCKS is not set +CONFIG_MQTT_TASK_PRIORITY=5 +CONFIG_MQTT_POLL_READ_TIMEOUT_MS=10000 +CONFIG_MQTT_EVENT_QUEUE_SIZE=1 # CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_OUTBOX_DATA_ON_EXTERNAL_MEMORY is not set # CONFIG_MQTT_CUSTOM_OUTBOX is not set +CONFIG_MQTT_OUTBOX_EXPIRED_TIMEOUT_MS=30000 # end of ESP-MQTT Configurations # @@ -1921,22 +1941,11 @@ CONFIG_LV_USE_GRID=y # Others # # CONFIG_LV_USE_SNAPSHOT is not set -CONFIG_LV_USE_SYSMON=y -CONFIG_LV_USE_PERF_MONITOR=y -# CONFIG_LV_PERF_MONITOR_ALIGN_TOP_LEFT is not set -# CONFIG_LV_PERF_MONITOR_ALIGN_TOP_MID is not set -# CONFIG_LV_PERF_MONITOR_ALIGN_TOP_RIGHT is not set -# CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_LEFT is not set -# CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_MID is not set -CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_RIGHT=y -# CONFIG_LV_PERF_MONITOR_ALIGN_LEFT_MID is not set -# CONFIG_LV_PERF_MONITOR_ALIGN_RIGHT_MID is not set -# CONFIG_LV_PERF_MONITOR_ALIGN_CENTER is not set -# CONFIG_LV_USE_PERF_MONITOR_LOG_MODE is not set +# CONFIG_LV_USE_SYSMON is not set # CONFIG_LV_USE_MONKEY is not set # CONFIG_LV_USE_PROFILER is not set # CONFIG_LV_USE_GRIDNAV is not set -# CONFIG_LV_USE_FRAGMENT is not set +CONFIG_LV_USE_FRAGMENT=y # CONFIG_LV_USE_IMGFONT is not set # CONFIG_LV_USE_IME_PINYIN is not set # CONFIG_LV_USE_FILE_EXPLORER is not set