feat(disp) allow decouplig the disp_refr timer

With this change after an lv_timer_del(disp->refr_timer); disp->refr_timer = NULL;
the user can call _lv_disp_refr_timer(NULL); anywhere to sync rendering with VSYNC or the TE signal.

lv_timer_handler() and _lv_disp_refr_timer() can not run at the same time.
This commit is contained in:
Gabor Kiss-Vamosi
2021-11-12 20:00:51 +01:00
parent 25c2f53a67
commit 85cc84ad94
3 changed files with 17 additions and 13 deletions

View File

@@ -292,7 +292,7 @@ void lv_obj_mark_layout_as_dirty(lv_obj_t * obj)
/*Make the display refreshing*/
lv_disp_t * disp = lv_obj_get_disp(scr);
lv_timer_resume(disp->refr_timer);
if(disp->refr_timer) lv_timer_resume(disp->refr_timer);
}
void lv_obj_update_layout(const lv_obj_t * obj)

View File

@@ -86,13 +86,13 @@ void lv_refr_now(lv_disp_t * disp)
lv_anim_refr_now();
if(disp) {
_lv_disp_refr_timer(disp->refr_timer);
if(disp->refr_timer) _lv_disp_refr_timer(disp->refr_timer);
}
else {
lv_disp_t * d;
d = lv_disp_get_next(NULL);
while(d) {
_lv_disp_refr_timer(d->refr_timer);
if(d->refr_timer) _lv_disp_refr_timer(d->refr_timer);
d = lv_disp_get_next(d);
}
}
@@ -131,7 +131,7 @@ void _lv_inv_area(lv_disp_t * disp, const lv_area_t * area_p)
if(disp->driver->full_refresh) {
disp->inv_areas[0] = scr_area;
disp->inv_p = 1;
lv_timer_resume(disp->refr_timer);
if(disp->refr_timer) lv_timer_resume(disp->refr_timer);
return;
}
@@ -152,7 +152,7 @@ void _lv_inv_area(lv_disp_t * disp, const lv_area_t * area_p)
lv_area_copy(&disp->inv_areas[disp->inv_p], &scr_area);
}
disp->inv_p++;
lv_timer_resume(disp->refr_timer);
if(disp->refr_timer) lv_timer_resume(disp->refr_timer);
}
/**
@@ -186,15 +186,19 @@ void _lv_disp_refr_timer(lv_timer_t * tmr)
uint32_t start = lv_tick_get();
volatile uint32_t elaps = 0;
disp_refr = tmr->user_data;
if(tmr) {
disp_refr = tmr->user_data;
#if LV_USE_PERF_MONITOR == 0 && LV_USE_MEM_MONITOR == 0
/**
* Ensure the timer does not run again automatically.
* This is done before refreshing in case refreshing invalidates something else.
*/
lv_timer_pause(tmr);
/**
* Ensure the timer does not run again automatically.
* This is done before refreshing in case refreshing invalidates something else.
*/
lv_timer_pause(tmr);
#endif
}
else {
disp_refr = lv_disp_get_default();
}
/*Refresh the screen's layout if required*/
lv_obj_update_layout(disp_refr->act_scr);

View File

@@ -259,7 +259,7 @@ void lv_disp_remove(lv_disp_t * disp)
}
_lv_ll_remove(&LV_GC_ROOT(_lv_disp_ll), disp);
lv_timer_del(disp->refr_timer);
if(disp->refr_timer) lv_timer_del(disp->refr_timer);
lv_mem_free(disp);
if(was_default) lv_disp_set_default(_lv_ll_get_head(&LV_GC_ROOT(_lv_disp_ll)));