From 185578ad8d598e296d1a61367a5a412045b1caeb Mon Sep 17 00:00:00 2001 From: true Date: Fri, 2 Aug 2024 17:33:40 -0700 Subject: [PATCH] fix LEDs lighting, and fix up first RGB program --- firmware/retro_tech_fw/user/src/led.c | 12 +++--- firmware/retro_tech_fw/user/src/led_rgbprog.c | 40 ++++++++----------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/firmware/retro_tech_fw/user/src/led.c b/firmware/retro_tech_fw/user/src/led.c index a402f28..052bfe8 100644 --- a/firmware/retro_tech_fw/user/src/led.c +++ b/firmware/retro_tech_fw/user/src/led.c @@ -12,8 +12,8 @@ -const uint8_t rgb_map[9] = {0x04, 0x14, 0x01, 0x11, 0x07, 0x0a, 0x1a, 0x0d, 0x1d}; -const uint8_t cursor_map[3] = {0x17, 0x18, 0x19}; +static const uint8_t rgb_map[9] = {0x04, 0x14, 0x01, 0x11, 0x07, 0x0a, 0x1a, 0x0d, 0x1d}; +static const uint8_t cursor_map[3] = {0x17, 0x18, 0x19}; @@ -45,15 +45,17 @@ void led_is_updated() void led_send() { uint8_t i; + uint8_t o; uint8_t out[16*2]; // only render when there's something to render if (led_updated) { // stuff RGB outputs for (i = 0; i < 9; i++) { - out[rgb_map[i] + 0] = rgb[i][0]; - out[rgb_map[i] + 1] = rgb[i][1]; - out[rgb_map[i] + 2] = rgb[i][2]; + o = (rgb_map[i] - 1) & 0x1f; + out[o + 0] = rgb[i][0]; + out[o + 1] = rgb[i][1]; + out[o + 2] = rgb[i][2]; } // stuff cursor outputs diff --git a/firmware/retro_tech_fw/user/src/led_rgbprog.c b/firmware/retro_tech_fw/user/src/led_rgbprog.c index ab50f38..f687914 100644 --- a/firmware/retro_tech_fw/user/src/led_rgbprog.c +++ b/firmware/retro_tech_fw/user/src/led_rgbprog.c @@ -62,22 +62,6 @@ static const uint8_t rainbow_angles[8][5] = { 0x00, 0x00} // bottom to top }; -static void rainbow_letter_next() -{ - uint16_t h; - - // add to our hue - h = userconf.ledprog_setting[0][1]; - h <<= 2; - - rainbow_hue += h; - rainbow_hue++; - rainbow_hue %= 256*6; - - // make a color out of it - hsv2rgb_8b(rainbow_hue, 255, 255, &prog_rgb[0], &prog_rgb[1], &prog_rgb[2]); -} - void led_rgb_0_rainbow(uint8_t preview, uint8_t tick) { uint8_t i, j; // iterator @@ -86,6 +70,8 @@ void led_rgb_0_rainbow(uint8_t preview, uint8_t tick) uint8_t max; // max number of iterations for this angle uint8_t angle; // fill direction from LUT + uint16_t hoff; + // run at half framerate if (tick & 1) { // no matter what, this puke is getting updated @@ -96,22 +82,24 @@ void led_rgb_0_rainbow(uint8_t preview, uint8_t tick) angle &= 0x7; max = rainbow_angles[angle][2] & 0x7; + hoff = userconf.ledprog_setting[0][1]; + hoff <<= 2; + hoff = (256*6) - hoff; + // process outputs for (i = 0; i <= max; i++) { // get the next puke - rainbow_letter_next(); + hsv2rgb_8b((rainbow_hue + (hoff * i)) % (256*6), 255, 255, + &prog_rgb[0], &prog_rgb[1], &prog_rgb[2]); // apply to next set of LEDs n = 0; for (j = 0; j < 9; j++) { - n++; - if (j == 5) n++; // nybble index - idx = rainbow_angles[angle][n >> 1]; // get mask byte - if ((n & 1) == 0) idx >>= 4; // shift even values over + if (!(n & 1)) idx >>= 4; // shift even numbered LED index over idx &= 0x7; // mask lowest 3 bits - if (idx == i) { // is this LED part of this pattern? + if (i == idx) { // is this LED part of this pattern at this index? if (preview) { // are we in preview mode? if (j != 0) { // is the first letter not the one selected? if ((preview & 0x7f) == 0) {// is this preview selected? @@ -119,12 +107,18 @@ void led_rgb_0_rainbow(uint8_t preview, uint8_t tick) } } else return; // preview is not selected, so we're done here } - rgb[j][0] = prog_rgb[0]; // if so, copy the values + rgb[j][0] = prog_rgb[0]; // if so, copy the values rgb[j][1] = prog_rgb[1]; rgb[j][2] = prog_rgb[2]; } + + n++; // nybble index + if (n == 5) n++; // skip the 6th nybble; this indicates the max } } + + rainbow_hue += 2; + rainbow_hue %= (256*6); } }