Éric Bisson
/
S5info_APP2
School Project
main.cpp
- Committer:
- ericbisson
- Date:
- 2017-01-30
- Revision:
- 1:b3ae0d9f02ad
- Parent:
- 0:c637467eeb8f
- Child:
- 2:c6465d4e82d2
File content as of revision 1:b3ae0d9f02ad:
#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; struct message_t { time_t timestamp; char pin_id; 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 }; bool bLast_p15 = false; bool bLast_p16 = false; unsigned short u16Last_p19 = 0; unsigned short u16Last_p20 = 0; void signal_analog() { t1->signal_set(1); } void signal_digital() { t2->signal_set(2); } unsigned short moyenne_mobile(MovingAverage_t* MA, unsigned short newData) { int sum = 0; MA->buffer[MA->cursor] = newData; MA->cursor++; if (MA->cursor >= MOVING_AVG_SIZE) { MA->cursor = 0; MA->bFilled = true; } if (MA->bFilled) { for (char i = 0; i < MOVING_AVG_SIZE; i++) { sum += MA->buffer[i]; } sum = sum / MOVING_AVG_SIZE; } else { for (char i = 0; i < MA->cursor; i++) { sum += MA->buffer[i]; } sum = sum / MA->cursor; } return sum; } inline void MailBox_put(message_t* data) { 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); 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); } 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); } 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(); } } int main() { // set the time set_time(1485887400); // démarrage des tâches t1 = new Thread(); t2 = new Thread(); t3 = new Thread(); t1->start(lecture_analog); 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 while(1) { wait_ms(1000); // wait forever } }