/* Funzioni della classe String che saranno utilizzate:

https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/indexof/
https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/toint/
https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/substring/

*/

//SD vars
char myFile[] = {
  "Riga per intestazione colonne\n"
  "0,on,1,2,100,vuoto,vuoto,0,100,vuoto,3,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100\n"
  "1,vuoto,vuoto,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100\n"
  "2,fade in,2,5,80,vuoto,vuoto,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100,vuoto,vuoto,0,100\n"
  
};


// Struct con le caratteritiche del led
struct FadeLed {
  char fadeTipe[10] = {"vuoto"};    // La stringa più lunga da memorizzare è "fade out"
  int8_t pin = -1;
  uint32_t fadeTime = 0;
  uint8_t level = 0;
};

// Array di struct FadeLed da 7 elementi
FadeLed leds[7];


void printValues(FadeLed led) {
  Serial.print(led.fadeTipe);
  Serial.print(", ");
  Serial.print(led.pin);
  Serial.print(", ");
  Serial.print(led.fadeTime);
  Serial.print(", ");
  Serial.println(led.level);
}


void getValues(int row) {
  int numLine = -1;
  String line;        // Salvo nella String line una riga per volta del file (fino al ritorno a capo)
  line.reserve(256);
  
  for (int i = 0; i < strlen(myFile); i++) {
  // while (myFile.available()) {
    
    line += myFile[i];
    // char fileChar = (char) myFile.read();
    // line += fileChar;
    
    if (myFile[i] == '\n') {
    // if (fileChar != '\n') {

      numLine++;

      // Se è la riga che sto cercando:
      if (numLine == row) {
        int p1, p2;

        // Popolo ciascun elemento di tipo FadeLed dell'array leds con i valori letti dal file
        for ( int j = 0; j < 7; j++) {

          // Tipo azione
          p1 = line.indexOf(",", p2) + 1;   // Cerchiamo la posizione del pimo carattere ','
          p2 = line.indexOf(",", p1);       // Cerchiamo la posizione del successivo
          strcpy(leds[j].fadeTipe, line.substring(p1, p2).c_str());

          // Numero del pin
          p1 = line.indexOf(",", p2) + 1;
          p2 = line.indexOf(",", p1);
          int val = line.substring(p1, p2).toInt(); 
          // Se è possibile convertire in intero, il pin è definito
          if (val)
            leds[j].pin = val;

          // Tempo del fade
          p1 = line.indexOf(",", p2) + 1;
          p2 = line.indexOf(",", p1);
          leds[j].fadeTime = line.substring(p1, p2).toInt() * 1000;  // millisecondi

          // Livello di uscita
          p1 = line.indexOf(",", p2) + 1;
          p2 = line.indexOf(",", p1);
          leds[j].level = line.substring(p1, p2).toInt();

          // Facciamo una stampa sul monitor per verificare i dati
          Serial.print("Led ");   Serial.print(j + 1);   Serial.print(": ");
          printValues(leds[j]);
        }

        // Abbiamo trovato la riga cercata, si può uscire dalla funzione
        // myFile.close();
        return;
      }

      // Pronti per valutare la prossima riga
      line = "";
    }
  }

}

void setup() {

  Serial.begin(9600);

  Serial.println("Riga numero 1:");
  getValues(1);

  Serial.println("Riga numero 3:");
  getValues(3);

}


void loop(void) {
}