/******************************************************************************/
/* Files to Include                                                           */
/******************************************************************************/

#include "Process.h"


void Pes_AttenteDCY(float PoidsDeclenchement)                                   // EXP.PEs_PosCycle = 0
{
sortiesTOR(DO_CycleEnCours, 0);                                                 // Cycle en cours
sortiesTOR(DO_FeuVert, 1);                                                      // Feu vert activé
sortiesTOR(DO_FeuRouge, 0);                                                     // Feu rouge éteint

EXP.PEs_PoidsTotalEssieux = 0;
EXP.PEs_NbEssieuxPeses = 0;

if (EXP.PoidsMoyen >= PoidsDeclenchement)
    EXP.PEs_PosCycle = 5;
}


void Pes_AttenteEssieu(float PoidsDeclenchement)                                // EXP.PEs_PosCycle = 5
{
if (EXP.PoidsMoyen >= PoidsDeclenchement)
{
    sortiesTOR(DO_CycleEnCours, 1);                                             // Cycle en cours
    sortiesTOR(DO_FeuVert, 0);                                                  // Feu vert éteint
    sortiesTOR(DO_FeuRouge, 1);                                                 // Feu rouge activé 
    
    EXP.PEs_PosCycle = 10;
}   
}


void Pes_AttenteStabilite(float PoidsDeclenchement)                             // EXP.PEs_PosCycle = 10
{
if (EXP.PoidsStable)
{
    T100[timer_Pes_AttenteApresStabilite] = PAR.PEs_TempoApresStabilite;
    EXP.PEs_PosCycle = 20;
}

if (EXP.PoidsMoyen < PoidsDeclenchement)
    EXP.PEs_PosCycle = 5;                                                       // Attente nouvel essieu
}


void Pes_AttenteFinTempo(float PoidsDeclenchement)                              // EXP.PEs_PosCycle = 20
{
if (!EXP.PoidsStable)
    EXP.PEs_PosCycle = 10;

if (EXP.PoidsMoyen < PoidsDeclenchement)
    EXP.PEs_PosCycle = 5;                                                       // Attente nouvel essieu

if (!T100[timer_Pes_AttenteApresStabilite])
{
    EXP.PEs_CumulPoidsEssieu = 0.0;
    EXP.PEs_NbMesurePoids = 0;
    T100[timer_Pes_TempsMesurePoids] = PAR.PEs_TempsAcquisitionPoids;           // Tempo Xs

    EXP.PEs_PosCycle = 30;                                                      // Mesure poids
}
}


void Pes_MesurePoids(float PoidsDeclenchement)                                  // EXP.PEs_PosCycle = 30
{
float           PoidsEssieu;
float           interF;
long            interL;

if (!EXP.PoidsStable)
    EXP.PEs_PosCycle = 10;

if (EXP.PoidsMoyen < PoidsDeclenchement)
    EXP.PEs_PosCycle = 5;                                                       // Attente nouvel essieu

if (!T100[timer_Pes_TempsMesurePoids])
{
    EXP.PEs_NbEssieuxPeses++;
    PoidsEssieu = (EXP.PEs_CumulPoidsEssieu / EXP.PEs_NbMesurePoids - PAR.TareInc) * PAR.Pente[1] / 100000;

    // Création poids afficheur
    if (PoidsEssieu > 0)
        interF = EXP.PoidsMoyen + (PAR.EchelonPoidsVal/2);
    else
        interF = EXP.PoidsMoyen - (PAR.EchelonPoidsVal/2);
    interF = interF / PAR.EchelonPoidsVal;
    interL = interF;
    interF = interL * PAR.EchelonPoidsVal;

    EXP.PEs_NumeroEssieu[EXP.PEs_NbEssieuxPeses] = EXP.PEs_NbEssieuxPeses;
    EXP.PEs_PoidsTotalEssieuxReel = EXP.PEs_PoidsTotalEssieuxReel + interF;
    EXP.PEs_PoidsTotalEssieux = EXP.PEs_PoidsTotalEssieuxReel;
    interF = interF * 1000;
    EXP.PEs_PoidsEssieu[EXP.PEs_NbEssieuxPeses] = interF;


    sortiesTOR(DO_FeuVert, 1);                                                  // Feu vert activé 
    sortiesTOR(DO_FeuRouge, 0);                                                 // Feu rouge éteint 

    EXP.PEs_PosCycle = 40;                                                      // Attente pese essieu vide
}
}


void Pes_AttentePeseEssieuVide(float PoidsDeclenchement)                        // EXP.PEs_PosCycle = 40
{
if (EXP.PoidsMoyen < PoidsDeclenchement)
    EXP.PEs_PosCycle = 5;                                                       // Attente essieu suivant
}


void Pes_TempoFinCycle(void)                                                    // EXP.PEs_PosCycle = 100
{
if (!T100[timer_Pes_TempoFinDeCycle])
    EXP.PEs_PosCycle = 0;                                                       // Attente DCY
}


void gestion_cycle_PeseEssieu(void)
{
float           PoidsDeclenchement;
int             indice;

GestionCyclePesage();

PoidsDeclenchement = PAR.PEs_SeuilDeclenchement; PoidsDeclenchement /= 1000;

switch (EXP.PEs_PosCycle)
{
    case   0 : Pes_AttenteDCY(PoidsDeclenchement);
               break;
    case   5 : Pes_AttenteEssieu(PoidsDeclenchement);
               break;
    case  10 : Pes_AttenteStabilite(PoidsDeclenchement);
               break;
    case  20 : Pes_AttenteFinTempo(PoidsDeclenchement);
               break;
    case  30 : Pes_MesurePoids(PoidsDeclenchement);
               break;
    case  40 : Pes_AttentePeseEssieuVide(PoidsDeclenchement);
               break;
    case 100 : Pes_TempoFinCycle();
               break;
}

// RAZ des données pèse essieux
if (EXP.Command2 & 0x0001)                                                      // RAZ données pèse essieux
{
    EXP.Command2 = EXP.Command2 & 0xFFFE;
    EXP.PEs_NbEssieuxPeses = 0;
    EXP.PEs_PoidsTotalEssieux = 0;
    EXP.PEs_PosCycle = 0;                                                       // Attente DCY
    EXP.PEs_PoidsTotalEssieuxReel = 0.0;
    
    for (indice=1; indice<=100; indice++)
    {
        EXP.PEs_NumeroEssieu[indice] = 0;
        EXP.PEs_PoidsEssieu[indice] = 0;
    }
}
    
// Impression ticket
if (EXP.Command2 & 0x0002)                                                     // Impression ticket
{
    if (PAR.Impr_NumTicket < 60000)
        PAR.Impr_NumTicket++;
    else
        PAR.Impr_NumTicket = 1;
    ImpressionTotalisateur(0, 0, 1);
}
EXP.Command2 = EXP.Command2 & 0xFFFD;

// Acquittement défauts
if ((EXP.Command1 & 0x0008)                                                     // Acquittement défauts
        || (EXP.Profibus_Command & 0x0008)                                      // Acquittement défauts
        || (ValEntTOR(DI_AcqDefauts, 0)))                                       // Acquittement défauts
{
    EXP.Command1 = EXP.Command1 & 0xFFF7;
    EXP.Profibus_Command = EXP.Profibus_Command & 0xFFF7;

    EXP.Defaut1 = 0;
    EXP.Defaut2 = 0;
}
}


