From ced37c10015464be575e8f1b0ae9a1838f34c45c Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Thu, 28 Feb 2019 22:36:50 -0500 Subject: [PATCH] Don't wait for display frame if interrupt pending --- shared-module/displayio/Display.c | 3 ++- shared-module/displayio/__init__.c | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index da3424a360..1c9ba5702d 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -147,7 +147,8 @@ void common_hal_displayio_display_refresh_soon(displayio_display_obj_t* self) { int32_t common_hal_displayio_display_wait_for_frame(displayio_display_obj_t* self) { uint64_t last_refresh = self->last_refresh; - while (last_refresh == self->last_refresh) { + // Don't try to refresh if we got an exception. + while (last_refresh == self->last_refresh && MP_STATE_VM(mp_pending_exception) == NULL) { MICROPY_VM_HOOK_LOOP } return 0; diff --git a/shared-module/displayio/__init__.c b/shared-module/displayio/__init__.c index 0d35abf0f6..79014fb5af 100644 --- a/shared-module/displayio/__init__.c +++ b/shared-module/displayio/__init__.c @@ -2,7 +2,9 @@ #include #include "shared-module/displayio/__init__.h" +#include "lib/utils/interrupt_char.h" #include "py/reload.h" +#include "py/runtime.h" #include "shared-bindings/displayio/Bitmap.h" #include "shared-bindings/displayio/Display.h" #include "shared-bindings/displayio/Group.h" @@ -23,8 +25,12 @@ static inline void swap(uint16_t* a, uint16_t* b) { bool refreshing_displays = false; void displayio_refresh_displays(void) { + if (mp_hal_is_interrupted()) { + return; + } // Somehow reloads from the sdcard are being lost. So, cheat and reraise. - if (reload_requested) { + // But don't re-raise if already pending. + if (reload_requested && MP_STATE_VM(mp_pending_exception) == MP_OBJ_NULL) { mp_raise_reload_exception(); return; }