#include<HX711.h>;
HX711 lc;

const uint8_t DOUT_PIN = A0;
const uint8_t SCK_PIN = A1;
boolean ready_to_read = 0;

int full_scale = 0;
int num_mass = 0;
int num_meas = 0;

float mass;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  lc.begin(DOUT_PIN, SCK_PIN);
  pinMode(13, OUTPUT);
// }

// void loop() {
  // put your main code here, to run repeatedly:
  
  Serial.println("\n\nWelcome!");
  while(Serial.available()) Serial.read();

  Serial.println("Premi enter per iniziare...");
  while(Serial.available()==0);


  // Serial.println("Digita il fondoscala della cella di carico in [kg]...");
  fondo_scala_input:
  while(Serial.available()) Serial.read();
  Serial.print("Fondo scala [kg]: ");
  
  while (Serial.peek() != '\n'){
    if (Serial.available())
    {
      full_scale = Serial.parseInt();
    }
  }
  if(full_scale==0) goto fondo_scala_input;
  Serial.print(full_scale);Serial.println(" kg");
  

  // Serial.println("Quanti provini vuoi misurare?");
  num_mass_input:
  while(Serial.available()) Serial.read();
  Serial.print("n° provini: ");
  
  while (Serial.peek() != '\n'){
    if (Serial.available())
    {
      num_mass = Serial.parseInt();
    }
  }
  if(num_mass==0) goto num_mass_input;
  Serial.println(num_mass);//Serial.println(" kg");

  // Serial.println("Quante misurazioni per provino?");
  num_meas_input:
  while(Serial.available()) Serial.read();
  Serial.print("n° misurazioni per provino: ");
  
  while (Serial.peek() != '\n'){
    if (Serial.available())
    {
      num_meas = Serial.parseInt();
    }
  }
  if(num_meas==0) goto num_meas_input;
  Serial.println(num_meas);
  while(Serial.available()) Serial.read();

  long measures [num_mass][num_meas]; 
  float masses[num_mass];

  for (int i=0; i<num_mass; i++){
    digitalWrite(13, ready_to_read);

    while(Serial.available()) Serial.read();
    
    mass_input:
    Serial.print("\n\tMassa del provino n° ");Serial.print(i+1);Serial.print(" [kg]: ");
    float mass = 0;
    while (Serial.peek() != '\n'){
      if (Serial.available())
      {
       mass = Serial.parseFloat();
      }
    }
    if (mass==0) goto mass_input;
    
    masses[i]=mass;
    Serial.println(mass);
    while(Serial.available()) Serial.read();
    

    for (int j=0; j<num_meas; j++){
      digitalWrite(13, 1);
      delay(1000);
      // Serial.println("Pronto per la misura");

      while (Serial.available()) Serial.read();
      Serial.println("\nPosiziona il provino e premi enter\n");
      while (Serial.available() == 0);

      while (Serial.available()) Serial.read();
      Serial.print("Provino da "); Serial.print(masses[i]);
      Serial.print(" kg, \n\tMisura n° ");Serial.print(j+1);
      Serial.print(" : ");
      measures[i][j] = lc.read_average(10);
      Serial.println(measures[i][j]);

      Serial.print("\tSolleva il provino...");
      long read_check = lc.read_average(5); 
      digitalWrite(13, 0);
      while(! (read_check < measures[i][j]/2)) read_check = lc.read_average(5); 
      Serial.println("Ok!");
      // while (Serial.available()) Serial.read();
      // Serial.println("togliere il provino e premere enter\n");
      // while (Serial.available() == 0);
      delay(1000);
    }
  }

  Serial.println("Measures: ");
  for (int i=0; i<num_mass; i++){
    for (int j=0; j<num_meas; j++){
      Serial.print(measures[i][j]);
      Serial.print(" ");
    }
    Serial.print("\n");
  }

  Serial.println("============");
}

void loop() {

}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
cell1:VCC
cell1:DT
cell1:SCK
cell1:GND