Ok pour cette méthode.
Je viens de trouvé par hasard ceci : Arduino Playground - HashMap Library
Ça correspond à ce que je voulais faire mais hélas j'ai pas l'impression que ça fonctionne.
#include <HashMap.h>
#define SIZE_BUFFER 32 //Nombre de case du buffer
const int nbFic = 10; //Nombre de fichier potentiel à scruter
const byte SIZE_HASH = 2; //Nombre de hshtable
char bufferConf[SIZE_BUFFER]; //Le buffer des fichiers de conf
HashType<char*, String> hashRawArray[SIZE_HASH];
HashMap<char*, String> hashMapConfSvg = HashMap<char*, String>(hashRawArray, SIZE_HASH);
File myFile; //Fichier
String tblFicMdle[nbFic]; //Le tableau des noms des fichiers modèles
String tblFicSvg[nbFic]; //Le tableau des noms des fichiers de sauvegardes
int nbFichierMdle; //Nombre de fichier
/* SETUP */
void setup() {
//Initialiser la carte SD
if(initSD()) {
//Lister les fichier de sauvegardes
listeFichier("/svgde/");
//Lister les fichiers de configuration modèle
nbFichierMdle = listeFichier("/modeles/");
//Ouvrir le fichier de sauvegarde
ouvrirFichier("/svgde/", tblFicSvg[0]);
}
else {
//Charger les valeurs par défaut de la radio
}
}
/* LOOP */
void loop() {
}
/* FONCTION initLCD */
void initLcd() {
//Initialisation de l'écran par I2C
Wire.begin(); //Amorce la connection sur SDA et SCL
Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
Wire.write((byte)0x00); //Assigne un null
Wire.write((byte)0x0C); //Effacer l'écran
Wire.write((byte)0x13); //Allume le rétro-éclairage
Wire.write((byte)0x04); //Ne pas afficher le curseur
Wire.endTransmission(); //Ferme la connexion sur SDA et SCL
}
/* FONCTION ecrireLcd */
void ecrireLcd(String texte, int positionEcran) {
//Initialisation de l'écran par I2C
Wire.begin(); //Amorce la connection sur SDA et SCL
Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
Wire.write((byte)0x00); //Assigne un null
Wire.write((byte)0x02); //Placer le curseur
Wire.write(positionEcran); //Sur l'écran
Wire.print(texte); //Ecrire un texte
Wire.endTransmission(); //Ferme la connexion sur SDA et SCL
}
/* FONCTION ecrireLcdChar */
void ecrireLcdChar(char texte[32], int positionEcran) {
//Initialisation de l'écran par I2C
Wire.begin(); //Amorce la connection sur SDA et SCL
Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
Wire.write((byte)0x00); //Assigne un null
Wire.write((byte)0x02); //Placer le curseur
Wire.write(positionEcran); //Sur l'écran
Wire.write(texte); //Ecrire un texte
Wire.endTransmission(); //Ferme la connexion sur SDA et SCL
}
/* FONCTION clearLcd() */
void clearLcd() {
//Initialisation de l'écran par I2C
Wire.begin(); //Amorce la connection sur SDA et SCL
Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
Wire.write((byte)0x00); //Assigne un null
Wire.write((byte)0x0C); //Effacer l'écran
Wire.endTransmission(); //Ferme la connexion sur SDA et SCL
}
/* FONCTION initSD() */
boolean initSD() {
clearLcd(); //Effacer l'écran
ecrireLcd("Init SD Card", 01); //Ecrire
//Si la carte n'est pas présente ou qu'elle est en défaut
if(!SD.begin(4)) {
ecrireLcd("Non presente", 21); //Ecrire
return false;
}
ecrireLcd("Sd card... Ok", 21); //Ecrire
delay(1000);
return true;
}
/* FONCTION listerFichier() */
int listeFichier(String chemin) {
int count = 0;
char path[SIZE_BUFFER];
//Conversion du chemin
chemin.toCharArray(path, SIZE_BUFFER);
//Ouvre ce qui est défini par le chemin
myFile = SD.open(path);
//Tant que c'est vrai
while(true) {
//Prend le nom du fichier
File entry = myFile.openNextFile();
//Si c'est la fin
if(!entry) {
break; //Sortir de la boucle
}
//Si le nombre de fichier est plus important que le nombre de place en tableau
if(count == nbFic) {
break; //Sortir de la boucle
}
//Si c'est le répertoire /modeles/
if(chemin == "/modeles/") {
//Rentre le nom de fichier dans le tableau des noms de modèles
tblFicMdle[count] = entry.name();
}
//Si c'est le répertoire /sauvegarde/
if(chemin == "/svgde/") {
//Rentre le nom de fichier dans le tableau des noms de sauvegarde
tblFicSvg[count] = entry.name();
}
count++; //Compter le nombre de fichier
}
//Fermer le fichier
myFile.close();
//Retourner le nombre de fichier
return count;
}
/* FONCTION qui ouvre un fichier */
void ouvrirFichier(String chemin, String fic) {
//Variables
char path[SIZE_BUFFER], *key, *val;
int i, bufferLenght, lineCounter = 0;
clearLcd(); //Effacer l'écran
ecrireLcd("Fichier en lecture", 01); //Ecrire
//Re crée le chemin
chemin = chemin + fic;
//Transforme le chemin en tableau de carractères
chemin.toCharArray(path, SIZE_BUFFER);
//Ouvre le fichier de configuration
myFile = SD.open(path, FILE_READ);
//Erreur d'ouverture du fichier
if(!myFile) {
clearLcd(); //Effacer l'écran
ecrireLcd("Pb fichier", 01); //Ecrire
for(;;); //Boucle infini (peut tre remplacer par un bouton valider)
}
//Tant que ce n'est pas la fin du fichier
while(myFile.available()) {
//Récupère la ligne
i=0;
while((bufferConf[i++] = myFile.read()) != '\n') {
//Si la ligne dépasse le buffer
if(i == SIZE_BUFFER) {
//Finir la ligne et stopper la lecture
while(myFile.read() != '\n') {
break;
}
}
}
bufferLenght = i; //Garder en mémoire le nombre de char
bufferConf[--i] = '\0'; //Finalise la chaine en virant le \n
++lineCounter; //Incrémenter le nombre de ligne
//Ignore les lignes vides, les commentaires # et //
if(bufferConf[0] == '\0' || bufferConf[0] == '#' || bufferConf[0] == '//') {
continue;
}
//Cherche l'emplacement de la clef en ignorant les espaces et tabulations
i = 0;
while(bufferConf[i] == ' ' || bufferConf[i] == '\t') {
//Ignore les lignes contenant uniquement des espaces ou des tabulations
if(++i == bufferLenght) {
break;
}
}
//Gère les lignes mal formés
if(i == bufferLenght) {
continue;
}
key = &bufferConf[i];
//Cherche l'emplacement du séparateur
while(bufferConf[i] != '=') {
//Ignore les espaces et tabulations
if(bufferConf[i] == ' ' || bufferConf[i] == '\t') {
bufferConf[i] = '\0';
}
//Ignore les lignes mal formés
if(++i == bufferLenght) {
break;
}
}
//Gère les lignes mal formés
if(i == bufferLenght) {
continue;
}
bufferConf[i++] = '\0'; //Transforme me séparateur = en \o et continue
//Cherche l'emplacement de la valeur en ignorant espaces et tabulations
while(bufferConf[i] == ' ' || bufferConf[i] == '\t') {
//Ignore les lignes contenant uniquement des espaces ou des tabulations
if(++i == bufferLenght) {
break;
}
}
//Gère les lignes mal formés
if(i == bufferLenght) {
continue;
}
val = &bufferConf[i];
/*
String tblConfSvg[clef][valeur]; //Tableau de configuration Sauvegarde
String tblConfMdle[clef][valeur]; //Tableau de configuration valeur
*/
//Si c'est le répertoire /sauvegarde/
if(chemin == "/svgde/") {
hashMapConfSvg[lineCounter](key, val);
}
//Si c'est le répertoire /modeles/
if(chemin == "/modeles/") {
}
Serial.println(lineCounter);
Serial.println(key);
Serial.println(val);
}
Serial.println(hashMapConfSvg.getIndexOf("Modele"), DEC);
Serial.println(hashMapConfSvg.getValueOf("Modele"));
//Fermer le fichier
myFile.close();
ecrireLcd("Fichier Ok", 21); //Ecrire
delay(1000);
}
Ceci alourdis pas mal le code le coup du hashtable. Mais tu a peut-être raison, ça m'a l'air aussi simple avec la recherche dans le tableau. Laquelle des deux solutions est la plus pratique / meilleure et surtout non consommatrice de ressources ?
Edit, je laisse tomber les hashtable. Beaucoup de souci d'upload à cause de cette librairie !
Retour à ta solution ![]()