Outils pour utilisateurs

Outils du site


arduino:fichier_cfg

lit un fichier de paramétrage sur un support (SD) inspiration : https://skyduino.wordpress.com/2012/06/19/arduino-charger-un-fichier-de-configuration-depuis-une-carte-sd/

void readSDSettings() {

  /* Déclare le buffer qui stockera une ligne du fichier, ainsi que les deux pointeurs key et value */
  char buffer[BUFFER_SIZE], *key, *value;
  /* Déclare l'itérateur et le compteur de lignes */
  byte i, buffer_lenght, line_counter = 0;
  
/* Ouvre le  fichier de configuration */
  File config_file = sd.open("param.cfg", FILE_READ);
  if(!config_file) { // Gère les erreurs
    DBG_OUTPUT_PORT.println("Erreur d'ouverture du fichier /param.cfg !");
    //for(;;);
  } else {

/* Tant que non fin de fichier */
  while(config_file.available() > 0 ){
 
    /* Récupère une ligne entière dans le buffer */
    i = 0;
    while((buffer[i++] = config_file.read()) != '\n') {
 
      /* Si la ligne dépasse la taille du buffer */
      if(i == BUFFER_SIZE) {
 
        /* On finit de lire la ligne mais sans stocker les données */
        while(config_file.read() != '\n');
        break; // Et on arrête la lecture de cette ligne
      }
    }
 
    /* On garde de côté le nombre de char stocké dans le buffer */
    buffer_lenght = i;
 
    /* Gestion des lignes trop grande */
    if(i == BUFFER_SIZE) {
      DBG_OUTPUT_PORT.println("Ligne trop longue à la ligne ");
      DBG_OUTPUT_PORT.println(line_counter, DEC);
      DBG_OUTPUT_PORT.println(i);
    }
 
    /* Finalise la chaine de caractéres ASCIIZ en supprimant le \n au passage */
    buffer[--i] = '\0';
 
    /* Incrémente le compteur de lignes */
    ++line_counter;
 
    /* Ignore les lignes vides ou les lignes de commentaires */
    if(buffer[0] == '\0' || buffer[0] == '#') continue;
       
    /* Cherche l'emplacement de la clef en ignorant les espaces et les tabulations en début de ligne */
    i = 0;
    while(buffer[i] == ' ' || buffer[i] == '\t') {
      if(++i == buffer_lenght) break; // Ignore les lignes contenant uniquement des espaces et/ou des tabulations
    }
    if(i == buffer_lenght) continue; // Gère les lignes contenant uniquement des espaces et/ou des tabulations
    key = &buffer[i];
 
    /* Cherche l'emplacement du séparateur = en ignorant les espaces et les tabulations âpres la clef */
    while(buffer[i] != '=') {
 
      /* Ignore les espaces et les tabulations */
      if(buffer[i] == ' ' || buffer[i] == '\t') buffer[i] = '\0';
         
      if(++i == buffer_lenght) {
        DBG_OUTPUT_PORT.println("Ligne mal forme a la ligne ");
        DBG_OUTPUT_PORT.println(line_counter, DEC);
        break; // Ignore les lignes mal formé
      }
    }
    if(i == buffer_lenght) continue; // Gère les lignes mal formé
 
    /* Transforme le séparateur = en \0 et continue */
    buffer[i++] = '\0';
 
    /* Cherche l'emplacement de la valeur en ignorant les espaces et les tabulations âpres le séparateur */
    while(buffer[i] == ' ' || buffer[i] == '\t') {
      if(++i == buffer_lenght) {
        DBG_OUTPUT_PORT.println("Ligne mal forme a la ligne ");
        DBG_OUTPUT_PORT.println(line_counter, DEC);
        break; // Ignore les lignes mal formé
      }
    }
    if(i == buffer_lenght) continue; // Gère les lignes mal formé
    value = &buffer[i];
 
    /* Transforme les données texte en valeur utilisable */
    if(strcmp(key, "ssid") == 0) {
      ssid="";
      strcpy(ssid,value);
        DBG_OUTPUT_PORT.println(ssid);
    } 
    else if(strcmp(key, "hostname") == 0) {
      strcpy(nom,value);
        DBG_OUTPUT_PORT.println(nom);
    } 
    else if(strcmp(key, "password") == 0) {
      strcpy(password,value);
      DBG_OUTPUT_PORT.println(password);
    } 
    else if(strcmp(key, "sdgpio") == 0) {
      SDGPIO=atoi(value);
      DBG_OUTPUT_PORT.println(SDGPIO);
    }
    else if(strcmp(key, "IPC") == 0) {
      IPC=atoi(value);
      DBG_OUTPUT_PORT.println(IPC);
    } 
    else if(strcmp(key, "IPD") == 0) {
      IPD=atoi(value);
      DBG_OUTPUT_PORT.println(IPD);
    }
    else if(strcmp(key, "modifpass") == 0) {
      strcpy(modifpass,value);
      DBG_OUTPUT_PORT.println(modifpass);
    }  
    else { // Default 
      Serial.print("Clef inconnu ");
      Serial.println(key);
    }
 
  }
 
  /* Ferme le fichier de configuration */
  config_file.close();

  }
}
arduino/fichier_cfg.txt · Dernière modification : 2024/02/09 17:10 de 127.0.0.1