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:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)));
|
||||
|
||||
Reference in New Issue
Block a user