tiens nic

Dependencies:   mbed-rtos mbed

Fork of rtos_basic by mbed official

Revision:
11:fe7d53172c00
Parent:
10:dc33cd3f4eb9
--- a/main.cpp	Thu Jan 12 23:35:40 2017 +0000
+++ b/main.cpp	Sun Jan 29 23:06:46 2017 +0000
@@ -1,21 +1,122 @@
 #include "mbed.h"
- 
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-Thread thread;
- 
-void led2_thread() {
+#include "rtos.h"
+#include "AnalogBuffer.h"
+
+const int SEUIL_ANALOG = 0x2000;
+DigitalIn en_1(p15);
+DigitalIn en_2(p16);
+AnalogIn ea_1(p19);
+AnalogIn ea_2(p20);
+bool digital_1;
+bool digital_2;
+AnalogBuffer ab_1;
+AnalogBuffer ab_2;
+
+typedef struct {
+    bool isAnalog;
+    bool digital;
+    unsigned short analog;
+    time_t rtc_time;
+} mail_t;
+
+Mail<mail_t, 16> mail_box;
+
+void lecture_analog(void const *args) {
+    Timer timer;
+    unsigned short old_average_1 = 0;
+    unsigned short old_average_2 = 0;
     while (true) {
-        led2 = !led2;
-        wait(1);
+        timer.start(); // synchronisation sur la période d'échantillonnage
+        time_t rtc_time = time(NULL); // lecture de l'étampe temporelle
+        ab_1.put(ea_1.read_u16()); // lecture des échantillons analogiques
+        ab_2.put(ea_2.read_u16());
+        unsigned short new_average_1 = ab_1.average(); // calcul de la nouvelle moyenne courante
+        unsigned short new_average_2 = ab_2.average();
+        int diff_1 = abs(new_average_1 - old_average_1);
+        int diff_2 = abs(new_average_2 - old_average_2);
+        if (diff_1 > SEUIL_ANALOG) {
+            mail_t* mail = mail_box.alloc();
+            mail->isAnalog = true;
+            mail->analog = new_average_1;
+            mail->rtc_time = rtc_time;
+            mail_box.put(mail);
+        }
+        if (diff_2 > SEUIL_ANALOG) {
+            mail_t* mail = mail_box.alloc();
+            mail->isAnalog = true;
+            mail->analog = new_average_1;
+            mail->rtc_time = rtc_time;
+            mail_box.put(mail);
+        }
+        old_average_1 = new_average_1;
+        old_average_2 = new_average_2;
+        Thread::wait(250 - timer.read_ms());
+        timer.stop();
+        timer.reset(); // Necessaire??
     }
 }
- 
-int main() {
-    thread.start(led2_thread);
-    
+void lecture_num(void const *args) {
+    Timer timer;
     while (true) {
-        led1 = !led1;
-        wait(0.5);
+        timer.start(); // synchronisation sur la période d'échantillonnage
+        time_t rtc_time = time(NULL); // lecture de l'étampe temporelle
+        bool new_digital_1 = en_1.read();  // lecture des échantillons numériques
+        bool new_digital_2 = en_2.read();  // lecture des échantillons numériques
+        
+        if ((new_digital_1 != digital_1) || (new_digital_2 != digital_2)) {
+            // prise en charge du phénomène de rebond
+            Thread::wait(50);
+            if (new_digital_1 != digital_1) {
+                new_digital_1 = en_1.read();
+                if (new_digital_1 != digital_1) {
+                    // génération éventuelle d'un événement
+                    mail_t* mail = mail_box.alloc();
+                    mail->isAnalog = false;
+                    mail->digital = new_digital_1;
+                    mail->rtc_time = rtc_time;
+                    mail_box.put(mail);
+                    digital_1 = new_digital_1;
+                }
+            }
+            if (new_digital_2 != digital_2) {
+                new_digital_2 = en_2.read();
+                if (new_digital_2 != digital_2) {
+                    // génération éventuelle d'un événement
+                    mail_t* mail = mail_box.alloc();
+                    mail->isAnalog = false;
+                    mail->digital = new_digital_2;
+                    mail->rtc_time = rtc_time;
+                    mail_box.put(mail);
+                    digital_2 = new_digital_2;
+                }
+            }
+        }
+        Thread::wait(100 - timer.read_ms());
+        timer.stop();
+        timer.reset(); // Necessaire??
     }
 }
+
+void collection(void const *args) {
+    while (true) {
+    // attente et lecture d'un événement
+    // écriture de l'événement en sortie (port série)
+        osEvent evt = mail_box.get();
+        if (evt.status == osEventMail) {
+            mail_t *mail = (mail_t*)evt.value.p;
+            if(mail->isAnalog) {
+                pc.printf("%s Analog: %X", ctime(&mail->rtc_time), mail->analog);
+            } else {
+                pc.printf("%s Digital: %d", ctime(&mail->rtc_time), mail->digital);
+            }
+            mail_box.free(mail);
+        }
+    }
+}
+
+int main() {
+    // initialisation du RTC
+    // démarrage des tâches
+    while(1) {
+    }
+}
\ No newline at end of file