
S05APP2: Noyau temps réel
Diff: main.cpp
- Revision:
- 18:01c6a7ee0914
- Parent:
- 14:3b72daf433fb
- Child:
- 19:abddc058f6d1
--- a/main.cpp Mon Jan 30 15:16:39 2017 +0000 +++ b/main.cpp Mon Jan 30 15:34:59 2017 +0000 @@ -1,4 +1,7 @@ -#include "mbed.h" +#include "AnalogIn.h" +#include "DigitalIn.h" +#include "Ticker.h" +#include "Serial.h" #include "rtos.h" Serial pc(USBTX, USBRX); // tx, rx @@ -10,16 +13,15 @@ Thread *t1; Thread *t2; Thread *t3; +Mutex mutex; uint8_t compteur = 0; bool verifierSiStable = false; /* Mail */ typedef struct { - bool type; // Numérique = 0, analogique = 1 char* temps; // Étampe indiquant l’heure et la date de l'occurrence uint8_t broche; // Le numéro de la broche - float moyenne; // Moyenne courante échantillonnée sur 5 échantillons successifs } mail_t; Mail<mail_t, 16> mail_box; @@ -27,12 +29,14 @@ // ------------------------------------------------------- // ------------------------------------------------------- -void envoyer_mail(uint8_t broche, float moyenne) { +void envoyer_mail(uint8_t broche) { + mutex.lock(); time_t secondes = time(NULL); + mutex.unlock(); + mail_t *mail = mail_box.alloc(); mail->temps = ctime(&secondes); mail->broche = broche; - mail->moyenne = moyenne; mail_box.put(mail); } @@ -41,8 +45,8 @@ float moyenne_passee1 = -1; float moyenne_passee2 = -1; float echantillons1[5]; - float echantillons2[5]; - float seuil = 0.125; + float echantillons2[5]; + float seuil = 0.125; while (true) { /*** Synchronisation sur la période d'échantillonnage ***/ @@ -51,8 +55,6 @@ /*** Lecture des échantillons analogiques ***/ float entreeanal_1 = ea_1.read(); float entreeanal_2 = ea_2.read(); - //printf("Valeur de entree analogique 1: %f\n", entreeanal_1); - //printf("Valeur de entree analogique 2: %f\n", entreeanal_2); echantillons1[i] = entreeanal_1; echantillons2[i] = entreeanal_2; @@ -62,16 +64,15 @@ /*** Calcul de la moyenne courante du signal (calculée sur 5 échantillons successifs) ***/ float moyenne_courante1 = (echantillons1[0] + echantillons1[1] + echantillons1[2] + echantillons1[3] + echantillons1[4]) / 5; float moyenne_courante2 = (echantillons2[0] + echantillons2[1] + echantillons2[2] + echantillons2[3] + echantillons2[4]) / 5; - //printf("moyenne courante = %f, moyenne passee = %f, variation = %f\n", moyenne_courante1, moyenne_passee1, std::abs(1 - (moyenne_courante1 / moyenne_passee1))); if (moyenne_passee1 != -1) { if ((std::abs(1 - (moyenne_courante1 / moyenne_passee1))) > seuil) { - envoyer_mail(19, moyenne_courante1); /*** Génération éventuelle d'un événement ***/ + envoyer_mail(19); /*** Génération éventuelle d'un événement ***/ } } if (moyenne_passee2 != -1) { if ((std::abs(1 - (moyenne_courante2 / moyenne_passee2))) > seuil) { - envoyer_mail(20, moyenne_courante2); /*** Génération éventuelle d'un événement ***/ + envoyer_mail(20); /*** Génération éventuelle d'un événement ***/ } } moyenne_passee1 = moyenne_courante1; @@ -82,7 +83,7 @@ } void lecture_num(void const *args) { - bool valeurs[2] = {0}; + bool valeurs[2] = {0}; while (true) { /*** Synchronisation sur la période d'échantillonnage ***/ @@ -91,27 +92,24 @@ /*** Lecture des échantillons numériques ***/ uint8_t entreenum_1 = en_1.read(); uint8_t entreenum_2 = en_2.read(); - // printf("Valeur de entree numerique 1: %d\n", entreenum_1); - // printf("Valeur de entree numerique 2: %d\n", entreenum_2); /*** Prise en charge du phénomène de rebond ***/ - if (en_1.read() != valeurs[0]) { + if (entreenum_1 != valeurs[0]) { verifierSiStable = true; Thread::signal_wait(0x2); - valeurs[0] = en_1.read(); + valeurs[0] = entreenum_1; if (entreenum_1 == en_1.read()) { - envoyer_mail(15, NULL); /*** Génération d'un évènement... ***/ + envoyer_mail(15); /*** Génération d'un évènement... ***/ } - } - if (en_2.read() != valeurs[1]) { + if (entreenum_2 != valeurs[1]) { verifierSiStable = true; Thread::signal_wait(0x2); - valeurs[1] = en_2.read(); + valeurs[1] = entreenum_2; if (entreenum_2 == en_2.read()) { - envoyer_mail(16, NULL); /*** Génération d'un évènement... ***/ + envoyer_mail(16); /*** Génération d'un évènement... ***/ } } Thread::yield(); @@ -126,16 +124,9 @@ mail_t *mail = (mail_t*)evt.value.p; /*** Écriture de l'événement en sortie (port série) ***/ - if (mail->broche == 15 || mail->broche == 16) { - pc.printf("Une lecture detectee entree numerique %d\nDate: %s\n", mail->broche, mail->temps); - } - else { - pc.printf("Une lecture detectee entree analogique %d\nDate: %sMoyenne courante: %f\n\n", mail->broche, mail->temps, mail->moyenne); - } + pc.printf("Entree %d\nDate: %s\n", mail->broche, mail->temps); mail_box.free(mail); - } else { - Thread::yield(); - } + } } }