Add CRC16 library

Dependencies:   CRC16 mbed-rtos mbed

Fork of S5info_APP4 by Éric Bisson

Revision:
2:c6465d4e82d2
Parent:
1:b3ae0d9f02ad
Child:
3:3ecbcc05bc85
--- a/main.cpp	Mon Jan 30 22:40:48 2017 +0000
+++ b/main.cpp	Tue Jan 31 00:51:06 2017 +0000
@@ -1,18 +1,8 @@
 #include "mbed.h"
 #include "rtos.h"
 
-Ticker tick1;
-Ticker tick2;
-Thread* t1;
-Thread* t2;
-Thread* t3;
-
-DigitalIn en_1(p15);
-DigitalIn en_2(p16);
-AnalogIn ea_1(p19);
-AnalogIn ea_2(p20);
-Serial pc(USBTX, USBRX);
-Mutex mutex;
+#define UN_HUITIEME_SHORT 0x1FFF
+#define MOVING_AVG_SIZE 5
 
 struct message_t
 {
@@ -21,27 +11,27 @@
     unsigned short value;
 };
 
-Mail<message_t, 16> Mailbox;
-
-#define UN_HUITIEME_SHORT 0x1FFF
-#define MOVING_AVG_SIZE 5
 struct MovingAverage_t
 {
     unsigned short buffer[MOVING_AVG_SIZE];
     char cursor;
     bool bFilled;
 };
-MovingAverage_t MovingAverageP19 = {
-        {},
-        0,
-        false
-    };
-    
-MovingAverage_t MovingAverageP20 = {
-        {},
-        0,
-        false
-    };
+
+Thread* t1;
+Thread* t2;
+Thread* t3;
+
+DigitalIn* en_1;
+DigitalIn* en_2;
+AnalogIn* ea_1;
+AnalogIn* ea_2;
+Serial* pc;
+Mutex* mutex;
+Mail<message_t, 16>* Mailbox;
+
+MovingAverage_t* MovingAverageP19;
+MovingAverage_t* MovingAverageP20;
 
 bool bLast_p15 = false;
 bool bLast_p16 = false;
@@ -55,7 +45,7 @@
 
 void signal_digital()
 {
-    t2->signal_set(2);
+    t2->signal_set(1);
 }
 
 unsigned short moyenne_mobile(MovingAverage_t* MA, unsigned short newData)
@@ -89,111 +79,117 @@
     return sum;
 }
 
-inline void MailBox_put(message_t* data)
+void MailBox_put(time_t timestamp, char pin_id, unsigned short value)
 {
-    mutex.lock();
-    message_t* msg = Mailbox.calloc();
-    msg->timestamp = data->timestamp;
-    msg->pin_id = data->pin_id;
-    msg->value = data->value;
-    Mailbox.put(msg);
-    mutex.unlock();
-    t3->signal_set(4);
+    // Prepare the message to send
+    message_t* msg = Mailbox->calloc();
+    msg->timestamp = timestamp;
+    msg->pin_id = pin_id;
+    msg->value = value;
+    
+    // Add the message to the mailbox
+    mutex->lock();
+    Mailbox->put(msg);
+    mutex->unlock();
+    
+    // Signal the new message
+    t3->signal_set(1);
     t1->yield();
     t2->yield();
 }
 
-void lecture_analog(void/* const *args*/) {
- while (true) {
-// synchronisation sur la période d'échantillonnage
-    t1->signal_wait(1);
-    
-// lecture de l'étampe temporelle
-    message_t msg;
-    msg.timestamp = time(NULL);
-
-// lecture des échantillons analogiques
-// calcul de la nouvelle moyenne courante
-    unsigned short res_p19 = moyenne_mobile(&MovingAverageP19, ea_1.read_u16());
-    unsigned short res_p20 = moyenne_mobile(&MovingAverageP20, ea_2.read_u16());
-
-// génération éventuelle d'un événement
-    if ((res_p19 + UN_HUITIEME_SHORT) < u16Last_p19 || (res_p19 - UN_HUITIEME_SHORT) > u16Last_p19 )
-    {
-        msg.pin_id = 19;
-        msg.value = res_p19;
-        MailBox_put(&msg);
+void lecture_analog() {
+    while (true) {
+        // synchronisation sur la période d'échantillonnage
+        t1->signal_wait(1);
+        
+        // lecture de l'étampe temporelle
+        time_t curTime = time(NULL);
+        
+        // lecture des échantillons analogiques
+        // calcul de la nouvelle moyenne courante
+        unsigned short res_p19 = moyenne_mobile(MovingAverageP19, ea_1->read_u16());
+        unsigned short res_p20 = moyenne_mobile(MovingAverageP20, ea_2->read_u16());
+        
+        // génération éventuelle d'un événement
+        if ((res_p19 + UN_HUITIEME_SHORT) < u16Last_p19 || (res_p19 - UN_HUITIEME_SHORT) > u16Last_p19 )
+        {
+            MailBox_put(curTime, 19, res_p19);
+        }
+        if ((res_p20 + UN_HUITIEME_SHORT < u16Last_p20) || (res_p20 - UN_HUITIEME_SHORT) > u16Last_p20 )
+        {
+            MailBox_put(curTime, 20, res_p20);
+        }
+        
+        u16Last_p19 = res_p19;
+        u16Last_p20 = res_p20;
+        
+        t1->signal_clr(1);
+        t1->yield();
     }
-    if ((res_p20 + UN_HUITIEME_SHORT < u16Last_p20) || (res_p20 - UN_HUITIEME_SHORT) > u16Last_p20 )
-    {
-        msg.pin_id = 20;
-        msg.value = res_p20;
-        MailBox_put(&msg);
-    }
-    
-    u16Last_p19 = res_p19;
-    u16Last_p20 = res_p20;
-
-    t1->signal_clr(1);
-    t1->yield();
- }
 }
-void lecture_num(void/* const *args*/) {
- while (true) {
-// synchronisation sur la période d'échantillonnage
-    t2->signal_wait(2);
-
-// lecture de l'étampe temporelle
-    message_t msg;
-    msg.timestamp = time(NULL);
-
-// lecture des échantillons numériques
-    bool bP15 = en_1.read();
-    bool bP16 = en_2.read();
-
-// prise en charge du phénomène de rebond
-    wait_ms(50); // :')
-    
-// génération éventuelle d'un événement
-    if (en_1.read() == bP15 && bP15 != bLast_p15)
-    {
-        msg.pin_id = 15;
-        msg.value = bP15;
-        MailBox_put(&msg);
+void lecture_num() {
+    while (true) {
+        // synchronisation sur la période d'échantillonnage
+        t2->signal_wait(1);
+        
+        // lecture de l'étampe temporelle
+        time_t curTime = time(NULL);
+        
+        // lecture des échantillons numériques
+        bool bP15 = en_1->read();
+        bool bP16 = en_2->read();
+        
+        // prise en charge du phénomène de rebond
+        wait_ms(50); // :')
+        
+        // génération éventuelle d'un événement
+        if (en_1->read() == bP15 && bP15 != bLast_p15)
+        {
+            MailBox_put(curTime, 15, bP15);
+        }
+        if (en_2->read() == bP16 && bP16 != bLast_p16)
+        {
+            MailBox_put(curTime, 16, bP16);
+        }
+        bLast_p15 = bP15;
+        bLast_p16 = bP16;
+        
+        t2->signal_clr(1);
+        t2->yield();
     }
-    if (en_2.read() == bP16 && bP16 != bLast_p16)
-    {
-        msg.pin_id = 16;
-        msg.value = bP16;
-        MailBox_put(&msg);
-    }
-    bLast_p15 = bP15;
-    bLast_p16 = bP16;
-
-    t2->signal_clr(2);
-    t2->yield();
- }
 }
-void collection(void/* const *args*/) {
- while (true) {     
-// attente et lecture d'un événement
-    t3->signal_wait(4);
-    mutex.lock();
-    osEvent evt = Mailbox.get();
-    if (evt.status == osEventMail) {
-        message_t *msg = (message_t*)evt.value.p;
-        
-        // écriture de l'événement en sortie (port série)
-        pc.printf("[%s] Evenement de la pin %d avec valeur %d\n", ctime(&(msg->timestamp)), msg->pin_id, msg->value);
-        
-        Mailbox.free(msg);
-    }
-    t3->signal_clr(4);
-    mutex.unlock();
-    t3->yield();
- }
+void collection() {
+     while (true) {     
+        // attente et lecture d'un événement
+        t3->signal_wait(1);
+        mutex->lock();
+        while (Mailbox->get().status == osEventMail)
+        {
+            message_t* msg = (message_t*)Mailbox->get().value.p;
+            
+            // écriture de l'événement en sortie (port série)
+            pc->printf("[%s] Evenement de la pin %d avec valeur %d\n", ctime(&(msg->timestamp)), msg->pin_id, msg->value);
+            
+            Mailbox->free(msg);
+        }
+        mutex->unlock();
+        t3->signal_clr(1);
+        t3->yield();
+     }
 }
-int main() {    
+int main() {
+    // Initialization de tous les globals
+    Mailbox = new Mail<message_t, 16>();
+    MovingAverageP19 = new MovingAverage_t();
+    MovingAverageP20 = new MovingAverage_t();
+    en_1 = new DigitalIn(p15);
+    en_2 = new DigitalIn(p16);
+    ea_1 = new AnalogIn(p19);
+    ea_2 = new AnalogIn(p20);
+    mutex = new Mutex();
+    pc = new Serial(USBTX, USBRX);
+    
     // set the time
     set_time(1485887400);
     
@@ -206,10 +202,12 @@
     t2->start(lecture_num);
     t3->start(collection);
     
-    tick1.attach(&signal_digital, 0.1); // fréquence de 100ms
-    tick2.attach(&signal_analog, 0.25); // fréquence de 250ms
+    Ticker tick1;
+    Ticker tick2;
+    
+    tick1.attach(&signal_digital, 0.1);
+    tick2.attach(&signal_analog, 0.25);
     
     while(1) {
-        wait_ms(1000); // wait forever
     }
 }
\ No newline at end of file