Carte SD - programmation [mettre en tableau key et val liées] - config.txt

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 :grin: