App S5 / Mbed 2 deprecated S05APP2

Dependencies:   mbed mbed-rtos

Committer:
marc1119
Date:
Mon Jan 30 21:14:03 2017 +0000
Revision:
21:3b9a50b245f8
Parent:
20:8815d51406a9
Child:
22:b837590f4fd0
Faudrait juste s'assurer que la logique est correct pour les IF qui remplace les abs

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 20:8815d51406a9 7 Serial pc(USBTX, USBRX); // tx, rx
benjaminroy 20:8815d51406a9 8 Ticker ticker;
benjaminroy 20:8815d51406a9 9 DigitalIn en_1(p15);
benjaminroy 20:8815d51406a9 10 DigitalIn en_2(p16);
benjaminroy 20:8815d51406a9 11 AnalogIn ea_1(p19);
benjaminroy 20:8815d51406a9 12 AnalogIn ea_2(p20);
marc1119 2:94e2eebf1524 13 Thread *t1;
marc1119 2:94e2eebf1524 14 Thread *t2;
benjaminroy 18:01c6a7ee0914 15 Mutex mutex;
marc1119 2:94e2eebf1524 16
benjaminroy 3:fa3112b2216c 17 uint8_t compteur = 0;
benjaminroy 5:79b5773e6764 18 bool verifierSiStable = false;
benjaminroy 6:6da143aff561 19
benjaminroy 9:8549816b1cac 20 /* Mail */
marc1119 7:e9f5280d47b3 21 typedef struct {
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
marc1119 7:e9f5280d47b3 24 } mail_t;
marc1119 7:e9f5280d47b3 25
benjaminroy 20:8815d51406a9 26 Mail<mail_t, 4> mail_box;
benjaminroy 9:8549816b1cac 27
benjaminroy 3:fa3112b2216c 28 // -------------------------------------------------------
benjaminroy 3:fa3112b2216c 29 // -------------------------------------------------------
benjaminroy 3:fa3112b2216c 30
benjaminroy 18:01c6a7ee0914 31 void envoyer_mail(uint8_t broche) {
benjaminroy 18:01c6a7ee0914 32 mutex.lock();
benjaminroy 9:8549816b1cac 33 time_t secondes = time(NULL);
benjaminroy 18:01c6a7ee0914 34 mutex.unlock();
benjaminroy 18:01c6a7ee0914 35
benjaminroy 9:8549816b1cac 36 mail_t *mail = mail_box.alloc();
benjaminroy 9:8549816b1cac 37 mail->temps = ctime(&secondes);
benjaminroy 9:8549816b1cac 38 mail->broche = broche;
marc1119 7:e9f5280d47b3 39 mail_box.put(mail);
marc1119 7:e9f5280d47b3 40 }
marc1119 7:e9f5280d47b3 41
benjaminroy 1:d37b1a61bd0b 42 void lecture_analog(void const *args) {
benjaminroy 9:8549816b1cac 43 uint8_t i = 0;
benjaminroy 6:6da143aff561 44 float moyenne_passee1 = -1;
benjaminroy 6:6da143aff561 45 float moyenne_passee2 = -1;
benjaminroy 14:3b72daf433fb 46 float echantillons1[5];
benjaminroy 18:01c6a7ee0914 47 float echantillons2[5];
benjaminroy 18:01c6a7ee0914 48 float seuil = 0.125;
benjaminroy 14:3b72daf433fb 49
benjaminroy 6:6da143aff561 50 while (true) {
benjaminroy 9:8549816b1cac 51 /*** Synchronisation sur la période d'échantillonnage ***/
benjaminroy 6:6da143aff561 52 Thread::signal_wait(0x1);
benjaminroy 6:6da143aff561 53
benjaminroy 9:8549816b1cac 54 /*** Lecture des échantillons analogiques ***/
benjaminroy 6:6da143aff561 55 float entreeanal_1 = ea_1.read();
benjaminroy 6:6da143aff561 56 float entreeanal_2 = ea_2.read();
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
benjaminroy 6:6da143aff561 67 if (moyenne_passee1 != -1) {
marc1119 21:3b9a50b245f8 68 if(moyenne_courante1 < moyenne_passee1) {
marc1119 21:3b9a50b245f8 69 if (1 - (moyenne_courante1 / moyenne_passee1)) > seuil) {
benjaminroy 18:01c6a7ee0914 70 envoyer_mail(19); /*** Génération éventuelle d'un événement ***/
marc1119 21:3b9a50b245f8 71 }
benjaminroy 6:6da143aff561 72 }
marc1119 21:3b9a50b245f8 73 else {
marc1119 21:3b9a50b245f8 74 if (1 - (moyenne_passee1 / moyenne_courante1) > seuil) {
marc1119 21:3b9a50b245f8 75 envoyer_mail(19); /*** Génération éventuelle d'un événement ***/
marc1119 21:3b9a50b245f8 76 }
marc1119 21:3b9a50b245f8 77 }
benjaminroy 6:6da143aff561 78 }
benjaminroy 6:6da143aff561 79 if (moyenne_passee2 != -1) {
marc1119 21:3b9a50b245f8 80 if(moyenne_courante2 < moyenne_passee2) {
marc1119 21:3b9a50b245f8 81 if (1 - (moyenne_courante2 / moyenne_passee2) > seuil) {
benjaminroy 18:01c6a7ee0914 82 envoyer_mail(20); /*** Génération éventuelle d'un événement ***/
marc1119 21:3b9a50b245f8 83 }
benjaminroy 6:6da143aff561 84 }
marc1119 21:3b9a50b245f8 85 else {
marc1119 21:3b9a50b245f8 86 if (1 - (moyenne_passee2 / moyenne_courante2) > seuil) {
marc1119 21:3b9a50b245f8 87 envoyer_mail(20); /*** Génération éventuelle d'un événement ***/
marc1119 21:3b9a50b245f8 88 }
marc1119 21:3b9a50b245f8 89 }
benjaminroy 6:6da143aff561 90 }
benjaminroy 6:6da143aff561 91 moyenne_passee1 = moyenne_courante1;
benjaminroy 6:6da143aff561 92 moyenne_passee2 = moyenne_courante2;
benjaminroy 6:6da143aff561 93 i = 0;
benjaminroy 6:6da143aff561 94 }
benjaminroy 0:4f447b02a32f 95 }
benjaminroy 0:4f447b02a32f 96 }
marc1119 2:94e2eebf1524 97
benjaminroy 14:3b72daf433fb 98 void lecture_num(void const *args) {
benjaminroy 18:01c6a7ee0914 99 bool valeurs[2] = {0};
benjaminroy 20:8815d51406a9 100
benjaminroy 1:d37b1a61bd0b 101 while (true) {
benjaminroy 9:8549816b1cac 102 /*** Synchronisation sur la période d'échantillonnage ***/
marc1119 2:94e2eebf1524 103 Thread::signal_wait(0x1);
benjaminroy 6:6da143aff561 104
benjaminroy 9:8549816b1cac 105 /*** Lecture des échantillons numériques ***/
benjaminroy 3:fa3112b2216c 106 uint8_t entreenum_1 = en_1.read();
benjaminroy 3:fa3112b2216c 107 uint8_t entreenum_2 = en_2.read();
benjaminroy 3:fa3112b2216c 108
benjaminroy 9:8549816b1cac 109 /*** Prise en charge du phénomène de rebond ***/
benjaminroy 18:01c6a7ee0914 110 if (entreenum_1 != valeurs[0]) {
benjaminroy 5:79b5773e6764 111 verifierSiStable = true;
benjaminroy 5:79b5773e6764 112 Thread::signal_wait(0x2);
benjaminroy 18:01c6a7ee0914 113 valeurs[0] = entreenum_1;
benjaminroy 5:79b5773e6764 114
benjaminroy 13:29991a8767fe 115 if (entreenum_1 == en_1.read()) {
benjaminroy 18:01c6a7ee0914 116 envoyer_mail(15); /*** Génération d'un évènement... ***/
benjaminroy 10:200ebb491b60 117 }
benjaminroy 13:29991a8767fe 118 }
benjaminroy 18:01c6a7ee0914 119 if (entreenum_2 != valeurs[1]) {
benjaminroy 13:29991a8767fe 120 verifierSiStable = true;
benjaminroy 13:29991a8767fe 121 Thread::signal_wait(0x2);
benjaminroy 18:01c6a7ee0914 122 valeurs[1] = entreenum_2;
benjaminroy 13:29991a8767fe 123
benjaminroy 13:29991a8767fe 124 if (entreenum_2 == en_2.read()) {
benjaminroy 18:01c6a7ee0914 125 envoyer_mail(16); /*** Génération d'un évènement... ***/
benjaminroy 5:79b5773e6764 126 }
benjaminroy 13:29991a8767fe 127 }
benjaminroy 13:29991a8767fe 128 Thread::yield();
benjaminroy 1:d37b1a61bd0b 129 }
benjaminroy 1:d37b1a61bd0b 130 }
marc1119 2:94e2eebf1524 131
benjaminroy 1:d37b1a61bd0b 132 void collection(void const *args) {
benjaminroy 20:8815d51406a9 133 while (true) {
benjaminroy 9:8549816b1cac 134 /*** Attente et lecture d'un événement ***/
marc1119 7:e9f5280d47b3 135 osEvent evt = mail_box.get();
marc1119 7:e9f5280d47b3 136 if (evt.status == osEventMail) {
marc1119 7:e9f5280d47b3 137 mail_t *mail = (mail_t*)evt.value.p;
benjaminroy 9:8549816b1cac 138
benjaminroy 9:8549816b1cac 139 /*** Écriture de l'événement en sortie (port série) ***/
benjaminroy 18:01c6a7ee0914 140 pc.printf("Entree %d\nDate: %s\n", mail->broche, mail->temps);
marc1119 7:e9f5280d47b3 141 mail_box.free(mail);
benjaminroy 18:01c6a7ee0914 142 }
benjaminroy 1:d37b1a61bd0b 143 }
benjaminroy 1:d37b1a61bd0b 144 }
marc1119 2:94e2eebf1524 145
benjaminroy 3:fa3112b2216c 146 void alarm() {
benjaminroy 3:fa3112b2216c 147 compteur++;
benjaminroy 5:79b5773e6764 148
benjaminroy 5:79b5773e6764 149 if (verifierSiStable) {
benjaminroy 5:79b5773e6764 150 t1->signal_set(0x2);
benjaminroy 5:79b5773e6764 151 verifierSiStable = false;
benjaminroy 5:79b5773e6764 152 }
benjaminroy 3:fa3112b2216c 153
benjaminroy 9:8549816b1cac 154 if (compteur % 2 == 0) { // Entrées numériques échantillionnées à tous les 100 ms
benjaminroy 3:fa3112b2216c 155 t1->signal_set(0x1);
benjaminroy 9:8549816b1cac 156 } else if (compteur % 5 == 0) { // Entrées analogiques échantillonnées à tous les 250 ms
benjaminroy 6:6da143aff561 157 t2->signal_set(0x1);
marc1119 2:94e2eebf1524 158 }
benjaminroy 3:fa3112b2216c 159
benjaminroy 3:fa3112b2216c 160 if (compteur % 10 == 0) {
benjaminroy 3:fa3112b2216c 161 compteur = 0;
benjaminroy 3:fa3112b2216c 162 }
marc1119 2:94e2eebf1524 163 }
marc1119 2:94e2eebf1524 164
benjaminroy 1:d37b1a61bd0b 165 int main() {
benjaminroy 9:8549816b1cac 166 /*** Démarrage des tâches ***/
benjaminroy 20:8815d51406a9 167
marc1119 2:94e2eebf1524 168 Thread t_lectureNum(lecture_num);
benjaminroy 6:6da143aff561 169 Thread t_lectureAnalog(lecture_analog);
marc1119 2:94e2eebf1524 170 Thread t_collection(collection);
marc1119 2:94e2eebf1524 171
marc1119 2:94e2eebf1524 172 t1 = &t_lectureNum;
benjaminroy 6:6da143aff561 173 t2 = &t_lectureAnalog;
benjaminroy 3:fa3112b2216c 174
benjaminroy 9:8549816b1cac 175 /*** Initialisation du RTC ***/
benjaminroy 9:8549816b1cac 176 set_time(1485514920); // Set RTC time to...
benjaminroy 6:6da143aff561 177 ticker.attach(&alarm, 0.05);
benjaminroy 5:79b5773e6764 178
benjaminroy 8:56f2b8db5361 179 while(1);
benjaminroy 1:d37b1a61bd0b 180 }