Horloge RTC

Dependencies:   ihm_L476_full RTC_IUT

main.cpp

Committer:
grimwald
Date:
2020-08-30
Revision:
6:21be959149c3
Parent:
5:6ce20ff7927b

File content as of revision 6:21be959149c3:

#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,mois_t,jour_t,annee_t;//on nomme nos valeur qui seront sous le format time_t
Serial pc(SERIAL_TX, SERIAL_RX);//permet la communication avec le terminal en liason serie

Timer tempo1,tempo2,tempo3,tempo4,tempsS;

// prototype et variables globales et constantes
static unsigned char Heure_t=23,Minute_t=59,Seconde_t = 50,Mois_t=01,Jour_t=01,Annee_t=18; // on defini l'heure/date 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 au valeur demandes
    rtc.SetSec(Seconde_t);

    rtc.SetDay(Jour_t);
    rtc.SetMon(Mois_t);//on initialise la date au valeurs demandes
    rtc.SetYear(Annee_t);

    ihm.LCD_printf("CLK:OS");
    // 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 {Menu=0,Horloge=1,Calendrier=2,inter=3,Alarme=4,bip=5,bip2=6,Minuteur=7} type_etat;
    type_etat etat_actuel = Menu ;   // déclaration état actuel init. à etat0
    static type_etat etat_futur = Menu;  // déclaration état futur

    int entreeb, entreeh, entreeg, entreed, entree;
    static int compteur=0;
    static int cptMenu=0;

    static int Heure_a=00,Minute_a =00,Seconde_a=00; // creation de mutliple variables
    static int cpt_a=0,choix_a=0;

    static int Heure_m=00,Minute_m =00,Seconde_m=00;
    static int cpt_m=0,choix_m=0;



    // gestion des entrees
    entree = BPC;// c'est le bouton centre
    entreeb = BPD;// c'est le bouton bas
    entreeh = BPU;//haut
    entreeg = BPL;//gauche
    entreed = BPR;//droit

    // 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 Menu :

            //a chaque que j'appui sur droite ou gauche j'ajoute ou je retire 1 au compteur ensuite le programme va regarder a combien est le compteur
            //et cela correspondera a un affichage du menu ensuite il reste appuyer pour changer d'etat correspondant
            if (cptMenu == 0) {
                ihm.LCD_printf("HORLOGE\r");
                if(entree) {
                    etat_futur = Horloge;
                }
            }
            if (cptMenu == 1) {
                ihm.LCD_printf("CALENDRIER\r");
                if(entree) {
                    etat_futur = Calendrier;
                }
            }
            if (cptMenu == 2) {
                ihm.LCD_printf("ALARME\r");
                if(entree) {
                    etat_futur = Alarme;
                }
            }
            if (cptMenu == 3) {
                ihm.LCD_printf("MINUTEUR\r");
                if(entree) {
                    etat_futur = Minuteur;
                }
            }


            if(entreed) {
                cptMenu++;
                LG=1;// j'allume verte pour l'incrementation
                LR=0;


            }
            if(entreeg) {
                cptMenu--;
                LG=0;// j'allume verte pour l'incrementation
                LR=1;

            }
            if(cptMenu > 3 or cptMenu<0) {//si le compteur depasse une certaine valeur il revient au depart
                cptMenu=0;
            }
            if (cpt_a == 1 && Heure_a == heure_t && Minute_a == minute_t && Seconde_a == seconde_t) {//alarme
                pc.printf("bip bip");
                etat_futur=bip;
            }
            if (cpt_m == 1 && Heure_m == 00 && Minute_m == 00 && Seconde_m == 00) {//alarme minuteur
                pc.printf("bip bip");
                etat_futur=bip2;
            }
            break;


        case Horloge :


            if(entreed) {
                rtc.SetMin(Minute_t++); // j'incremente Minute_t
                rtc.SetSec(00);//je met les secondes a zero a chaque changement d'etat
                heure_t = rtc.GetHour();
                rtc.SetMin(Minute_t);
                rtc.SetHour(Heure_t);
                LG=1;// j'allume verte pour l'incrementation
                LR=0;
            }//si j'appuie sur droite j'augmente les minute de 1

            if(entreeg) {
                rtc.SetMin(Minute_t--);//je diminue Minute_t
                heure_t = rtc.GetHour();
                rtc.SetMin(Minute_t);
                rtc.SetHour(Heure_t);
                rtc.SetSec(00);


                LG=0;// j'allume rouge pour la diminution
                LR=1;
            }//si j'appuie a gauche je diminue les minutes de

            if(entreeh) {
                rtc.SetHour(Heure_t++);//j'incremente Heure_t
                rtc.SetSec(00);
                jour_t=rtc.GetDay();
                minute_t = rtc.GetMin();
                rtc.SetMin(Minute_t);
                rtc.SetHour(Heure_t);

                LG=1;// j'allume verte pour l'incrementation
                LR=0;

            }//si j'appuie sur haut j'augmente les heures de 1

            else if(entreeb) {
                rtc.SetHour(Heure_t--);
                rtc.SetSec(00);
                jour_t=rtc.GetDay();
                minute_t = rtc.GetMin();
                rtc.SetHour(Heure_t);
                rtc.SetMin(Minute_t);

                LG=0;
                LR=1;// j'allume rouge pour la diminution
            }//si j'appuie en bas je diminue les heures de 1


            if(entree)etat_futur=inter;
            if (cpt_a == 1 && Heure_a == heure_t && Minute_a == minute_t && Seconde_a == seconde_t) {
                pc.printf("bip bip");
                etat_futur=bip;
            }
            if (cpt_m == 1 && Heure_m == 00 && Minute_m == 00 && Seconde_m == 00) {
                pc.printf("bip bip");
                etat_futur=bip2;
            }
            break;



        case Calendrier:
            rtc.SetDay(Jour_t);//j'incremente Jour_t


            rtc.SetMon(Mois_t);

            mois_t=rtc.GetMon();
            jour_t=rtc.GetDay();

            if(compteur==0) {
                ihm.BAR_set(1);
                if(entreeh) {
                    rtc.SetDay(Jour_t++);//j'incremente Jour_t


                    rtc.SetMon(Mois_t);

                    mois_t=rtc.GetMon();
                    jour_t=rtc.GetDay();

                    LG=1;// j'allume verte pour l'incrementation
                    LR=0;
                } else if (entreeb) {
                    rtc.SetDay(Jour_t--);
                    jour_t=rtc.GetDay();
                    rtc.SetMon(Mois_t);
                    mois_t=rtc.GetMon();

                    LG=0;
                    LR=1;
                }
            } else if(compteur==1) {
                ihm.BAR_set(2);
                if(entreeh) {
                    rtc.SetMon(Mois_t++);

                    mois_t=rtc.GetMon();
                    jour_t=rtc.GetDay();
                    rtc.SetDay(Jour_t);



                    LG=1;
                    LR=0;
                } else if (entreeb) {
                    rtc.SetMon(Mois_t--);

                    mois_t=rtc.GetMon();
                    rtc.SetDay(Jour_t);

                    jour_t=rtc.GetDay();


                    LG=0;
                    LR=1;
                }
            }//si j'appuie sur haut j'augmente les heures de 1
            /** else if(compteur==2) {
                 ihm.BAR_set(4);
                 if(entreeh) {
                     rtc.SetYear(Annee_t++);//j'incremente Heure_t

                     annee_t=rtc.GetYear();



                     jour_t=rtc.GetDay();



             mois_t=rtc.GetMon();
                     LG=1;// j'allume verte pour l'incrementation
                     LR=0;
                 }
                 if (entreeb) {
                     rtc.SetYear(Annee_t--);//j'incremente Heure_t

                     annee_t=rtc.GetYear();


                     jour_t=rtc.GetDay();



             mois_t=rtc.GetMon();
                     LG=0;// j'allume verte pour l'incrementation
                     LR=1;
                 }
             }
             **/
            //En fonction de l'appui sur droite ou gauche je change la valeur du compteur et certaine corresponde soit au jour , mois ou année
            if(entreed) {
                compteur++;

                LG=1;// j'allume verte pour l'incrementation
                LR=0;


            }
            if(entreeg) {
                compteur--;

                LG=0;
                LR=1;

            }




            if(compteur > 2 or compteur<0) {
                compteur=0;
            }
            if(entree)etat_futur=inter;
            if (cpt_a == 1 && Heure_a == heure_t && Minute_a == minute_t && Seconde_a == seconde_t) {
                pc.printf("bip bip");
                etat_futur=bip;
            }
            if (cpt_m == 1 && Heure_m == 00 && Minute_m == 00 && Seconde_m == 00) {
                pc.printf("bip bip");
                etat_futur=bip2;
            }

            break;
        case inter:
            if(entree)etat_futur=inter;
            if(!entree)etat_futur=Menu; // test pour avoir un ecran eteint quand on reste appuyé au retour au menu
            break;

        case Alarme:
            heure_t = rtc.GetHour();
            minute_t = rtc.GetMin();//J'utilise les valeurs qui ont été etablie avant et je les met dans des variables


            //pc.printf("%d\n",cpt_a);
            // en fonction de la valeur de choix_a on va selectionner soit les heure , minute ou seconde et avec la possibiliés de  les modifier
            if (entreed) {
                choix_a++;
            }
            if (choix_a == 0) {
                LG=1;
                LR=0;
                if(entreeh) {
                    Heure_a++;
                } else if(entreeb) {
                    Heure_a--;
                }
            }

            else if (choix_a == 1) {
                LG=0;
                LR=1;
                if(entreeh) {
                    Minute_a++;
                } else if(entreeb) {
                    Minute_a--;
                }
            } else if (choix_a == 2) {
                LG=0;
                LR=0;
                if(entreeh) {
                    Seconde_a++;
                } else if(entreeb) {
                    Seconde_a--;
                }
            }

            // en appuyant sur gauche on met l'alarme soit sur off ou on
            if (entreeg) {
                cpt_a++;
            }
            if (cpt_a==0) {
                //OFF
                ihm.BAR_set(1);

            }

            else if (cpt_a==1) {
                //ON
                ihm.BAR_set(2);

            }
            // si l'alarme est ON est que le temps voulu correspond au temps actuel l'alarme sonne
            if (cpt_a == 1 && Heure_a == heure_t && Minute_a == minute_t && Seconde_a == seconde_t) {
                pc.printf("bip bip");
                etat_futur=bip;
            }
            if (cpt_m == 1 && Heure_m == 00 && Minute_m == 00 && Seconde_m == 00) {
                pc.printf("bip bip");
                etat_futur=bip2;
            }


            // pour definir le temps
            if (Heure_a > 23 or Heure_a < 00) {
                Heure_a = 00;
            }
            if (Minute_a > 59 or Minute_a < 00) {
                Minute_a = 00;
            }
            if (Seconde_a > 59 or Seconde_a < 00) {
                Seconde_a = 00;
            }
            if (choix_a >2 or choix_a<0) {
                choix_a = 0;
            }
            if (cpt_a >1 or cpt_a<0) {
                cpt_a = 0;
            }

            if(entree)etat_futur=inter;
            break;
        // deux alarme
        case bip :
            if (entree) {
                cpt_a=0;
                etat_futur=Menu;
            }
            break;
        case bip2 :
            if (entree) {
                cpt_m=0;
                etat_futur=Menu;
            }
            break;
        case Minuteur :

            // meme fonctionnement que l'alarme ici on regle le temps souhaite et on le met sur on ce qui va faire que le décompte va commence
            if (entreed) {
                choix_m++;
            }
            if (choix_m == 0) {
                LG=1;
                LR=0;
                if(entreeh) {
                    Heure_m++;
                } else if(entreeb) {
                    Heure_m--;
                }
            }

            else if (choix_m == 1) {
                LG=0;
                LR=1;
                if(entreeh) {
                    Minute_m++;
                } else if(entreeb) {
                    Minute_m--;
                }
            } else if (choix_m == 2) {
                LG=0;
                LR=0;
                if(entreeh) {
                    Seconde_m++;
                } else if(entreeb) {
                    Seconde_m--;
                }
            }


            if (entreeg) {
                cpt_m++;
            }
            if (cpt_m==0) {
                //OFF
                ihm.BAR_set(1);

                tempsS.reset();

            }

            else if (cpt_m==1) {
                //ON
                ihm.BAR_set(2);

                tempsS.start();

            }
            // si le minuteur est sur on est que le decompte arrive a 0 alors l'alarme se declenche
            if (cpt_m == 1 && Heure_m == 00 && Minute_m == 00 && Seconde_m == 00) {
                pc.printf("bip bip");
                etat_futur=bip2;
            }
            if (cpt_a == 1 && Heure_a == heure_t && Minute_a == minute_t && Seconde_a == seconde_t) {
                pc.printf("bip bip");
                etat_futur=bip;
            }



            if (Heure_m > 23 or Heure_m < 00) {
                Heure_m = 00;
            }
            if (Minute_m > 59 or Minute_m < 00) {
                Minute_m = 00;
            }
            if (Seconde_m > 59 or Seconde_m < 00) {
                Seconde_m = 00;
            }
            if (choix_m >2 or choix_m<0) {
                choix_m = 0;
            }
            if (cpt_m >1 or cpt_m<0) {
                cpt_m = 0;
            }

            // partie ou le prog gere la gestion du decompte en fonction d'un chrono interne
            if(tempsS.read() >=1) {
                Seconde_m--;
                tempsS.reset();
            }
            if (cpt_m == 1 && Minute_m>00 && Seconde_m < 00) {
                Minute_m--;
                Seconde_m = 59;


            }
            if (cpt_m == 1 && Heure_m>00 && Minute_m == 00 && Seconde_m < 00 ) {
                Heure_m--;
                Minute_m = 59;
                Seconde_m = 59;



            }


            if(entree)etat_futur=inter;
            break;


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


// a chaque etat je reprend l'information sur le temps pour l'avoir toujours a jour
        case Horloge :
            pc.printf("%02u:%02u:%02u\n",heure_t,minute_t,seconde_t);//debug
            pc.printf("%02u:%02u:%02u\n",Heure_a,Minute_a,Seconde_a);
            pc.printf("%d\n",cpt_a);
            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();

            jour_t=rtc.GetDay();
            mois_t=rtc.GetMon();
            annee_t=rtc.GetYear();
            ihm.LCD_printf("%02u:%02u:%02u",heure_t,minute_t,seconde_t);
            LG=0;// je met les leds a 0 pour un effet de clignotement
            LR=0;
            break;

        case Calendrier:
            pc.printf("%02u:%02u:%02u\n",heure_t,minute_t,seconde_t);//debug
            pc.printf("%02u:%02u:%02u\n",Heure_a,Minute_a,Seconde_a);
            pc.printf("%d\n",cpt_a);

            jour_t=rtc.GetDay();
            mois_t=rtc.GetMon();
            annee_t=rtc.GetYear();

            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("%d:%d:%d",jour_t,mois_t);
            pc.printf("%d\n",annee_t);
            LG=0;// je met les leds a 0 pour un effet de clignotement
            LR=0;
            break;
        case Menu:
            pc.printf("%02u:%02u:%02u\n",heure_t,minute_t,seconde_t);
            pc.printf("%02u:%02u:%02u\n",Heure_a,Minute_a,Seconde_a);//debug
            pc.printf("%d\n",cpt_a);

            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();

            jour_t=rtc.GetDay();
            mois_t=rtc.GetMon();
            annee_t=rtc.GetYear();
            break;
        case Alarme:
            pc.printf("%02u:%02u:%02u\n",heure_t,minute_t,seconde_t);//debug
            pc.printf("%02u:%02u:%02u\n",Heure_a,Minute_a,Seconde_a);
            pc.printf("%d\n",cpt_a);


            ihm.LCD_printf("%02u:%02u:%02u",Heure_a,Minute_a,Seconde_a);
            break;

        case inter:
            ihm.LCD_clear();
            break;
        case bip:
            pc.printf("%02u:%02u:%02u\n",heure_t,minute_t,seconde_t);//debug
            pc.printf("%02u:%02u:%02u\n",Heure_a,Minute_a,Seconde_a);
            LR=0;
            LG=0;
            tempo1.start();
            tempo2.start();

            //je cree un clignotement pour simuler ue alarme et je precise quelle alarme

            if(tempo1.read_ms()>500) {
                LR=!LR;
                ihm.LCD_printf("BIPALA");
                tempo1.reset();
            }
            if(tempo2.read_ms()>500) {
                LG=!LG;
                ihm.LCD_printf("BIPALA");
                tempo2.reset();
            }
            break;
        case bip2:
            pc.printf("%02u:%02u:%02u\n",heure_t,minute_t,seconde_t);
            pc.printf("%02u:%02u:%02u\n",Heure_a,Minute_a,Seconde_a);
            LR=0;
            LG=0;
            tempo3.start();
            tempo4.start();
            //je cree un clignotement pour simuler ue alarme et je precise quelle alarme

            if(tempo3.read_ms()>500) {
                LR=!LR;
                ihm.LCD_printf("BIPMIN");
                tempo3.reset();
            }
            if(tempo4.read_ms()>500) {
                LG=!LG;
                ihm.LCD_printf("BIPMIN");
                tempo4.reset();
            }
            break;
        case Minuteur :
            ihm.LCD_printf("%02u:%02u:%02u",Heure_m,Minute_m,Seconde_m);

            pc.printf("S=%02f\n\r",tempsS.read());

            break;


    }
}