aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main/main.c44
1 files changed, 39 insertions, 5 deletions
diff --git a/main/main.c b/main/main.c
index ebfb8c7..c9d3f54 100644
--- a/main/main.c
+++ b/main/main.c
@@ -24,7 +24,11 @@
#define PWM_PERIOD 1000
// raises the brigtness value from 0-1 to this power
-#define BRIGHTNESS_CURVE_CORRECTION 3
+#define BRIGHTNESS_CURVE_CORRECTION 3.f
+
+// transition
+#define TRANSITION_DURATION_MS 300
+#define TRANSITION_STEP_LEN_MS 10
static const char *TAG = "rgbstrip";
int color[3];
@@ -36,6 +40,22 @@ const uint32_t pin_num[] = {GPIO_OUTPUT_CHANNEL_RED, GPIO_OUTPUT_CHANNEL_GREEN,
uint32_t duties[] = {0, 0, 0};
float phase[] = {0, 0, 0};
+int *transitionv;
+int transitionc;
+int transitioni;
+
+void update_color(int r, int g, int b) {
+ for(int i = 0; i < transitionc; i++) {
+ float weight2 = (float)(i + 1) / transitionc;
+ float weight1 = 1 - weight2;
+
+ transitionv[i * 3 + 0] = (int)((float)color[0] * weight1 + (float)r * weight2);
+ transitionv[i * 3 + 1] = (int)((float)color[1] * weight1 + (float)g * weight2);
+ transitionv[i * 3 + 2] = (int)((float)color[2] * weight1 + (float)b * weight2);
+ }
+ transitioni = 0;
+}
+
void update_strip() {
duties[0] = PWM_PERIOD - (int)( PWM_PERIOD * pow( (float)color[0] / 0xff, BRIGHTNESS_CURVE_CORRECTION ) );
duties[1] = PWM_PERIOD - (int)( PWM_PERIOD * pow( (float)color[1] / 0xff, BRIGHTNESS_CURVE_CORRECTION ) );
@@ -72,11 +92,12 @@ esp_err_t post_handler(httpd_req_t *req) {
char g_hex[] = {buf[2], buf[3], '\0'};
char b_hex[] = {buf[4], buf[5], '\0'};
- sscanf(r_hex, "%x", &color[0]);
- sscanf(g_hex, "%x", &color[1]);
- sscanf(b_hex, "%x", &color[2]);
+ int r, g, b;
+ sscanf(r_hex, "%x", &r);
+ sscanf(g_hex, "%x", &g);
+ sscanf(b_hex, "%x", &b);
- update_strip();
+ update_color(r, g, b);
httpd_resp_send_chunk(req, NULL, 0);
return ESP_OK;
@@ -137,5 +158,18 @@ void app_main() {
pwm_set_phases(phase);
pwm_start();
+ transitionc = TRANSITION_DURATION_MS / TRANSITION_STEP_LEN_MS;
+ transitionv = (int*) malloc(sizeof(int) * transitionc * 3);
+
server = start_webserver();
+
+ update_color(0, 0, 0);
+ for (;;) {
+ color[0] = transitionv[transitioni * 3 + 0];
+ color[1] = transitionv[transitioni * 3 + 1];
+ color[2] = transitionv[transitioni * 3 + 2];
+ update_strip();
+ vTaskDelay(TRANSITION_STEP_LEN_MS / portTICK_RATE_MS);
+ transitioni = MIN(transitionc - 1, transitioni + 1);
+ }
}