Horloge RTC

Dependencies:   ihm_L476_full RTC_IUT

main.cpp

Committer:
grimwald
Date:
2020-05-24
Revision:
2:29559ef1623d
Parent:
1:1e5f482dad5b
Child:
3:69c53ab43e4e

File content as of revision 2:29559ef1623d:


#include "ihm_L476.h"
Serial pc(SERIAL_TX, SERIAL_RX);//liason série
DigitalIn BPC (PA_0,PullNone) ;  // bouton centre
DigitalIn BPB (PA_1,PullDown) ;//bouton down
DigitalOut LG (PE_8) ;  // led verte
DigitalOut LR (PB_2) ;  // led rouge

IHM_L476 ihm;//bibliotheque de l'afficheur
Timer temps,temps2; //bibliotheque du chrono

// prototype et variables globales et constantes
void automate(void);
//


int main()
{
    
    ihm.LCD_printf("CHRONO");
    // début de l'application
    while(1) {
        wait(0.2);  //c'est la clock (5 Hz)
        automate(); // ce qui se produit sur top de clock
    }
}


void automate(void)
{
    // définition d'un type énuméré permettant de manipuler l'état de l'automate
    // par son nom
    typedef enum {etat0=0, start=1, stop=2,reset=3,lap=4} type_etat;
    type_etat etat_actuel = etat0 ;   // déclaration état actuel init. à etat0
    static type_etat etat_futur = etat0;  // déclaration état futur
    static int minute = 0; // declaration de minute en static pour que la valeur ne soit pas réinitialiser 
    int entree;
    int entreeb;
    
    // gestion des entrees
    entree = BPC;// c'est le bouton centre
    entreeb = BPB;// c'est le bouton bas
    // gestion du diagramme de transition
    etat_actuel = etat_futur;   // mise à jour de l'état
    // calul de l'éat futur en fonction de l'état actuel et des entrées
    switch(etat_actuel) {
        case etat0 :
            minute = 0; //pour reset
            temps.reset();//pour reset
            if (entree) etat_futur = start;
            break;
        case start :
            temps.start();//pour demarrer le chrono
            temps2=temps;//le temps2 recopie le temps de base 
            if (entree) etat_futur = stop;
            if (entreeb) etat_futur = lap;
            break;
        case stop :
            temps.stop();
            if (entree) etat_futur = start;
            if (entreeb) etat_futur = reset; //si j'appui sur le bouton down quand le chrono est stoppé il se reset
            break;
        case reset :
            etat_futur = etat0;
            break;
        case lap :
            temps2.stop();//le temps 2 se met en pause (qui est la copie du temps de base)pendant que le temps de base continue
            if (entreeb) etat_futur = start;
            break;
        
    }
    // valeurs des  sorties en fonction de l'état actuel
    switch(etat_actuel) {
       
        case etat0 :
            ihm.BAR_set(0);
            ihm.LCD_printf("%02d.%05.2f",minute,temps.read());//affiche le temps a zero
            pc.printf("%02d.%05.2f\r\n",minute,temps.read())
            break;
        case start :
            if(temps.read()>59.99){
                temps.reset();          // je reset les seconde a 0 et je rajoute une minute car 60s = 1 min
                minute = minute +1;
                }
            
            ihm.BAR_set(1);//debug de l'état
            ihm.LCD_printf("%02d.%05.2f",minute,temps.read());    // affichage mis a jour du temps // affichage sur l'écran LCD
            pc.printf("%02d.%05.2f \r\n",minute,temps.read());  // affichage sur pc
            break;
        case stop :
            ihm.BAR_set(2);//debug de l'état
            ihm.LCD_printf("%02d.%05.2f",minute,temps.read());    // affichage sur l'écran LCD
            pc.printf("%02d.%05.2f\r\n",minute,temps.read());   // affichage du temps en pause     // affichage sur pc  
            break;
        case lap :
            ihm.BAR_set(4);
            ihm.LCD_printf("%02d.%05.2f",minute,temps2.read()); //affiche le temps figé pendant que le temps continue
            pc.printf("%02d.%05.2f\r\n",minute,temps2.read())
            break;
            
    }
}