Improve framebufferdisplay.refresh()
Now the defaults make it easy to refresh when you want. It matches the displayio.Display().refresh() behavior.
This commit is contained in:
parent
4d2bc35d40
commit
807edd4c66
|
@ -100,29 +100,38 @@ static framebufferio_framebufferdisplay_obj_t *native_display(mp_obj_t display_o
|
||||||
}
|
}
|
||||||
|
|
||||||
//| def refresh(
|
//| def refresh(
|
||||||
//| self, *, target_frames_per_second: int = 60, minimum_frames_per_second: int = 1
|
//| self,
|
||||||
|
//| *,
|
||||||
|
//| target_frames_per_second: Optional[int] = None,
|
||||||
|
//| minimum_frames_per_second: int = 0
|
||||||
//| ) -> bool:
|
//| ) -> bool:
|
||||||
//| """When auto refresh is off, waits for the target frame rate and then refreshes the display,
|
//| """When auto_refresh is off, and :py:attr:`target_frames_per_second` is not `None` this waits
|
||||||
//| returning True. If the call has taken too long since the last refresh call for the given
|
//| for the target frame rate and then refreshes the display,
|
||||||
//| target frame rate, then the refresh returns False immediately without updating the screen to
|
//| returning `True`. If the call has taken too long since the last refresh call for the given
|
||||||
|
//| target frame rate, then the refresh returns `False` immediately without updating the screen to
|
||||||
//| hopefully help getting caught up.
|
//| hopefully help getting caught up.
|
||||||
//|
|
//|
|
||||||
//| If the time since the last successful refresh is below the minimum frame rate, then an
|
//| If the time since the last successful refresh is below the minimum frame rate, then an
|
||||||
//| exception will be raised. Set minimum_frames_per_second to 0 to disable.
|
//| exception will be raised. The default :py:attr:`minimum_frames_per_second` of 0 disables this behavior.
|
||||||
//|
|
//|
|
||||||
//| When auto refresh is on, updates the display immediately. (The display will also update
|
//| When auto_refresh is off, and :py:attr:`target_frames_per_second` is `None` this
|
||||||
|
//| will update the display immediately.
|
||||||
|
//|
|
||||||
|
//| When auto_refresh is on, updates the display immediately. (The display will also update
|
||||||
//| without calls to this.)
|
//| without calls to this.)
|
||||||
//|
|
//|
|
||||||
//| :param int target_frames_per_second: How many times a second `refresh` should be called and the screen updated.
|
//| :param Optional[int] target_frames_per_second: The target frame rate that :py:func:`refresh` should try to
|
||||||
|
//| achieve. Set to `None` for immediate refresh.
|
||||||
//| :param int minimum_frames_per_second: The minimum number of times the screen should be updated per second.
|
//| :param int minimum_frames_per_second: The minimum number of times the screen should be updated per second.
|
||||||
//| """
|
//| """
|
||||||
//| ...
|
//| ...
|
||||||
STATIC mp_obj_t framebufferio_framebufferdisplay_obj_refresh(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
STATIC mp_obj_t framebufferio_framebufferdisplay_obj_refresh(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
enum { ARG_target_frames_per_second, ARG_minimum_frames_per_second };
|
enum { ARG_target_frames_per_second, ARG_minimum_frames_per_second };
|
||||||
static const mp_arg_t allowed_args[] = {
|
static const mp_arg_t allowed_args[] = {
|
||||||
{ MP_QSTR_target_frames_per_second, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 60} },
|
{ MP_QSTR_target_frames_per_second, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} },
|
||||||
{ MP_QSTR_minimum_frames_per_second, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1} },
|
{ MP_QSTR_minimum_frames_per_second, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
|
||||||
};
|
};
|
||||||
|
|
||||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
|
@ -132,7 +141,14 @@ STATIC mp_obj_t framebufferio_framebufferdisplay_obj_refresh(size_t n_args, cons
|
||||||
if (minimum_frames_per_second > 0) {
|
if (minimum_frames_per_second > 0) {
|
||||||
maximum_ms_per_real_frame = 1000 / minimum_frames_per_second;
|
maximum_ms_per_real_frame = 1000 / minimum_frames_per_second;
|
||||||
}
|
}
|
||||||
return mp_obj_new_bool(common_hal_framebufferio_framebufferdisplay_refresh(self, 1000 / args[ARG_target_frames_per_second].u_int, maximum_ms_per_real_frame));
|
|
||||||
|
uint32_t target_ms_per_frame;
|
||||||
|
if (args[ARG_target_frames_per_second].u_obj == mp_const_none) {
|
||||||
|
target_ms_per_frame = 0xffffffff;
|
||||||
|
} else {
|
||||||
|
target_ms_per_frame = 1000 / mp_obj_get_int(args[ARG_target_frames_per_second].u_obj);
|
||||||
|
}
|
||||||
|
return mp_obj_new_bool(common_hal_framebufferio_framebufferdisplay_refresh(self, target_ms_per_frame, maximum_ms_per_real_frame));
|
||||||
}
|
}
|
||||||
MP_DEFINE_CONST_FUN_OBJ_KW(framebufferio_framebufferdisplay_refresh_obj, 1, framebufferio_framebufferdisplay_obj_refresh);
|
MP_DEFINE_CONST_FUN_OBJ_KW(framebufferio_framebufferdisplay_refresh_obj, 1, framebufferio_framebufferdisplay_obj_refresh);
|
||||||
|
|
||||||
|
|
|
@ -283,7 +283,7 @@ uint16_t common_hal_framebufferio_framebufferdisplay_get_rotation(framebufferio_
|
||||||
|
|
||||||
|
|
||||||
bool common_hal_framebufferio_framebufferdisplay_refresh(framebufferio_framebufferdisplay_obj_t *self, uint32_t target_ms_per_frame, uint32_t maximum_ms_per_real_frame) {
|
bool common_hal_framebufferio_framebufferdisplay_refresh(framebufferio_framebufferdisplay_obj_t *self, uint32_t target_ms_per_frame, uint32_t maximum_ms_per_real_frame) {
|
||||||
if (!self->auto_refresh && !self->first_manual_refresh) {
|
if (!self->auto_refresh && !self->first_manual_refresh && (target_ms_per_frame != 0xffffffff)) {
|
||||||
uint64_t current_time = supervisor_ticks_ms64();
|
uint64_t current_time = supervisor_ticks_ms64();
|
||||||
uint32_t current_ms_since_real_refresh = current_time - self->core.last_refresh;
|
uint32_t current_ms_since_real_refresh = current_time - self->core.last_refresh;
|
||||||
// Test to see if the real frame time is below our minimum.
|
// Test to see if the real frame time is below our minimum.
|
||||||
|
|
Loading…
Reference in New Issue