#include <SdFat.h>
#define CS_PIN 53
#define SPI_SPEED SD_SCK_MHZ(4)
SdFat SD;
/*
TODO :
-> faire l'import de tableaux avec des pointeurs (chaines?)
-> émuler la structure KEYMAP -> MODE -> CHORD
les variables globales currentMode et autres sont chargées au moment du changement de Mode (via la SD)
normalement le changement de mode ira charger les accords qui seront en RAM donc pas de délai ..
*/
void setup() {
Serial.begin(115200);
initCard();
//readFileTree();
//readText("wokwi.txt");
//readLines("data.txt");
// searchFile("data.txt","array1"); // seéarch for "array1" in "data.txt"
int arrSize = 6 ;
int currentArray[arrSize] ; // global var to handle selecyed / played mode / chords
// array size file occurence
extractChord(currentArray, arrSize, "chords.txt","C262");
displayArray(currentArray, arrSize);
//writeJSONarray();
}
void loop() {
// nothing happens after setup finishes.
}
void initCard(){
Serial.print("Initializing SD card... ");
if (!SD.begin(CS_PIN)) {
Serial.println("Card initialization failed!");
while (true);
}
Serial.println("initialization done.\n");
}
void readText(String myfile) {
// Example of reading file from the card:
File textFile = SD.open(myfile);
if (textFile) {
Serial.println("=> read whole file :");
Serial.print(myfile + " : ");
// loop over each line
while (textFile.available()) {
Serial.write(textFile.read());
}
Serial.println();
} else {
Serial.println("Error opening" + myfile );
}
textFile.close();
}
void readLines(String myfile){
File dataFile = SD.open(myfile);
if (dataFile) {
Serial.println("=> Read line by line :");
while (dataFile.available()) {
String line = dataFile.readStringUntil('\n');
Serial.println(line);
// line parsing
}
dataFile.close();
} else {
Serial.println("Error opening" + myfile );
}
}
void searchFile(String myfile, String occurence){
File dataFile = SD.open(myfile);
if (dataFile) {
bool found = false;
while (dataFile.available()) {
String line = dataFile.readStringUntil('\n');
if (line.indexOf(occurence) != -1) { // Si le nom est trouvé dans la ligne
Serial.print("Occurence trouvée: ");
Serial.println(line);
found = true;
break; // Sortir après avoir trouvé le tableau
}
}
if (!found) {
Serial.println("Occurence non trouvée !");
}
dataFile.close();
} else {
Serial.println("Erreur d'ouverture du fichier.");
}
}
// params : search for occurence in text file and assign to array "current" of size "size" (transform string to INT ! )
void extractChord(int current[], int size, String myfile, String occurence){
File dataFile = SD.open(myfile);
if (dataFile) {
bool found = false;
while (dataFile.available()) {
String line = dataFile.readStringUntil('\n');
line.trim(); // Supprimer les espaces inutiles
// Séparer la ligne au niveau des deux points (":")
int colonIndex = line.indexOf(':');
if (colonIndex == -1) continue; // Si pas de deux-points, ignorer la ligne
// Extraire le nom (avant les deux points) et les valeurs (après les deux points)
String key = line.substring(0, colonIndex);
key.trim(); // Nettoyer les espaces autour du nom
String values = line.substring(colonIndex + 1);
values.trim(); // Nettoyer les espaces autour des valeurs
if ( key == occurence ) { // find the exact match , not only the occurence with indexOf()
Serial.print("Occurence trouvée: ");
Serial.println(line);
values = removeSpaces(values); // supprimmer les espaces eventuels DANS la chaine
Serial.println(values);
// Créer un tableau pour stocker les valeurs
int arraySize = 0;
// Découper les valeurs séparées par des virgules !!! ATTENTION : take care to fill/pad the array with 0 till the end
while (values.length() > 0) {
int commaIndex = values.indexOf(','); // Trouver l'indice de la prochaine virgule
if (commaIndex == -1) { // Si aucune virgule n'est trouvée, c'est la dernière valeur
commaIndex = values.length();
}
// Extraire la valeur
String valueStr = values.substring(0, commaIndex);
valueStr.trim(); // Supprimer les espaces inutiles
// Convertir la chaîne en entier et l'ajouter au tableau
current[arraySize] = valueStr.toInt();
arraySize++;
// Supprimer la valeur traitée
values = values.substring(commaIndex + 1);
}
found = true;
break; // Sortir après avoir trouvé le tableau
} // end of if occurence found
} // end of while
if (!found) {
Serial.println("Occurence non trouvée !");
}
dataFile.close();
} // end of if dataFile
else {
Serial.println("Erreur d'ouverture du fichier.");
}
} // end of fct
String removeSpaces(String input) {
String output = ""; // Chaîne de sortie sans espaces
for (int i = 0; i < input.length(); i++) {
if (input[i] != ' ') { // Si ce n'est pas un espace
output += input[i]; // Ajouter le caractère à la chaîne de sortie
}
}
return output;
}
void displayArray(int array[], int size){
// Afficher le tableau résultant
Serial.println();
Serial.print("current Array : { ");
for (int i = 0; i < size; i++) {
Serial.print(array[i]);
if (i < size - 1) {
Serial.print(", ");
}
}
Serial.println(" }");
}