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

Et bien, c'est super cette page 8) J'ai encore appris des choses :grin:

Alors, j'ai fait évoluer mon code et je doit en profiter pour vous citer dans mes soures :wink:
Je vous simplifie le code de façon à montrer que ce qui n'a de l'intérêt avec le sujet.

/*
  Auteur : Alexandre LABURE
  Aide DVP : Ragmaxone, sevyc64, Winjerome, Bousk
  Aide Arduino.cc : barbudor, SesechXP
  Création : le 30 octobre 2012
  Dernière modification : le 02 novembre 2012
  Version 1.0
*/

/* DEFINITIONS */
#define SIZE_BUFFER 32  //Nombre de case du buffer
#define SIZE_CMDE 10  //Nombre de commandes

File myFile;  //Fichier
String tblFicMdle[SIZE_CMDE];  //Le tableau des noms des fichiers modèles
String tblFicSvg[SIZE_CMDE];  //Le tableau des noms des fichiers de sauvegardes
int nbFichierMdle;  //Nombre de fichier

char tblConfSvg[SIZE_CMDE][SIZE_BUFFER];  //Le tableau des configuration du fichier de sauvegarde
char tblConfMdle[SIZE_CMDE][SIZE_BUFFER]; //Le tableau des configurations du fichier de modèle

//Configuration pour un modèle
String confNom, confType;
boolean confMix_V1V2, confMix_V3V4; 

/* SETUP */
void setup() {
//Initialiser l'écran LCD
  initLcd();  //Initialiser l'écran LCD
  ecrireLcd("Telecommande 433Mhz", 01);  //Ecrire
  ecrireLcd("Version 1.0", 24);  //Ecrire
  ecrireLcd("Bonjour", 66);  //Ecrire
  
  delay(2000);
  
  
  //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]);
    
    //ouvrirFichier("/modeles/", "model001.txt");
    ouvrirFichier("/modeles/", tblConfSvg[0]);
    
    //Charger les valeurs sauvegardés
    confNom = tblConfMdle[0];
    confType = tblConfMdle[1];
    
    //Compare la configuration
    if(strcmp(tblConfMdle[2], "true") == 0) {
      //Si c'est vrai
      confMix_V1V2 = true;
    }
    else {
      //Si c'est faux
      confMix_V1V2 = false;
    }
    
    //Compare la configuration
    if(strcmp(tblConfMdle[3], "true") == 0) {
      //Si c'est vraie
      confMix_V3V4 = true;
    }
    else {
      //Si c'est faux
      confMix_V3V4 = false;
    }
  }
  else {
     
    //Charger les valeurs par défaut de la radio
    confNom = "Aucun nom";
    confType = "Aucun";
    confMix_V1V2 = false;
    confMix_V3V4 = false;
  }
}

/* LOOP */
void loop() {
}

/* 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 == SIZE_CMDE) {
      
      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 rep, String fic) {
  
  //Variables
  char path[SIZE_BUFFER], bufferConf[SIZE_BUFFER+1];
  int i, bufferLenght, lineCounter = 0;
  String chemin;
  
  clearLcd();  //Efface l'écran
  ecrireLcd("Fichier en lecture", 01);  //Ecrire
  
  //Crée le chemin
  chemin = rep + fic;
  
  //Transforme le chemin
  chemin.toCharArray(path, SIZE_BUFFER);
  
  //Ouvre le fichier
  myFile = SD.open(path, FILE_READ);
  
  //Si le fichier est présent
  if(myFile) {
    //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) {
          break;
        }
      }
      
      bufferLenght = i;  //Garder en mémoire le nombre de lettre
      bufferConf[--i] = '\0';  //Finir la ligne en retirant le saut de ligne
      
      //Ne pas enregistrer les lignes vides ou les commentaires
      if(bufferConf[0] == '\0' || bufferConf[0] == '/' || bufferConf[0] == '#') {
        continue;
      }
      
      //Charger le tableau des configurations modèle
      if(rep == "/modeles/") {
        
        /*
          Copie le tableau contenant une commande, dans le tableau
          à deux dimensions qui est extérieur
        */
        strncpy(tblConfMdle[lineCounter], bufferConf, SIZE_BUFFER);
        bufferConf[SIZE_BUFFER] = '\0'; //Fini par un '\0'
      }
      
      //Charger le tableau des configurations sauvegardes
      if(rep == "/svgde/") {
        
        /*
          Copie le tableau contenant une commande, dans le tableau
          à deux dimensions qui est extérieur
        */
        strncpy(tblConfSvg[lineCounter], bufferConf, SIZE_BUFFER);
        bufferConf[SIZE_BUFFER] = '\0'; //Fini par un '\0'
      }
      
      lineCounter++; //Compter le nombre de lignes
    }
  }
  else {
    clearLcd();  //Efface l'écran
    ecrireLcd("Fichier introuvable", 01);  //Ecrire
    for(;;);
  }
  
  //Fermer le fichier
  myFile.close();
  
  return; 
}

Je vous ai épargné le loop() qui contient des choses qui n'ont plus rien à voir.

Je me suis fait un petit exemple avec strcmp() et qui fonctionne parfaitement. On test si c'est sur "true" et si oui, on en profite pour écrire true dans un boolean, sinon on écrit un false. C'est peut-être pas des plus optimisé mais ça fonctionne très bien.

Je profite d'aileur pour vous dire que je vais laisser tomber la carte SD quelques jours car j'aimerais nettoyé un peu mon code. Remplacer des strings inutiles par des char et revoir un peu l'architecture interne avec des classes. Par exemple créer une classe pour la partie LCD. Ainsi, je n'aurais plus à refaire initLcd(); planqué dans ma fonction. Elle sera directement dans la classe. Je pense qu'à terme ça peut faire gagner quelques octets et c'est pas non négligeable. Qu'en pensez-vous ?