summaryrefslogtreecommitdiff
path: root/shared-module/displayio/__init__.c
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2019-02-14 12:54:34 -0800
committerScott Shawcroft <scott@tannewt.org>2019-02-19 14:50:31 -0800
commit46fd60c70398b51136a2deea84f30e867679ca53 (patch)
treed258a055ea443cb8b0b1879a2905af0eb03a3a35 /shared-module/displayio/__init__.c
parent4e75aaecd07ea954aeba5dda59ed3d1b37bfc17d (diff)
Prevent infinite display update recursion and fix VFS mounting
Fixes #1529
Diffstat (limited to 'shared-module/displayio/__init__.c')
-rw-r--r--shared-module/displayio/__init__.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/shared-module/displayio/__init__.c b/shared-module/displayio/__init__.c
index c4f9cbeb7..5db571f33 100644
--- a/shared-module/displayio/__init__.c
+++ b/shared-module/displayio/__init__.c
@@ -6,6 +6,7 @@
#include "shared-bindings/displayio/Display.h"
#include "shared-bindings/displayio/Group.h"
#include "shared-bindings/displayio/Palette.h"
+#include "supervisor/shared/autoreload.h"
#include "supervisor/shared/display.h"
#include "supervisor/memory.h"
#include "supervisor/usb.h"
@@ -18,7 +19,13 @@ static inline void swap(uint16_t* a, uint16_t* b) {
*b = temp;
}
+bool refreshing_displays = false;
+
void displayio_refresh_displays(void) {
+ if (refreshing_displays) {
+ return;
+ }
+ refreshing_displays = true;
for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) {
if (displays[i].display.base.type == NULL || displays[i].display.base.type == &mp_type_NoneType) {
continue;
@@ -27,6 +34,7 @@ void displayio_refresh_displays(void) {
displayio_display_update_backlight(display);
if (!displayio_display_frame_queued(display)) {
+ refreshing_displays = false;
return;
}
if (displayio_display_refresh_queued(display)) {
@@ -89,8 +97,9 @@ void displayio_refresh_displays(void) {
index += 1;
// The buffer is full, send it.
if (index >= buffer_size) {
- if (!displayio_display_send_pixels(display, buffer, buffer_size / 2)) {
+ if (!displayio_display_send_pixels(display, buffer, buffer_size / 2) || reload_requested) {
displayio_display_finish_region_update(display);
+ refreshing_displays = false;
return;
}
// TODO(tannewt): Make refresh displays faster so we don't starve other
@@ -103,12 +112,14 @@ void displayio_refresh_displays(void) {
// Send the remaining data.
if (index && !displayio_display_send_pixels(display, buffer, index * 2)) {
displayio_display_finish_region_update(display);
+ refreshing_displays = false;
return;
}
displayio_display_finish_region_update(display);
}
displayio_display_finish_refresh(display);
}
+ refreshing_displays = false;
}
void common_hal_displayio_release_displays(void) {