From 51239bffa7d9fd5bb80ce860d103df75af32e111 Mon Sep 17 00:00:00 2001 From: true Date: Fri, 2 Aug 2024 18:49:47 -0700 Subject: [PATCH] fix rgb program 1, 2, and 3 --- firmware/retro_tech_fw/user/src/config.c | 9 ++++ firmware/retro_tech_fw/user/src/led_rgbprog.c | 52 +++++++++++-------- firmware/retro_tech_fw/user/src/ui.c | 5 +- 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/firmware/retro_tech_fw/user/src/config.c b/firmware/retro_tech_fw/user/src/config.c index c50b2fe..6b91f2a 100644 --- a/firmware/retro_tech_fw/user/src/config.c +++ b/firmware/retro_tech_fw/user/src/config.c @@ -45,6 +45,15 @@ void userconf_load() userconf.ledprog_setting[0][0] = 2; // rainbow: angle top left to bottom right userconf.ledprog_setting[0][1] = 25; // rainbow: spacing + userconf.ledprog_setting[1][0] = 8; // lite then fade: fade rate + userconf.ledprog_setting[1][1] = 192; // lite then fade: hue + + userconf.ledprog_setting[2][0] = 255; // twinkle: saturation + userconf.ledprog_setting[2][1] = 4; // twinkle: intensity + + userconf.ledprog_setting[3][0] = 5; // alternate: offset in 22.5deg increments + userconf.ledprog_setting[3][1] = 244; // alternate: hue + userconf.checksum = checksum(); userconf.checkval = CHECKVAL; } diff --git a/firmware/retro_tech_fw/user/src/led_rgbprog.c b/firmware/retro_tech_fw/user/src/led_rgbprog.c index f687914..b82aec5 100644 --- a/firmware/retro_tech_fw/user/src/led_rgbprog.c +++ b/firmware/retro_tech_fw/user/src/led_rgbprog.c @@ -154,17 +154,17 @@ void led_rgb_1_lite_then_fade(uint8_t preview, uint8_t tick) i = 0; } - hue *= 6; - hsv2rgb_8b(hue, i, 255, &prog_rgb[0], &prog_rgb[1], &prog_rgb[2]); + hsv2rgb_8b(hue * 6, i, 255, &prog_rgb[0], &prog_rgb[1], &prog_rgb[2]); // make the rate adjustment a bit more intuitive if (rate >= 254) rate = 255; else rate >>= 2; + rate++; // fade out anything that's already lit at user's rate for (i = 0; i < 9; i++) { if (lite_persist[i]) lite_persist[i]--; - else for (j = 0; j < 2; j++) { + else for (j = 0; j < 3; j++) { if (rgb[i][j] > rate) rgb[i][j] -= rate; else rgb[i][j] = 0; } } @@ -201,6 +201,8 @@ void led_rgb_1_lite_then_fade(uint8_t preview, uint8_t tick) for (i = start; i < end; i++) { rgb[i][0] = prog_rgb[0]; + rgb[i][1] = prog_rgb[1]; + rgb[i][2] = prog_rgb[2]; lite_persist[i] = LITE_PERSIST; } } @@ -224,6 +226,8 @@ void led_rgb_1_lite_then_fade(uint8_t preview, uint8_t tick) if (lite_idx == end) { lite_timeout = LITE_IDLE_DWELL; } + + led_is_updated(); } lite_timeout--; @@ -238,7 +242,7 @@ void led_rgb_1_lite_then_fade(uint8_t preview, uint8_t tick) */ #define TWINKLE_PERSIST 3; -#define TWINKLE_RGB_VAL 240 +#define TWINKLE_RGB_VAL 255 uint8_t twinkle_set[9] = {0}; void led_rgb_2_twinkle(uint8_t preview, uint8_t tick) @@ -248,26 +252,28 @@ void led_rgb_2_twinkle(uint8_t preview, uint8_t tick) uint8_t sat; // set - rnd = prng_get8(); - if (rnd >= userconf.ledprog_setting[2][1]) { - // yup, we're doing it - rnd = prng_get16(); - rnd *= 1536; - rnd <<= 16; + if ((tick & 3) == 0) { + rnd = prng_get8(); + if (rnd < userconf.ledprog_setting[2][1]) { + // yup, we're doing it + rnd = prng_get16(); + rnd *= 1536; + rnd >>= 16; - sat = userconf.ledprog_setting[2][0]; - if (sat >= 128) sat = 128 - (sat - 128); - sat <<= 1; + sat = userconf.ledprog_setting[2][0]; + if (sat >= 128) sat = 128 - (sat - 128); + sat <<= 1; - hsv2rgb_8b(rnd, sat, TWINKLE_RGB_VAL, &prog_rgb[0], &prog_rgb[1], &prog_rgb[2]); + hsv2rgb_8b(rnd, sat, TWINKLE_RGB_VAL, &prog_rgb[0], &prog_rgb[1], &prog_rgb[2]); - rnd = prng_get16() & 0xfff; - rnd /= 455; + rnd = prng_get16() & 0xfff; + rnd /= 455; - rgb[rnd][0] = prog_rgb[0]; - rgb[rnd][1] = prog_rgb[1]; - rgb[rnd][2] = prog_rgb[2]; - twinkle_set[rnd] = TWINKLE_PERSIST; + rgb[rnd][0] = prog_rgb[0]; + rgb[rnd][1] = prog_rgb[1]; + rgb[rnd][2] = prog_rgb[2]; + twinkle_set[rnd] = TWINKLE_PERSIST; + } } // decay @@ -278,6 +284,8 @@ void led_rgb_2_twinkle(uint8_t preview, uint8_t tick) else rgb[i][j] >>= 1; } } + + led_is_updated(); } /* @@ -292,7 +300,7 @@ void led_rgb_3_alternate(uint8_t preview, uint8_t tick) uint8_t i, j; uint16_t hue = userconf.ledprog_setting[3][1] * 6; - uint8_t offset = (userconf.ledprog_setting[3][0] & 0xf) * 16 * 6; + uint16_t offset = (userconf.ledprog_setting[3][0] & 0xf) * 16 * 6; uint8_t is_flashing = 0; @@ -307,6 +315,8 @@ void led_rgb_3_alternate(uint8_t preview, uint8_t tick) } } + // don't need to update flashing state. this is handled by the cursor + // set hues for (i = 0; i < 2; i++) { hsv2rgb_8b(hue, 255, 255, &prog_rgb[0], &prog_rgb[1], &prog_rgb[2]); diff --git a/firmware/retro_tech_fw/user/src/ui.c b/firmware/retro_tech_fw/user/src/ui.c index 740c5d0..9c9e024 100644 --- a/firmware/retro_tech_fw/user/src/ui.c +++ b/firmware/retro_tech_fw/user/src/ui.c @@ -485,12 +485,13 @@ void ui_render() } // actually run the program - led_rgbprog[rgb_prog_idx - 1](LED_RGBPROG_NORMAL, tick); + led_rgbprog[rgb_prog_idx](LED_RGBPROG_NORMAL, tick); } } // temp: remove me once buttons are tested and working - led_rgbprog[0](LED_RGBPROG_NORMAL, tick); + rgb_prog_idx = 4; + led_rgbprog[rgb_prog_idx](LED_RGBPROG_NORMAL, tick); break; }