Make module count dynamic
This commit is contained in:
parent
a862d0e9ff
commit
0fc6f787da
|
@ -10,12 +10,12 @@ struct Colour {
|
|||
int16_t red, green, blue; // value range is 0 to 255
|
||||
};
|
||||
|
||||
struct Colour curColour[NUM_MODULES];
|
||||
struct Colour targetColour[NUM_MODULES];
|
||||
struct Colour curColour[MAX_NUM_MODULES];
|
||||
struct Colour targetColour[MAX_NUM_MODULES];
|
||||
|
||||
void fader_init(void)
|
||||
{
|
||||
for(uint32_t i = 0; i < NUM_MODULES; i++) {
|
||||
for(uint32_t i = 0; i < ws2801_num_modules; i++) {
|
||||
curColour[i].red = targetColour[i].red = 0;
|
||||
curColour[i].green = targetColour[i].green = 0;
|
||||
curColour[i].blue = targetColour[i].blue = 0;
|
||||
|
@ -97,7 +97,7 @@ static void fade_colour(int16_t *cur, const int16_t *target, int *changed)
|
|||
|
||||
void fader_update(void)
|
||||
{
|
||||
for(uint32_t i = 0; i < NUM_MODULES; i++) {
|
||||
for(uint32_t i = 0; i < ws2801_num_modules; i++) {
|
||||
fade_colour(&(curColour[i].red), &(targetColour[i].red), &somethingChanged);
|
||||
fade_colour(&(curColour[i].green), &(targetColour[i].green), &somethingChanged);
|
||||
fade_colour(&(curColour[i].blue), &(targetColour[i].blue), &somethingChanged);
|
||||
|
|
|
@ -64,7 +64,7 @@ void setup()
|
|||
|
||||
ws2801_udp_setup();
|
||||
|
||||
for(int i = 0; i < NUM_MODULES; i++) {
|
||||
for(int i = 0; i < MAX_NUM_MODULES; i++) {
|
||||
fader_set_colour(i, 0, 0, 0);
|
||||
fader_fade_colour(i, 0, 255, 0);
|
||||
}
|
||||
|
@ -93,15 +93,15 @@ void loop()
|
|||
if((fader_loop % 200) == 0) {
|
||||
int round = (fader_loop / 200) % 3;
|
||||
if(round == 0) {
|
||||
for(int i = 0; i < NUM_MODULES; i++) {
|
||||
for(int i = 0; i < MAX_NUM_MODULES; i++) {
|
||||
fader_fade_colour(i, 255, 0, 0);
|
||||
}
|
||||
} else if(round == 1) {
|
||||
for(int i = 0; i < NUM_MODULES; i++) {
|
||||
for(int i = 0; i < MAX_NUM_MODULES; i++) {
|
||||
fader_fade_colour(i, 0, 255, 0);
|
||||
}
|
||||
} else {
|
||||
for(int i = 0; i < NUM_MODULES; i++) {
|
||||
for(int i = 0; i < MAX_NUM_MODULES; i++) {
|
||||
fader_fade_colour(i, 0, 0, 255);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,10 +2,14 @@
|
|||
|
||||
#include "ws2801.h"
|
||||
|
||||
uint8_t message[3 * NUM_MODULES];
|
||||
uint8_t message[3 * MAX_NUM_MODULES];
|
||||
|
||||
uint32_t ws2801_num_modules;
|
||||
|
||||
void ws2801_init(void)
|
||||
{
|
||||
ws2801_num_modules = MAX_NUM_MODULES;
|
||||
|
||||
SPI.begin();
|
||||
}
|
||||
|
||||
|
@ -20,10 +24,16 @@ void ws2801_send_update(void)
|
|||
{
|
||||
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
|
||||
|
||||
for(uint32_t i = 0; i < 3*NUM_MODULES; i++) {
|
||||
for(uint32_t i = 0; i < 3*ws2801_num_modules; i++) {
|
||||
SPI.transfer(message[i]);
|
||||
}
|
||||
|
||||
SPI.endTransaction();
|
||||
}
|
||||
|
||||
void ws2801_set_num_modules(uint32_t n)
|
||||
{
|
||||
if(n <= MAX_NUM_MODULES) {
|
||||
ws2801_num_modules = n;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,10 +3,13 @@
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
#define NUM_MODULES 32
|
||||
#define MAX_NUM_MODULES 255
|
||||
|
||||
extern uint32_t ws2801_num_modules;
|
||||
|
||||
void ws2801_init(void);
|
||||
void ws2801_set_colour(uint32_t module, uint8_t red, uint8_t green, uint8_t blue);
|
||||
void ws2801_send_update(void);
|
||||
void ws2801_set_num_modules(uint32_t n);
|
||||
|
||||
#endif // WS2801_H
|
||||
|
|
|
@ -16,7 +16,8 @@ enum {
|
|||
SET_COLOUR = 0,
|
||||
FADE_COLOUR = 1,
|
||||
ADD_COLOUR = 2,
|
||||
SET_FADESTEP = 3
|
||||
SET_FADESTEP = 3,
|
||||
SET_NUM_MODULES = 4
|
||||
};
|
||||
|
||||
void ws2801_udp_setup(void)
|
||||
|
@ -40,16 +41,6 @@ void ws2801_udp_loop(void)
|
|||
int packetSize = ws2801UDP.parsePacket();
|
||||
if(packetSize)
|
||||
{
|
||||
/*
|
||||
Serial.print("Received packet of size ");
|
||||
Serial.println(packetSize);
|
||||
Serial.print("From ");
|
||||
IPAddress remoteIp = ws2801UDP.remoteIP();
|
||||
Serial.print(remoteIp);
|
||||
Serial.print(", port ");
|
||||
Serial.println(ws2801UDP.remotePort());
|
||||
*/
|
||||
|
||||
// read the packet into packetBufffer
|
||||
while((len = ws2801UDP.read(cmd, WS2801_CMD_LEN)) == WS2801_CMD_LEN) {
|
||||
action = cmd[0];
|
||||
|
@ -58,7 +49,7 @@ void ws2801_udp_loop(void)
|
|||
g = cmd[3];
|
||||
b = cmd[4];
|
||||
|
||||
if(module >= NUM_MODULES) {
|
||||
if(module >= ws2801_num_modules) {
|
||||
// module index out of range
|
||||
continue;
|
||||
}
|
||||
|
@ -80,6 +71,10 @@ void ws2801_udp_loop(void)
|
|||
fader_set_fadestep(r); // red channel contains the fadestep in this case
|
||||
break;
|
||||
|
||||
case SET_NUM_MODULES:
|
||||
// red and green channels contain the number of modules, big endian
|
||||
ws2801_set_num_modules(((uint32_t)r << 16) + ((uint32_t)g << 8) + b);
|
||||
|
||||
default:
|
||||
//Serial.println("WS2801UDP: ERROR: invalid action received!");
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue