#include <SD.h>
#include "conf.h"
#include <ArduinoJson.h>
#define CS_PIN 5
PlayList AlTime[24];
File root;
char * times[24];
char timess[24][200];
void getTimeList(File file)
{
String finStr;
char v[7];
if (file)
{
int count = 0;
while (file.available())
{
if (file.peek() == '\n')
{
char str[200];
strcpy(str, finStr.c_str());
// Serial.println(str);
strtok(str, "|");
AlTime[count].isPlay = (strcmp(strtok(NULL, "|"), "1") == 0 ? true : false);
for (size_t i = 0; i < PL_len; i++)
{
// memset(v, 0, sizeof(v));
for (size_t ii = 0; ii < 4; ii++)
{
strcpy(v, strtok(NULL, "|"));
if (strcmp(v, "#") == 0) {
// Serial.println("----------------");
goto XX;
}
switch (ii)
{
case 0:
AlTime[count].songconf[i].isPlay = atoi(v);
break;
case 1:
strcpy(AlTime[count].songconf[i].Folder, v);
break;
case 2:
AlTime[count].songconf[i].Count = atoi(v);
break;
case 3:
strcpy(AlTime[count].songconf[i].File, v);
break;
}
// Serial.print(v);
// Serial.print("|");
}
}
XX:
count++;
file.read();
finStr = "";
}
else
{
finStr += (char)file.read();
}
}
finStr = "";
file.close();
}
else
{
Serial.println("error opening file");
}
}
void writenewFile(File newFile) {
String pr;
char t[3];
if (newFile)
{
for (int i = 0; i < 24 ; i++)
{
sprintf(t, "%02d", i + 1);
pr += (char*)t;
pr += "|";
pr += AlTime[i].isPlay;
pr += "|";
for (size_t x = 0; x < PL_len; x++)
{
if (AlTime[i].songconf[x].isPlay == -1) break;
pr += AlTime[i].songconf[x].isPlay;
pr += "|";
pr += (char*)AlTime[i].songconf[x].Folder;
pr += "|";
pr += AlTime[i].songconf[x].Count;
pr += "|";
pr += (char*)AlTime[i].songconf[x].File;
pr += "|";
}
pr += "#|";
Serial.println(pr);
newFile.println(pr);
pr = "";
}
Serial.println("#EOF");
newFile.println("#EOF");
newFile.close();
}
}
void setup() {
Serial.begin(115200);
Serial.print("Initializing SD card... ");
if (!SD.begin(CS_PIN)) {
Serial.println("Card initialization failed!");
while (true);
}
Serial.println("initialization done.");
Serial.println("Files in the card:");
root = SD.open("/");
printDirectory(root, 0);
Serial.println("");
// File textFile = SD.open("/wokwi.txt");
// getTimeList(textFile);
// textFile.close();
// File newFile = SD.open("/wokwi.txt");
// writenewFile(newFile);
// Serial.println("Finish");
// newFile = SD.open("/wokwi.txt");
// while (newFile.available())
// {
// Serial.write(newFile.read());;
// }
// newFile.close();
// JsontoConfig();
getFilesList();
}
void loop() {
delay(100);
// nothing happens after setup finishes.
}
// template <size_t N>
void ConfigJson()
{
DynamicJsonDocument doc(2048);
for (PlayList v : AlTime)
{
JsonObject _PlayList = doc["PlayList"].createNestedObject();
_PlayList["isPlay"] = v.isPlay;
for (SongConfig s : v.songconf)
{
JsonObject _SongConfig = _PlayList["SongConfig"].createNestedObject();
_SongConfig["isPlay"] = s.isPlay; // int
_SongConfig["Folder"] = s.Folder; // char
_SongConfig["Count"] = s.Count; // int
_SongConfig["File"] = s.File; // char
}
}
serializeJson(doc, Serial);
Serial.println(sizeof(doc));
}
void JsontoConfig()
{
File file = SD.open("/wokwi.txt");
DynamicJsonDocument doc(2048); // Adjust the capacity as needed
deserializeJson(doc, file);
file.close();
JsonArray alar = doc["PlayList"];
JsonObject v = alar[0];
// for (JsonObject v : alar)
// {
for (JsonPair x : v["SongConfig"].as<JsonObject>())
{
Serial.println(x.key().c_str());
// for (JsonPair kv : x.as<JsonObject>()) {
// Serial.println(kv.key().c_str());
// }
}
// }
// for (size_t xi = 0; xi < alar.size(); xi++)
// {
// AlTime[xi].isPlay = alar[xi]["isPlay"];
// for (size_t xj = 0; xj < alar[xi]["SongConfig"].size(); xj++)
// {
// AlTime[xi].songconf[xj].isPlay = alar[xi]["SongConfig"][xj]["isPlay"].as<int>();
// strlcpy(AlTime[xi].songconf[xj].Folder, alar[xi]["SongConfig"][xj]["Folder"], 8);
// AlTime[xi].songconf[xj].Count = alar[xi]["SongConfig"][xj]["Count"].as<int>();
// strlcpy(AlTime[xi].songconf[xj].File, alar[xi]["SongConfig"][xj]["File"], 8);
// }
// }
doc.clear();
Serial.println("Done");
}
void json2config()
{
File file = SD.open("/wokwi.txt");
DynamicJsonDocument doc(2048);
deserializeJson(doc, file);
file.close();
JsonArray pl = doc["PlayList"];
for (size_t i = 0; i < pl.size(); i++)
{
int j = 0;
AlTime[i].isPlay = pl[i]["isPlay"];
for (JsonPair x : pl[i]["SongConfig"].as<JsonObject>())
{
// Serial.println(x.key().c_str());
AlTime[i].songconf[j].isPlay = true;
sprintf(AlTime[i].songconf[j].Folder, x.key().c_str());
AlTime[i].songconf[j].Count = x.value()[1].as<int>();
sprintf(AlTime[i].songconf[j].File, x.value()[2].as<const char *>());
j++;
}
}
Serial.println(("Result : "));
// for (size_t i = 0; i < (sizeof(AlTime)/sizeof(AlTime[0])); i++)
// {
// AlTime[i].isPlay = pl[i]["isPlay"];
// Serial.print("isPlay");
// Serial.println(AlTime[i].isPlay ? "True" : "False");
// for (size_t j = 0; j < (sizeof(AlTime[i].songconf)/sizeof(AlTime[i].songconf[0])); j++)
// {
// if(AlTime[i].songconf[j].isPlay == true)
// {
// Serial.print(AlTime[i].songconf[j].isPlay ? "True " : "False ");
// Serial.print(AlTime[i].songconf[j].Folder);Serial.print(" : [");
// Serial.print(AlTime[i].songconf[j].Count); Serial.print(", ");
// Serial.print(AlTime[i].songconf[j].File); Serial.println("]");
// }
// }
// }
for (size_t i = 0; i < (sizeof(AlTime) / sizeof(AlTime[0])); i++)
{
pl[i]["isPlay"] = AlTime[i].isPlay;
for (size_t j = 0; j < (sizeof(AlTime[i].songconf) / sizeof(AlTime[i].songconf[0])); j++)
{
if (AlTime[i].songconf[j].isPlay == true)
{
JsonArray sc = pl[i]["SongConfig"][AlTime[i].songconf[j].Folder];
sc.remove(1); sc.remove(1);
sc.add(AlTime[i].songconf[j].Count);
sc.add(AlTime[i].songconf[j].File);
// Serial.print(AlTime[i].songconf[j].isPlay ? "True " : "False ");
// Serial.print(AlTime[i].songconf[j].Folder);Serial.print(" : [");
// Serial.print(AlTime[i].songconf[j].Count); Serial.print(", ");
// Serial.print(AlTime[i].songconf[j].File); Serial.println("]");
}
}
}
serializeJson(doc, Serial);
doc.clear();
Serial.println("Done");
}
void getFilesList()
{
File file = SD.open("/wokwi.txt");
DynamicJsonDocument doc(2048);
deserializeJson(doc, file);
file.close();
JsonObject fC = doc["FolderConfig"];
DynamicJsonDocument fileList(2048);
JsonArray _FileList = fileList.createNestedArray("SN1");
File SN1 = SD.open("/");
SN1.rewindDirectory();
while (true)
{
File entry = SN1.openNextFile();
if (!entry) {
break;
}
if (entry.isDirectory() || !isMp3File(entry.name()))
{
continue;
}
String fname = entry.name();
Serial.println(fname);
_FileList.add(fname);
entry.close();
}
SN1.close();
Serial.println(_FileList.size());
serializeJson(fileList, Serial);
// for(JsonPair x : fC)
// {
// const char* Fn = x.key().c_str();
// Serial.println(Fn);
// }
}
bool isMp3File(const char *filename)
{
bool result = false;
if (strcmp(strrchr(filename, '.'), ".txt") == 0 || strcmp(strrchr(filename, '.'), ".MP3") == 0)
result = true;
return result;
}
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
// void getTimeList(char list[24][200], File file)
// void getTimeList(File file)
// {
// String finStr;
// if (file) {
// int count = 0;
// while (file.available() ) {
// if (file.peek() == '\n') {
// char str[150];
// strcpy(str, finStr.c_str());
// // Serial.println(str);
// Serial.println(strtok(str, "|"));
// AlTime[count].isPlay = (strcmp(strtok(NULL, "|"),"1") == 0 ? true : false);
// strtok(NULL, "|");
// AlTime[count].StartSong1.isPlay = (strcmp(strtok(NULL, "|"),"1") == 0 ? true : false);
// strcpy(AlTime[count].StartSong1.Folder, strtok(NULL, "|"));
// strcpy(AlTime[count].StartSong1.File, strtok(NULL, "|"));
// strtok(NULL, "|");
// AlTime[count].timeAudio.isPlay = (strcmp(strtok(NULL, "|"),"1") == 0 ? true : false);
// strcpy(AlTime[count].timeAudio.Folder, strtok(NULL, "|"));
// strcpy(AlTime[count].timeAudio.File, strtok(NULL, "|"));
// strtok(NULL, "|");
// AlTime[count].monthAudio.isPlay = (strcmp(strtok(NULL, "|"),"1") == 0 ? true : false);
// strcpy(AlTime[count].monthAudio.Folder, strtok(NULL, "|"));
// strcpy(AlTime[count].monthAudio.File, strtok(NULL, "|"));
// strtok(NULL, "|");
// AlTime[count].dayAudio.isPlay = (strcmp(strtok(NULL, "|"),"1") == 0 ? true : false);
// strcpy(AlTime[count].dayAudio.Folder, strtok(NULL, "|"));
// strcpy(AlTime[count].dayAudio.File, strtok(NULL, "|"));
// strtok(NULL, "|");
// AlTime[count].dayWeekAudio.isPlay = (strcmp(strtok(NULL, "|"),"1") == 0 ? true : false);
// strcpy(AlTime[count].dayWeekAudio.Folder, strtok(NULL, "|"));
// strcpy(AlTime[count].dayWeekAudio.File, strtok(NULL, "|"));
// strtok(NULL, "|");
// AlTime[count].panchagamAudio.isPlay = (strcmp(strtok(NULL, "|"),"1") == 0 ? true : false);
// strcpy(AlTime[count].panchagamAudio.Folder, strtok(NULL, "|"));
// strcpy(AlTime[count].panchagamAudio.File, strtok(NULL, "|"));
// strtok(NULL, "|");
// AlTime[count].Song1.isPlay = (strcmp(strtok(NULL, "|"),"1") == 0 ? true : false);
// strcpy(AlTime[count].Song1.Folder, strtok(NULL, "|"));
// AlTime[count].Song1.Count = atoi(strtok(NULL, "|"));
// strcpy(AlTime[count].Song1.File, strtok(NULL, "|"));
// strtok(NULL, "|");
// AlTime[count].Song2.isPlay = (strcmp(strtok(NULL, "|"),"1") == 0 ? true : false);
// strcpy(AlTime[count].Song2.Folder, strtok(NULL, "|"));
// AlTime[count].Song2.Count = atoi(strtok(NULL, "|"));
// strcpy(AlTime[count].Song2.File, strtok(NULL, "|"));
// strtok(NULL, "|");
// AlTime[count].Msg.isPlay = (strcmp(strtok(NULL, "|"),"1") == 0 ? true : false);
// strcpy(AlTime[count].Msg.Folder, strtok(NULL, "|"));
// strcpy(AlTime[count].Msg.File, strtok(NULL, "|"));
// // strcpy(list[count], finStr.c_str());
// count++;
// file.read();
// finStr = "";
// }
// else
// {
// finStr += (char)file.read();
// }
// }
// finStr = "";
// file.close();
// } else {
// Serial.println("error opening wokwi.txt!");
// }
// }