New protocol for multiple strips

This commit is contained in:
Thomas Kolb 2018-08-14 21:52:33 +02:00
parent 0ae3492b82
commit d4e7d558bd
9 changed files with 40 additions and 40 deletions

View file

@ -1,5 +1,5 @@
LUA_CFLAGS=$(shell pkg-config --cflags lua) LUA_CFLAGS=$(shell pkg-config --cflags lua53)
LUA_LIBS=$(shell pkg-config --libs lua) LUA_LIBS=$(shell pkg-config --libs lua53)
CC=gcc CC=gcc
CFLAGS+=-O2 -Wall -march=native -pedantic -std=c99 -D_POSIX_C_SOURCE=20120607L -D_XOPEN_SOURCE $(LUA_CFLAGS) CFLAGS+=-O2 -Wall -march=native -pedantic -std=c99 -D_POSIX_C_SOURCE=20120607L -D_XOPEN_SOURCE $(LUA_CFLAGS)

View file

@ -16,13 +16,13 @@
// configuration variables for musiclight2 // configuration variables for musiclight2
// networking // networking
#define HOST "192.168.23.222" #define HOST "musiclight0.wiese.icmp.camp"
#define PORT 2703 #define PORT 2703
// FFT transformation parameters // FFT transformation parameters
#define FFT_EXPONENT 8 // ATTENTION: when you change this, run gen_lut.py with this value as argument #define FFT_EXPONENT 8 // ATTENTION: when you change this, run gen_lut.py with this value as argument
#define BLOCK_LEN (1 << FFT_EXPONENT) // 2^FFT_EXPONENT #define BLOCK_LEN (1 << FFT_EXPONENT) // 2^FFT_EXPONENT
#define SAMPLE_RATE 44100 #define SAMPLE_RATE 48000
#define DATALEN (BLOCK_LEN / 2) #define DATALEN (BLOCK_LEN / 2)
// Number of parts in the sample buffer // Number of parts in the sample buffer

View file

@ -1,7 +1,7 @@
WS2801_HOST = "zybot" WS2801_HOST = "10.42.6.183"
WS2801_PORT = 2703 WS2801_PORT = 2703
NUM_MODULES = 54 NUM_MODULES = 60
CENTER_MODULE = 54 CENTER_MODULE = 30
GAMMA = 2.0 GAMMA = 2.0

View file

@ -7,8 +7,8 @@ M = 2.3 -- mass
D = 1 -- spring strength D = 1 -- spring strength
DAMPING = {} -- filled in init() DAMPING = {} -- filled in init()
num_modules = 54 num_modules = 60
center_module = 54 center_module = 60
num_masses = math.floor(num_modules/2) num_masses = math.floor(num_modules/2)
excitement_pos = 1 excitement_pos = 1
@ -63,7 +63,7 @@ function periodic()
local whiteEnergy = get_energy_in_band(12000, 22000); local whiteEnergy = get_energy_in_band(12000, 22000);
local centerIndex = 2 * center_module + 1; local centerIndex = 2 * center_module + 1;
print(maxRedEnergy .. "\t" .. maxGreenEnergy .. "\t" .. maxBlueEnergy .. "\t" .. maxWhiteEnergy) --print(maxRedEnergy .. "\t" .. maxGreenEnergy .. "\t" .. maxBlueEnergy .. "\t" .. maxWhiteEnergy)
maxRedEnergy = maxRedEnergy * COOLDOWN_FACTOR maxRedEnergy = maxRedEnergy * COOLDOWN_FACTOR
if redEnergy > maxRedEnergy then if redEnergy > maxRedEnergy then
@ -170,7 +170,7 @@ end
function init(nmod, cmod) function init(nmod, cmod)
num_modules = nmod num_modules = nmod
center_module = cmod center_module = nmod --cmod
num_masses = nmod --math.floor(nmod/2) num_masses = nmod --math.floor(nmod/2)
excitement_pos = 1 excitement_pos = 1

34
main.c
View file

@ -36,6 +36,8 @@
// Number of new samples put into the buffer each frame // Number of new samples put into the buffer each frame
#define READ_SAMPLES (BLOCK_LEN / BUFFER_PARTS) #define READ_SAMPLES (BLOCK_LEN / BUFFER_PARTS)
#define NUM_SK6812 4
value_type fft[BLOCK_LEN]; value_type fft[BLOCK_LEN];
value_type rms; value_type rms;
value_type redEnergy, greenEnergy, blueEnergy; value_type redEnergy, greenEnergy, blueEnergy;
@ -45,7 +47,7 @@ sample signal[BLOCK_LEN];
sem_t fftSemaphore; sem_t fftSemaphore;
struct sk6812_ctx sk6812[3]; struct sk6812_ctx sk6812;
int running = 1; int running = 1;
@ -222,17 +224,13 @@ int main(int argc, char **argv) {
fadeStep = lua_tointeger(L, -1); fadeStep = lua_tointeger(L, -1);
useFading = fadeStep > 0; useFading = fadeStep > 0;
if(useFading) { if(useFading) {
for(int i = 0; i < 3; i++) { sk6812_set_fadestep(&sk6812, fadeStep);
sk6812_set_fadestep(&(sk6812[i]), fadeStep);
}
printf("Fading enabled with fadestep %i.\n", fadeStep); printf("Fading enabled with fadestep %i.\n", fadeStep);
} }
// initialize the WS2801 library // initialize the WS2801 library
printf("Connecting to %s:%i\n", host, port); printf("Connecting to %s:%i\n", host, port);
for(int i = 0; i < 3; i++) { sk6812_init(&sk6812, host, port);
sk6812_init(&(sk6812[i]), host, port + i);
}
// create semaphores // create semaphores
sem_init(&fftSemaphore, 0, 1); sem_init(&fftSemaphore, 0, 1);
@ -254,40 +252,38 @@ int main(int argc, char **argv) {
lua_readdoublearray(L, green, num_modules); lua_readdoublearray(L, green, num_modules);
lua_readdoublearray(L, red, num_modules); lua_readdoublearray(L, red, num_modules);
for(int s = 0; s < 3; s++) { for(int s = 0; s < NUM_SK6812; s++) {
if(useFading) { if(useFading) {
for(i = 0; i < num_modules; i++) { for(i = 0; i < num_modules; i++) {
sk6812_fade_color(&(sk6812[s]), i, sk6812_fade_color(&sk6812, s, i,
255 * gamma_correct(red[i], gamma), 255 * gamma_correct(red[i], gamma),
255 * gamma_correct(green[i], gamma), 255 * gamma_correct(green[i], gamma),
255 * gamma_correct(blue[i], gamma), 255 * gamma_correct(blue[i], gamma),
255 * gamma_correct(white[i], gamma)); 255 * gamma_correct(white[i], gamma));
} }
sk6812_commit(&(sk6812[s]));
} else { } else {
for(i = 0; i < num_modules; i++) { for(i = 0; i < num_modules; i++) {
sk6812_set_color(&(sk6812[s]), i, sk6812_set_color(&sk6812, s, i,
255 * gamma_correct(red[i], gamma), 255 * gamma_correct(red[i], gamma),
255 * gamma_correct(green[i], gamma), 255 * gamma_correct(green[i], gamma),
255 * gamma_correct(blue[i], gamma), 255 * gamma_correct(blue[i], gamma),
255 * gamma_correct(white[i], gamma)); 255 * gamma_correct(white[i], gamma));
} }
sk6812_commit(&(sk6812[s]));
} }
} }
sk6812_commit(&sk6812);
if(lastUpdateTime < nextFrame - 1) { if(lastUpdateTime < nextFrame - 1) {
printf("Idle for 1 second -> stopping updates.\n"); printf("Idle for 1 second -> stopping updates.\n");
for(i = 0; i < num_modules; i++) { for(i = 0; i < num_modules; i++) {
for(int s = 0; s < 3; s++) { for(int s = 0; s < NUM_SK6812; s++) {
sk6812_fade_color(&(sk6812[s]), i, 0, 0, 0, 20); sk6812_fade_color(&sk6812, s, i, 0, 0, 0, 20);
} }
} }
for(int s = 0; s < 3; s++) { sk6812_commit(&sk6812);
sk6812_commit(&(sk6812[s]));
}
active = 0; active = 0;
} }
@ -300,8 +296,8 @@ int main(int argc, char **argv) {
sleep_until(nextFrame); sleep_until(nextFrame);
} }
for(int i = 0; i < 3; i++) { for(int i = 0; i < NUM_SK6812; i++) {
sk6812_shutdown(&(sk6812[i])); sk6812_shutdown(&sk6812);
} }
// free arrays // free arrays

View file

@ -2,7 +2,7 @@ COOLDOWN_FACTOR = 0.9995
OVERDRIVE = 1.50 OVERDRIVE = 1.50
EXPONENT = 1.5 EXPONENT = 1.5
M = 1.3--1.7 -- mass M = 5.0--1.7 -- mass
D = 1 -- spring strength D = 1 -- spring strength
DAMPING = {} -- filled in init() DAMPING = {} -- filled in init()
@ -169,8 +169,8 @@ function init(nmod, cmod)
num_modules = nmod num_modules = nmod
center_module = cmod center_module = cmod
num_masses = math.floor(nmod/2) num_masses = math.floor(nmod)
excitement_pos = math.floor(cmod/2) excitement_pos = math.floor(cmod)
for i = 1,nmod do for i = 1,nmod do
red[i] = 0 red[i] = 0

View file

@ -1,4 +1,4 @@
#!/bin/sh #!/bin/sh
#dd if=/tmp/mpd.fifo bs=1024 | ./musiclight2 #dd if=/tmp/mpd.fifo bs=1024 | ./musiclight2
./musiclight2 $* < /tmp/musiclight.fifo ./musiclight2 $* < /tmp/mpd.fifo

View file

@ -62,9 +62,10 @@ int sk6812_init(struct sk6812_ctx *ctx, const char *host, unsigned short port) {
return 0; return 0;
} }
void sk6812_set_color(struct sk6812_ctx *ctx, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w) { void sk6812_set_color(struct sk6812_ctx *ctx, uint8_t strip, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w) {
ctx->packetQueue[ctx->queueIndex].action = SET_COLOR; ctx->packetQueue[ctx->queueIndex].action = SET_COLOR;
ctx->packetQueue[ctx->queueIndex].module = htons(module); ctx->packetQueue[ctx->queueIndex].module = htons(module);
ctx->packetQueue[ctx->queueIndex].strip = strip;
ctx->packetQueue[ctx->queueIndex].data[0] = r; ctx->packetQueue[ctx->queueIndex].data[0] = r;
ctx->packetQueue[ctx->queueIndex].data[1] = g; ctx->packetQueue[ctx->queueIndex].data[1] = g;
ctx->packetQueue[ctx->queueIndex].data[2] = b; ctx->packetQueue[ctx->queueIndex].data[2] = b;
@ -72,9 +73,10 @@ void sk6812_set_color(struct sk6812_ctx *ctx, uint16_t module, uint8_t r, uint8_
ctx->queueIndex++; ctx->queueIndex++;
} }
void sk6812_fade_color(struct sk6812_ctx *ctx, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w) { void sk6812_fade_color(struct sk6812_ctx *ctx, uint8_t strip, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w) {
ctx->packetQueue[ctx->queueIndex].action = FADE_COLOR; ctx->packetQueue[ctx->queueIndex].action = FADE_COLOR;
ctx->packetQueue[ctx->queueIndex].module = htons(module); ctx->packetQueue[ctx->queueIndex].module = htons(module);
ctx->packetQueue[ctx->queueIndex].strip = strip;
ctx->packetQueue[ctx->queueIndex].data[0] = r; ctx->packetQueue[ctx->queueIndex].data[0] = r;
ctx->packetQueue[ctx->queueIndex].data[1] = g; ctx->packetQueue[ctx->queueIndex].data[1] = g;
ctx->packetQueue[ctx->queueIndex].data[2] = b; ctx->packetQueue[ctx->queueIndex].data[2] = b;
@ -82,9 +84,10 @@ void sk6812_fade_color(struct sk6812_ctx *ctx, uint16_t module, uint8_t r, uint8
ctx->queueIndex++; ctx->queueIndex++;
} }
void sk6812_add_color(struct sk6812_ctx *ctx, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w) { void sk6812_add_color(struct sk6812_ctx *ctx, uint8_t strip, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w) {
ctx->packetQueue[ctx->queueIndex].action = ADD_COLOR; ctx->packetQueue[ctx->queueIndex].action = ADD_COLOR;
ctx->packetQueue[ctx->queueIndex].module = htons(module); ctx->packetQueue[ctx->queueIndex].module = htons(module);
ctx->packetQueue[ctx->queueIndex].strip = strip;
ctx->packetQueue[ctx->queueIndex].data[0] = r; ctx->packetQueue[ctx->queueIndex].data[0] = r;
ctx->packetQueue[ctx->queueIndex].data[1] = g; ctx->packetQueue[ctx->queueIndex].data[1] = g;
ctx->packetQueue[ctx->queueIndex].data[2] = b; ctx->packetQueue[ctx->queueIndex].data[2] = b;

View file

@ -13,6 +13,7 @@
struct __attribute__((__packed__)) SK6812Packet { struct __attribute__((__packed__)) SK6812Packet {
uint8_t action; uint8_t action;
uint8_t strip;
uint16_t module; uint16_t module;
uint8_t data[4]; uint8_t data[4];
}; };
@ -25,9 +26,9 @@ struct sk6812_ctx {
}; };
int sk6812_init(struct sk6812_ctx *ctx, const char *host, unsigned short port); int sk6812_init(struct sk6812_ctx *ctx, const char *host, unsigned short port);
void sk6812_set_color(struct sk6812_ctx *ctx, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w); void sk6812_set_color(struct sk6812_ctx *ctx, uint8_t strip, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w);
void sk6812_fade_color(struct sk6812_ctx *ctx, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w); void sk6812_fade_color(struct sk6812_ctx *ctx, uint8_t strip, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w);
void sk6812_add_color(struct sk6812_ctx *ctx, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w); void sk6812_add_color(struct sk6812_ctx *ctx, uint8_t strip, uint16_t module, uint8_t r, uint8_t g, uint8_t b, uint8_t w);
void sk6812_set_fadestep(struct sk6812_ctx *ctx, uint8_t fadestep); void sk6812_set_fadestep(struct sk6812_ctx *ctx, uint8_t fadestep);
int sk6812_commit(struct sk6812_ctx *ctx); int sk6812_commit(struct sk6812_ctx *ctx);
void sk6812_shutdown(struct sk6812_ctx *ctx); void sk6812_shutdown(struct sk6812_ctx *ctx);