diff options
Diffstat (limited to 'main/ws2812b_writer.c')
-rw-r--r-- | main/ws2812b_writer.c | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/main/ws2812b_writer.c b/main/ws2812b_writer.c index f7176f1..36fa666 100644 --- a/main/ws2812b_writer.c +++ b/main/ws2812b_writer.c @@ -3,6 +3,12 @@ #include <stdlib.h> #include <string.h> +const int NUMBER_PARAMS = +#define STATE_PARAM(...) +1 +#include "state_params.i" +#undef STATE_PARAM +; + #define SIZE 300 /* Returns round(sin(2πn / 256) * 127.5 + 127.5). */ @@ -21,11 +27,11 @@ uint8_t amp(uint8_t in, uint8_t n); void reset_parameters(ws_params_t* params) { memset(¶ms->state, 0, sizeof(params->state)); - params->state.brightness = 32; - params->state.off = 8; - params->state.timetick = 100; - params->state.power = 1; - params->state.n_snow = 2; + +#define STATE_PARAM(type, attr, displ, def, ...) \ + params->state. attr = def; +#include "state_params.i" +#undef STATE_PARAM } void calculate_colors( @@ -33,14 +39,18 @@ void calculate_colors( ws2812b_buffer_t* buffer) { uint32_t red = 0, green = 0, blue = 0; + int time; for (int i = 0; i < SIZE; ++i) { + int x = i * 255 / ws_params->state.x_scale; + time = ws_params->state.time; + if (!ws_params->state.power) { ws2812b_buffer_set_rgb(buffer, i, 0, 0, 0); continue; } - red = byte_scale(byte_sin(ws_params->state.time / 1000 + i * 4), 255 - ws_params->state.n_red) + + red = byte_scale(byte_sin(time / 1000 + x * 4), 255 - ws_params->state.n_red) + ws_params->state.n_red; green = 255 - red; @@ -56,11 +66,11 @@ void calculate_colors( if (ws_params->state.n_snow) { uint32_t white[] = { /* Parallax "snow" */ - ws_params->state.time / 179 + i * 8, - ws_params->state.time / 193 + i * 12, - ws_params->state.time / 211 + i * 16, - (ws_params->state.time) / 233 + i * 8, - // (ws_params->state.time + 128) / 233 + i * 8, + time / 179 + x * 8, + time / 193 + x * 12, + time / 211 + x * 16, + time / 233 + x * 8, + // (ws_params->state.time + 128) / 233 + x * 8, }; for (int i = 0; i < sizeof(white) / sizeof(uint32_t); ++i) { @@ -73,12 +83,22 @@ void calculate_colors( } } - ws2812b_buffer_set_rgb( - buffer, - i, - byte_scale(min(red + whitesum, 255), ws_params->state.brightness), - byte_scale(min(green + whitesum, 255), ws_params->state.brightness), - byte_scale(min(blue + whitesum, 255), ws_params->state.brightness)); + uint8_t brightness = ws_params->state.brightness; + red = min(red + whitesum, 255); + green = min(green + whitesum, 255); + blue = min(blue + whitesum, 255); + + if (ws_params->state.invert) { + red = 255 - red; + green = 255 - green; + blue = 255 - blue; + } + + red = byte_scale(red, brightness); + green = byte_scale(green, brightness); + blue = byte_scale(blue, brightness); + + ws2812b_buffer_set_rgb(buffer, i, red, green, blue); } } |