#include "biblio.h"
void setup() {
// put your setup code here, to run once:
}
void loop() {
////////////////////////////////////////////////////////////////////
//Implémentation de la méthode constructeur
CStateMachine::CStateMachine(){
// à compléter si besoin, allocation etc...
reset();
}
////////////////////////////////////////////////////////////////////
//Implémentation de la méthode reset, tout ce qui est fait pour (re)démarrer la machine à états
void CStateMachine::reset(){
etat=0;
sortie=0; //mettre des valeurs initiales correctes
}
////////////////////////////////////////////////////////////////////
//Implémentation de la méthode clock
void CStateMachine::clock(){
//variables intérmédiaires pour les 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;
//variables intérmédiaires pour les sorties
//codage des sorties
//Sortie0 est une AMZI
unsigned char sortie0;
if (etat==3)
sortie0=entree1;
else
sortie0=0;
//Sortie1 est une AMZI
unsigned char sortie1;
if (etat==1)
sortie1=entree1;
else if ((etat==3)&& (entree0==0))
sortie1=entree2;
else
sortie1=0;
//Sortie2 est une AMZE
unsigned char sortie2=(sortie>>2)&1; //récupère la valeur précédente
if ((etat==0) && ( (entree0==1) && (entree1==0)) )
sortie2=entree2;
//Sortie3 est une AMZE
unsigned char sortie3=(sortie>>3)&1; //récupère la valeur précédente
if ((etat==1) && (entree2==0) )
sortie3=entree0;
else if ((etat==2) && (entree2==1) && (entree0==0) )
sortie3=0;
//codage de l'évolution de l'état
switch (etat){
default:
case 0: if ( (entree0==1) && (entree1==0))
etat=1;
break;
case 1: if (entree2==0)
etat=2;
break;
case 2: if (entree0==1)
etat=3;
else if (entree2==1) //entree0==0 implicite par le else
etat=0;
break;
case 3: if (entree0==0)
etat=0;
break;
}
//reconstruction de sortie à partir des variables intermédiaires
sortie=(sortie3<<3) | (sortie2<<2) | (sortie1<<1) | (sortie0<<0) ;
}
////////////////////////////////////////////////////////////////////
}