S05APP2: Noyau temps réel

Dependencies:   mbed mbed-rtos

Committer:
benjaminroy
Date:
Tue Jan 31 19:06:42 2017 +0000
Revision:
26:faaca34daf91
Parent:
25:9428c29c50dc
Ajout de la valeur dans le printf

Who changed what in which revision?

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