Pages: [1]   Go Down
Author Topic: Com'è fatto questo file di configurazione?  (Read 673 times)
0 Members and 1 Guest are viewing this topic.
Rome
Offline Offline
God Member
*****
Karma: 1
Posts: 987
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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();   
  } 
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Rome
Offline Offline
God Member
*****
Karma: 1
Posts: 987
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
BAUD 9600
FILE test.txt

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged


Rome
Offline Offline
God Member
*****
Karma: 1
Posts: 987
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Non hai tutto il codice?
Code:
/*
  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);   

}
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Rome
Offline Offline
God Member
*****
Karma: 1
Posts: 987
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Pages: [1]   Go Up
Jump to: