Allow changing LVGL refresh and animation period

This commit is contained in:
Kuba Szczodrzyński 2024-02-10 12:11:37 +01:00
parent de0aeab435
commit 2738bff96a
No known key found for this signature in database
GPG Key ID: 43037AC62A600562
3 changed files with 37 additions and 0 deletions

View File

@ -90,6 +90,7 @@ const char FP_GUI_BACKLIGHTINVERT[] PROGMEM = "bcklinv";
const char FP_GUI_POINTER[] PROGMEM = "cursor"; const char FP_GUI_POINTER[] PROGMEM = "cursor";
const char FP_GUI_LONG_TIME[] PROGMEM = "long"; const char FP_GUI_LONG_TIME[] PROGMEM = "long";
const char FP_GUI_REPEAT_TIME[] PROGMEM = "repeat"; const char FP_GUI_REPEAT_TIME[] PROGMEM = "repeat";
const char FP_GUI_FPS[] PROGMEM = "fps";
const char FP_DEBUG_TELEPERIOD[] PROGMEM = "tele"; const char FP_DEBUG_TELEPERIOD[] PROGMEM = "tele";
const char FP_DEBUG_ANSI[] PROGMEM = "ansi"; const char FP_DEBUG_ANSI[] PROGMEM = "ansi";
const char FP_GPIO_CONFIG[] PROGMEM = "config"; const char FP_GPIO_CONFIG[] PROGMEM = "config";

View File

@ -57,6 +57,8 @@ uint32_t screenshotEtag = 0;
void (*drv_display_flush_cb)(struct _disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p); void (*drv_display_flush_cb)(struct _disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p);
static lv_disp_buf_t disp_buf; static lv_disp_buf_t disp_buf;
static bool gui_initialized = false;
static uint32_t anim_fps_deferred = 0;
static inline void gui_init_lvgl() static inline void gui_init_lvgl()
{ {
@ -100,6 +102,27 @@ void gui_hide_pointer(bool hidden)
if(cursor) lv_obj_set_hidden(cursor, hidden || !gui_settings.show_pointer); if(cursor) lv_obj_set_hidden(cursor, hidden || !gui_settings.show_pointer);
} }
bool gui_set_fps(uint32_t fps)
{
if(!gui_initialized) {
LOG_ERROR(TAG_GUI, F("GUI not initialized, deferring FPS setting"));
anim_fps_deferred = fps;
return false;
}
bool changed = false;
uint32_t period = 1000 / fps;
// find animation task by its period
lv_task_t* task = NULL;
while(task = lv_task_get_next(task)) {
if(!(task->period == LV_DISP_DEF_REFR_PERIOD)) continue;
changed |= (task->period != period);
LOG_INFO(TAG_GUI, F("Changing animation period: %u -> %u (%u FPS)"), task->period, period, fps);
task->period = period;
}
return changed;
}
IRAM_ATTR void gui_flush_cb(lv_disp_drv_t* disp, const lv_area_t* area, lv_color_t* color_p) IRAM_ATTR void gui_flush_cb(lv_disp_drv_t* disp, const lv_area_t* area, lv_color_t* color_p)
{ {
haspTft.flush_pixels(disp, area, color_p); haspTft.flush_pixels(disp, area, color_p);
@ -373,6 +396,13 @@ void guiSetup()
} }
#endif // ESP32 && HASP_USE_ESP_MQTT #endif // ESP32 && HASP_USE_ESP_MQTT
// apply deferred FPS setting
gui_initialized = true;
if(anim_fps_deferred != 0) {
gui_set_fps(anim_fps_deferred);
anim_fps_deferred = 0;
}
LOG_INFO(TAG_LVGL, F(D_SERVICE_STARTED)); LOG_INFO(TAG_LVGL, F(D_SERVICE_STARTED));
} }
@ -612,6 +642,11 @@ bool guiSetConfig(const JsonObject& settings)
changed |= status; changed |= status;
} }
if(!settings[FPSTR(FP_GUI_FPS)].isNull()) {
uint32_t fps = settings[FPSTR(FP_GUI_FPS)].as<uint32_t>();
changed |= gui_set_fps(fps);
}
return changed; return changed;
} }
#endif // HASP_USE_CONFIG #endif // HASP_USE_CONFIG

View File

@ -48,6 +48,7 @@ void guiEverySecond(void);
void guiStart(void); void guiStart(void);
void guiStop(void); void guiStop(void);
void gui_hide_pointer(bool hidden); void gui_hide_pointer(bool hidden);
bool gui_set_fps(uint32_t fps);
/* ===== Special Event Processors ===== */ /* ===== Special Event Processors ===== */
void guiCalibrate(void); void guiCalibrate(void);