8000 Merge pull request #9865 from jepler/rgbmatrix-cleanup-failure · adafruit/circuitpython@2bb9fc4 · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 2bb9fc4

Browse files
authored
Merge pull request #9865 from jepler/rgbmatrix-cleanup-failure
rgbmatrix: Avoid leaving an incompletely configured display bus
2 parents 76a2a49 + bc465e5 commit 2bb9fc4

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,13 @@ CIRCUITPY_GIFIO = 0
1616
CIRCUITPY_JPEGIO = 0
1717

1818
CIRCUITPY_BITBANG_APA102 = 1
19+
20+
# We don't have room for the fonts for terminalio for certain languages,
21+
# so turn off terminalio, and if it's off and displayio is on,
22+
# force a clean build.
23+
# Note that we cannot test $(CIRCUITPY_DISPLAYIO) directly with an
24+
# ifeq, because it's not set yet.
25+
ifneq (,$(filter $(TRANSLATION),ja ko ru))
26+
CIRCUITPY_TERMINALIO = 0
27+
RELEASE_NEEDS_CLEAN_BUILD = $(CIRCUITPY_DISPLAYIO)
28+
endif

shared-bindings/rgbmatrix/RGBMatrix.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,16 @@ static void preflight_pins_or_throw(uint8_t clock_pin, uint8_t *rgb_pins, uint8_
116116
#endif
117117
}
118118

119+
typedef struct {
120+
nlr_jump_callback_node_t callback;
121+
mp_obj_base_t *base_ptr;
122+
} nlr_jump_callback_node_clear_displaybus_t;
123+
124+
static void clear_display_bus(void *node_in) {
125+
nlr_jump_callback_node_clear_displaybus_t *node = node_in;
126+
node->base_ptr->type = &mp_type_NoneType;
127+
}
128+
119129
//| def __init__(
120130
//| self,
121131
//| *,
@@ -217,6 +227,13 @@ static mp_obj_t rgbmatrix_rgbmatrix_make_new(const mp_obj_type_t *type, size_t n
217227
rgbmatrix_rgbmatrix_obj_t *self = &allocate_display_bus_or_raise()->rgbmatrix;
218228
self->base.type = &rgbmatrix_RGBMatrix_type;
219229

230+
// If an exception is thrown, ensure the display bus object's type is set
231+
// back to the uninitialized/deinitialied type. **note that all other resource
232+
// deallocations must be handled by the shared-module code**
233+
nlr_jump_callback_node_clear_displaybus_t node;
234+
node.base_ptr = &self->base;
235+
nlr_push_jump_callback(&node.callback, clear_display_bus);
236+
220237
uint8_t rgb_count, addr_count;
221238
uint8_t rgb_pins[MP_ARRAY_SIZE(self->rgb_pins)];
222239
uint8_t addr_pins[MP_ARRAY_SIZE(self->addr_pins)];
@@ -254,7 +271,6 @@ static mp_obj_t rgbmatrix_rgbmatrix_make_new(const mp_obj_type_t *type, size_t n
254271
clock_pin, latch_pin, output_enable_pin,
255272
args[ARG_doublebuffer].u_bool,
256273
args[ARG_framebuffer].u_obj, tile, args[ARG_serpentine].u_bool, NULL);
257-
258274
claim_and_never_reset_pins(args[ARG_rgb_list].u_obj);
259275
claim_and_never_reset_pins(args[ARG_addr_list].u_obj);
260276
claim_and_never_reset_pin(args[ARG_clock_pin].u_obj);

0 commit comments

Comments
 (0)
0