App S5 / Mbed 2 deprecated S05APP2

Dependencies:   mbed mbed-rtos

Committer:
benjaminroy
Date:
Fri Jan 27 21:27:44 2017 +0000
Revision:
12:b24f9818a9f0
Parent:
11:ca0aae170333
Child:
13:29991a8767fe
Ajout de s?maphores

Who changed what in which revision?

UserRevisionLine numberNew contents of line
benjaminroy 0:4f447b02a32f 1 #include "mbed.h"
benjaminroy 1:d37b1a61bd0b 2 #include "rtos.h"
benjaminroy 0:4f447b02a32f 3
benjaminroy 3:fa3112b2216c 4 Ticker ticker;
benjaminroy 1:d37b1a61bd0b 5 DigitalIn en_1(p15);
benjaminroy 1:d37b1a61bd0b 6 DigitalIn en_2(p16);
benjaminroy 1:d37b1a61bd0b 7 AnalogIn ea_1(p19);
benjaminroy 1:d37b1a61bd0b 8 AnalogIn ea_2(p20);
marc1119 2:94e2eebf1524 9 Thread *t1;
marc1119 2:94e2eebf1524 10 Thread *t2;
marc1119 2:94e2eebf1524 11 Thread *t3;
marc1119 2:94e2eebf1524 12
benjaminroy 3:fa3112b2216c 13 uint8_t compteur = 0;
benjaminroy 5:79b5773e6764 14 bool verifierSiStable = false;
benjaminroy 6:6da143aff561 15 float echantillons1[5];
benjaminroy 6:6da143aff561 16 float echantillons2[5];
benjaminroy 6:6da143aff561 17 float seuil = 0.125;
benjaminroy 6:6da143aff561 18
benjaminroy 9:8549816b1cac 19 /* Mail */
marc1119 7:e9f5280d47b3 20 typedef struct {
benjaminroy 9:8549816b1cac 21 bool type; // Numérique = 0, analogique = 1
benjaminroy 9:8549816b1cac 22 char* temps; // Étampe indiquant l’heure et la date de l'occurrence
benjaminroy 9:8549816b1cac 23 uint8_t broche; // Le numéro de la broche
benjaminroy 9:8549816b1cac 24 float moyenne; // Moyenne courante échantillonnée sur 5 échantillons successifs
marc1119 7:e9f5280d47b3 25 } mail_t;
marc1119 7:e9f5280d47b3 26
benjaminroy 12:b24f9818a9f0 27 Semaphore semaphore(200);
benjaminroy 10:200ebb491b60 28 Mail<mail_t, 200> mail_box;
benjaminroy 9:8549816b1cac 29
benjaminroy 3:fa3112b2216c 30 // -------------------------------------------------------
benjaminroy 3:fa3112b2216c 31 // -------------------------------------------------------
benjaminroy 3:fa3112b2216c 32
benjaminroy 9:8549816b1cac 33 void envoyer_mail(bool type, uint8_t broche, float moyenne) {
benjaminroy 9:8549816b1cac 34 time_t secondes = time(NULL);
benjaminroy 9:8549816b1cac 35 mail_t *mail = mail_box.alloc();
benjaminroy 9:8549816b1cac 36 mail->type = type;
benjaminroy 9:8549816b1cac 37 mail->temps = ctime(&secondes);
benjaminroy 9:8549816b1cac 38 mail->broche = broche;
benjaminroy 9:8549816b1cac 39 mail->moyenne = moyenne;
marc1119 7:e9f5280d47b3 40 mail_box.put(mail);
marc1119 7:e9f5280d47b3 41 }
marc1119 7:e9f5280d47b3 42
benjaminroy 1:d37b1a61bd0b 43 void lecture_analog(void const *args) {
benjaminroy 9:8549816b1cac 44 uint8_t i = 0;
benjaminroy 6:6da143aff561 45 float moyenne_passee1 = -1;
benjaminroy 6:6da143aff561 46 float moyenne_passee2 = -1;
benjaminroy 6:6da143aff561 47
benjaminroy 6:6da143aff561 48 while (true) {
benjaminroy 9:8549816b1cac 49 /*** Synchronisation sur la période d'échantillonnage ***/
benjaminroy 6:6da143aff561 50 Thread::signal_wait(0x1);
benjaminroy 6:6da143aff561 51
benjaminroy 9:8549816b1cac 52 /*** Lecture des échantillons analogiques ***/
benjaminroy 6:6da143aff561 53 float entreeanal_1 = ea_1.read();
benjaminroy 6:6da143aff561 54 float entreeanal_2 = ea_2.read();
benjaminroy 9:8549816b1cac 55 //printf("Valeur de entree analogique 1: %f\n", entreeanal_1);
benjaminroy 9:8549816b1cac 56 //printf("Valeur de entree analogique 2: %f\n", entreeanal_2);
benjaminroy 6:6da143aff561 57
benjaminroy 6:6da143aff561 58 echantillons1[i] = entreeanal_1;
benjaminroy 6:6da143aff561 59 echantillons2[i] = entreeanal_2;
benjaminroy 6:6da143aff561 60
benjaminroy 6:6da143aff561 61 i++;
benjaminroy 6:6da143aff561 62 if (i == 5) {
benjaminroy 9:8549816b1cac 63 /*** Calcul de la moyenne courante du signal (calculée sur 5 échantillons successifs) ***/
benjaminroy 6:6da143aff561 64 float moyenne_courante1 = (echantillons1[0] + echantillons1[1] + echantillons1[2] + echantillons1[3] + echantillons1[4]) / 5;
benjaminroy 6:6da143aff561 65 float moyenne_courante2 = (echantillons2[0] + echantillons2[1] + echantillons2[2] + echantillons2[3] + echantillons2[4]) / 5;
benjaminroy 6:6da143aff561 66 //printf("moyenne courante = %f, moyenne passee = %f, variation = %f\n", moyenne_courante1, moyenne_passee1, std::abs(1 - (moyenne_courante1 / moyenne_passee1)));
benjaminroy 6:6da143aff561 67
benjaminroy 6:6da143aff561 68 if (moyenne_passee1 != -1) {
benjaminroy 6:6da143aff561 69 if ((std::abs(1 - (moyenne_courante1 / moyenne_passee1))) > seuil) {
benjaminroy 12:b24f9818a9f0 70 semaphore.wait();
benjaminroy 9:8549816b1cac 71 envoyer_mail(1, 19, moyenne_courante1); /*** Génération éventuelle d'un événement ***/
benjaminroy 6:6da143aff561 72 }
benjaminroy 6:6da143aff561 73 }
benjaminroy 6:6da143aff561 74 if (moyenne_passee2 != -1) {
benjaminroy 6:6da143aff561 75 if ((std::abs(1 - (moyenne_courante2 / moyenne_passee2))) > seuil) {
benjaminroy 12:b24f9818a9f0 76 semaphore.wait();
benjaminroy 9:8549816b1cac 77 envoyer_mail(1, 20, moyenne_courante2); /*** Génération éventuelle d'un événement ***/
benjaminroy 6:6da143aff561 78 }
benjaminroy 6:6da143aff561 79 }
benjaminroy 6:6da143aff561 80 moyenne_passee1 = moyenne_courante1;
benjaminroy 6:6da143aff561 81 moyenne_passee2 = moyenne_courante2;
benjaminroy 6:6da143aff561 82 i = 0;
benjaminroy 6:6da143aff561 83 }
benjaminroy 0:4f447b02a32f 84 }
benjaminroy 0:4f447b02a32f 85 }
marc1119 2:94e2eebf1524 86
benjaminroy 5:79b5773e6764 87 void lecture_num(void const *args) {
benjaminroy 1:d37b1a61bd0b 88 while (true) {
benjaminroy 9:8549816b1cac 89 /*** Synchronisation sur la période d'échantillonnage ***/
marc1119 2:94e2eebf1524 90 Thread::signal_wait(0x1);
benjaminroy 6:6da143aff561 91
benjaminroy 9:8549816b1cac 92 /*** Lecture des échantillons numériques ***/
benjaminroy 3:fa3112b2216c 93 uint8_t entreenum_1 = en_1.read();
benjaminroy 3:fa3112b2216c 94 uint8_t entreenum_2 = en_2.read();
benjaminroy 8:56f2b8db5361 95 // printf("Valeur de entree numerique 1: %d\n", entreenum_1);
benjaminroy 8:56f2b8db5361 96 // printf("Valeur de entree numerique 2: %d\n", entreenum_2);
benjaminroy 3:fa3112b2216c 97
benjaminroy 9:8549816b1cac 98 /*** Lecture de l'étampe temporelle ***/
benjaminroy 3:fa3112b2216c 99 time_t t = std::time(NULL);
benjaminroy 5:79b5773e6764 100
benjaminroy 9:8549816b1cac 101 /*** Prise en charge du phénomène de rebond ***/
benjaminroy 5:79b5773e6764 102 if (en_1 || en_2) {
benjaminroy 5:79b5773e6764 103 verifierSiStable = true;
benjaminroy 5:79b5773e6764 104 Thread::signal_wait(0x2);
benjaminroy 5:79b5773e6764 105
benjaminroy 5:79b5773e6764 106 if (en_1 == 1 && entreenum_1 == en_1.read()) {
benjaminroy 12:b24f9818a9f0 107 semaphore.wait();
benjaminroy 9:8549816b1cac 108 envoyer_mail(0, 15, NULL); /*** Génération d'un évènement... ***/
benjaminroy 10:200ebb491b60 109 }
benjaminroy 5:79b5773e6764 110 if (en_2 == 1 && entreenum_2 == en_2.read()) {
benjaminroy 12:b24f9818a9f0 111 semaphore.wait();
benjaminroy 9:8549816b1cac 112 envoyer_mail(0, 16, NULL); /*** Génération d'un évènement... ***/
benjaminroy 5:79b5773e6764 113 }
benjaminroy 12:b24f9818a9f0 114 } else {
benjaminroy 5:79b5773e6764 115 Thread::yield();
benjaminroy 5:79b5773e6764 116 }
benjaminroy 1:d37b1a61bd0b 117 }
benjaminroy 1:d37b1a61bd0b 118 }
marc1119 2:94e2eebf1524 119
benjaminroy 1:d37b1a61bd0b 120 void collection(void const *args) {
benjaminroy 1:d37b1a61bd0b 121 while (true) {
benjaminroy 9:8549816b1cac 122 /*** Attente et lecture d'un événement ***/
marc1119 7:e9f5280d47b3 123 osEvent evt = mail_box.get();
marc1119 7:e9f5280d47b3 124 if (evt.status == osEventMail) {
marc1119 7:e9f5280d47b3 125 mail_t *mail = (mail_t*)evt.value.p;
benjaminroy 9:8549816b1cac 126
benjaminroy 9:8549816b1cac 127 /*** Écriture de l'événement en sortie (port série) ***/
benjaminroy 9:8549816b1cac 128 if (mail->type == 0) {
benjaminroy 9:8549816b1cac 129 printf("Une lecture a ete detectee sur l'entree numerique %d\nDate: %s\n", mail->broche, mail->temps);
benjaminroy 9:8549816b1cac 130 }
benjaminroy 8:56f2b8db5361 131 else {
benjaminroy 9:8549816b1cac 132 printf("Une lecture a ete detectee sur l'entree analogique %d\nDate: %sLa moyenne courante est: %f\n\n", mail->broche, mail->temps, mail->moyenne);
benjaminroy 8:56f2b8db5361 133 }
marc1119 7:e9f5280d47b3 134 mail_box.free(mail);
benjaminroy 12:b24f9818a9f0 135 semaphore.release();
benjaminroy 12:b24f9818a9f0 136 } else {
benjaminroy 9:8549816b1cac 137 Thread::yield();
benjaminroy 9:8549816b1cac 138 }
benjaminroy 1:d37b1a61bd0b 139 }
benjaminroy 1:d37b1a61bd0b 140 }
marc1119 2:94e2eebf1524 141
benjaminroy 3:fa3112b2216c 142 void alarm() {
benjaminroy 3:fa3112b2216c 143 compteur++;
benjaminroy 5:79b5773e6764 144
benjaminroy 5:79b5773e6764 145 if (verifierSiStable) {
benjaminroy 5:79b5773e6764 146 t1->signal_set(0x2);
benjaminroy 5:79b5773e6764 147 verifierSiStable = false;
benjaminroy 5:79b5773e6764 148 }
benjaminroy 3:fa3112b2216c 149
benjaminroy 9:8549816b1cac 150 if (compteur % 2 == 0) { // Entrées numériques échantillionnées à tous les 100 ms
benjaminroy 3:fa3112b2216c 151 t1->signal_set(0x1);
benjaminroy 9:8549816b1cac 152 } else if (compteur % 5 == 0) { // Entrées analogiques échantillonnées à tous les 250 ms
benjaminroy 6:6da143aff561 153 t2->signal_set(0x1);
marc1119 2:94e2eebf1524 154 }
benjaminroy 3:fa3112b2216c 155
benjaminroy 3:fa3112b2216c 156 if (compteur % 10 == 0) {
benjaminroy 3:fa3112b2216c 157 compteur = 0;
benjaminroy 3:fa3112b2216c 158 }
marc1119 2:94e2eebf1524 159 }
marc1119 2:94e2eebf1524 160
benjaminroy 1:d37b1a61bd0b 161 int main() {
benjaminroy 9:8549816b1cac 162 /*** Démarrage des tâches ***/
benjaminroy 5:79b5773e6764 163 printf("Demarrage des taches...\n");
benjaminroy 3:fa3112b2216c 164
marc1119 2:94e2eebf1524 165 Thread t_lectureNum(lecture_num);
benjaminroy 6:6da143aff561 166 Thread t_lectureAnalog(lecture_analog);
marc1119 2:94e2eebf1524 167 Thread t_collection(collection);
marc1119 2:94e2eebf1524 168
marc1119 2:94e2eebf1524 169 t1 = &t_lectureNum;
benjaminroy 6:6da143aff561 170 t2 = &t_lectureAnalog;
marc1119 2:94e2eebf1524 171 t3 = &t_collection;
benjaminroy 3:fa3112b2216c 172
benjaminroy 9:8549816b1cac 173 /*** Initialisation du RTC ***/
benjaminroy 9:8549816b1cac 174 set_time(1485514920); // Set RTC time to...
benjaminroy 6:6da143aff561 175 ticker.attach(&alarm, 0.05);
benjaminroy 5:79b5773e6764 176
benjaminroy 8:56f2b8db5361 177 while(1);
benjaminroy 1:d37b1a61bd0b 178 }