diff --git a/firmware/src/gfx_decoder.cpp b/firmware/src/gfx_decoder.cpp index 8e59ee9..1520b9c 100644 --- a/firmware/src/gfx_decoder.cpp +++ b/firmware/src/gfx_decoder.cpp @@ -46,3 +46,14 @@ bool gfx_decoder_loadNextFrame() { free(buffer); return true; } + +unsigned long frameLastChangedAt = 0; + +bool gfx_decoder_handleLoop() { + auto now = millis(); + if (now - frameLastChangedAt > MS_PER_FRAME) { + frameLastChangedAt = now; + return gfx_decoder_loadNextFrame(); + } + return true; +} diff --git a/firmware/src/gfx_decoder.h b/firmware/src/gfx_decoder.h index 3958ff4..cbce7ac 100644 --- a/firmware/src/gfx_decoder.h +++ b/firmware/src/gfx_decoder.h @@ -9,5 +9,6 @@ extern uint16_t frameCount; extern uint8_t gfxFrameBuffer[2048]; bool gfx_decoder_loadNextFrame(); +bool gfx_decoder_handleLoop(); #endif diff --git a/firmware/src/leds.cpp b/firmware/src/leds.cpp index ae7b2b9..67c23ca 100644 --- a/firmware/src/leds.cpp +++ b/firmware/src/leds.cpp @@ -20,10 +20,6 @@ inline void outputEnable(uint8_t pin, bool enable) { gpio_put(pin, !enable); } -uint16_t frameIndex = 0; -uint16_t lastRenderedFrameIndex = 0; -unsigned long frameLastChangedAt; - // we have 4-bit color depth, so 16 levels of brightness // we go from phase 0 to phase 3 uint8_t brightnessPhase = 0; @@ -61,10 +57,6 @@ void leds_init() { clearShiftReg(ROW_SRCLK, ROW_SRCLR); pulsePin(ROW_RCLK); - // clear frames - frameIndex = 0; - frameLastChangedAt = millis(); - /* // launch core1 // NOTE: For some reason, without delay, core1 doesn't start? diff --git a/firmware/src/main.cpp b/firmware/src/main.cpp index 8ee0a2f..296405e 100644 --- a/firmware/src/main.cpp +++ b/firmware/src/main.cpp @@ -23,10 +23,7 @@ void setup() { setupSD(); - // // sd_getAudio(); - // sd_getGfx(); - - // return; + sd_loadAudio(); if (!sd_loadGfxFrameLengths()) { Serial.println("Failed to load gfx frame lengths"); @@ -40,26 +37,24 @@ void setup() { } void loop() { - if (Serial.available() > 0) { - char c = Serial.read(); - if (c == 'p') { - Serial.println("Paused. Press any key to continue."); - leds_disable(); - while (Serial.available() == 0) { - Serial.read(); - delay(50); - } - Serial.println("Continuing..."); - } - } + sd_loadNextAudio(); + // if (Serial.available() > 0) { + // char c = Serial.read(); + // if (c == 'p') { + // Serial.println("Paused. Press any key to continue."); + // leds_disable(); + // while (Serial.available() == 0) { + // Serial.read(); + // delay(50); + // } + // Serial.println("Continuing..."); + // } + // } - if (!gfx_decoder_loadNextFrame()) { + if (!gfx_decoder_handleLoop()) { Serial.println("Failed to load frame..."); } leds_render(); - leds_render(); - leds_render(); - leds_render(); } diff --git a/firmware/src/sd.cpp b/firmware/src/sd.cpp index 9e770b5..a32dec9 100644 --- a/firmware/src/sd.cpp +++ b/firmware/src/sd.cpp @@ -156,54 +156,53 @@ void printSDStats(RP2040_SdVolume volume) { Serial.println((float)volumesize / 1024.0); } -File file; +File audioFile; -void sd_getAudio() { +void sd_loadAudio() { if (!SD.exists("/badapple/audio.bin")) { Serial.println("Audio not found :("); return; } - if (file) { - file.close(); + if (audioFile) { + audioFile.close(); } - file = SD.open("/badapple/audio.bin", FILE_READ); + audioFile = SD.open("/badapple/audio.bin", FILE_READ); Serial.println("Audio file opened"); audio_stop(); // load two buffers' worth of audio - if (file.read(&wav_buffer_0, BUFFER_LEN) < BUFFER_LEN) { + if (audioFile.read(&wav_buffer_0, BUFFER_LEN) < BUFFER_LEN) { Serial.println("Could not read first sample"); return; } - if (file.read(&wav_buffer_1, BUFFER_LEN) < BUFFER_LEN) { + if (audioFile.read(&wav_buffer_1, BUFFER_LEN) < BUFFER_LEN) { Serial.println("Could not read second sample"); return; } audio_start(); +} - while (true) { - if (!next_buffer_requested) { - delay(50); - continue; - } - next_buffer_requested = false; +void sd_loadNextAudio() { + if (!next_buffer_requested) { + return; + } + next_buffer_requested = false; - auto next_buffer = wav_buffer1_active ? &wav_buffer_0 : &wav_buffer_1; - auto bytesRead = file.read(next_buffer, BUFFER_LEN); + auto next_buffer = wav_buffer1_active ? &wav_buffer_0 : &wav_buffer_1; + auto bytesRead = audioFile.read(next_buffer, BUFFER_LEN); - if (bytesRead < BUFFER_LEN) { - Serial.println("End of audio file"); - file.seek(0); - } else { - Serial.print("Read "); - Serial.print(bytesRead); - Serial.println(" bytes from audio file"); - } + if (bytesRead < BUFFER_LEN) { + Serial.println("End of audio file, rewinding..."); + audioFile.seek(0); + } else { + Serial.print("Read "); + Serial.print(bytesRead); + Serial.println(" bytes from audio file"); } } diff --git a/firmware/src/sd.h b/firmware/src/sd.h index b6eddd5..ee49952 100644 --- a/firmware/src/sd.h +++ b/firmware/src/sd.h @@ -5,7 +5,8 @@ void setupSD(); bool isSDCardInserted(); -void sd_getAudio(); +void sd_loadAudio(); +void sd_loadNextAudio(); bool sd_loadGfxFrameLengths(); bool sd_loadGfxBlob(); int32_t sd_loadNextFrame();