#define MOTOR_A     7
#define MOTOR_B     8
#define MOTOR_C     9
#define PIN_SMAX    2
#define PIN_SMIN    3
//const byte pinMotor[] = { 5, 6, 7 };

struct ComboAct {
    bool cmd;
    uint8_t idx;
    uint32_t timer0;
    const byte pinMotor[3] = { MOTOR_A, MOTOR_B, MOTOR_C };
    
};

ComboAct ca;
void nComboAct(ComboAct &ca, bool tf) {
    if (!ca.timer0) {
        ca.cmd = tf;
        Serial.println(ca.idx);
        digitalWrite(ca.pinMotor[ca.idx], ca.cmd);
        ca.timer0 = millis();
        ca.idx++;
    } else if (millis() - ca.timer0 > 5000) {
        Serial.println(ca.idx);
        digitalWrite(ca.pinMotor[ca.idx], ca.cmd);
        ca.timer0 = millis();
        ca.idx++;
    }
}

void comboAct(ComboAct &ca, bool tf) {
    if (ca.cmd != tf) {
        ca.cmd = tf;
    }
    if (ca.cmd) {
        if (!ca.idx) {
            Serial.println(ca.idx);
            digitalWrite(ca.pinMotor[ca.idx], ca.cmd);
            ca.timer0 = millis();
            ca.idx++;
        }
        if (ca.idx < 3) {
            if (millis() - ca.timer0 > 1000) {
                digitalWrite(ca.pinMotor[ca.idx], ca.cmd);
                Serial.println(ca.idx);
                ca.timer0 = millis();
                ca.idx++;
                
            }
        }
    } else {
        if (ca.idx == 3) {
            ca.idx--;
            Serial.println(ca.idx);
            digitalWrite(ca.pinMotor[ca.idx], ca.cmd);
            ca.timer0 = millis();
        }
        if (ca.idx > 0) {
            if (millis() - ca.timer0 > 1000) {
                
                ca.timer0 = millis();
                ca.idx--;
                Serial.println(ca.idx);
                digitalWrite(ca.pinMotor[ca.idx], ca.cmd);
                
            }

        }
    }
}

#if(0)
struct Action {
    bool actState; 
    
    uint8_t stateMachine;
    uint32_t timer;
    byte pinIndex;
    const byte pinMotor[3] = { MOTOR_A, MOTOR_B, MOTOR_C };
};

Action azione;

void azionaMotori(struct Action &act, bool tf, bool abort) {
  // tf sta per true o false

  if (abort) {
      for (byte i=0; i<3; i++) {
          digitalWrite(act.pinMotor[i], LOW);
      }
      act.actState = false;
      act.timer = 0;
      act.pinIndex = 0;

      act.stateMachine = 3;
  }
  switch (act.stateMachine) {
    case 0:
      
      if (act.actState != tf) {
          act.actState = tf;
          digitalWrite(act.pinMotor[act.pinIndex], act.actState);
          act.timer = millis();
          
          act.stateMachine = 2;   // CHANGE STATE
          
      }
      break;
    
    case 1:
      
      if (millis() - act.timer >= 1000) {
          digitalWrite(act.pinMotor[act.pinIndex], act.actState);
          act.timer = millis();
          if (act.pinIndex == 0 || act.pinIndex == 2) {
              act.stateMachine = 0;  // CHANGE STATE
          } else {
              act.stateMachine = 2;  // CHANGE STATE
          }
      }
      break;

    case 2:
      //Serial.println("case 2");
      if (act.actState == true)
          act.pinIndex++;
      else
          act.pinIndex--;

      act.stateMachine = 1; // CHANGE STATE
      break;
    case 3: //abort   
      break;
  }
}
#endif

uint32_t g_timer;
byte g_counter;
bool g_command;

bool silosState;
bool oldSilosState = true;

void setup() {
    Serial.begin(115200);  // Start the Serial monitor with speed of 9600 Bauds
    pinMode(LED_BUILTIN, OUTPUT);
    pinMode(MOTOR_A, OUTPUT);
    pinMode(MOTOR_B, OUTPUT);
    pinMode(MOTOR_C, OUTPUT);

    pinMode(PIN_SMIN, INPUT_PULLUP);
    pinMode(PIN_SMAX, INPUT_PULLUP);
    delay(100);

    //g_command = true;   // inizia con l'azione composta di accensione
    
}



void loop() {
    bool abort = false;
    if (millis() - g_timer >= 500) {
        digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
        g_timer = millis();
        g_counter++;
        if (g_counter == 10) {
            g_counter = 0;
            //abort = true;
        }   
        /*if (g_counter == 10) { // sono trascorsi 5 secondi
            g_command = !g_command; // inverte il comando
            g_counter = 0; 
        }*/
    }
    if (digitalRead(PIN_SMIN) && digitalRead(PIN_SMAX)) {
        g_command = true;
    } else if (!digitalRead(PIN_SMIN) && !digitalRead(PIN_SMAX)) {
        g_command = false;
    }
        
    
    // SMAX indica full mentre SMIN indica empty
    // forse uno dei due sensori e guasto.
    if (!digitalRead(PIN_SMIN) && digitalRead(PIN_SMAX)) {
        Serial.println("anomalia sensori");
        Serial.print("SMIN is LOW and SMAX is HIGH.");
        while(1);
    }
    //Serial.println(g_command);
        
    //azionaMotori(azione, g_command, abort);
    comboAct(ca, g_command);
  
}
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
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
sw1:1
sw1:2
sw1:3
sw2:1
sw2:2
sw2:3