fix not sending last frame to LEDs

also, clarified comments a bit
This commit is contained in:
true 2025-04-23 19:53:59 -07:00
parent d8d2677f54
commit 8a0430f137

View File

@ -10,6 +10,9 @@
the resulting binary at time of porting takes an additional the resulting binary at time of porting takes an additional
531 bytes of flash and 8 bytes of SRAM. I do not know why. 531 bytes of flash and 8 bytes of SRAM. I do not know why.
but I suspect it is due to the inability to get -flto working
properly on libraries. oh well; can figure it out later.
operation workflow: operation workflow:
@ -17,21 +20,21 @@
- at initial reset (battery inserted), set up GPIO and peripherals. this - at initial reset (battery inserted), set up GPIO and peripherals. this
includes setting up button wake interrupt. sleep MCU into standby mode. includes setting up button wake interrupt. sleep MCU into standby mode.
- when button state changes, MCU will wake up and process the interrupt. - when button is pushed (pin goes low), MCU will wake up and process the
if button is pushed (btn gpio is low), prepare to run next RGB program. button interrupt. prepare to run next RGB program.
- rgb program setup involves turning on power to the LEDs and enabling - rgb program setup involves turning on power to the LEDs and enabling
TCB0 periodic timer to interrupt every ~61Hz. this timer interrupt TCB0 periodic timer to interrupt every ~61Hz. (this timer interrupt
does not handle the rgb program, but will wake the CPU which resumes does not handle the rgb program directly, but will wake the CPU which
processing in the loop() function. resumes processing in the loop() function.
- call the rgb program with the `init` parameter set to 1. idle the CPU. - call the rgb program with the `init` parameter set to 1. idle the CPU.
- rgb prog timer will interrupt every ~61Hz. this will wake the CPU and - rgb prog timer will interrupt every ~61Hz. this will wake the CPU and
send the previously rendered LED data, then call the rgb prog function. send the previously rendered LED data, then call the rgb prog function.
afterward, the CPU idles. process repeats until the rgb prog fn returns 0. afterward, the CPU idles. process repeats until the rgb program returns 0.
- every time the rgb program is run, the rgb data to send is updated. - every time the rgb program is run, the rgb data to send can be updated.
the data is not actually sent until next wakeup in less than 16.4ms. the data is not actually sent until next wakeup in less than 16.4ms.
this allows the functions to have variable processing time, but the this allows the functions to have variable processing time, but the
output to have a consistent ~61Hz (~16.4ms) timing. output to have a consistent ~61Hz (~16.4ms) timing.
@ -62,7 +65,8 @@
enum { enum {
RGB_IDLE, RGB_IDLE,
RGB_INIT, RGB_INIT,
RGB_RUNNING RGB_RUNNING,
RGB_STOPPING
}; };
enum { enum {
@ -140,7 +144,7 @@ void loop() {
rgb.show(); // send updates to the led rgb.show(); // send updates to the led
// then process the next program frame // then process the next program frame
if (!rgb_program[rgbprog_idx](PROG_RUN)) { if (!rgb_program[rgbprog_idx](PROG_RUN)) {
run_rgbprog = RGB_IDLE; // until the program says it's done run_rgbprog = RGB_STOPPING; // until the program says it's done
break; break;
} }
@ -149,6 +153,15 @@ void loop() {
break; break;
} }
case RGB_STOPPING: {
rgb.show(); // send final updates to the led
run_rgbprog = RGB_IDLE;
idle_cpu(); // we can idle CPU after running the program
break;
}
default: { // no longer running a program default: { // no longer running a program
disable_rgb_timer(); // disable RGB program timer, disable_rgb_timer(); // disable RGB program timer,
digitalWrite(PIN_LED_PWRENA, LOW); // disable LED power supply, digitalWrite(PIN_LED_PWRENA, LOW); // disable LED power supply,