//////////////////////////////////////////////////////////////////// //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) ; } ////////////////////////////////////////////////////////////////////