App S5 / Mbed 2 deprecated S05APP2

Dependencies:   mbed mbed-rtos

Committer:
marc1119
Date:
Mon Jan 30 17:04:20 2017 +0000
Revision:
19:abddc058f6d1
Parent:
18:01c6a7ee0914
Child:
20:8815d51406a9
Essaie de le r?duire

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