S05APP2: Noyau temps réel

Dependencies:   mbed mbed-rtos

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