
S05APP2: Noyau temps réel
main.cpp@26:faaca34daf91, 2017-01-31 (annotated)
- 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?
User | Revision | Line number | New 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 | } |