kopia lustrzana https://github.com/pimoroni/pimoroni-pico
Attempt at adding color order support to Hub75
rodzic
884722de50
commit
1343f23316
|
@ -6,11 +6,48 @@
|
||||||
|
|
||||||
namespace pimoroni {
|
namespace pimoroni {
|
||||||
|
|
||||||
|
void Hub75::swap_pin(unsigned int &pin_a, unsigned int &pin_b) {
|
||||||
|
unsigned int swap;
|
||||||
|
swap = pin_a;
|
||||||
|
pin_a = pin_b;
|
||||||
|
pin_b = swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hub75::Hub75(uint width, uint height, Pixel *buffer, PanelType panel_type, bool inverted_stb, COLOR_ORDER color_order)
|
||||||
Hub75::Hub75(uint width, uint height, Pixel *buffer, PanelType panel_type, bool inverted_stb)
|
|
||||||
: width(width), height(height), panel_type(panel_type), inverted_stb(inverted_stb)
|
: width(width), height(height), panel_type(panel_type), inverted_stb(inverted_stb)
|
||||||
{
|
{
|
||||||
|
// If the colour order is not RGB, swap the colour pins.
|
||||||
|
switch(color_order) {
|
||||||
|
case COLOR_ORDER::RBG:
|
||||||
|
swap_pin(pin_g0, pin_b0);
|
||||||
|
swap_pin(pin_g1, pin_b1);
|
||||||
|
break;
|
||||||
|
case COLOR_ORDER::GRB:
|
||||||
|
swap_pin(pin_r0, pin_g0);
|
||||||
|
swap_pin(pin_r1, pin_g1);
|
||||||
|
break;
|
||||||
|
case COLOR_ORDER::GBR:
|
||||||
|
swap_pin(pin_r0, pin_g0);
|
||||||
|
swap_pin(pin_r1, pin_g1);
|
||||||
|
|
||||||
|
swap_pin(pin_r0, pin_b0);
|
||||||
|
swap_pin(pin_r1, pin_b1);
|
||||||
|
break;
|
||||||
|
case COLOR_ORDER::BRG:
|
||||||
|
swap_pin(pin_r0, pin_b0);
|
||||||
|
swap_pin(pin_r1, pin_b1);
|
||||||
|
|
||||||
|
swap_pin(pin_r0, pin_g0);
|
||||||
|
swap_pin(pin_r1, pin_g1);
|
||||||
|
break;
|
||||||
|
case COLOR_ORDER::BGR:
|
||||||
|
swap_pin(pin_r0, pin_b0);
|
||||||
|
swap_pin(pin_r1, pin_b1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Set up allllll the GPIO
|
// Set up allllll the GPIO
|
||||||
gpio_init(pin_r0); gpio_set_function(pin_r0, GPIO_FUNC_SIO); gpio_set_dir(pin_r0, true); gpio_put(pin_r0, 0);
|
gpio_init(pin_r0); gpio_set_function(pin_r0, GPIO_FUNC_SIO); gpio_set_dir(pin_r0, true); gpio_put(pin_r0, 0);
|
||||||
gpio_init(pin_g0); gpio_set_function(pin_g0, GPIO_FUNC_SIO); gpio_set_dir(pin_g0, true); gpio_put(pin_g0, 0);
|
gpio_init(pin_g0); gpio_set_function(pin_g0, GPIO_FUNC_SIO); gpio_set_dir(pin_g0, true); gpio_put(pin_g0, 0);
|
||||||
|
|
|
@ -52,6 +52,14 @@ Pixel hsv_to_rgb(float h, float s, float v);
|
||||||
|
|
||||||
class Hub75 {
|
class Hub75 {
|
||||||
public:
|
public:
|
||||||
|
enum class COLOR_ORDER {
|
||||||
|
RGB,
|
||||||
|
RBG,
|
||||||
|
GRB,
|
||||||
|
GBR,
|
||||||
|
BRG,
|
||||||
|
BGR
|
||||||
|
};
|
||||||
uint width;
|
uint width;
|
||||||
uint height;
|
uint height;
|
||||||
Pixel *back_buffer;
|
Pixel *back_buffer;
|
||||||
|
@ -112,7 +120,7 @@ class Hub75 {
|
||||||
Hub75(uint width, uint height) : Hub75(width, height, nullptr) {};
|
Hub75(uint width, uint height) : Hub75(width, height, nullptr) {};
|
||||||
Hub75(uint width, uint height, Pixel *buffer) : Hub75(width, height, buffer, PANEL_GENERIC) {};
|
Hub75(uint width, uint height, Pixel *buffer) : Hub75(width, height, buffer, PANEL_GENERIC) {};
|
||||||
Hub75(uint width, uint height, Pixel *buffer, PanelType panel_type) : Hub75(width, height, buffer, panel_type, false) {};
|
Hub75(uint width, uint height, Pixel *buffer, PanelType panel_type) : Hub75(width, height, buffer, panel_type, false) {};
|
||||||
Hub75(uint width, uint height, Pixel *buffer, PanelType panel_type, bool inverted_stb);
|
Hub75(uint width, uint height, Pixel *buffer, PanelType panel_type, bool inverted_stb, COLOR_ORDER color_order=COLOR_ORDER::RGB);
|
||||||
~Hub75();
|
~Hub75();
|
||||||
|
|
||||||
void FM6126A_write_register(uint16_t value, uint8_t position);
|
void FM6126A_write_register(uint16_t value, uint8_t position);
|
||||||
|
@ -126,5 +134,7 @@ class Hub75 {
|
||||||
void stop(irq_handler_t handler);
|
void stop(irq_handler_t handler);
|
||||||
void dma_complete();
|
void dma_complete();
|
||||||
void update(PicoGraphics *graphics);
|
void update(PicoGraphics *graphics);
|
||||||
|
private:
|
||||||
|
void swap_pin(unsigned int &pin_a, unsigned int &pin_b);
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -61,6 +61,13 @@ STATIC const mp_map_elem_t hub75_globals_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR_PIN_SDA), MP_ROM_INT(20) },
|
{ MP_ROM_QSTR(MP_QSTR_PIN_SDA), MP_ROM_INT(20) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_PIN_SCL), MP_ROM_INT(21) },
|
{ MP_ROM_QSTR(MP_QSTR_PIN_SCL), MP_ROM_INT(21) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_CURRENT_SENSE), MP_ROM_INT(29) },
|
{ MP_ROM_QSTR(MP_QSTR_CURRENT_SENSE), MP_ROM_INT(29) },
|
||||||
|
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_COLOR_ORDER_RGB), MP_ROM_INT(0x00) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_COLOR_ORDER_RBG), MP_ROM_INT(0x01) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_COLOR_ORDER_GRB), MP_ROM_INT(0x02) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_COLOR_ORDER_GBR), MP_ROM_INT(0x03) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_COLOR_ORDER_BRG), MP_ROM_INT(0x04) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_COLOR_ORDER_BGR), MP_ROM_INT(0x05) },
|
||||||
};
|
};
|
||||||
STATIC MP_DEFINE_CONST_DICT(mp_module_hub75_globals, hub75_globals_table);
|
STATIC MP_DEFINE_CONST_DICT(mp_module_hub75_globals, hub75_globals_table);
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,8 @@ mp_obj_t Hub75_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, c
|
||||||
ARG_height,
|
ARG_height,
|
||||||
ARG_buffer,
|
ARG_buffer,
|
||||||
ARG_panel_type,
|
ARG_panel_type,
|
||||||
ARG_stb_invert
|
ARG_stb_invert,
|
||||||
|
ARG_color_order
|
||||||
};
|
};
|
||||||
static const mp_arg_t allowed_args[] = {
|
static const mp_arg_t allowed_args[] = {
|
||||||
{ MP_QSTR_width, MP_ARG_REQUIRED | MP_ARG_INT },
|
{ MP_QSTR_width, MP_ARG_REQUIRED | MP_ARG_INT },
|
||||||
|
@ -93,6 +94,7 @@ mp_obj_t Hub75_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, c
|
||||||
{ MP_QSTR_buffer, MP_ARG_OBJ, {.u_obj = nullptr} },
|
{ MP_QSTR_buffer, MP_ARG_OBJ, {.u_obj = nullptr} },
|
||||||
{ MP_QSTR_panel_type, MP_ARG_INT, {.u_int = 0} },
|
{ MP_QSTR_panel_type, MP_ARG_INT, {.u_int = 0} },
|
||||||
{ MP_QSTR_stb_invert, MP_ARG_INT, {.u_int = 0} },
|
{ MP_QSTR_stb_invert, MP_ARG_INT, {.u_int = 0} },
|
||||||
|
{ MP_QSTR_color_order, MP_ARG_INT, {.u_int = (uint8_t)Hub75::COLOR_ORDER::RGB} },
|
||||||
};
|
};
|
||||||
|
|
||||||
// Parse args.
|
// Parse args.
|
||||||
|
@ -103,6 +105,7 @@ mp_obj_t Hub75_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, c
|
||||||
int height = args[ARG_height].u_int;
|
int height = args[ARG_height].u_int;
|
||||||
PanelType paneltype = (PanelType)args[ARG_panel_type].u_int;
|
PanelType paneltype = (PanelType)args[ARG_panel_type].u_int;
|
||||||
bool stb_invert = args[ARG_stb_invert].u_int;
|
bool stb_invert = args[ARG_stb_invert].u_int;
|
||||||
|
Hub75::COLOR_ORDER color_order = (Hub75::COLOR_ORDER)args[ARG_color_order].u_int;
|
||||||
|
|
||||||
Pixel *buffer = nullptr;
|
Pixel *buffer = nullptr;
|
||||||
|
|
||||||
|
@ -120,7 +123,7 @@ mp_obj_t Hub75_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, c
|
||||||
hub75_obj = m_new_obj_with_finaliser(_Hub75_obj_t);
|
hub75_obj = m_new_obj_with_finaliser(_Hub75_obj_t);
|
||||||
hub75_obj->base.type = &Hub75_type;
|
hub75_obj->base.type = &Hub75_type;
|
||||||
hub75_obj->buf = buffer;
|
hub75_obj->buf = buffer;
|
||||||
hub75_obj->hub75 = m_new_class(Hub75, width, height, buffer, paneltype, stb_invert);
|
hub75_obj->hub75 = m_new_class(Hub75, width, height, buffer, paneltype, stb_invert, color_order);
|
||||||
|
|
||||||
return MP_OBJ_FROM_PTR(hub75_obj);
|
return MP_OBJ_FROM_PTR(hub75_obj);
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue