/*! \file sketch.cpp
\brief Emulation sketch Arduino pour le CESI.
\author Bertrand Vandeportaele IUT GEII
\date 14/02/2022
*/
#include "sketch.h"
#include "lib_io_tp.h"
CStateMachine MAE;
//////////////////////////////////////////////////////
void setup(){
Serial.begin(9600);
//init_millis();
//boucle locale pour simu
SetupES();
//arduino iut gomette bleue
//int r=setupES("172.16.6.60","4242");
setName("Elia & Thomas = <3");
printf("Elapsed time: %ld milliseconds\n", millis());
//programmeDeTest1();
//programmeDeTest1();
}
//////////////////////////////////////////////////////
void loop(){
unsigned int periodiciteTache1=10;
static unsigned long timerTache1 = millis();
if (millis() - timerTache1 >= periodiciteTache1) {
timerTache1 += periodiciteTache1;
MAE.setEntree(readPort());
MAE.clock();
writePort(MAE.getSortie());
char chaine[100];
//sprintf(chaine,"cpt=%d",cpt);
sprintf(chaine,"etat=%d",MAE.getEtat());
//printf("%s",chaine);
setMsg(chaine);
}
/*
unsigned int periodiciteTache2=1000;
static unsigned long timerTache2 = millis();
if (millis() - timerTache2 >= periodiciteTache2) {
timerTache2 += periodiciteTache2;
static unsigned int cpt=0;
cpt++;
}
*/
}
CStateMachine::CStateMachine()
{
reset();
}
void CStateMachine::reset()
{
etat = 0;
sortie = 0;
}
void CStateMachine::clock()
{
// Implémentation des entrées
unsigned char entree0 = (entree>>0)&1;
unsigned char entree1 = (entree>>1)&1;
unsigned char entree2 = (entree>>2)&1;
unsigned char entree3 = (entree>>3)&1;
// Création des varaiables capteurs (Logique inversée)
unsigned char Present = entree0^1;
unsigned char Metal = entree1^1;
unsigned char Noire = entree2^1;
unsigned char Plein = entree3^1;
printf("Present=%d",Present);
// Implémentation des sorties
unsigned char sortie0=0;
unsigned char sortie1=0;
unsigned char sortie2=0;
unsigned char sortie3=0;
// Sortie : Moteur
if ((etat ==2) || (etat == 4) || (etat == 1) || (etat ==7) || (etat == 10) || (etat == 0) )
{
sortie0 = 1;
}
// Sortie : Switch 1
if ((etat == 6) || (etat ==7))
{
sortie1 = 1;
}
// Sortie : Switch 2
//sortie2 = (sortie>>2)&1;
if ((etat == 3)||(etat == 4))
{
sortie2 = 1;
}
// Sortie : Stoppeur
sortie3 = 1;
// Changement des ETAT
switch (etat)
{
case 0 :
if ((Noire == 1)&&(Present == 0))
etat = 1;
else if (Present == 1)
etat = 9;
break;
case 1 :
if ((Metal==1)&&(Present ==0))
etat = 2;
if (Present ==1)
etat = 6;
break;
case 2 :
if (Present ==1)
etat = 3;
break;
case 3:
if (Plein == 0)
etat = 4;
break;
case 4:
if (Plein ==1)
etat = 5;
break;
case 5:
if (Plein == 0)
etat = 0;
break;
case 6:
if (Plein == 0)
etat = 7;
break;
case 7:
if (Plein == 1)
etat = 8;
break;
case 8:
if (Plein == 0)
etat = 0;
break;
case 9:
if (Plein == 0)
etat = 10;
break;
case 10:
if (Plein == 1)
etat = 11;
break;
case 11:
if (Plein == 0)
etat = 0;
break;
}
sortie = sortie0|sortie1<<1|sortie2<<2|sortie3<<3;
}
// |==============================|
// |=== Programme de débug ===|
// |==============================|
void debugMessage(const char * chaineMsg,const char * chaineFile,const unsigned int line)
{
printf("DEBUG ");
printf(chaineFile);
printf(" : l ");
printf("Ligne n° %d",line);
printf(" : ");
printf("\n");
printf(chaineMsg);
}
// |===================================|
// |=== Programme de test unitiaire ===|
// |===================================|
void programmeDeTest1()
{
MAE.reset();
MAE.setEntree(0);
//MAE.setEntreeBit(0,1);
//MAE.clock(); //ici on teste la mae sans considération de timing, donc clock() n'est pas conditionné à un timer
//MAE.clock();
// Transistion de l'état 1 vers l'état 5
if (MAE.getEtat()!=0) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
MAE.clock(); //ici on teste la mae sans considération de timing, donc clock() n'est pas conditionné à un timer
if (MAE.getSortieBit(0)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
MAE.clock();
if (MAE.getEtat()!=1) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
if (MAE.getSortieBit(0)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
MAE.setEntreeBit(1,1);
MAE.setEntreeBit(0,0);
MAE.clock(); //ici on teste la mae sans considération de timing, donc clock() n'est pas conditionné à un timer
MAE.clock();
if (MAE.getEtat()!=2) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
if (MAE.getSortieBit(0)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
MAE.setEntreeBit(1,0);
MAE.setEntreeBit(0,1);
MAE.clock(); //ici on teste la mae sans considération de timing, donc clock() n'est pas conditionné à un timer
//MAE.clock();
if (MAE.getEtat()!=3) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
MAE.setEntreeBit(1,0);
MAE.setEntreeBit(0,0);
MAE.setEntreeBit(0,0);
MAE.clock(); //ici on teste la mae sans considération de timing, donc clock() n'est pas conditionné à un timer
if (MAE.getSortieBit(2)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
MAE.clock();
if (MAE.getEtat()!=4) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
if (MAE.getSortieBit(0)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
if (MAE.getSortieBit(2)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
MAE.setEntreeBit(3,1);
MAE.clock(); //ici on teste la mae sans considération de timing, donc clock() n'est pas conditionné à un timer
MAE.clock();
if (MAE.getEtat()!=5) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
MAE.setEntreeBit(3,0);
MAE.clock(); //ici on teste la mae sans considération de timing, donc clock() n'est pas conditionné à un timer
if (MAE.getEtat()!=0) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
MAE.clock();
printf("\n");
printf("\n");
if (MAE.getEtat()!=1) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
// Transistion de l'état 1 vers l'état 8
MAE.setEntreeBit(0,1);
MAE.clock();
//MAE.clock();
if (MAE.getEtat()!=6) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
MAE.clock();
if (MAE.getSortieBit(1)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
MAE.setEntreeBit(0,0);
MAE.setEntreeBit(0,0);
MAE.clock();
MAE.clock();
if (MAE.getEtat()!=7) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
if (MAE.getSortieBit(0)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
if (MAE.getSortieBit(1)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
MAE.setEntreeBit(3,1);
MAE.clock();
MAE.clock();
if (MAE.getEtat()!=8) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
MAE.setEntreeBit(3,0);
MAE.clock();
//MAE.clock();
if (MAE.getEtat()!=0) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
MAE.setEntreeBit(0,1);
MAE.clock();
if (MAE.getSortieBit(0)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
if (MAE.getEtat()!=9) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
MAE.clock();
if (MAE.getEtat()!=10) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
MAE.clock();
if (MAE.getSortieBit(0)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
MAE.setEntreeBit(3,1);
MAE.clock();
if (MAE.getEtat()!=11) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
MAE.setEntreeBit(3,0);
MAE.clock();
if (MAE.getEtat()!=0) debugMessage("Erreur: La MAE n'est pas dans l\'état prévu", __FILE__, __LINE__);
MAE.clock();
if (MAE.getSortieBit(0)!=1) debugMessage("Erreur: La sortie n'est pas à la valeur prévue", __FILE__, __LINE__);
printf("etat=%d",MAE.getEtat());
printf("fin de test");
//flush (std::cout);
}