#include <ArduinoJson.h>
#include <SD.h>
#include <SPI.h>
#include <FastLED.h>
#include <StreamUtils.h>
#define MAX_ANIMATION_FRAMES_ACCEPTED (5)
#define LED_NUM (1024)
#define RGB_NUM (3)
#define DATA_PIN 26
struct Config {
uint8_t width;
uint8_t height;
uint8_t frames;
uint8_t animation[MAX_ANIMATION_FRAMES_ACCEPTED][LED_NUM][RGB_NUM];
};
char filePath[256] = { 0 };
char fileName[256] = { 0 };
File root,gifFile;
Config config;
CRGB leds[LED_NUM];
void loadConfiguration(const char *filename, Config &config) {
File file = SD.open(filename);
StaticJsonDocument<262144> doc;
// DeserializationError error = deserializeJson(doc, file);
// if (error)
// Serial.println(F("Failed to read file, using default configuration"));
ReadBufferingStream bufferedFile(file, 64);
deserializeJson(doc, bufferedFile);
config.width = doc["width"];
config.height = doc["height"];
config.frames = doc["frames"];
for(uint8_t j = 0; j < config.frames; j++){
JsonArray curr_frame = doc["animation"][j];
for(uint16_t i = 0; i < 1024; i++){
JsonArray curr_led = curr_frame[i];
config.animation[j][i][0] = curr_led[0];
config.animation[j][i][1] = curr_led[1];
config.animation[j][i][2] = curr_led[2];
}
}
file.close();
}
void setup() {
Serial.begin(115200);
while (!Serial) continue;
while (!SD.begin()) {
Serial.println(F("Failed to initialize SD library"));
delay(1000);
}
FastLED.addLeds<WS2812B,DATA_PIN,GRB>(leds, LED_NUM);
FastLED.setBrightness(100);
FastLED.setCorrection(TypicalLEDStrip);
FastLED.clear();
}
void loop() {
while(1){
root = SD.open("/");
if(root){
gifFile = root.openNextFile();
while(gifFile)
{
if (!gifFile.isDirectory()) // play it
{
memset(fileName, 0x0, sizeof(fileName));
strcpy(fileName, gifFile.name());
snprintf(filePath, sizeof(filePath)+1, "/%s", fileName);
loadConfiguration(filePath, config);
for(uint8_t k = 0; k < 8; k++){
for(uint8_t j = 0; j < config.frames; j++){
FastLED.clear();
for(uint16_t i = 0; i < LED_NUM; i++) {
leds[i].r = pgm_read_dword(&(config.animation[j][i][0]));
leds[i].g = pgm_read_dword(&(config.animation[j][i][1]));
leds[i].b = pgm_read_dword(&(config.animation[j][i][2]));
}
FastLED.show();
delay(300);
}
}
}
gifFile.close();
gifFile = root.openNextFile();
}
root.close();
}
}
delay(1000);
}