diff options
| author | Scott Shawcroft <scott@tannewt.org> | 2019-02-14 12:54:34 -0800 |
|---|---|---|
| committer | Scott Shawcroft <scott@tannewt.org> | 2019-02-19 14:50:31 -0800 |
| commit | 46fd60c70398b51136a2deea84f30e867679ca53 (patch) | |
| tree | d258a055ea443cb8b0b1879a2905af0eb03a3a35 /shared-module/displayio/__init__.c | |
| parent | 4e75aaecd07ea954aeba5dda59ed3d1b37bfc17d (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__.c | 13 |
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) { |
