/*
IBT-2 Motor Control Board driven by Arduino.
 
Speed and direction controlled by a potentiometer attached to analog input 0.
One side pin of the potentiometer (either one) to ground; the other side pin to +5V
 
Connection to the IBT-2 board:
IBT-2 pin 1 (RPWM) to Arduino pin 5(PWM)
IBT-2 pin 2 (LPWM) to Arduino pin 6(PWM)
IBT-2 pins 3 (R_EN), 4 (L_EN), 7 (VCC) to Arduino 5V pin
IBT-2 pin 8 (GND) to Arduino GND
IBT-2 pins 5 (R_IS) and 6 (L_IS) not connected
*/
 
int potMoteur;       // potentiometre vitesse moteur
int potG;           // potentiometre % Géneral
int potQ;     // potentiometre débit colle
int delayStart =A3;       // delay avant le debut de cordon en mode continu ou le premier paquet en mode paquet
int delayStop =A4;        // delay avant la fin du cordon en mode continu ou le dernier paquet en mode paquet
int delayinterpaquets =A5;// delay entre deux paquets
int delaytaillepaquets ; 
int memCollage;
int memmoteur;
int memPaquets;
int dStop;
int dInter;
int dStart;

int unSeulStart;

int motor_speed1;


int dTaille = delaytaillepaquets ; 
int reducp;

//int dStart1 = map(dStart, 0, 1023, 0 , 2000);

const int Bp1 = 2;     // Capteur Colle
const int Bp2 = 4 ;      // Selecteur Mode continu ou paquets
int etatBp1; 
int etatBp2; 

int Speed;
 
int RPWM = 5; // Arduino PWM output pin 5; connect to IBT-2 pin 1 (RPWM)
int LPWM = 6; // Arduino PWM output pin 6; connect to IBT-2 pin 2 (LPWM)

int Q = 3; // Sortie PWM 3 ; sur PWM module 0-10v
 
void setup()
{
  //------------------------------------------------------------Entrées / Sortie
  pinMode(Q, OUTPUT);
  pinMode(RPWM, OUTPUT);
  pinMode(LPWM, OUTPUT);
  pinMode(Bp1, INPUT); // le bouton 1 est une entrée
  pinMode(Bp2, INPUT); // le bouton 1 est une entrée

  etatBp1 = HIGH; //Bp1 est relaché 
  etatBp2 = HIGH; //Bp2 est relaché 
  memCollage = HIGH; //collage est arreté de base 
  memmoteur = HIGH; // moteur est arreté de base
  unSeulStart = HIGH;
  memPaquets = HIGH;


  //--------------------------------------------------------------Serial.Print------------------------
  Serial.begin(115200); //Initialise la communication entre le PC et Arduino
 Serial.println("Regul_3_Potar_V3_delayX3");  
  Serial.println("Wait..."); 
  delay(1000);
  Serial.println("OK");
}
 
void loop()
{
  etatBp1 = digitalRead(Bp1); // lire état Bp1
  etatBp2 = digitalRead(Bp2);
  //potG = map(potG, 0, 1023, 0, 100);           // potar General en 100%
    

  // int potMoteur = analogRead(potG);
  // int potG = analogRead(Pot_G);
  //int potQ = analogRead(A2);
  // int dStart = analogRead(delayStart);       
  // int dStop = analogRead(delayStop);        
  //int dInter = analogRead(delayinterpaquets);
  // int dTaille = delaytaillepaquets ; 
  // int motor_speed1;
 // int reducp;
   
  //dStart = map(dStart, 0, 1023, 0 , 2000);
  //dStop = map(dStop, 0, 1023, 0 , 2000);
  // dInter = map(dStart, 0, 1023, 0 , 2000);
  
 // motor_speed1 = map(potMoteur, 0, 1023, 0, 255); // potar moteur 0-255
 //potQ = map (potQ, 0, 1023, 0,255);           // potar colle 0-255
//reducp = potG/10 ;

 //-------------------------------------------------------------Action du Potar G sur les autres potar

 //motor_speed1 = motor_speed1 * (255 - reducp) / 255; // ne pas utiliser celui la 
 // motor_speed1 = (motor_speed1 * potG)/100; // utiliser celui la 
 //potQ = (potQ * potG)/100;

//---------------------------------------------------------------Condition ajouté pour le BP1 action sur la colle
if (etatBp2 == HIGH)
  {
Continu(); // appel fonction continue
marcheMoteur();

    }
     else
     {
      Paquets();// appel fonction Paquets
      }
//----------------------------------------------------------------------Fonctions----------------------------------
}

void Paquets(){

//-----------------------------------------------------définition mode paquet---------------------------


  delaytaillepaquets = 1000; // donne le temps qui defini la taille du paquet

marcheMoteur();// démarrage Moteur-----
collagePaquets();
  
}

void Continu(){
//-----------------------------------------------------définition  mode continu---------------------------


  marcheMoteur();
  collageContinu();                // et on active le mode collage continu

}

void collageContinu(){ //-----------------------------------------------------définition du mode collage continu---------------------------

Serial.println("---------------------------------------------------------");
Serial.println("Mode collageContinu");
Serial.println("---------------------------------------------------------");

if (etatBp1 == HIGH)//--------------------------------------Si Bp1 est relaché

 {  //------------------------------------------------si bp deja relaché on ne fait rien de plus 
    Serial.println("Bp relaché attendre");
    if(memCollage == HIGH){ // si collage est inactif

      Serial.println("collage deja arreté");
    }
    else {//-----------------------------------------sinon si le bouton était actif on arrete la colle

      fdelayStop(); // attendre ... milliseconde avant d'arreter la colle régulé
      Serial.println("delai Stop: ");
      Serial.println(dStop);
      arretColle();  // 0 Bar pour la colle
      memCollage=HIGH;
      Serial.println("on arrete la colle=> 0 BAR");
      Serial.println("---------------------------------------------------------");
    }


  }//--------------------------------------------------si le Bp1 est appuyé
   else
   {
      if(memCollage == HIGH){//------------------------------si il était relaché on démarre la colle 
      Serial.println("Bouton actif");
      memCollage=LOW;
      Serial.println("mémoire collage actif");
      fdelayStart(); // attendre ... milliseconde avant de demarrer la colle régulé
    
      debitColle(); // sinon on utilise la valeur potQ pour donner la valeur de Pression
      Serial.println(" on démarre la colle => 0-6 BAR régulé par potQ");
      }
        else{//------------------------------------------------si il était deja actif on ne fait rien de plus
          Serial.println(" collage deja actif on ne fait rien de plus");
          Serial.println("---------------------------------------------------------");
    }
  }
  delay((2000)); //delai pour serial.print

}

void collagePaquets(){ //-----------------------------------------------------définition du mode collage continu---------------------------

Serial.println("---------------------------------------------------------");
Serial.println("Mode collagePaquets");
Serial.println("---------------------------------------------------------");

if (etatBp1 == HIGH)//--------------------------------------Si Bp1 est relaché

 {  //------------------------------------------------si bp deja relaché on ne fait rien de plus 
    Serial.println("Aucune Présence");
    if(memCollage == HIGH){                   // si collage est inactif
      unSeulStart=HIGH;
      Serial.println("COLLE deja sur OFF");
      Serial.println("---------------------------------------------------------");
    }
    else {//-----------------------------------------sinon si le bouton était actif on arrete la colle
      dernierPaquets();
      fdelayStop();                         // attendre ... milliseconde avant d'arreter la colle régulé
      Serial.println("delai Stop: ");
      Serial.println(dStop);
      dernierPaquets();
      unSeulStart=HIGH;
    }
                                                          // MANQUE MOTEUR

  }//--------------------------------------------------si le Bp1 est appuyé
   else
   {
    if(memCollage == HIGH){//------------------------------si il était relaché on démarre la colle 
      Serial.println("Présence Profil");
      marcheMoteur();
      reglagePaquets();
}
    
    
    else{//------------------------------------------------si il était deja actif on ne fait rien de plus
    Serial.println(" collage deja actif on ne fait rien de plus");
    }
  }
  delay((2000)); //delai pour serial.print

}

void marcheMoteur() { //marcheMoteur();

if (memmoteur == HIGH){
    
    potMoteur = analogRead(A0);
    potG = analogRead(A1);
    potG = map(potG, 0, 1023, 0, 100);
    motor_speed1 = map(potMoteur, 0, 1023, 0, 255); // potar moteur 0-255
    motor_speed1 = (motor_speed1 * potG)/100;
       
    analogWrite(RPWM, motor_speed1);
    Serial.print("motor_speed1 : ");
    Serial.println(motor_speed1);
    analogWrite(LPWM, 0);
    memmoteur = LOW;
      Serial.println("Moteur ON");

}else{
  Serial.println("Moteur Reste sur ON ");
}
}

void arretMoteur(){

  analogWrite(RPWM, 0);
  analogWrite(LPWM, 0);
  memmoteur = HIGH;
  Serial.println("Moteur OFF");
}

void fdelayStop() { 
  dStop = analogRead(delayStop);
dStop = map(dStop, 0, 1023, 0 , 2000);
Serial.print("délai stop: ");
    Serial.print(dStop);
    Serial.println(" mS ");
delay(dStop);
}

void fdelayStart() { 
  
  dStart = analogRead(delayStart);
  dStart = map(dStart, 0, 1023, 0 , 2000);
  Serial.print("délai start: ");
    Serial.print(dStart);
    Serial.println(" mS ");
  delay(dStart);
}



void fdInter() {
  
  dInter = analogRead(delayinterpaquets);
  dInter = map(dInter, 0, 1023, 0 , 2000);
  Serial.print("délai inter paquets: ");
    Serial.print(dInter);
    Serial.println(" mS ");
  delay(dStart);
}

void ftempsTaillePaquets() {
  
  delaytaillepaquets = 1500;
  
  Serial.print("délai taille paquets: ");
    Serial.print(delaytaillepaquets);
    Serial.println(" mS ");
    delay(delaytaillepaquets);
}


void debitColle(){
  potG = analogRead(A1);
  potG = map(potG, 0, 1023, 0, 100);

  potQ = analogRead(A2);
  potQ = map (potQ, 0, 1023, 0,255);
  potQ = (potQ * potG)/100;

  analogWrite(Q, potQ);
  Serial.print("potQ : ");
    Serial.println(potQ);
  memCollage = LOW;
  Serial.println("Colle ON ");

}


void reglagePaquets(){
    
    if(unSeulStart==HIGH){ // memCollage'est le premier Paquet donc on met un délai Start
    Serial.println("memCollage'est le premier Paquet donc on met un délai Start");
    unSeulStart = LOW; // on passe un seulStart a actif
    fdelayStart();                //délai avant de mettre le premier paquet
    arretMoteur();                //Arret Moteur
    debitColle();                  // On colle
    ftempsTaillePaquets();        // on met un paquets
    arretColle();            // on arrete la colle
    marcheMoteur();               // Go moteur
    fdInter();                    // on attend entre deux paquets

    }

      else 
      {Serial.println("memCollage est sur LOW donc on enchaine avec les paquets suivant");
        arretMoteur();                //Arret Moteur
        ftempsTaillePaquets();        // on met un paquets
        arretColle();            // on arrete la colle
        marcheMoteur();               // Go moteur
        fdInter();                    // on attent 
    }

}

void dernierPaquets(){

  Serial.println("Dernier paquets");
    ftempsTaillePaquets();  // on met un paquets
    arretMoteur();
    arretColle();
    unSeulStart = HIGH;
    memCollage = HIGH;
    marcheMoteur;
}

void arretColle(){
  analogWrite(Q, 0);
  Serial.println("Colle OFF");
  memCollage = HIGH;
}




/* Serial.print("potMoteur : ");
    Serial.println(potMoteur);
    Serial.println(".........");
    

    Serial.print("potG :");
    Serial.println(potG);
    Serial.println(".........");
    
    Serial.print("motor_speed1 : ");
    Serial.println(motor_speed1);
    Serial.println(".........");

    Serial.print("potQ : ");
    Serial.println(potQ);
    Serial.println(".........");
    
    delay(500); //delai affichage 

    */

 
 
 /* Speed = map(potMoteur, 0, 1023, 0, 255);
    analogWrite(RPWM, Speed);
    analogWrite(LPWM, 0);
Serial.print(sensorValue);
Serial.print("...");
Serial.println(Speed);
*/

//potG = map(potMoteur, 0, , 0, potValue2);

//analogWrite(Q, potQ);

 //0-10v = potQ
Speed
Général
Débit colle
Délai Start
Délai Stop
Délai Inter
Paquets / Continu
Présence Profil
OUI / NON
Bp1
Bp2
Mode fonctionnement