|
|
|
@ -48,12 +48,25 @@ |
|
|
|
|
namespace ui { |
|
|
|
|
|
|
|
|
|
static const char* kTag = "lv_task"; |
|
|
|
|
static const TickType_t kMaxFrameRate = pdMS_TO_TICKS(33); |
|
|
|
|
|
|
|
|
|
static int sTimerId; |
|
|
|
|
static SemaphoreHandle_t sFrameSemaphore; |
|
|
|
|
|
|
|
|
|
auto next_frame(TimerHandle_t) { |
|
|
|
|
xSemaphoreGive(sFrameSemaphore); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void LvglMain(std::weak_ptr<drivers::RelativeWheel> weak_touch_wheel, |
|
|
|
|
std::weak_ptr<drivers::Display> weak_display) { |
|
|
|
|
ESP_LOGI(kTag, "init lvgl"); |
|
|
|
|
lv_init(); |
|
|
|
|
|
|
|
|
|
sFrameSemaphore = xSemaphoreCreateBinary(); |
|
|
|
|
auto timer = |
|
|
|
|
xTimerCreate("lvgl_frame", kMaxFrameRate, pdTRUE, &sTimerId, next_frame); |
|
|
|
|
xTimerStart(timer, portMAX_DELAY); |
|
|
|
|
|
|
|
|
|
lv_theme_t* base_theme = lv_theme_basic_init(NULL); |
|
|
|
|
lv_disp_set_theme(NULL, base_theme); |
|
|
|
|
static themes::Theme sTheme{}; |
|
|
|
@ -80,9 +93,9 @@ void LvglMain(std::weak_ptr<drivers::RelativeWheel> weak_touch_wheel, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
lv_task_handler(); |
|
|
|
|
// 30 FPS
|
|
|
|
|
// TODO(jacqueline): make this dynamic
|
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(33)); |
|
|
|
|
|
|
|
|
|
// Wait for the signal to loop again.
|
|
|
|
|
xSemaphoreTake(sFrameSemaphore, portMAX_DELAY); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|