tiens nic

Dependencies:   mbed-rtos mbed

Fork of rtos_basic by mbed official

Committer:
philfontaine
Date:
Sun Jan 29 23:06:46 2017 +0000
Revision:
11:fe7d53172c00
Parent:
10:dc33cd3f4eb9
ok

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:491820ee784d 1 #include "mbed.h"
philfontaine 11:fe7d53172c00 2 #include "rtos.h"
philfontaine 11:fe7d53172c00 3 #include "AnalogBuffer.h"
philfontaine 11:fe7d53172c00 4
philfontaine 11:fe7d53172c00 5 const int SEUIL_ANALOG = 0x2000;
philfontaine 11:fe7d53172c00 6 DigitalIn en_1(p15);
philfontaine 11:fe7d53172c00 7 DigitalIn en_2(p16);
philfontaine 11:fe7d53172c00 8 AnalogIn ea_1(p19);
philfontaine 11:fe7d53172c00 9 AnalogIn ea_2(p20);
philfontaine 11:fe7d53172c00 10 bool digital_1;
philfontaine 11:fe7d53172c00 11 bool digital_2;
philfontaine 11:fe7d53172c00 12 AnalogBuffer ab_1;
philfontaine 11:fe7d53172c00 13 AnalogBuffer ab_2;
philfontaine 11:fe7d53172c00 14
philfontaine 11:fe7d53172c00 15 typedef struct {
philfontaine 11:fe7d53172c00 16 bool isAnalog;
philfontaine 11:fe7d53172c00 17 bool digital;
philfontaine 11:fe7d53172c00 18 unsigned short analog;
philfontaine 11:fe7d53172c00 19 time_t rtc_time;
philfontaine 11:fe7d53172c00 20 } mail_t;
philfontaine 11:fe7d53172c00 21
philfontaine 11:fe7d53172c00 22 Mail<mail_t, 16> mail_box;
philfontaine 11:fe7d53172c00 23
philfontaine 11:fe7d53172c00 24 void lecture_analog(void const *args) {
philfontaine 11:fe7d53172c00 25 Timer timer;
philfontaine 11:fe7d53172c00 26 unsigned short old_average_1 = 0;
philfontaine 11:fe7d53172c00 27 unsigned short old_average_2 = 0;
emilmont 1:491820ee784d 28 while (true) {
philfontaine 11:fe7d53172c00 29 timer.start(); // synchronisation sur la période d'échantillonnage
philfontaine 11:fe7d53172c00 30 time_t rtc_time = time(NULL); // lecture de l'étampe temporelle
philfontaine 11:fe7d53172c00 31 ab_1.put(ea_1.read_u16()); // lecture des échantillons analogiques
philfontaine 11:fe7d53172c00 32 ab_2.put(ea_2.read_u16());
philfontaine 11:fe7d53172c00 33 unsigned short new_average_1 = ab_1.average(); // calcul de la nouvelle moyenne courante
philfontaine 11:fe7d53172c00 34 unsigned short new_average_2 = ab_2.average();
philfontaine 11:fe7d53172c00 35 int diff_1 = abs(new_average_1 - old_average_1);
philfontaine 11:fe7d53172c00 36 int diff_2 = abs(new_average_2 - old_average_2);
philfontaine 11:fe7d53172c00 37 if (diff_1 > SEUIL_ANALOG) {
philfontaine 11:fe7d53172c00 38 mail_t* mail = mail_box.alloc();
philfontaine 11:fe7d53172c00 39 mail->isAnalog = true;
philfontaine 11:fe7d53172c00 40 mail->analog = new_average_1;
philfontaine 11:fe7d53172c00 41 mail->rtc_time = rtc_time;
philfontaine 11:fe7d53172c00 42 mail_box.put(mail);
philfontaine 11:fe7d53172c00 43 }
philfontaine 11:fe7d53172c00 44 if (diff_2 > SEUIL_ANALOG) {
philfontaine 11:fe7d53172c00 45 mail_t* mail = mail_box.alloc();
philfontaine 11:fe7d53172c00 46 mail->isAnalog = true;
philfontaine 11:fe7d53172c00 47 mail->analog = new_average_1;
philfontaine 11:fe7d53172c00 48 mail->rtc_time = rtc_time;
philfontaine 11:fe7d53172c00 49 mail_box.put(mail);
philfontaine 11:fe7d53172c00 50 }
philfontaine 11:fe7d53172c00 51 old_average_1 = new_average_1;
philfontaine 11:fe7d53172c00 52 old_average_2 = new_average_2;
philfontaine 11:fe7d53172c00 53 Thread::wait(250 - timer.read_ms());
philfontaine 11:fe7d53172c00 54 timer.stop();
philfontaine 11:fe7d53172c00 55 timer.reset(); // Necessaire??
emilmont 1:491820ee784d 56 }
emilmont 1:491820ee784d 57 }
philfontaine 11:fe7d53172c00 58 void lecture_num(void const *args) {
philfontaine 11:fe7d53172c00 59 Timer timer;
emilmont 1:491820ee784d 60 while (true) {
philfontaine 11:fe7d53172c00 61 timer.start(); // synchronisation sur la période d'échantillonnage
philfontaine 11:fe7d53172c00 62 time_t rtc_time = time(NULL); // lecture de l'étampe temporelle
philfontaine 11:fe7d53172c00 63 bool new_digital_1 = en_1.read(); // lecture des échantillons numériques
philfontaine 11:fe7d53172c00 64 bool new_digital_2 = en_2.read(); // lecture des échantillons numériques
philfontaine 11:fe7d53172c00 65
philfontaine 11:fe7d53172c00 66 if ((new_digital_1 != digital_1) || (new_digital_2 != digital_2)) {
philfontaine 11:fe7d53172c00 67 // prise en charge du phénomène de rebond
philfontaine 11:fe7d53172c00 68 Thread::wait(50);
philfontaine 11:fe7d53172c00 69 if (new_digital_1 != digital_1) {
philfontaine 11:fe7d53172c00 70 new_digital_1 = en_1.read();
philfontaine 11:fe7d53172c00 71 if (new_digital_1 != digital_1) {
philfontaine 11:fe7d53172c00 72 // génération éventuelle d'un événement
philfontaine 11:fe7d53172c00 73 mail_t* mail = mail_box.alloc();
philfontaine 11:fe7d53172c00 74 mail->isAnalog = false;
philfontaine 11:fe7d53172c00 75 mail->digital = new_digital_1;
philfontaine 11:fe7d53172c00 76 mail->rtc_time = rtc_time;
philfontaine 11:fe7d53172c00 77 mail_box.put(mail);
philfontaine 11:fe7d53172c00 78 digital_1 = new_digital_1;
philfontaine 11:fe7d53172c00 79 }
philfontaine 11:fe7d53172c00 80 }
philfontaine 11:fe7d53172c00 81 if (new_digital_2 != digital_2) {
philfontaine 11:fe7d53172c00 82 new_digital_2 = en_2.read();
philfontaine 11:fe7d53172c00 83 if (new_digital_2 != digital_2) {
philfontaine 11:fe7d53172c00 84 // génération éventuelle d'un événement
philfontaine 11:fe7d53172c00 85 mail_t* mail = mail_box.alloc();
philfontaine 11:fe7d53172c00 86 mail->isAnalog = false;
philfontaine 11:fe7d53172c00 87 mail->digital = new_digital_2;
philfontaine 11:fe7d53172c00 88 mail->rtc_time = rtc_time;
philfontaine 11:fe7d53172c00 89 mail_box.put(mail);
philfontaine 11:fe7d53172c00 90 digital_2 = new_digital_2;
philfontaine 11:fe7d53172c00 91 }
philfontaine 11:fe7d53172c00 92 }
philfontaine 11:fe7d53172c00 93 }
philfontaine 11:fe7d53172c00 94 Thread::wait(100 - timer.read_ms());
philfontaine 11:fe7d53172c00 95 timer.stop();
philfontaine 11:fe7d53172c00 96 timer.reset(); // Necessaire??
emilmont 1:491820ee784d 97 }
emilmont 1:491820ee784d 98 }
philfontaine 11:fe7d53172c00 99
philfontaine 11:fe7d53172c00 100 void collection(void const *args) {
philfontaine 11:fe7d53172c00 101 while (true) {
philfontaine 11:fe7d53172c00 102 // attente et lecture d'un événement
philfontaine 11:fe7d53172c00 103 // écriture de l'événement en sortie (port série)
philfontaine 11:fe7d53172c00 104 osEvent evt = mail_box.get();
philfontaine 11:fe7d53172c00 105 if (evt.status == osEventMail) {
philfontaine 11:fe7d53172c00 106 mail_t *mail = (mail_t*)evt.value.p;
philfontaine 11:fe7d53172c00 107 if(mail->isAnalog) {
philfontaine 11:fe7d53172c00 108 pc.printf("%s Analog: %X", ctime(&mail->rtc_time), mail->analog);
philfontaine 11:fe7d53172c00 109 } else {
philfontaine 11:fe7d53172c00 110 pc.printf("%s Digital: %d", ctime(&mail->rtc_time), mail->digital);
philfontaine 11:fe7d53172c00 111 }
philfontaine 11:fe7d53172c00 112 mail_box.free(mail);
philfontaine 11:fe7d53172c00 113 }
philfontaine 11:fe7d53172c00 114 }
philfontaine 11:fe7d53172c00 115 }
philfontaine 11:fe7d53172c00 116
philfontaine 11:fe7d53172c00 117 int main() {
philfontaine 11:fe7d53172c00 118 // initialisation du RTC
philfontaine 11:fe7d53172c00 119 // démarrage des tâches
philfontaine 11:fe7d53172c00 120 while(1) {
philfontaine 11:fe7d53172c00 121 }
philfontaine 11:fe7d53172c00 122 }