Merge pull request #9865 from jepler/rgbmatrix-cleanup-failure
rgbmatrix: Avoid leaving an incompletely configured display bus
This commit is contained in:
commit
2bb9fc4af0
2 changed files with 27 additions and 1 deletions
|
|
@ -16,3 +16,13 @@ CIRCUITPY_GIFIO = 0
|
|||
CIRCUITPY_JPEGIO = 0
|
||||
|
||||
CIRCUITPY_BITBANG_APA102 = 1
|
||||
|
||||
# We don't have room for the fonts for terminalio for certain languages,
|
||||
# so turn off terminalio, and if it's off and displayio is on,
|
||||
# force a clean build.
|
||||
# Note that we cannot test $(CIRCUITPY_DISPLAYIO) directly with an
|
||||
# ifeq, because it's not set yet.
|
||||
ifneq (,$(filter $(TRANSLATION),ja ko ru))
|
||||
CIRCUITPY_TERMINALIO = 0
|
||||
RELEASE_NEEDS_CLEAN_BUILD = $(CIRCUITPY_DISPLAYIO)
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -116,6 +116,16 @@ static void preflight_pins_or_throw(uint8_t clock_pin, uint8_t *rgb_pins, uint8_
|
|||
#endif
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
nlr_jump_callback_node_t callback;
|
||||
mp_obj_base_t *base_ptr;
|
||||
} nlr_jump_callback_node_clear_displaybus_t;
|
||||
|
||||
static void clear_display_bus(void *node_in) {
|
||||
nlr_jump_callback_node_clear_displaybus_t *node = node_in;
|
||||
node->base_ptr->type = &mp_type_NoneType;
|
||||
}
|
||||
|
||||
//| def __init__(
|
||||
//| self,
|
||||
//| *,
|
||||
|
|
@ -217,6 +227,13 @@ static mp_obj_t rgbmatrix_rgbmatrix_make_new(const mp_obj_type_t *type, size_t n
|
|||
rgbmatrix_rgbmatrix_obj_t *self = &allocate_display_bus_or_raise()->rgbmatrix;
|
||||
self->base.type = &rgbmatrix_RGBMatrix_type;
|
||||
|
||||
// If an exception is thrown, ensure the display bus object's type is set
|
||||
// back to the uninitialized/deinitialied type. **note that all other resource
|
||||
// deallocations must be handled by the shared-module code**
|
||||
nlr_jump_callback_node_clear_displaybus_t node;
|
||||
node.base_ptr = &self->base;
|
||||
nlr_push_jump_callback(&node.callback, clear_display_bus);
|
||||
|
||||
uint8_t rgb_count, addr_count;
|
||||
uint8_t rgb_pins[MP_ARRAY_SIZE(self->rgb_pins)];
|
||||
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
|
|||
clock_pin, latch_pin, output_enable_pin,
|
||||
args[ARG_doublebuffer].u_bool,
|
||||
args[ARG_framebuffer].u_obj, tile, args[ARG_serpentine].u_bool, NULL);
|
||||
|
||||
claim_and_never_reset_pins(args[ARG_rgb_list].u_obj);
|
||||
claim_and_never_reset_pins(args[ARG_addr_list].u_obj);
|
||||
claim_and_never_reset_pin(args[ARG_clock_pin].u_obj);
|
||||
|
|
|
|||
Loading…
Reference in a new issue