#include <SD.h>
#define CS_PIN 10
const char * nomFichierConfigWifi = "SSID.csv";
const char * nomFichierConfigAnniversaires = "anniv.csv";
const size_t nbMaxAnniversaires = 10;
const size_t tailleMaxChaine = 20;
struct Anniversaire {
bool actif;
char nom[tailleMaxChaine + 1];
char prenom[tailleMaxChaine + 1];
uint8_t jour;
uint8_t mois;
uint16_t annee;
};
// tableau de toutes les dates
Anniversaire lesAnniversaires[nbMaxAnniversaires];
struct ConfigWifi {
char SSID[33];
char PWD[tailleMaxChaine];
};
// on en a besoin que d'une seule
ConfigWifi configuration;
// un buffer général pour la lecture de lignes
const size_t tailleBufferTemporaire = 80;
char tmpBuf[tailleBufferTemporaire + 1]; // +1 pour le caractère nul de fin
void setup() {
Serial.begin(115200);
if (!SD.begin(CS_PIN)) {
Serial.println("Impossible de trouver la carte SD!");
while (true);
}
Serial.println("carte SD OK.");
// lecture du fichier de confifg WIFI:
File fichier = SD.open(nomFichierConfigWifi, FILE_READ);
if (fichier) {
size_t posLigne = 0;
while (fichier.available()) {
char r = fichier.read();
if ((r != '\r') && (r != '\n')) { // on ignore la fin de ligne car c'est l'étoile qui compte
if (r == '*') break; // c'est le caractère de fin, on termine ici
else if (posLigne < tailleBufferTemporaire) tmpBuf[posLigne++] = r;
}
}
fichier.close();
tmpBuf[posLigne] = '\0'; // on marque la fin de chaîne
Serial.print(F("ligne lue : ["));
Serial.print(tmpBuf);
Serial.println(F("]"));
// parsing sans gestion des erreurs
char * ptr = strtok(tmpBuf, ";");
snprintf(configuration.SSID, sizeof configuration.SSID, "%s", ptr); // https://cplusplus.com/reference/cstdio/snprintf/
ptr = strtok(nullptr, ";");
snprintf(configuration.PWD, sizeof configuration.PWD, "%s", ptr);
Serial.println(F("l'analyse de la ligne donne :"));
Serial.print(F("\tSSID : [")); Serial.print(configuration.SSID); Serial.println(F("]"));
Serial.print(F("\tPWD : [")); Serial.print(configuration.PWD); Serial.println(F("]"));
} else {
Serial.print(F("Erreur : Impossible de lire "));
Serial.println(nomFichierConfigWifi);
}
Serial.println(F("-------------------------------------"));
// gestion du fichier des anniversaires
// on commence par initialiser le tableau
for (size_t i = 0; i < nbMaxAnniversaires; i++) {
lesAnniversaires[i].actif = false; // on pourrait se contenter de cette ligne mais je préfère tout nettoyer
lesAnniversaires[i].nom[0] = '\0';
lesAnniversaires[i].prenom[0] = '\0';
lesAnniversaires[i].jour = 0;
lesAnniversaires[i].mois = 0;
lesAnniversaires[i].annee = 0;
}
// on lit le fichier ligne par ligne et on remplit le tableau
fichier = SD.open(nomFichierConfigAnniversaires, FILE_READ);
if (fichier) {
size_t nbAnniversaires = 0;
while (nbAnniversaires < nbMaxAnniversaires) {
size_t posLigne = 0;
while (fichier.available()) {
char r = fichier.read();
if ((r != '\r') && (r != '\n')) { // on ignore la fin de ligne car c'est l'étoile qui compte
if (r == '*') break; // c'est le caractère de fin, on termine ici
else if (posLigne < tailleBufferTemporaire) tmpBuf[posLigne++] = r;
}
}
tmpBuf[posLigne] = '\0'; // on marque la fin de chaîne
if (posLigne != 0) {
// on a lu quelque chose
Serial.print(F("ligne lue : ["));
Serial.print(tmpBuf);
Serial.println(F("]"));
// parsing sans gestion des erreurs
lesAnniversaires[nbAnniversaires].actif = true;
char * ptr = strtok(tmpBuf, ";");
snprintf(lesAnniversaires[nbAnniversaires].nom, sizeof lesAnniversaires[nbAnniversaires].nom, "%s", ptr); // https://cplusplus.com/reference/cstdio/snprintf/
ptr = strtok(nullptr, ";");
snprintf(lesAnniversaires[nbAnniversaires].prenom, sizeof lesAnniversaires[nbAnniversaires].prenom, "%s", ptr); // https://cplusplus.com/reference/cstdio/snprintf/
ptr = strtok(nullptr, ";");
lesAnniversaires[nbAnniversaires].jour = strtol(ptr, nullptr, 10); // https://cplusplus.com/reference/cstdlib/strtol/
ptr = strtok(nullptr, ";");
lesAnniversaires[nbAnniversaires].mois = strtol(ptr, nullptr, 10); // https://cplusplus.com/reference/cstdlib/strtol/
ptr = strtok(nullptr, ";");
lesAnniversaires[nbAnniversaires].annee = strtol(ptr, nullptr, 10); // https://cplusplus.com/reference/cstdlib/strtol/
Serial.println(F("l'analyse de la ligne donne :"));
Serial.print(F("\tNom : [")); Serial.print(lesAnniversaires[nbAnniversaires].nom); Serial.println(F("]"));
Serial.print(F("\tPrenom : [")); Serial.print(lesAnniversaires[nbAnniversaires].prenom); Serial.println(F("]"));
Serial.print(F("\tJour : [")); Serial.print(lesAnniversaires[nbAnniversaires].jour); Serial.println(F("]"));
Serial.print(F("\tMois : [")); Serial.print(lesAnniversaires[nbAnniversaires].mois); Serial.println(F("]"));
Serial.print(F("\tAnnée : [")); Serial.print(lesAnniversaires[nbAnniversaires].annee); Serial.println(F("]"));
}
// si le fichier est entièrement lu
if (fichier.available() == 0) break;
// on passe à la ligne suivante
nbAnniversaires++;
}
fichier.close();
Serial.print(F("On a trouvé ")); Serial.print(nbAnniversaires); Serial.println(F(" personnes"));
} else {
Serial.print(F("Erreur : Impossible de lire "));
Serial.println(nomFichierConfigWifi);
}
}
void loop() {}