6697544cdf
It's designed to minimize RAM footprint by using Sprites to represent objects on the screen. The object model also facilitates partial screen updating which reduces the bandwidth needed to display. This is all handled in C. Python simply manipulates the objects with the ability to synchronize to frame timing.
81 lines
2.7 KiB
C
81 lines
2.7 KiB
C
#include "shared-bindings/displayio/FourWire.h"
|
|
|
|
extern displayio_fourwire_obj_t board_display_obj;
|
|
|
|
void start_region_update(displayio_fourwire_obj_t* display, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
|
|
// TODO delegate between different display types
|
|
displayio_fourwire_start_region_update(display, x0, y0, x1, y1);
|
|
}
|
|
|
|
void finish_region_update(displayio_fourwire_obj_t* display) {
|
|
// TODO delegate between different display types
|
|
displayio_fourwire_finish_region_update(display);
|
|
}
|
|
|
|
void finish_refresh(displayio_fourwire_obj_t* display) {
|
|
// TODO delegate between different display types
|
|
displayio_fourwire_finish_refresh(display);
|
|
}
|
|
|
|
bool frame_queued(displayio_fourwire_obj_t* display) {
|
|
// TODO delegate between different display types
|
|
return displayio_fourwire_frame_queued(display);
|
|
}
|
|
|
|
bool refresh_queued(displayio_fourwire_obj_t* display) {
|
|
// TODO delegate between different display types
|
|
return displayio_fourwire_refresh_queued(display);
|
|
}
|
|
|
|
bool send_pixels(displayio_fourwire_obj_t* display, uint32_t* pixels, uint32_t length) {
|
|
// TODO delegate between different display types
|
|
return displayio_fourwire_send_pixels(display, pixels, length);
|
|
}
|
|
|
|
void displayio_refresh_display(void) {
|
|
displayio_fourwire_obj_t* display = &board_display_obj;
|
|
|
|
if (!frame_queued(display)) {
|
|
return;
|
|
}
|
|
if (refresh_queued(display)) {
|
|
// We compute the pixels
|
|
uint16_t x0 = 0;
|
|
uint16_t y0 = 0;
|
|
uint16_t x1 = display->width;
|
|
uint16_t y1 = display->height;
|
|
size_t index = 0;
|
|
//size_t row_size = (x1 - x0);
|
|
uint16_t buffer_size = 256;
|
|
uint32_t buffer[buffer_size / 2];
|
|
start_region_update(display, x0, y0, x1, y1);
|
|
for (uint16_t y = y0; y < y1; ++y) {
|
|
for (uint16_t x = x0; x < x1; ++x) {
|
|
uint16_t* pixel = &(((uint16_t*)buffer)[index]);
|
|
*pixel = 0;
|
|
if (display->current_group != NULL) {
|
|
displayio_group_get_pixel(display->current_group, x, y, pixel);
|
|
}
|
|
|
|
|
|
index += 1;
|
|
// The buffer is full, send it.
|
|
if (index >= buffer_size) {
|
|
if (!send_pixels(display, buffer, buffer_size / 2)) {
|
|
finish_region_update(display);
|
|
return;
|
|
}
|
|
index = 0;
|
|
}
|
|
}
|
|
}
|
|
// Send the remaining data.
|
|
if (index && !send_pixels(display, buffer, index * 2)) {
|
|
finish_region_update(display);
|
|
return;
|
|
}
|
|
finish_region_update(display);
|
|
}
|
|
finish_refresh(display);
|
|
}
|