aboutsummaryrefslogtreecommitdiff
path: root/main/ws2812b_writer.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/ws2812b_writer.c')
-rw-r--r--main/ws2812b_writer.c54
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(&params->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);
}
}