Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@12:b24f9818a9f0, 2017-01-27 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |