Horloge RTC

Dependencies:   ihm_L476_full RTC_IUT

main.cpp

Committer:
grimwald
Date:
2020-07-27
Revision:
5:6ce20ff7927b
Parent:
4:86341306d9d7
Child:
6:21be959149c3

File content as of revision 5:6ce20ff7927b:

#include "RTC_IUT.h"//bibliotheque de l'afficheur
#include "ihm_L476.h"//bibliotheque du chrono
DigitalIn BPC (PA_0,PullNone) ;  // bouton centre
DigitalIn BPL (PA_1,PullDown) ;//left
DigitalIn BPR(PA_2,PullDown) ;//right
DigitalIn BPU(PA_3,PullDown) ;//up
DigitalIn BPD (PA_5,PullDown) ;//down
DigitalOut LG (PE_8) ;  // led verte
DigitalOut LR (PB_2) ;  // led rouge

IHM_L476 ihm; // on chosis des noms qui nous serviront a appelé les fonctions dans les bibliotheque
Rtc rtc;
time_t heure_t,minute_t,seconde_t;//on nomme nos valeur qui seront sous le format time_t

// prototype et variables globales et constantes
static unsigned char Heure_t=23,Minute_t=59,Seconde_t = 50; // on defini l'heure avec une unsigned char

void automate(void);



int main()
{
    rtc.SetHour(Heure_t);
    rtc.SetMin(Minute_t);// On initialise l'heure , les minutes et les secondes
    rtc.SetSec(Seconde_t);
    rtc.SetYear(2020);
    ihm.LCD_printf("CLOCK");
    // début de l'application
    while(1) {
        wait(0.1);
        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 {affichage=0, Minutep =1, Minutem =2, Heurep= 3,Heurem =4,Calendrier=5,Jour+=6,Jour} type_etat;
    type_etat etat_actuel = affichage ;   // déclaration état actuel init. à etat0
    static type_etat etat_futur = affichage;  // déclaration état futur
    int entreeb, entreeh, entreeg, entreed , entree;

    // gestion des entrees
    entree = BPC;// c'est le bouton centre
    entreeb = BPD;// c'est le bouton bas
    entreeh = BPU;
    entreeg = BPL;
    entreed = BPR;
    
    // 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) {
        //les différents états en accord avec le diagramme de transition


        case affichage :
            if(entreed)etat_futur= Minutep;//si j'appuie sur droite j'augmente les minute de 1
            if(entreeg)etat_futur=Minutem;//si j'appuie a gauche je diminue les minutes de
            if(entreeh)etat_futur=Heurep;//si j'appuie sur haut j'augmente les heures de 1
            if(entreeb)etat_futur=Heurem;//si j'appuie en bas je diminue les heures de 1
            if(entree)etat_futur=Calendrier;//si j'appuie je vais sur le calendrier

            if(Minute_t > 59  ) { // si Minute_t depasse 59 minutes alors Minute_t reviens a 0 et j'incremente Heure_t de 1
                Minute_t=00;
                rtc.SetHour(Heure_t++);
            }
            if(Heure_t > 23 ) {//si Heure_t depasse 23 heures alors Heure_t reviens a 0
                Heure_t = 00;
            }

            if(Seconde_t > 59 ) {// si Seconde_t depasse 59 secondes alors Secondes_t reviens a 0 et j'incremente Minute_t de 1
                Seconde_t = 00;
                rtc.SetMin(Minute_t++);
            }
            break;


        case Minutep:
            rtc.SetMin(Minute_t++); // j'incremente Minute_t
            rtc.SetSec(00);//je met les secondes a zero a chaque changement d'etat
            etat_futur = affichage;// je retourne a l'affichage
            break;
        case  Minutem:
            rtc.SetMin(Minute_t--);//je diminue Minute_t
            rtc.SetSec(00);
            etat_futur = affichage;
            break;

        case Heurep:
            rtc.SetHour(Heure_t++);//j'incremente Heure_t
            rtc.SetSec(00);
            etat_futur = affichage;
            break;

        case Heurem :
            rtc.SetHour(Heure_t--);
            rtc.SetSec(00);
            etat_futur = affichage;
            break;
        case Calendrier:
            break;




    }
    // valeurs des  sorties en fonction de l'état actuel
    switch(etat_actuel) {



        case affichage :
            ihm.BAR_set(0);
            heure_t= rtc.GetHour();
            minute_t = rtc.GetMin();//J'utilise les valeurs qui ont été etablie avant et je les met dans des variables
            seconde_t = rtc.GetSec();
            ihm.LCD_printf("%02d:%02d:%02d",heure_t,minute_t,seconde_t);
            LG=0;// je met les leds a 0 pour un effet de clignotement
            LR=0;

            break;



        case Minutep :
            ihm.BAR_set(2);
            heure_t= rtc.GetHour();
            minute_t = rtc.GetMin();//J'utilise les valeurs qui ont été etablie avant et je les met dans des variables
            seconde_t = rtc.GetSec();
            ihm.LCD_printf("%02d:%02d:%02d",heure_t,minute_t,seconde_t);
            LG=1;// j'allume verte pour l'incrementation
            LR=0;
            break;
        case Minutem :
            ihm.BAR_set(2);
            ihm.LCD_printf("%02d:%02d:%02d",heure_t,minute_t,seconde_t);
            LG=0;// j'allume rouge pour la diminution
            LR=1;
            break;
        case Heurep :
            ihm.BAR_set(1);//debug de l'état
            ihm.LCD_printf("%02d:%02d:%02d",heure_t,minute_t,seconde_t);//affichage de l'heure en format 00:00:00
            LG=1;// j'allume verte pour l'incrementation
            LR=0;
            break;

        case Heurem :
            ihm.BAR_set(1);
            ihm.LCD_printf("%02d:%02d:%02d",Heure_t,Minute_t,seconde_t);
            LG=0;
            LR=1;// j'allume rouge pour la diminution
            break;
        case Calendrier:
            break;



    }
}