displayio: implement, use allocate_new_display_bus_or_raise

This commit is contained in:
Jeff Epler 2020-03-30 10:47:14 -05:00
parent 6378d600c4
commit 8cba145c90
5 changed files with 22 additions and 36 deletions

View File

@ -82,19 +82,8 @@ STATIC mp_obj_t displayio_fourwire_make_new(const mp_obj_type_t *type, size_t n_
mcu_pin_obj_t *chip_select = validate_obj_is_free_pin(args[ARG_chip_select].u_obj);
mcu_pin_obj_t *reset = validate_obj_is_free_pin_or_none(args[ARG_reset].u_obj);
displayio_fourwire_obj_t* self = NULL;
mp_obj_t spi = args[ARG_spi_bus].u_obj;
for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) {
if (displays[i].fourwire_bus.base.type == NULL ||
displays[i].fourwire_bus.base.type == &mp_type_NoneType) {
self = &displays[i].fourwire_bus;
self->base.type = &displayio_fourwire_type;
break;
}
}
if (self == NULL) {
mp_raise_RuntimeError(translate("Too many display busses"));
}
displayio_fourwire_obj_t* self = &allocate_display_bus_or_raise()->fourwire_bus;
uint8_t polarity = args[ARG_polarity].u_int;
if (polarity != 0 && polarity != 1) {

View File

@ -71,19 +71,8 @@ STATIC mp_obj_t displayio_i2cdisplay_make_new(const mp_obj_type_t *type, size_t
mcu_pin_obj_t *reset = validate_obj_is_free_pin_or_none(args[ARG_reset].u_obj);
displayio_i2cdisplay_obj_t* self = NULL;
mp_obj_t i2c = args[ARG_i2c_bus].u_obj;
for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) {
if (displays[i].i2cdisplay_bus.base.type == NULL ||
displays[i].i2cdisplay_bus.base.type == &mp_type_NoneType) {
self = &displays[i].i2cdisplay_bus;
self->base.type = &displayio_i2cdisplay_type;
break;
}
}
if (self == NULL) {
mp_raise_RuntimeError(translate("Too many display busses"));
}
displayio_i2cdisplay_obj_t* self = &allocate_display_bus_or_raise()->i2cdisplay_bus;
common_hal_displayio_i2cdisplay_construct(self,
MP_OBJ_TO_PTR(i2c), args[ARG_device_address].u_int, reset);

View File

@ -83,18 +83,7 @@ STATIC mp_obj_t displayio_parallelbus_make_new(const mp_obj_type_t *type, size_t
mcu_pin_obj_t *read = validate_obj_is_free_pin(args[ARG_read].u_obj);
mcu_pin_obj_t *reset = validate_obj_is_free_pin(args[ARG_reset].u_obj);
displayio_parallelbus_obj_t* self = NULL;
for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) {
if (displays[i].parallel_bus.base.type== NULL ||
displays[i].parallel_bus.base.type == &mp_type_NoneType) {
self = &displays[i].parallel_bus;
self->base.type = &displayio_parallelbus_type;
break;
}
}
if (self == NULL) {
mp_raise_RuntimeError(translate("Too many display busses"));
}
displayio_parallelbus_obj_t* self = &allocate_display_bus_or_raise()->parallel_bus;
common_hal_displayio_parallelbus_construct(self, data0, command, chip_select, write, read, reset);
return self;

View File

@ -326,3 +326,20 @@ primary_display_t *allocate_display_or_raise() {
}
}
primary_display_t *allocate_display_bus(void) {
for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) {
mp_const_obj_t display_type = displays[i].display.base.type;
if (display_type == NULL || display_type == &mp_type_NoneType) {
return &displays[i];
}
}
return NULL;
}
primary_display_t *allocate_display_bus_or_raise(void) {
primary_display_t *result = allocate_display_bus();
if (result) {
return result;
}
mp_raise_RuntimeError(translate("Too many display busses"));
}

View File

@ -56,5 +56,7 @@ void displayio_gc_collect(void);
primary_display_t *allocate_display(void);
primary_display_t *allocate_display_or_raise(void);
primary_display_t *allocate_display_bus(void);
primary_display_t *allocate_display_bus_or_raise(void);
#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO___INIT___H