kopia lustrzana https://github.com/pimoroni/pimoroni-pico
Merge pull request #660 from pimoroni/patch/hub75_color_order
Add support to Interstate / HUB 75 for panels with different color orderspull/628/head
commit
de8cb95ab4
|
@ -6,10 +6,8 @@
|
|||
|
||||
namespace pimoroni {
|
||||
|
||||
|
||||
|
||||
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)
|
||||
Hub75::Hub75(uint width, uint height, Pixel *buffer, PanelType panel_type, bool inverted_stb, COLOR_ORDER color_order)
|
||||
: width(width), height(height), panel_type(panel_type), inverted_stb(inverted_stb), color_order(color_order)
|
||||
{
|
||||
// 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);
|
||||
|
@ -60,7 +58,26 @@ void Hub75::set_color(uint x, uint y, Pixel c) {
|
|||
}
|
||||
|
||||
void Hub75::set_pixel(uint x, uint y, uint8_t r, uint8_t g, uint8_t b) {
|
||||
switch(color_order) {
|
||||
case COLOR_ORDER::RGB:
|
||||
set_color(x, y, Pixel(r, g, b));
|
||||
break;
|
||||
case COLOR_ORDER::RBG:
|
||||
set_color(x, y, Pixel(r, b, g));
|
||||
break;
|
||||
case COLOR_ORDER::GRB:
|
||||
set_color(x, y, Pixel(g, r, b));
|
||||
break;
|
||||
case COLOR_ORDER::GBR:
|
||||
set_color(x, y, Pixel(g, b, r));
|
||||
break;
|
||||
case COLOR_ORDER::BRG:
|
||||
set_color(x, y, Pixel(b, r, g));
|
||||
break;
|
||||
case COLOR_ORDER::BGR:
|
||||
set_color(x, y, Pixel(b, g, r));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Hub75::FM6126A_write_register(uint16_t value, uint8_t position) {
|
||||
|
|
|
@ -52,12 +52,21 @@ Pixel hsv_to_rgb(float h, float s, float v);
|
|||
|
||||
class Hub75 {
|
||||
public:
|
||||
enum class COLOR_ORDER {
|
||||
RGB,
|
||||
RBG,
|
||||
GRB,
|
||||
GBR,
|
||||
BRG,
|
||||
BGR
|
||||
};
|
||||
uint width;
|
||||
uint height;
|
||||
Pixel *back_buffer;
|
||||
bool managed_buffer = false;
|
||||
PanelType panel_type;
|
||||
bool inverted_stb = false;
|
||||
COLOR_ORDER color_order;
|
||||
Pixel background = 0;
|
||||
|
||||
// DMA & PIO
|
||||
|
@ -112,7 +121,7 @@ class Hub75 {
|
|||
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, 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();
|
||||
|
||||
void FM6126A_write_register(uint16_t value, uint8_t position);
|
||||
|
|
|
@ -11,6 +11,7 @@ It can, in theory, be used with your own custom wiring, though custom pin assign
|
|||
- [Notes On PIO & DMA Limitations](#notes-on-pio--dma-limitations)
|
||||
- [Getting Started](#getting-started)
|
||||
- [FM6216A Panels](#fm6216a-panels)
|
||||
- [Setting Colour Order](#setting-colour-order)
|
||||
- [Quick Reference](#quick-reference)
|
||||
- [Set A Pixel](#set-a-pixel)
|
||||
- [Clear The Display](#clear-the-display)
|
||||
|
@ -52,9 +53,25 @@ import hub75
|
|||
WIDTH = 64
|
||||
HEIGHT = 64
|
||||
|
||||
matrix = hub75.Hub75(WIDTH, HEIGHT,panel_type=hub75.PANEL_FM6126A)
|
||||
matrix = hub75.Hub75(WIDTH, HEIGHT, panel_type=hub75.PANEL_FM6126A)
|
||||
```
|
||||
|
||||
### Setting Colour Order
|
||||
|
||||
Some hub 75 panels have varying colour orders. A keyword argument is supplied to configure this:
|
||||
|
||||
```python
|
||||
matrix = hub75.Hub75(WIDTH, HEIGHT, panel_type=hub75.COLOR_ORDER_RBG)
|
||||
```
|
||||
|
||||
The available orders are defined as constants in `hub75`:
|
||||
|
||||
* `COLOR_ORDER_RGB`
|
||||
* `COLOR_ORDER_RBG`
|
||||
* `COLOR_ORDER_GRB`
|
||||
* `COLOR_ORDER_GBR`
|
||||
* `COLOR_ORDER_BRG`
|
||||
* `COLOR_ORDER_BGR`
|
||||
|
||||
## Quick Reference
|
||||
|
||||
|
|
|
@ -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_SCL), MP_ROM_INT(21) },
|
||||
{ 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);
|
||||
|
||||
|
|
|
@ -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_buffer,
|
||||
ARG_panel_type,
|
||||
ARG_stb_invert
|
||||
ARG_stb_invert,
|
||||
ARG_color_order
|
||||
};
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ 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_panel_type, 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.
|
||||
|
@ -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;
|
||||
PanelType paneltype = (PanelType)args[ARG_panel_type].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;
|
||||
|
||||
|
@ -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->base.type = &Hub75_type;
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -28,14 +28,20 @@ class Interstate75:
|
|||
|
||||
PANEL_GENERIC = hub75.PANEL_GENERIC
|
||||
PANEL_FM6126A = hub75.PANEL_FM6126A
|
||||
COLOR_ORDER_RGB = hub75.COLOR_ORDER_RGB
|
||||
COLOR_ORDER_RBG = hub75.COLOR_ORDER_RBG
|
||||
COLOR_ORDER_GRB = hub75.COLOR_ORDER_GRB
|
||||
COLOR_ORDER_GBR = hub75.COLOR_ORDER_GBR
|
||||
COLOR_ORDER_BRG = hub75.COLOR_ORDER_BRG
|
||||
COLOR_ORDER_BGR = hub75.COLOR_ORDER_BGR
|
||||
|
||||
# Count Constants
|
||||
NUM_SWITCHES = 2
|
||||
|
||||
def __init__(self, display, panel_type=hub75.PANEL_GENERIC, stb_invert=False):
|
||||
def __init__(self, display, panel_type=hub75.PANEL_GENERIC, stb_invert=False, color_order=hub75.COLOR_ORDER_RGB):
|
||||
self.display = PicoGraphics(display=display)
|
||||
self.width, self.height = self.display.get_bounds()
|
||||
self.hub75 = hub75.Hub75(self.width, self.height, panel_type=panel_type, stb_invert=stb_invert)
|
||||
self.hub75 = hub75.Hub75(self.width, self.height, panel_type=panel_type, stb_invert=stb_invert, color_order=color_order)
|
||||
self.hub75.start()
|
||||
|
||||
# Set up the user switches
|
||||
|
|
Ładowanie…
Reference in New Issue