From c763b55057c53dce22ddd98bc6376ce069d4c108 Mon Sep 17 00:00:00 2001 From: true Date: Sat, 9 May 2026 10:02:46 -0700 Subject: [PATCH] added alpha slash slash programs --- firmware/app/led/ledprog.c | 181 ++++++++++++++++++++++++++++++++++++- firmware/app/led/ledprog.h | 4 + firmware/app/led/matrix.c | 2 +- firmware/app/ui/temp_ui.c | 28 ++++-- 4 files changed, 206 insertions(+), 9 deletions(-) diff --git a/firmware/app/led/ledprog.c b/firmware/app/led/ledprog.c index 5f5d89e..aa58c3c 100644 --- a/firmware/app/led/ledprog.c +++ b/firmware/app/led/ledprog.c @@ -7,8 +7,7 @@ static uint32_t s[8] = {0}; -//static uint32_t t[8] = {0}; -//static uint32_t l[8] = {0}; +static uint32_t t[8] = {0}; @@ -135,4 +134,182 @@ void lp_ribbon_twinkle(uint8_t idle, uint8_t max, uint8_t thresh_lo, uint8_t thr } matrix_flag_update(); +} + + +void lp_aii_init() +{ + uint8_t i; + + for (i = 0; i < 8; i++) { + t[i] = 0; + } + + // also clear LEDs + for (int i = 0; i < sizeof(led_set.a); i++) { + led_set.a[i] = 0; + } + for (int i = 0; i < sizeof(led_set.ii_lf); i++) { + led_set.ii_lf[i] = 0; + led_set.ii_rt[i] = 0; + } + + matrix_flag_update(); +} + +void lp_aii_filldown(uint16_t prewait, uint16_t downrate, uint16_t postwait, uint8_t setrate, uint8_t max) +{ + /* + 0: state + 1: timeout + 2: index or setrate >>= 1 + */ + + uint32_t i; + uint32_t x; + + if (setrate == 1) + setrate = 2; + + switch (t[0]) { + case 0: // timeout before start + case 2: { // timeout after set + if (!t[1]) { + t[0]++; + t[2] = 0; + return; + } + + t[1]--; + + break; + } + + case 1: { // fill down + // rate delay + if (!t[1]) { + t[1] = downrate; + } else { + t[1]--; + break; + } + + x = t[2]++; + + // done filling? + if (x > 10) { + t[0]++; + t[1] = postwait; + } + + for (i = 0; i <= x; i++) { + led_set.a[9 + i] += setrate; + if (led_set.a[9 + i] > max) + led_set.a[9 + i] = max; + + led_set.a[9 - i] += setrate; + if (led_set.a[9 - i] > max) + led_set.a[9 - i] = max; + } + + break; + } + + case 3: { // fade out + x = 0; + t[2] = setrate >>= 1; + + for (i = 0; i < sizeof(led_set.a); i++) { + if (led_set.a[i] < setrate) { + led_set.a[i] = 0; + } else { + led_set.a[i] -= setrate; + x++; + } + } + + // all blank? + if (!x) { + t[0] = 0; + t[1] = prewait; + } + } + } + + for (i = 0; i < 5; i++) { + led_set.ii_lf[i] = led_set.ii_rt[i] = led_set.a[i + 12]; + } + + matrix_flag_update(); +} + +void lp_aii_bounce(uint8_t rate, uint8_t set, uint8_t faderate, uint8_t fadeamt) +{ + /* + 0: direction + 1: rate timeout + 2: faderate timeout + 3: index + 4: changedir timeout + */ + + uint8_t *a; + uint32_t i; + uint32_t x; + + if (!t[1]) { + if (t[4]) { + t[4]--; + if (t[4]) { + goto fadeout; + } + } + + t[1] = rate; + t[3]++; + + if (t[3] >= 19) { + t[0] ^= 1; + t[3] = 0; + t[4] = rate << 2; + } + + if (t[0]) { + x = 18 - t[3]; + } else { + x = t[3]; + } + + led_set.a[x] = set; + + if (t[3] >= 3) { + if (t[3] <= 7) { + led_set.ii_lf[7 - t[3]] = set >> 1; + } + } + if (t[3] >= 13) { + if (t[3] <= 17) { + led_set.ii_rt[t[3] - 13] = set >> 1; + } + } + } + + t[1]--; + +fadeout: + if (!t[2]) { + t[2] = faderate; + + a = (uint8_t *)&led_set.a; + for (i = 0; i < (sizeof(led_set.a) + sizeof(led_set.ii_lf) + sizeof(led_set.ii_rt)); i++) { + if (*a <= fadeamt) { + *a = 0; + } else { + *a -= fadeamt; + } + a++; + } + } + + t[2]--; } \ No newline at end of file diff --git a/firmware/app/led/ledprog.h b/firmware/app/led/ledprog.h index 43fa354..9f49901 100644 --- a/firmware/app/led/ledprog.h +++ b/firmware/app/led/ledprog.h @@ -11,6 +11,10 @@ void lp_ribbon_init(); void lp_ribbon_upward(uint16_t wait, uint16_t rate, uint8_t fade); void lp_ribbon_twinkle(uint8_t idle, uint8_t max, uint8_t thresh_lo, uint8_t thresh_hi); +void lp_aii_init(); +void lp_aii_filldown(uint16_t prewait, uint16_t downrate, uint16_t postwait, uint8_t setrate, uint8_t max); +void lp_aii_bounce(uint8_t rate, uint8_t set, uint8_t faderate, uint8_t fadeamt); + #endif /* __APP_LED_LEDPROG_H */ diff --git a/firmware/app/led/matrix.c b/firmware/app/led/matrix.c index a0e2baa..291f104 100644 --- a/firmware/app/led/matrix.c +++ b/firmware/app/led/matrix.c @@ -64,7 +64,7 @@ const LedMap led_map = { 34, 46, 58, 11, 23, 35, 47, 59, 12 }, .ii_lf = { // "//" left one - 61, 62, 63, 64, 44 + 67, 70, 71, 72, 44 // 61, 62, 63, 64, 44 }, .ii_rt = { // "//" right one 60, 48, 36, 24, 56 diff --git a/firmware/app/ui/temp_ui.c b/firmware/app/ui/temp_ui.c index 9c0a16c..d17928d 100644 --- a/firmware/app/ui/temp_ui.c +++ b/firmware/app/ui/temp_ui.c @@ -13,8 +13,7 @@ static uint32_t brt = 28; uint8_t ribbon_prog = 0; -uint8_t a_prog = 0; -uint8_t ii_prog = 0; +uint8_t aii_prog = 0; @@ -55,15 +54,18 @@ static void prog_set(uint8_t idx) break; } case 6: { // big crater - lp_ribbon_init(); + aii_prog = 1; + lp_aii_init(); break; } case 7: { // next to big crater - lp_ribbon_init(); + aii_prog = 2; + lp_aii_init(); break; } case 8: { // bottom crater - lp_ribbon_init(); + aii_prog = 0; + lp_aii_init(); break; } case 9: { // trio right @@ -107,8 +109,22 @@ void tempui_lp_runprog() break; } case 3: { - lp_ribbon_twinkle(3, 0x7f, 0x1f, 0xfd); + lp_ribbon_twinkle(3, 0x5f, 0x1f, 0xfd); break; } } + + switch (aii_prog) { + case 0: { + // do nothing + break; + } + case 1: { + lp_aii_filldown(800, 14, 1200, 3, 0x60); + break; + } + case 2: { + lp_aii_bounce(7, 0x3f, 2, 3); + } + } } \ No newline at end of file