kopia lustrzana https://github.com/pimoroni/pimoroni-pico
PicoGraphics: Partial update/speed support. Tidyup.
rodzic
e0f23aafb2
commit
16aae0b1f2
|
@ -322,20 +322,18 @@ namespace pimoroni {
|
||||||
setup();
|
setup();
|
||||||
};
|
};
|
||||||
|
|
||||||
void UC8151::setup(uint8_t speed) {
|
void UC8151::setup() {
|
||||||
reset();
|
reset();
|
||||||
|
|
||||||
update_speed = speed;
|
|
||||||
|
|
||||||
uint8_t psr_setting = RES_128x296 | FORMAT_BW | BOOSTER_ON | RESET_NONE;
|
uint8_t psr_setting = RES_128x296 | FORMAT_BW | BOOSTER_ON | RESET_NONE;
|
||||||
|
|
||||||
psr_setting |= speed == 0 ? LUT_OTP : LUT_REG;
|
psr_setting |= update_speed == 0 ? LUT_OTP : LUT_REG;
|
||||||
|
|
||||||
psr_setting |= rotation == ROTATE_180 ? SHIFT_LEFT | SCAN_UP : SHIFT_RIGHT | SCAN_DOWN;
|
psr_setting |= rotation == ROTATE_180 ? SHIFT_LEFT | SCAN_UP : SHIFT_RIGHT | SCAN_DOWN;
|
||||||
|
|
||||||
command(PSR, 1, &psr_setting);
|
command(PSR, 1, &psr_setting);
|
||||||
|
|
||||||
switch(speed) {
|
switch(update_speed) {
|
||||||
case 0:
|
case 0:
|
||||||
// Note: the defult luts are built in so we don't really need to flash them here
|
// Note: the defult luts are built in so we don't really need to flash them here
|
||||||
// they are preserved above for posterity and reference mostly.
|
// they are preserved above for posterity and reference mostly.
|
||||||
|
@ -447,12 +445,10 @@ namespace pimoroni {
|
||||||
command(reg, values.size(), (uint8_t *)values.begin());
|
command(reg, values.size(), (uint8_t *)values.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
void UC8151::set_update_speed(uint8_t speed) {
|
bool UC8151::set_update_speed(int update_speed) {
|
||||||
setup(speed);
|
this->update_speed = (uint8_t)update_speed;
|
||||||
}
|
setup();
|
||||||
|
return true;
|
||||||
uint8_t UC8151::get_update_speed() {
|
|
||||||
return update_speed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t UC8151::update_time() {
|
uint32_t UC8151::update_time() {
|
||||||
|
@ -511,9 +507,7 @@ namespace pimoroni {
|
||||||
command(DRF); // start display refresh
|
command(DRF); // start display refresh
|
||||||
|
|
||||||
if(blocking) {
|
if(blocking) {
|
||||||
busy_wait();
|
off();
|
||||||
|
|
||||||
command(POF); // turn off
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -534,9 +528,7 @@ namespace pimoroni {
|
||||||
command(DRF); // start display refresh
|
command(DRF); // start display refresh
|
||||||
|
|
||||||
if(blocking) {
|
if(blocking) {
|
||||||
busy_wait();
|
off();
|
||||||
|
|
||||||
command(POF); // turn off
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -163,6 +163,7 @@ namespace pimoroni {
|
||||||
bool is_busy() override;
|
bool is_busy() override;
|
||||||
void update(PicoGraphics *graphics) override;
|
void update(PicoGraphics *graphics) override;
|
||||||
void partial_update(PicoGraphics *graphics, Rect region) override;
|
void partial_update(PicoGraphics *graphics, Rect region) override;
|
||||||
|
bool set_update_speed(int update_speed) override;
|
||||||
|
|
||||||
// UC8151 Specific
|
// UC8151 Specific
|
||||||
void default_luts();
|
void default_luts();
|
||||||
|
@ -170,13 +171,12 @@ namespace pimoroni {
|
||||||
void fast_luts();
|
void fast_luts();
|
||||||
void turbo_luts();
|
void turbo_luts();
|
||||||
|
|
||||||
void set_update_speed(uint8_t speed);
|
|
||||||
uint8_t get_update_speed();
|
uint8_t get_update_speed();
|
||||||
uint32_t update_time();
|
uint32_t update_time();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void init();
|
void init();
|
||||||
void setup(uint8_t speed=0);
|
void setup();
|
||||||
|
|
||||||
void read(uint8_t reg, size_t len, uint8_t *data);
|
void read(uint8_t reg, size_t len, uint8_t *data);
|
||||||
void command(uint8_t reg, size_t len, const uint8_t *data);
|
void command(uint8_t reg, size_t len, const uint8_t *data);
|
||||||
|
|
|
@ -384,6 +384,7 @@ namespace pimoroni {
|
||||||
|
|
||||||
virtual void update(PicoGraphics *display) {};
|
virtual void update(PicoGraphics *display) {};
|
||||||
virtual void partial_update(PicoGraphics *display, Rect region) {};
|
virtual void partial_update(PicoGraphics *display, Rect region) {};
|
||||||
|
virtual bool set_update_speed(int update_speed) {return false;};
|
||||||
virtual void set_backlight(uint8_t brightness) {};
|
virtual void set_backlight(uint8_t brightness) {};
|
||||||
virtual bool is_busy() {return false;};
|
virtual bool is_busy() {return false;};
|
||||||
virtual void cleanup() {};
|
virtual void cleanup() {};
|
||||||
|
|
|
@ -9,7 +9,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(ModPicoGraphics_get_required_buffer_size_obj, M
|
||||||
|
|
||||||
// Class Methods
|
// Class Methods
|
||||||
MP_DEFINE_CONST_FUN_OBJ_1(ModPicoGraphics_update_obj, ModPicoGraphics_update);
|
MP_DEFINE_CONST_FUN_OBJ_1(ModPicoGraphics_update_obj, ModPicoGraphics_update);
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ModPicoGraphics_partial_update_obj, 5, 5, ModPicoGraphics_partial_update);
|
||||||
MP_DEFINE_CONST_FUN_OBJ_2(ModPicoGraphics_set_backlight_obj, ModPicoGraphics_set_backlight);
|
MP_DEFINE_CONST_FUN_OBJ_2(ModPicoGraphics_set_backlight_obj, ModPicoGraphics_set_backlight);
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_2(ModPicoGraphics_set_update_speed_obj, ModPicoGraphics_set_update_speed);
|
||||||
|
|
||||||
// Palette management
|
// Palette management
|
||||||
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ModPicoGraphics_update_pen_obj, 5, 5, ModPicoGraphics_update_pen);
|
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ModPicoGraphics_update_pen_obj, 5, 5, ModPicoGraphics_update_pen);
|
||||||
|
@ -56,6 +58,8 @@ STATIC const mp_rom_map_elem_t ModPicoGraphics_locals_dict_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR_clear), MP_ROM_PTR(&ModPicoGraphics_clear_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_clear), MP_ROM_PTR(&ModPicoGraphics_clear_obj) },
|
||||||
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_update), MP_ROM_PTR(&ModPicoGraphics_update_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_update), MP_ROM_PTR(&ModPicoGraphics_update_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_partial_update), MP_ROM_PTR(&ModPicoGraphics_partial_update_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_set_update_speed), MP_ROM_PTR(&ModPicoGraphics_set_update_speed_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_set_clip), MP_ROM_PTR(&ModPicoGraphics_set_clip_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_set_clip), MP_ROM_PTR(&ModPicoGraphics_set_clip_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_remove_clip), MP_ROM_PTR(&ModPicoGraphics_remove_clip_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_remove_clip), MP_ROM_PTR(&ModPicoGraphics_remove_clip_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_pixel_span), MP_ROM_PTR(&ModPicoGraphics_pixel_span_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_pixel_span), MP_ROM_PTR(&ModPicoGraphics_pixel_span_obj) },
|
||||||
|
|
|
@ -34,60 +34,76 @@ typedef struct _ModPicoGraphics_obj_t {
|
||||||
DisplayDriver *display;
|
DisplayDriver *display;
|
||||||
void *spritedata;
|
void *spritedata;
|
||||||
void *buffer;
|
void *buffer;
|
||||||
|
_PimoroniI2C_obj_t *i2c;
|
||||||
//mp_obj_t scanline_callback; // Not really feasible in MicroPython
|
//mp_obj_t scanline_callback; // Not really feasible in MicroPython
|
||||||
} ModPicoGraphics_obj_t;
|
} ModPicoGraphics_obj_t;
|
||||||
|
|
||||||
bool get_display_settings(PicoGraphicsDisplay display, int &width, int &height, int &rotate, int &pen_type) {
|
bool get_display_settings(PicoGraphicsDisplay display, int &width, int &height, int &rotate, int &pen_type, PicoGraphicsBusType &bus_type) {
|
||||||
switch(display) {
|
switch(display) {
|
||||||
case DISPLAY_PICO_DISPLAY:
|
case DISPLAY_PICO_DISPLAY:
|
||||||
width = 240;
|
width = 240;
|
||||||
height = 135;
|
height = 135;
|
||||||
|
bus_type = BUS_SPI;
|
||||||
// Portrait to match labelling
|
// Portrait to match labelling
|
||||||
if(rotate == -1) rotate = (int)Rotation::ROTATE_270;
|
if(rotate == -1) rotate = (int)Rotation::ROTATE_270;
|
||||||
if(pen_type == -1) pen_type = PEN_RGB332;
|
if(pen_type == -1) pen_type = PEN_RGB332;
|
||||||
break;
|
break;
|
||||||
case DISPLAY_PICO_DISPLAY_2:
|
|
||||||
case DISPLAY_TUFTY_2040:
|
case DISPLAY_TUFTY_2040:
|
||||||
width = 320;
|
width = 320;
|
||||||
height = 240;
|
height = 240;
|
||||||
|
bus_type = BUS_PARALLEL;
|
||||||
// Tufty display is upside-down
|
// Tufty display is upside-down
|
||||||
if(rotate == -1) rotate = (int)Rotation::ROTATE_180;
|
if(rotate == -1) rotate = (int)Rotation::ROTATE_180;
|
||||||
if(pen_type == -1) pen_type = PEN_RGB332;
|
if(pen_type == -1) pen_type = PEN_RGB332;
|
||||||
break;
|
break;
|
||||||
|
case DISPLAY_PICO_DISPLAY_2:
|
||||||
|
width = 320;
|
||||||
|
height = 240;
|
||||||
|
bus_type = BUS_SPI;
|
||||||
|
// Tufty display is upside-down
|
||||||
|
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
||||||
|
if(pen_type == -1) pen_type = PEN_RGB332;
|
||||||
|
break;
|
||||||
case DISPLAY_PICO_EXPLORER:
|
case DISPLAY_PICO_EXPLORER:
|
||||||
case DISPLAY_LCD_240X240:
|
case DISPLAY_LCD_240X240:
|
||||||
case DISPLAY_ENVIRO_PLUS:
|
case DISPLAY_ENVIRO_PLUS:
|
||||||
width = 240;
|
width = 240;
|
||||||
height = 240;
|
height = 240;
|
||||||
|
bus_type = BUS_SPI;
|
||||||
if(pen_type == -1) pen_type = PEN_RGB332;
|
if(pen_type == -1) pen_type = PEN_RGB332;
|
||||||
break;
|
break;
|
||||||
case DISPLAY_ROUND_LCD_240X240:
|
case DISPLAY_ROUND_LCD_240X240:
|
||||||
width = 240;
|
width = 240;
|
||||||
height = 240;
|
height = 240;
|
||||||
|
bus_type = BUS_SPI;
|
||||||
if(pen_type == -1) pen_type = PEN_RGB332;
|
if(pen_type == -1) pen_type = PEN_RGB332;
|
||||||
break;
|
break;
|
||||||
case DISPLAY_LCD_160X80:
|
case DISPLAY_LCD_160X80:
|
||||||
width = 160;
|
width = 160;
|
||||||
height = 80;
|
height = 80;
|
||||||
|
bus_type = BUS_SPI;
|
||||||
if(pen_type == -1) pen_type = PEN_RGB332;
|
if(pen_type == -1) pen_type = PEN_RGB332;
|
||||||
break;
|
break;
|
||||||
case DISPLAY_I2C_OLED_128X128:
|
case DISPLAY_I2C_OLED_128X128:
|
||||||
width = 128;
|
width = 128;
|
||||||
height = 128;
|
height = 128;
|
||||||
|
bus_type = BUS_I2C;
|
||||||
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
||||||
if(pen_type == -1) pen_type = PEN_1BIT;
|
if(pen_type == -1) pen_type = PEN_1BIT;
|
||||||
break;
|
break;
|
||||||
case DISPLAY_INKY_PACK:
|
case DISPLAY_INKY_PACK:
|
||||||
width = 296;
|
width = 296;
|
||||||
height = 128;
|
height = 128;
|
||||||
|
bus_type = BUS_SPI;
|
||||||
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
||||||
if(pen_type == -1) pen_type = PEN_1BIT;
|
if(pen_type == -1) pen_type = PEN_1BIT;
|
||||||
break;
|
break;
|
||||||
case DISPLAY_INKY_FRAME:
|
case DISPLAY_INKY_FRAME:
|
||||||
width = 600;
|
width = 600;
|
||||||
height = 448;
|
height = 448;
|
||||||
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
bus_type = BUS_SPI;
|
||||||
if(pen_type == -1) pen_type = PEN_P4;
|
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
||||||
|
if(pen_type == -1) pen_type = PEN_P4;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
@ -140,68 +156,67 @@ mp_obj_t ModPicoGraphics_make_new(const mp_obj_type_t *type, size_t n_args, size
|
||||||
int height = 0;
|
int height = 0;
|
||||||
int pen_type = args[ARG_pen_type].u_int;
|
int pen_type = args[ARG_pen_type].u_int;
|
||||||
int rotate = args[ARG_rotate].u_int;
|
int rotate = args[ARG_rotate].u_int;
|
||||||
if(!get_display_settings(display, width, height, rotate, pen_type)) mp_raise_ValueError("Unsupported display!");
|
PicoGraphicsBusType bus_type = BUS_SPI;
|
||||||
|
if(!get_display_settings(display, width, height, rotate, pen_type, bus_type)) mp_raise_ValueError("Unsupported display!");
|
||||||
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
||||||
|
|
||||||
|
pimoroni::SPIPins spi_bus = get_spi_pins(BG_SPI_FRONT);
|
||||||
|
pimoroni::ParallelPins parallel_bus = {10, 11, 12, 13, 14, 2}; // Default for Tufty 2040 parallel
|
||||||
|
pimoroni::I2C *i2c_bus = nullptr;
|
||||||
|
|
||||||
|
if (mp_obj_is_type(args[ARG_bus].u_obj, &SPIPins_type)) {
|
||||||
|
if(bus_type != BUS_SPI) mp_raise_ValueError("unexpected SPI bus!");
|
||||||
|
_PimoroniBus_obj_t *bus = (_PimoroniBus_obj_t *)MP_OBJ_TO_PTR(args[ARG_bus].u_obj);
|
||||||
|
spi_bus = *(SPIPins *)(bus->pins);
|
||||||
|
|
||||||
|
} else if (mp_obj_is_type(args[ARG_bus].u_obj, &ParallelPins_type)) {
|
||||||
|
if(bus_type != BUS_PARALLEL) mp_raise_ValueError("unexpected Parallel bus!");
|
||||||
|
_PimoroniBus_obj_t *bus = (_PimoroniBus_obj_t *)MP_OBJ_TO_PTR(args[ARG_bus].u_obj);
|
||||||
|
parallel_bus = *(ParallelPins *)(bus->pins);
|
||||||
|
|
||||||
|
} else if (mp_obj_is_type(args[ARG_bus].u_obj, &PimoroniI2C_type) || MP_OBJ_IS_TYPE(args[ARG_bus].u_obj, &machine_hw_i2c_type)) {
|
||||||
|
if(bus_type != BUS_I2C) mp_raise_ValueError("unexpected I2C bus!");
|
||||||
|
self->i2c = PimoroniI2C_from_machine_i2c_or_native(args[ARG_bus].u_obj);
|
||||||
|
i2c_bus = (pimoroni::I2C *)(self->i2c->i2c);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// No bus given, fall back to defaults
|
||||||
|
if(bus_type == BUS_I2C) {
|
||||||
|
self->i2c = (_PimoroniI2C_obj_t *)MP_OBJ_TO_PTR(PimoroniI2C_make_new(&PimoroniI2C_type, 0, 0, nullptr));
|
||||||
|
i2c_bus = (pimoroni::I2C *)(self->i2c->i2c);
|
||||||
|
} else if (bus_type == BUS_SPI) {
|
||||||
|
if(display == DISPLAY_INKY_FRAME) {
|
||||||
|
spi_bus = {PIMORONI_SPI_DEFAULT_INSTANCE, SPI_BG_FRONT_CS, SPI_DEFAULT_SCK, SPI_DEFAULT_MOSI, PIN_UNUSED, 27, PIN_UNUSED};
|
||||||
|
} else if (display == DISPLAY_INKY_PACK) {
|
||||||
|
spi_bus = {PIMORONI_SPI_DEFAULT_INSTANCE, SPI_BG_FRONT_CS, SPI_DEFAULT_SCK, SPI_DEFAULT_MOSI, PIN_UNUSED, 20, PIN_UNUSED};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Try to create an appropriate display driver
|
// Try to create an appropriate display driver
|
||||||
if (display == DISPLAY_INKY_FRAME) {
|
if (display == DISPLAY_INKY_FRAME) {
|
||||||
pen_type = PEN_P4; // FORCE to P4 since it's the only supported mode
|
pen_type = PEN_P4; // FORCE to P4 since it's the only supported mode
|
||||||
// TODO grab BUSY and RESET from ARG_extra_pins
|
// TODO grab BUSY and RESET from ARG_extra_pins
|
||||||
if (args[ARG_bus].u_obj == mp_const_none) {
|
self->display = m_new_class(UC8159, width, height, spi_bus);
|
||||||
self->display = m_new_class(UC8159, width, height);
|
|
||||||
} else if (mp_obj_is_type(args[ARG_bus].u_obj, &SPIPins_type)) {
|
|
||||||
_PimoroniBus_obj_t *bus = (_PimoroniBus_obj_t *)MP_OBJ_TO_PTR(args[ARG_bus].u_obj);
|
|
||||||
self->display = m_new_class(UC8159, width, height, *(SPIPins *)(bus->pins));
|
|
||||||
} else {
|
|
||||||
mp_raise_ValueError("SPIBus expected!");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (display == DISPLAY_TUFTY_2040) {
|
else if (display == DISPLAY_TUFTY_2040) {
|
||||||
if (args[ARG_bus].u_obj == mp_const_none) {
|
self->display = m_new_class(ST7789, width, height, (Rotation)rotate, parallel_bus);
|
||||||
self->display = m_new_class(ST7789, width, height, (Rotation)rotate, {10, 11, 12, 13, 14, 2});
|
|
||||||
} else if (mp_obj_is_type(args[ARG_bus].u_obj, &ParallelPins_type)) {
|
} else if (display == DISPLAY_LCD_160X80) {
|
||||||
_PimoroniBus_obj_t *bus = (_PimoroniBus_obj_t *)MP_OBJ_TO_PTR(args[ARG_bus].u_obj);
|
self->display = m_new_class(ST7735, width, height, spi_bus);
|
||||||
self->display = m_new_class(ST7789, width, height, (Rotation)rotate, *(ParallelPins *)(bus->pins));
|
|
||||||
} else {
|
} else if (display == DISPLAY_I2C_OLED_128X128) {
|
||||||
mp_raise_ValueError("ParallelBus expected!");
|
int i2c_address = args[ARG_i2c_address].u_int;
|
||||||
}
|
if(i2c_address == -1) i2c_address = SH1107::DEFAULT_I2C_ADDRESS;
|
||||||
} else if (display == DISPLAY_LCD_160X80) {
|
|
||||||
if (args[ARG_bus].u_obj == mp_const_none) {
|
self->display = m_new_class(SH1107, width, height, *i2c_bus, (uint8_t)i2c_address);
|
||||||
self->display = m_new_class(ST7735, width, height, get_spi_pins(BG_SPI_FRONT));
|
|
||||||
} else if (mp_obj_is_type(args[ARG_bus].u_obj, &SPIPins_type)) {
|
|
||||||
_PimoroniBus_obj_t *bus = (_PimoroniBus_obj_t *)MP_OBJ_TO_PTR(args[ARG_bus].u_obj);
|
|
||||||
self->display = m_new_class(ST7735, width, height, *(SPIPins *)(bus->pins));
|
|
||||||
} else {
|
|
||||||
mp_raise_ValueError("SPIBus expected!");
|
|
||||||
}
|
|
||||||
} else if (display == DISPLAY_I2C_OLED_128X128) {
|
|
||||||
if (mp_obj_is_type(args[ARG_bus].u_obj, &PimoroniI2C_type)) {
|
|
||||||
_PimoroniI2C_obj_t *i2c = PimoroniI2C_from_machine_i2c_or_native(args[ARG_bus].u_obj);
|
|
||||||
|
|
||||||
int i2c_address = args[ARG_i2c_address].u_int;
|
|
||||||
if(i2c_address == -1) i2c_address = SH1107::DEFAULT_I2C_ADDRESS;
|
|
||||||
self->display = m_new_class(SH1107, width, height, *(pimoroni::I2C *)(i2c->i2c), (uint8_t)i2c_address);
|
|
||||||
} else {
|
|
||||||
mp_raise_ValueError("I2C bus required!");
|
|
||||||
}
|
|
||||||
} else if (display == DISPLAY_INKY_PACK) {
|
} else if (display == DISPLAY_INKY_PACK) {
|
||||||
if (args[ARG_bus].u_obj == mp_const_none) {
|
self->display = m_new_class(UC8151, width, height, (Rotation)rotate, spi_bus);
|
||||||
self->display = m_new_class(UC8151, width, height, (Rotation)rotate);
|
|
||||||
} else if (mp_obj_is_type(args[ARG_bus].u_obj, &SPIPins_type)) {
|
|
||||||
_PimoroniBus_obj_t *bus = (_PimoroniBus_obj_t *)MP_OBJ_TO_PTR(args[ARG_bus].u_obj);
|
|
||||||
self->display = m_new_class(UC8151, width, height, (Rotation)rotate, *(SPIPins *)(bus->pins));
|
|
||||||
} else {
|
|
||||||
mp_raise_ValueError("SPIBus expected!");
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (args[ARG_bus].u_obj == mp_const_none) {
|
self->display = m_new_class(ST7789, width, height, (Rotation)rotate, round, spi_bus);
|
||||||
self->display = m_new_class(ST7789, width, height, (Rotation)rotate, round, get_spi_pins(BG_SPI_FRONT));
|
|
||||||
} else if (mp_obj_is_type(args[ARG_bus].u_obj, &SPIPins_type)) {
|
|
||||||
_PimoroniBus_obj_t *bus = (_PimoroniBus_obj_t *)MP_OBJ_TO_PTR(args[ARG_bus].u_obj);
|
|
||||||
self->display = m_new_class(ST7789, width, height, (Rotation)rotate, round, *(SPIPins *)(bus->pins));
|
|
||||||
} else {
|
|
||||||
mp_raise_ValueError("SPIBus expected!");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create or fetch buffer
|
// Create or fetch buffer
|
||||||
|
@ -254,7 +269,7 @@ mp_obj_t ModPicoGraphics_make_new(const mp_obj_type_t *type, size_t n_args, size
|
||||||
self->graphics->clear();
|
self->graphics->clear();
|
||||||
|
|
||||||
// Update the LCD from the graphics library
|
// Update the LCD from the graphics library
|
||||||
if (display != DISPLAY_INKY_FRAME) {
|
if (display != DISPLAY_INKY_FRAME && display != DISPLAY_INKY_PACK) {
|
||||||
self->display->update(self->graphics);
|
self->display->update(self->graphics);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -381,7 +396,8 @@ mp_obj_t ModPicoGraphics_get_required_buffer_size(mp_obj_t display_in, mp_obj_t
|
||||||
int height = 0;
|
int height = 0;
|
||||||
int rotation = 0;
|
int rotation = 0;
|
||||||
int pen_type = mp_obj_get_int(pen_type_in);
|
int pen_type = mp_obj_get_int(pen_type_in);
|
||||||
if(!get_display_settings(display, width, height, rotation, pen_type)) mp_raise_ValueError("Unsupported display!");
|
PicoGraphicsBusType bus_type = BUS_SPI;
|
||||||
|
if(!get_display_settings(display, width, height, rotation, pen_type, bus_type)) mp_raise_ValueError("Unsupported display!");
|
||||||
size_t required_size = get_required_buffer_size((PicoGraphicsPenType)pen_type, width, height);
|
size_t required_size = get_required_buffer_size((PicoGraphicsPenType)pen_type, width, height);
|
||||||
if(required_size == 0) mp_raise_ValueError("Unsupported pen type!");
|
if(required_size == 0) mp_raise_ValueError("Unsupported pen type!");
|
||||||
|
|
||||||
|
@ -437,6 +453,45 @@ mp_obj_t ModPicoGraphics_update(mp_obj_t self_in) {
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mp_obj_t ModPicoGraphics_partial_update(size_t n_args, const mp_obj_t *args) {
|
||||||
|
enum { ARG_self, ARG_x, ARG_y, ARG_w, ARG_h };
|
||||||
|
|
||||||
|
ModPicoGraphics_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self], ModPicoGraphics_obj_t);
|
||||||
|
|
||||||
|
while(self->display->is_busy()) {
|
||||||
|
#ifdef MICROPY_EVENT_POLL_HOOK
|
||||||
|
MICROPY_EVENT_POLL_HOOK
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
self->display->partial_update(self->graphics, {
|
||||||
|
mp_obj_get_int(args[ARG_x]),
|
||||||
|
mp_obj_get_int(args[ARG_y]),
|
||||||
|
mp_obj_get_int(args[ARG_w]),
|
||||||
|
mp_obj_get_int(args[ARG_h])
|
||||||
|
});
|
||||||
|
|
||||||
|
while(self->display->is_busy()) {
|
||||||
|
#ifdef MICROPY_EVENT_POLL_HOOK
|
||||||
|
MICROPY_EVENT_POLL_HOOK
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
|
||||||
|
mp_obj_t ModPicoGraphics_set_update_speed(mp_obj_t self_in, mp_obj_t update_speed) {
|
||||||
|
ModPicoGraphics_obj_t *self = MP_OBJ_TO_PTR2(self_in, ModPicoGraphics_obj_t);
|
||||||
|
|
||||||
|
int speed = mp_obj_get_int(update_speed);
|
||||||
|
|
||||||
|
if(!self->display->set_update_speed(speed)) {
|
||||||
|
mp_raise_ValueError("update speed not supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
|
||||||
mp_obj_t ModPicoGraphics_set_backlight(mp_obj_t self_in, mp_obj_t brightness) {
|
mp_obj_t ModPicoGraphics_set_backlight(mp_obj_t self_in, mp_obj_t brightness) {
|
||||||
ModPicoGraphics_obj_t *self = MP_OBJ_TO_PTR2(self_in, ModPicoGraphics_obj_t);
|
ModPicoGraphics_obj_t *self = MP_OBJ_TO_PTR2(self_in, ModPicoGraphics_obj_t);
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,12 @@ enum PicoGraphicsPenType {
|
||||||
PEN_RGB565
|
PEN_RGB565
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum PicoGraphicsBusType {
|
||||||
|
BUS_I2C,
|
||||||
|
BUS_SPI,
|
||||||
|
BUS_PARALLEL
|
||||||
|
};
|
||||||
|
|
||||||
// Type
|
// Type
|
||||||
extern const mp_obj_type_t ModPicoGraphics_type;
|
extern const mp_obj_type_t ModPicoGraphics_type;
|
||||||
|
|
||||||
|
@ -38,7 +44,9 @@ extern mp_obj_t ModPicoGraphics_get_required_buffer_size(mp_obj_t display_in, mp
|
||||||
extern mp_obj_t ModPicoGraphics_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args);
|
extern mp_obj_t ModPicoGraphics_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args);
|
||||||
|
|
||||||
extern mp_obj_t ModPicoGraphics_update(mp_obj_t self_in);
|
extern mp_obj_t ModPicoGraphics_update(mp_obj_t self_in);
|
||||||
|
extern mp_obj_t ModPicoGraphics_partial_update(size_t n_args, const mp_obj_t *args);
|
||||||
extern mp_obj_t ModPicoGraphics_set_backlight(mp_obj_t self_in, mp_obj_t brightness);
|
extern mp_obj_t ModPicoGraphics_set_backlight(mp_obj_t self_in, mp_obj_t brightness);
|
||||||
|
extern mp_obj_t ModPicoGraphics_set_update_speed(mp_obj_t self_in, mp_obj_t update_speed);
|
||||||
|
|
||||||
// Palette management
|
// Palette management
|
||||||
extern mp_obj_t ModPicoGraphics_update_pen(size_t n_args, const mp_obj_t *args);
|
extern mp_obj_t ModPicoGraphics_update_pen(size_t n_args, const mp_obj_t *args);
|
||||||
|
|
|
@ -8,6 +8,7 @@ extern "C" {
|
||||||
#include "pimoroni_bus.h"
|
#include "pimoroni_bus.h"
|
||||||
#include "py/mperrno.h"
|
#include "py/mperrno.h"
|
||||||
|
|
||||||
|
|
||||||
void PimoroniBus_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
|
void PimoroniBus_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
|
||||||
_PimoroniBus_obj_t *self = MP_OBJ_TO_PTR2(self_in, _PimoroniBus_obj_t);
|
_PimoroniBus_obj_t *self = MP_OBJ_TO_PTR2(self_in, _PimoroniBus_obj_t);
|
||||||
if(self->base.type == &SPIPins_type) {
|
if(self->base.type == &SPIPins_type) {
|
||||||
|
|
Ładowanie…
Reference in New Issue