summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2023-07-09 22:01:14 +0200
committerThomas White <taw@physics.org>2023-07-09 22:01:14 +0200
commitba6556bec0920957b89ef4c69decb9b15d81a6f0 (patch)
treef7ca0f7af146de6f01e5e81c3fec931ed6861c0b
parent7f05e911e58c8aa283b65becca4bafeb1181ba87 (diff)
Handle multiple pixel strands
-rw-r--r--pixelhub.cpp86
1 files changed, 63 insertions, 23 deletions
diff --git a/pixelhub.cpp b/pixelhub.cpp
index f876e08..506e1a1 100644
--- a/pixelhub.cpp
+++ b/pixelhub.cpp
@@ -25,63 +25,103 @@
#include <ws2812.pio.h>
const int dmx_rx_pin = 16;
-const int pixels_pin = 2;
-const int num_pixels = 8;
-const PIO led_pio = pio0;
-uint led_pio_sm;
+
+struct pixel_strip
+{
+ int pin;
+ int num_pixels;
+ PIO pio;
+ uint pio_sm;
+ uint offset;
+ uint32_t pixelbuf[256];
+ int rgbw;
+};
-static inline void put_pixel(uint32_t pixel_grb) {
- pio_sm_put_blocking(led_pio, led_pio_sm, pixel_grb << 8u);
+static inline void put_pixel(struct pixel_strip *p, uint32_t pixel_grb) {
+ pio_sm_put_blocking(p->pio, p->pio_sm, pixel_grb);
}
static inline uint32_t urgb_u32(uint8_t r, uint8_t g, uint8_t b) {
- return ((uint32_t) (r) << 8) | ((uint32_t) (g) << 16) | (uint32_t) (b);
+ return ((uint32_t)(g)<<24) | ((uint32_t)(r)<<16) | ((uint32_t)(b)<<8);
+}
+
+
+static inline uint32_t wrgb_u32(uint8_t r, uint8_t g, uint8_t b, uint8_t w) {
+ return ((uint32_t)(g)<<24) | ((uint32_t)(r)<<16) | ((uint32_t)(b)<<8) | (uint32_t)(w);
+}
+
+
+static void init_pixel_strip(struct pixel_strip *p)
+{
+ int i;
+
+ p->pio_sm = pio_claim_unused_sm(p->pio, true);
+ p->offset = pio_add_program(p->pio, &ws2812_program);
+ ws2812_program_init(p->pio, p->pio_sm, p->offset, p->pin, 800000, p->rgbw);
+
+ for ( i=0; i<p->num_pixels; i++ ) {
+ p->pixelbuf[i] = 0;
+ }
+
}
int main()
{
DmxInput dmx_in;
- uint offset;
+ struct pixel_strip p1;
+ struct pixel_strip p2;
uint8_t dmxbuf[512];
- uint32_t pixelbuf[num_pixels];
int i;
int blink = 1;
+ p1.pin = 2;
+ p1.num_pixels = 8;
+ p1.rgbw = false;
+ p1.pio = pio0;
+
+ p2.pin = 3;
+ p2.num_pixels = 1;
+ p2.rgbw = true;
+ p2.pio = pio0;
+
/* Initialise DMX */
dmx_in.begin(dmx_rx_pin, 1, 512);
/* Initialise Neopixels */
- led_pio_sm = pio_claim_unused_sm(led_pio, true);
- offset = pio_add_program(led_pio, &ws2812_program);
- ws2812_program_init(led_pio, led_pio_sm, offset, pixels_pin, 800000, false);
+ init_pixel_strip(&p1);
+ init_pixel_strip(&p2);
+ int npx = 8;
/* Status LED */
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
- for ( i=0; i<num_pixels; i++ ) {
- pixelbuf[i] = 0x00000000; /* (W)GRB */
- }
-
while (1) {
dmx_in.read(dmxbuf);
- for ( i=0; i<num_pixels; i++) {
- pixelbuf[i] = urgb_u32(dmxbuf[1+3*i+0],
- dmxbuf[1+3*i+1],
- dmxbuf[1+3*i+2]);
+ int dmxpos = 1; /* Numbering starts at 1 */
+ for ( i=0; i<p1.num_pixels; i++) {
+ p1.pixelbuf[i] = urgb_u32(dmxbuf[dmxpos++],
+ dmxbuf[dmxpos++],
+ dmxbuf[dmxpos++]);
+ }
+ for ( i=0; i<p2.num_pixels; i++) {
+ p2.pixelbuf[i] = wrgb_u32(dmxbuf[dmxpos++],
+ dmxbuf[dmxpos++],
+ dmxbuf[dmxpos++],
+ dmxbuf[dmxpos++]);
}
- for ( i=0; i<num_pixels; i++) {
- put_pixel(pixelbuf[i]);
+ for ( i=0; i<npx; i++) {
+ put_pixel(&p1, p1.pixelbuf[i]);
+ put_pixel(&p2, p2.pixelbuf[i]);
}
gpio_put(PICO_DEFAULT_LED_PIN, blink);
blink = 1 - blink;
- //sleep_us(100000);
}
}