diff --git a/src/hasp/hasp.cpp b/src/hasp/hasp.cpp index 63beb2e3..05598966 100644 --- a/src/hasp/hasp.cpp +++ b/src/hasp/hasp.cpp @@ -608,9 +608,10 @@ IRAM_ATTR void haspLoop(void) dispatchLoop(); } +// Replaces all pages with new ones void hasp_init(void) { - haspPages.init(haspStartPage); + haspPages.init(haspStartPage); // StartPage is used for the BACK action } void hasp_load_json(void) diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index abb238d7..07cad76d 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -820,7 +820,9 @@ void dispatch_clear_page(const char*, const char* page, uint8_t source) uint8_t pageid; if(strlen(page) > 0) { if(!strcasecmp_P(page, PSTR("all"))) { - for(pageid = 0; pageid < HASP_NUM_PAGES; pageid++) haspPages.clear(pageid); + // for(pageid = 0; pageid < HASP_NUM_PAGES; pageid++) haspPages.clear(pageid); + hasp_init(); + font_clear_list(); // free TTF resources } else { pageid = atoi(page); } diff --git a/src/hasp/hasp_font.cpp b/src/hasp/hasp_font.cpp index 929d493c..56a02f20 100644 --- a/src/hasp/hasp_font.cpp +++ b/src/hasp/hasp_font.cpp @@ -20,13 +20,34 @@ static lv_ll_t hasp_fonts_ll; typedef struct { - const char* payload; /* The payload with name and size */ - lv_font_t* font; /* point to lvgl font */ + char* payload; /* The payload with name and size */ + lv_font_t* font; /* point to lvgl font */ } hasp_font_info_t; void font_setup() { _lv_ll_init(&hasp_fonts_ll, sizeof(hasp_font_info_t)); + + // initialize the FreeType renderer +// #ifdef 1 || USE_LVGL_FREETYPE +#if defined(ARDUINO_ARCH_ESP32) + +#if(HASP_USE_FREETYPE > 0) + + if(lv_freetype_init(USE_LVGL_FREETYPE_MAX_FACES, USE_LVGL_FREETYPE_MAX_SIZES, + hasp_use_psram() ? USE_LVGL_FREETYPE_MAX_BYTES_PSRAM : USE_LVGL_FREETYPE_MAX_BYTES)) { + LOG_VERBOSE(TAG_FONT, F("FreeType v%d.%d.%d " D_SERVICE_STARTED), FREETYPE_MAJOR, FREETYPE_MINOR, + FREETYPE_PATCH); + } else { + LOG_ERROR(TAG_FONT, F("FreeType " D_SERVICE_START_FAILED)); + } +#else + LOG_VERBOSE(TAG_FONT, F("FreeType " D_SERVICE_DISABLED)); +#endif + +#elif defined(WINDOWS) || defined(POSIX) +#else +#endif } size_t font_split_payload(const char* payload) @@ -39,12 +60,38 @@ size_t font_split_payload(const char* payload) return 0; } +void font_clear_list() +{ + if(_lv_ll_is_empty(&hasp_fonts_ll)) return; + + void* node = _lv_ll_get_head(&hasp_fonts_ll); + while(node) { + + if(hasp_font_info_t* font_p = (hasp_font_info_t*)node) { + if(font_p->font) { + if(font_p->font->user_data) { // It's a FreeType font + lv_ft_font_destroy(font_p->font); + } else { // It's a binary font + hasp_font_free(font_p->font); + } + } + + /* Free the allocated font_name last */ + hasp_free(font_p->payload); + } + + _lv_ll_remove(&hasp_fonts_ll, node); + lv_mem_free(node); + node = _lv_ll_get_head(&hasp_fonts_ll); + } +} + static lv_font_t* font_find_in_list(const char* payload) { hasp_font_info_t* font_p = (hasp_font_info_t*)_lv_ll_get_head(&hasp_fonts_ll); while(font_p) { if(strcmp(font_p->payload, payload) == 0) { // name and size - LOG_WARNING(TAG_FONT, F("Payload %s found => line height = %d"), payload, font_p->font->line_height); + // LOG_DEBUG(TAG_FONT, F("Payload %s found => line height = %d"), payload, font_p->font->line_height); return font_p->font; } font_p = (hasp_font_info_t*)_lv_ll_get_next(&hasp_fonts_ll, font_p); @@ -105,7 +152,7 @@ static lv_font_t* font_add_to_list(const char* payload) /* alloc payload str */ size_t len = strlen(payload); - name_p = (char*)calloc(sizeof(char), len + 1); + name_p = (char*)hasp_calloc(sizeof(char), len + 1); if(!name_p) return NULL; strncpy(name_p, payload, len); diff --git a/src/hasp/hasp_font.h b/src/hasp/hasp_font.h index 350d4f76..7689f2aa 100644 --- a/src/hasp/hasp_font.h +++ b/src/hasp/hasp_font.h @@ -6,5 +6,6 @@ void font_setup(); lv_font_t* get_font(const char* payload); +void font_clear_list(); #endif \ No newline at end of file diff --git a/src/hasp/hasp_mem.cpp b/src/hasp/hasp_mem.cpp index c9302076..51942271 100644 --- a/src/hasp/hasp_mem.cpp +++ b/src/hasp/hasp_mem.cpp @@ -13,6 +13,15 @@ bool hasp_use_psram() } #endif +void* hasp_calloc(size_t num, size_t size) +{ +#ifdef ESP32 + return hasp_use_psram() ? ps_calloc(num, size) : calloc(num, size); +#else + return calloc(num, size); +#endif +} + void* hasp_malloc(size_t size) { #ifdef ESP32 diff --git a/src/hasp_gui.cpp b/src/hasp_gui.cpp index 7fb9ccc4..306c140b 100644 --- a/src/hasp_gui.cpp +++ b/src/hasp_gui.cpp @@ -231,30 +231,6 @@ static inline void gui_init_images() #endif } -// initialize the FreeType renderer -static inline void gui_init_freetype() -{ -// #ifdef 1 || USE_LVGL_FREETYPE -#if defined(ARDUINO_ARCH_ESP32) - -#if(HASP_USE_FREETYPE > 0) - - if(lv_freetype_init(USE_LVGL_FREETYPE_MAX_FACES, USE_LVGL_FREETYPE_MAX_SIZES, - hasp_use_psram() ? USE_LVGL_FREETYPE_MAX_BYTES_PSRAM : USE_LVGL_FREETYPE_MAX_BYTES)) { - LOG_VERBOSE(TAG_FONT, F("FreeType v%d.%d.%d " D_SERVICE_STARTED), FREETYPE_MAJOR, FREETYPE_MINOR, - FREETYPE_PATCH); - } else { - LOG_ERROR(TAG_FONT, F("FreeType " D_SERVICE_START_FAILED)); - } -#else - LOG_VERBOSE(TAG_FONT, F("FreeType " D_SERVICE_DISABLED)); -#endif - -#elif defined(WINDOWS) || defined(POSIX) -#else -#endif -} - static inline void gui_init_filesystems() { #if LV_USE_FS_IF != 0 @@ -289,7 +265,6 @@ void guiSetup() gui_init_lvgl(); gui_init_images(); gui_init_filesystems(); - gui_init_freetype(); font_setup(); /* Initialize the LVGL display driver with correct orientation */