summaryrefslogtreecommitdiff
path: root/shared-module
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2019-03-04 13:55:13 -0500
committerGitHub <noreply@github.com>2019-03-04 13:55:13 -0500
commit146271fa580c92646776a2dad8800522256f7c73 (patch)
tree99d9adc704485ee1e9986906b1bd223fa0c38459 /shared-module
parent0ac40235b8c27a7a56323cffb6bd06bf30e45715 (diff)
parentced37c10015464be575e8f1b0ae9a1838f34c45c (diff)
Merge pull request #1604 from dhalbert/display_wait_for_frame-check-interrupts
Don't wait for display frame if interrupt pending
Diffstat (limited to 'shared-module')
-rw-r--r--shared-module/displayio/Display.c3
-rw-r--r--shared-module/displayio/__init__.c8
2 files changed, 9 insertions, 2 deletions
diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c
index da3424a36..1c9ba5702 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 0d35abf0f..79014fb5a 100644
--- a/shared-module/displayio/__init__.c
+++ b/shared-module/displayio/__init__.c
@@ -2,7 +2,9 @@
#include <string.h>
#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;
}