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

En fait ça fonctionne très bien. Beaucoup d'erreur ont été commise au niveau tableau. :disappointed_relieved:

La confusion entre un tableau de char ou x valait le nombre de possibilités et un tableau à deux dimensions qui lui a un nombre de possibilité de case contenant un nombre de caractères données.

L'incompréhension de strncpy qui après coup est effectivement une fonction rapide et pratique.

Je met ici la solution finale qui fonctionne.

#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

/* 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]);
    
    ouvrirFichier("/modeles/", tblFicMdle[2]);
  }
  else {
     
    //Charger les valeurs par défaut de la radio 
  }
  
  Serial.println(tblConfMdle[0]);
  Serial.println(tblConfMdle[1]);
  Serial.println(tblConfMdle[2]);
  Serial.println(tblConfMdle[3]);
  Serial.println(tblConfMdle[4]);
}

/* LOOP */
void loop() {
}


/* 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
    }
    
    //Fermer le fichier
    myFile.close();  
  }
  
  return; 
}

La prochaine étape va être de pouvoir charger les variables de tests. Avant je faisait des tests sur des strings. N'aurais-je pas intérêt à faire des tests sur des char fonction1, fonction2, fonction3... chargée par fonction1 = tbl1[0]; ... ?

Dans mon tableau j'ai entre autre du boolean (true ou false) qui doivent au final être tester. Je comprends bien qu'il me faudra faire de nouvelles conversions.