Go Down

Topic: Com'è fatto questo file di configurazione? (Read 833 times) previous topic - next topic

jumpjack

Ho trovato questo sorgente che legge dati da un file di configurazione... ma per il mio C un po' sempliciotto è troppo complicato... :~
Come dovrebbe essere fatto il file?

Code: [Select]
if (SD.exists("config.txt"))
  {
    CFile = SD.open("config.txt");
 
    if (CFile)
    {   
      // read from the file until there's nothing else in it:
      while (CFile.available())
      {
    inVal = CFile.read();
        if((inVal=='\r') || (inVal=='\n') || (i>LINE_LEN))
        {
          // end of line
          configData[i] = '\0';
          if(i>0)
          {
            if (!strncmp( configData, "BAUD", 4 ))
            { 
              GetParam(configData, param);
              config.baud = (unsigned int) strtoi(param);
            }           
            if (!strncmp( configData, "FILE", 4 ))
            { 
              GetParam(configData, param);
              strcpy(config.fileprefix, param);
              strcat(config.fileprefix,".");
            }           
          }
          i=0;         
        } 
        else
        {
          configData[i]=inVal;
          i++;
        } 
      }
    }
    else
    {
      // file doesn't exist or cant open it
    }
    // close the file:
    CFile.close();   
  } 

leo72

Manca la funzione GetParam che legge i parametri dal file, per capire quanti byte legge per volta.
Comunque da quel che si capisce, legge ogni riga e cerca le stringhe BAUD e FILE e legge i parametri seguenti se le trova.

jumpjack


Manca la funzione GetParam che legge i parametri dal file, per capire quanti byte legge per volta.
Comunque da quel che si capisce, legge ogni riga e cerca le stringhe BAUD e FILE e legge i parametri seguenti se le trova.

quindi così?
Code: [Select]

BAUD 9600
FILE test.txt


Nessun vincolo su lunghezza del nome e lunghezza/tipo del valore?

leo72

Senza vedere quanti caratteri legge non so dirti.
Non so neanche se ci vuole oppure no un separatore fra quelle stringhe ed i dati che identificano.
Non hai tutto il codice?

jumpjack



Non hai tutto il codice?

Code: [Select]
/*
  Ardulog config sketch
 
  Read config.txt file
  Store values in config struct (see ardulog)
*/ 

// Convert String to int
long strtoi (char *a){
  unsigned char i=0;
  char neg=1;
  char w;
  long intval=0, inttemp;
  i=0;
  if(a[0]=='-') {
    neg=-1;
    i++;
  } 
  do{
    w=a[i];
    inttemp=(long) w;
    inttemp=inttemp-48;
    if((inttemp >=0) && (inttemp <=9)){
      intval*=10;
      intval+=inttemp;
    }
    i++;
  } while(a[i]);
  intval*=neg;
  return intval;
}

void GetParam( char *instr, char *buffer )
{
  char oneChar;
  // Find first whitespace (space or tab)
  while ((*instr != '\0') && (*instr != ' ') && (*instr != 0x09) && (*instr >=31))
  {
    instr++;
  }
  // Skip any more whitespace
  while ((*instr == ' ') || (*instr == 0x09))
  {
    instr++;
  } 
  // Extract Parameter
  while ((*instr != '\0') && (*instr != ' ') && (*instr != 0x09) && (*instr >=31))
  {
    oneChar=*instr++;
    *buffer++ = oneChar;
  }
  *buffer = '\0';
}

void read_config_file(void)
{
  char i=0;
  char inVal;
  char configData[81];
  char param[30];
  File CFile;
  #define LINE_LEN 80
 
  if (SD.exists("config.txt"))
  {
    CFile = SD.open("config.txt");
 
    if (CFile)
    {   
      // read from the file until there's nothing else in it:
      while (CFile.available())
      {
    inVal = CFile.read();
        if((inVal=='\r') || (inVal=='\n') || (i>LINE_LEN))
        {
          // end of line
          configData[i] = '\0';
          if(i>0)
          {
            if (!strncmp( configData, "BAUD", 4 ))
            { 
              GetParam(configData, param);
              config.baud = (unsigned int) strtoi(param);
            }           
            if (!strncmp( configData, "FILE", 4 ))
            { 
              GetParam(configData, param);
              strcpy(config.fileprefix, param);
              strcat(config.fileprefix,".");
            }           
          }
          i=0;         
        } 
        else
        {
          configData[i]=inVal;
          i++;
        } 
      }
    }
    else
    {
      // file doesn't exist or cant open it
    }
    // close the file:
    CFile.close();   
  } 
}

void get_new_logfile(void)
{
    // Search for highest value logfile
    unsigned int i,j;
    unsigned int file_ext;
    char filename[20];
    File root;
    file_ext = 0;

    root = SD.open("/");
    root.rewindDirectory(); // Needed because we have already opened config.txt
 
    while(true) {

        File entry =  root.openNextFile();
        if (!entry) {
           // no more files
           break;
        }

        if (!(entry.isDirectory()))
        {
           // files have sizes, directories do not
           strcpy(filename, entry.name());
           
           if (!(strncmp(filename, config.fileprefix, strlen(config.fileprefix))))
           {
               // It's one of our log files
               // Extract the file extension
               
               for(i=0;i<strlen(filename);i++)
               {
                  if(filename[i]=='.') j=i;
               }
               for(i=0;i<strlen(filename)-j;i++)
               {
                  filename[i]=filename[j+i+1];
                  filename[i+1]='\0';
               }
               // convert file ext to a number and keep highest.

               i = strtoi(filename);
               if(i>file_ext) file_ext=i;
           } 

        }
        entry.close();
    }
    root.close();
   
    // Set filename to file_ext+1
    sprintf(config.filename,"%s%03d",config.fileprefix,++file_ext);   

}

leo72

Legge eliminando gli spazi bianchi. Quindi BAUD 9600 o BAUD    9600 vanno bene entrambi. Credo anche BAUD9600 ma andrebbe verificato.

jumpjack

ok grazie.
mi pare di capire che vanno bene anche le tabulazioni.

leo72


Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy