asd
Dependencies: mbed-rtos mbed RTC
main.cpp@3:1c077a1de3e5, 2016-01-29 (annotated)
- Committer:
- manl2003
- Date:
- Fri Jan 29 15:26:00 2016 +0000
- Revision:
- 3:1c077a1de3e5
- Parent:
- 2:ebbca46b415f
asd
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
manl2003 | 3:1c077a1de3e5 | 1 | //Laurent et Laurent |
manl2003 | 3:1c077a1de3e5 | 2 | //manl2003 huol2102 |
manl2003 | 3:1c077a1de3e5 | 3 | |
manl2003 | 0:b4d43279883c | 4 | #include "mbed.h" |
manl2003 | 0:b4d43279883c | 5 | #include "rtos.h" |
manl2003 | 3:1c077a1de3e5 | 6 | #include "RTC.h" |
manl2003 | 0:b4d43279883c | 7 | |
manl2003 | 3:1c077a1de3e5 | 8 | //Pins |
manl2003 | 3:1c077a1de3e5 | 9 | DigitalIn en_1(p27); |
manl2003 | 3:1c077a1de3e5 | 10 | DigitalIn en_2(p28); |
manl2003 | 3:1c077a1de3e5 | 11 | AnalogIn ea_1(p19); |
manl2003 | 3:1c077a1de3e5 | 12 | AnalogIn ea_2(p20); |
manl2003 | 3:1c077a1de3e5 | 13 | RawSerial pc(USBTX,USBRX); |
manl2003 | 3:1c077a1de3e5 | 14 | |
manl2003 | 3:1c077a1de3e5 | 15 | //Mutex |
manl2003 | 3:1c077a1de3e5 | 16 | Mutex mute; |
manl2003 | 0:b4d43279883c | 17 | |
manl2003 | 3:1c077a1de3e5 | 18 | //Compteurs |
manl2003 | 3:1c077a1de3e5 | 19 | int tic_count = 0; |
manl2003 | 3:1c077a1de3e5 | 20 | int tic_count_num1 = 0; |
manl2003 | 3:1c077a1de3e5 | 21 | int FREQ_NUM_MS = 100; |
manl2003 | 3:1c077a1de3e5 | 22 | int FREQ_ANAL_MS = 250; |
manl2003 | 0:b4d43279883c | 23 | |
manl2003 | 3:1c077a1de3e5 | 24 | //Constantes |
manl2003 | 3:1c077a1de3e5 | 25 | #define FREQ_NUM_STAB_MS 50 |
manl2003 | 3:1c077a1de3e5 | 26 | |
manl2003 | 3:1c077a1de3e5 | 27 | #define SIGNAL_NUM 0x1 |
manl2003 | 3:1c077a1de3e5 | 28 | #define SIGNAL_ANALOG 0x2 |
manl2003 | 3:1c077a1de3e5 | 29 | #define SEUIL_ANAL 0xB999 |
manl2003 | 0:b4d43279883c | 30 | |
manl2003 | 3:1c077a1de3e5 | 31 | //Timers |
manl2003 | 3:1c077a1de3e5 | 32 | RtosTimer *ticker_num1 = NULL; |
manl2003 | 3:1c077a1de3e5 | 33 | RtosTimer *ticker_num2 = NULL; |
manl2003 | 3:1c077a1de3e5 | 34 | RtosTimer *ticker_analog1 = NULL; |
manl2003 | 3:1c077a1de3e5 | 35 | RtosTimer *ticker_analog2 = NULL; |
manl2003 | 3:1c077a1de3e5 | 36 | |
manl2003 | 3:1c077a1de3e5 | 37 | struct MailData |
manl2003 | 0:b4d43279883c | 38 | { |
manl2003 | 3:1c077a1de3e5 | 39 | //Structure permettant d'encapsuler toutes les données nécessaires à l'affichage |
manl2003 | 3:1c077a1de3e5 | 40 | void FillData(int _eventType, time_t _seconds) |
manl2003 | 3:1c077a1de3e5 | 41 | { |
manl2003 | 3:1c077a1de3e5 | 42 | eventType = _eventType; |
manl2003 | 3:1c077a1de3e5 | 43 | seconds = _seconds; |
manl2003 | 3:1c077a1de3e5 | 44 | } |
manl2003 | 3:1c077a1de3e5 | 45 | int eventType; |
manl2003 | 3:1c077a1de3e5 | 46 | time_t seconds; |
manl2003 | 3:1c077a1de3e5 | 47 | void print() |
manl2003 | 3:1c077a1de3e5 | 48 | { |
manl2003 | 3:1c077a1de3e5 | 49 | char buffer[32]; |
manl2003 | 3:1c077a1de3e5 | 50 | strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); |
manl2003 | 3:1c077a1de3e5 | 51 | switch(eventType) |
manl2003 | 3:1c077a1de3e5 | 52 | { |
manl2003 | 3:1c077a1de3e5 | 53 | case 0: pc.printf("Evenement detecte sur le premier canal numerique a %s.\r\n", buffer); break; |
manl2003 | 3:1c077a1de3e5 | 54 | case 1: pc.printf("Evenement detecte sur le deuxieme canal numerique a %s.\r\n", buffer); break; |
manl2003 | 3:1c077a1de3e5 | 55 | case 2: pc.printf("Evenement detecte sur le premier canal analogique a %s.\r\n", buffer); break; |
manl2003 | 3:1c077a1de3e5 | 56 | case 3: pc.printf("Evenement detecte sur le deuxieme canal analogique a %s.\r\n", buffer); break; |
manl2003 | 3:1c077a1de3e5 | 57 | |
manl2003 | 3:1c077a1de3e5 | 58 | } |
manl2003 | 0:b4d43279883c | 59 | } |
manl2003 | 3:1c077a1de3e5 | 60 | }; |
manl2003 | 3:1c077a1de3e5 | 61 | |
manl2003 | 3:1c077a1de3e5 | 62 | //Mailbox |
manl2003 | 3:1c077a1de3e5 | 63 | Mail<MailData, 16> mailBox; |
manl2003 | 3:1c077a1de3e5 | 64 | |
manl2003 | 3:1c077a1de3e5 | 65 | struct num_args |
manl2003 | 0:b4d43279883c | 66 | { |
manl2003 | 3:1c077a1de3e5 | 67 | //Structure permettant d'encapsuler toutes les arguments pour un événement numérique |
manl2003 | 3:1c077a1de3e5 | 68 | num_args(DigitalIn *in_arg, int type_arg) |
manl2003 | 3:1c077a1de3e5 | 69 | { |
manl2003 | 3:1c077a1de3e5 | 70 | in = in_arg; |
manl2003 | 3:1c077a1de3e5 | 71 | type = type_arg; |
manl2003 | 3:1c077a1de3e5 | 72 | } |
manl2003 | 3:1c077a1de3e5 | 73 | int type; |
manl2003 | 3:1c077a1de3e5 | 74 | DigitalIn *in; |
manl2003 | 3:1c077a1de3e5 | 75 | }; |
manl2003 | 3:1c077a1de3e5 | 76 | |
manl2003 | 3:1c077a1de3e5 | 77 | struct analog_args |
manl2003 | 3:1c077a1de3e5 | 78 | { |
manl2003 | 3:1c077a1de3e5 | 79 | //Structure permettant d'encapsuler toutes les arguments pour un événement analogique |
manl2003 | 3:1c077a1de3e5 | 80 | analog_args(AnalogIn *in_arg, int type_arg){ |
manl2003 | 3:1c077a1de3e5 | 81 | in = in_arg; |
manl2003 | 3:1c077a1de3e5 | 82 | type = type_arg; |
manl2003 | 3:1c077a1de3e5 | 83 | } |
manl2003 | 3:1c077a1de3e5 | 84 | int type; |
manl2003 | 3:1c077a1de3e5 | 85 | AnalogIn* in; |
manl2003 | 3:1c077a1de3e5 | 86 | }; |
manl2003 | 3:1c077a1de3e5 | 87 | |
manl2003 | 3:1c077a1de3e5 | 88 | void collection(void const *args) { |
manl2003 | 3:1c077a1de3e5 | 89 | //Thread collecteur |
manl2003 | 3:1c077a1de3e5 | 90 | while (1) |
manl2003 | 3:1c077a1de3e5 | 91 | { |
manl2003 | 3:1c077a1de3e5 | 92 | // attente et lecture d'un événement |
manl2003 | 3:1c077a1de3e5 | 93 | osEvent evt = mailBox.get(); |
manl2003 | 3:1c077a1de3e5 | 94 | if (evt.status == osEventMail) |
manl2003 | 3:1c077a1de3e5 | 95 | { |
manl2003 | 0:b4d43279883c | 96 | mute.lock(); |
manl2003 | 3:1c077a1de3e5 | 97 | // écriture de l'événement en sortie (port série) |
manl2003 | 3:1c077a1de3e5 | 98 | MailData *mail = (MailData*)evt.value.p; |
manl2003 | 3:1c077a1de3e5 | 99 | mail->print(); |
manl2003 | 3:1c077a1de3e5 | 100 | mailBox.free(mail); |
manl2003 | 0:b4d43279883c | 101 | mute.unlock(); |
manl2003 | 3:1c077a1de3e5 | 102 | } |
manl2003 | 0:b4d43279883c | 103 | } |
manl2003 | 0:b4d43279883c | 104 | } |
manl2003 | 0:b4d43279883c | 105 | |
manl2003 | 3:1c077a1de3e5 | 106 | void lecture_analog(void const *args) { |
manl2003 | 3:1c077a1de3e5 | 107 | //Lecture des événements analogues |
manl2003 | 3:1c077a1de3e5 | 108 | analog_args *analArgs = (analog_args*)args; |
manl2003 | 3:1c077a1de3e5 | 109 | bool premiereLectureDispo = false, deuxMoyennesPretes = false; |
manl2003 | 3:1c077a1de3e5 | 110 | uint16_t echantillonsAnal[5] = {0, 0, 0, 0, 0}; |
manl2003 | 3:1c077a1de3e5 | 111 | int compteur = 0; |
manl2003 | 3:1c077a1de3e5 | 112 | int moyenneCourante = 0, moyennePrecedente = 0; |
manl2003 | 3:1c077a1de3e5 | 113 | while(1) |
manl2003 | 3:1c077a1de3e5 | 114 | { |
manl2003 | 3:1c077a1de3e5 | 115 | Thread::signal_wait(SIGNAL_ANALOG); |
manl2003 | 3:1c077a1de3e5 | 116 | // lecture des échantillons analogiques |
manl2003 | 3:1c077a1de3e5 | 117 | echantillonsAnal[compteur] = analArgs->in->read_u16(); |
manl2003 | 0:b4d43279883c | 118 | |
manl2003 | 0:b4d43279883c | 119 | // calcul de la nouvelle moyenne courante |
manl2003 | 0:b4d43279883c | 120 | if(premiereLectureDispo == true) |
manl2003 | 0:b4d43279883c | 121 | { |
manl2003 | 3:1c077a1de3e5 | 122 | moyennePrecedente = moyenneCourante; |
manl2003 | 0:b4d43279883c | 123 | moyenneCourante = 0; |
manl2003 | 0:b4d43279883c | 124 | for(int i = 0; i < 5; i++) |
manl2003 | 0:b4d43279883c | 125 | { |
manl2003 | 0:b4d43279883c | 126 | moyenneCourante += echantillonsAnal[i]; |
manl2003 | 0:b4d43279883c | 127 | } |
manl2003 | 0:b4d43279883c | 128 | } |
manl2003 | 0:b4d43279883c | 129 | |
manl2003 | 0:b4d43279883c | 130 | compteur++; |
manl2003 | 0:b4d43279883c | 131 | if(compteur >= 5) |
manl2003 | 0:b4d43279883c | 132 | { |
manl2003 | 0:b4d43279883c | 133 | compteur = 0; |
manl2003 | 0:b4d43279883c | 134 | premiereLectureDispo = true; |
manl2003 | 0:b4d43279883c | 135 | } |
manl2003 | 0:b4d43279883c | 136 | // génération éventuelle d'un événement |
manl2003 | 3:1c077a1de3e5 | 137 | if(!deuxMoyennesPretes) |
manl2003 | 3:1c077a1de3e5 | 138 | { |
manl2003 | 3:1c077a1de3e5 | 139 | deuxMoyennesPretes = true; |
manl2003 | 3:1c077a1de3e5 | 140 | } |
manl2003 | 3:1c077a1de3e5 | 141 | else if(abs(moyenneCourante - moyennePrecedente) > SEUIL_ANAL) |
manl2003 | 0:b4d43279883c | 142 | { |
manl2003 | 3:1c077a1de3e5 | 143 | //On écrit dans la mailbox lorsqu'une variation excède le seuil |
manl2003 | 3:1c077a1de3e5 | 144 | mute.lock(); |
manl2003 | 3:1c077a1de3e5 | 145 | MailData * mailData = mailBox.alloc(); |
manl2003 | 3:1c077a1de3e5 | 146 | mailData->FillData(analArgs->type, time(NULL)); |
manl2003 | 3:1c077a1de3e5 | 147 | mailBox.put(mailData); |
manl2003 | 3:1c077a1de3e5 | 148 | mute.unlock(); |
manl2003 | 0:b4d43279883c | 149 | } |
manl2003 | 0:b4d43279883c | 150 | } |
manl2003 | 0:b4d43279883c | 151 | } |
manl2003 | 0:b4d43279883c | 152 | |
manl2003 | 0:b4d43279883c | 153 | |
manl2003 | 0:b4d43279883c | 154 | void lecture_num(void const *args) { |
manl2003 | 3:1c077a1de3e5 | 155 | // lecture des échantillons numériques |
manl2003 | 3:1c077a1de3e5 | 156 | num_args *numArgs = (num_args*)args; |
manl2003 | 3:1c077a1de3e5 | 157 | bool lectureDebut; |
manl2003 | 3:1c077a1de3e5 | 158 | while (1) |
larryspaghetti | 1:7b379ec59b5d | 159 | { |
manl2003 | 3:1c077a1de3e5 | 160 | Thread::signal_wait(SIGNAL_NUM); |
manl2003 | 3:1c077a1de3e5 | 161 | lectureDebut = numArgs->in->read(); |
manl2003 | 0:b4d43279883c | 162 | wait_ms(FREQ_NUM_STAB_MS); |
manl2003 | 3:1c077a1de3e5 | 163 | if(lectureDebut != numArgs->in->read()) |
manl2003 | 0:b4d43279883c | 164 | { |
manl2003 | 3:1c077a1de3e5 | 165 | //On écrit dans la mailbox lorsqu'un événement numérique est détecté |
manl2003 | 3:1c077a1de3e5 | 166 | mute.lock(); |
manl2003 | 3:1c077a1de3e5 | 167 | MailData * mailData = mailBox.alloc(); |
manl2003 | 3:1c077a1de3e5 | 168 | mailData->FillData(numArgs->type, time(NULL)); |
manl2003 | 3:1c077a1de3e5 | 169 | mailBox.put(mailData); |
manl2003 | 3:1c077a1de3e5 | 170 | mute.unlock(); |
manl2003 | 0:b4d43279883c | 171 | } |
manl2003 | 3:1c077a1de3e5 | 172 | if (numArgs->type == 0) |
manl2003 | 3:1c077a1de3e5 | 173 | { |
manl2003 | 3:1c077a1de3e5 | 174 | tic_count_num1++; |
manl2003 | 3:1c077a1de3e5 | 175 | } |
larryspaghetti | 1:7b379ec59b5d | 176 | } |
manl2003 | 0:b4d43279883c | 177 | } |
manl2003 | 0:b4d43279883c | 178 | |
manl2003 | 3:1c077a1de3e5 | 179 | void signaleur_num(void const *args){ |
manl2003 | 3:1c077a1de3e5 | 180 | //Fonction qui envoie periodiquement un signal aux threads numériques |
manl2003 | 3:1c077a1de3e5 | 181 | Thread* signaled_thread = (Thread*)args; |
manl2003 | 3:1c077a1de3e5 | 182 | signaled_thread->signal_set(SIGNAL_NUM); |
manl2003 | 3:1c077a1de3e5 | 183 | } |
manl2003 | 3:1c077a1de3e5 | 184 | |
manl2003 | 3:1c077a1de3e5 | 185 | void signaleur_analog(void const *args){ |
manl2003 | 3:1c077a1de3e5 | 186 | //Fonction qui envoie periodiquement un signal aux threads analogiques |
manl2003 | 3:1c077a1de3e5 | 187 | Thread* signaled_thread = (Thread*)args; |
manl2003 | 3:1c077a1de3e5 | 188 | signaled_thread->signal_set(SIGNAL_ANALOG); |
manl2003 | 3:1c077a1de3e5 | 189 | } |
manl2003 | 3:1c077a1de3e5 | 190 | |
manl2003 | 3:1c077a1de3e5 | 191 | |
manl2003 | 3:1c077a1de3e5 | 192 | |
manl2003 | 3:1c077a1de3e5 | 193 | void starttickers() |
manl2003 | 3:1c077a1de3e5 | 194 | { |
manl2003 | 3:1c077a1de3e5 | 195 | ticker_num1->start(FREQ_NUM_MS); |
manl2003 | 3:1c077a1de3e5 | 196 | ticker_num2->start(FREQ_NUM_MS); |
manl2003 | 3:1c077a1de3e5 | 197 | ticker_analog1->start(FREQ_ANAL_MS); |
manl2003 | 3:1c077a1de3e5 | 198 | ticker_analog2->start(FREQ_ANAL_MS); |
manl2003 | 3:1c077a1de3e5 | 199 | pc.printf("Tickers started \n\r"); |
manl2003 | 3:1c077a1de3e5 | 200 | } |
manl2003 | 3:1c077a1de3e5 | 201 | |
manl2003 | 3:1c077a1de3e5 | 202 | void restartTickers() |
manl2003 | 3:1c077a1de3e5 | 203 | { |
manl2003 | 3:1c077a1de3e5 | 204 | ticker_num1->stop(); |
manl2003 | 3:1c077a1de3e5 | 205 | ticker_num2->stop(); |
manl2003 | 3:1c077a1de3e5 | 206 | ticker_analog1->stop(); |
manl2003 | 3:1c077a1de3e5 | 207 | ticker_analog2->stop(); |
manl2003 | 3:1c077a1de3e5 | 208 | ticker_num1->start(FREQ_NUM_MS); |
manl2003 | 3:1c077a1de3e5 | 209 | ticker_num2->start(FREQ_NUM_MS); |
manl2003 | 3:1c077a1de3e5 | 210 | ticker_analog1->start(FREQ_ANAL_MS); |
manl2003 | 3:1c077a1de3e5 | 211 | ticker_analog2->start(FREQ_ANAL_MS); |
manl2003 | 3:1c077a1de3e5 | 212 | } |
manl2003 | 3:1c077a1de3e5 | 213 | |
manl2003 | 3:1c077a1de3e5 | 214 | void tictoc() |
manl2003 | 3:1c077a1de3e5 | 215 | { |
manl2003 | 3:1c077a1de3e5 | 216 | //Fonction servant a vérifier et corriger l'écart entre la RTC et la CPU clock |
manl2003 | 3:1c077a1de3e5 | 217 | int tic_diff; |
manl2003 | 3:1c077a1de3e5 | 218 | tic_count++; |
manl2003 | 3:1c077a1de3e5 | 219 | if (tic_count == 10) |
manl2003 | 0:b4d43279883c | 220 | { |
manl2003 | 3:1c077a1de3e5 | 221 | if (!(99 < tic_count_num1 < 101)) |
manl2003 | 3:1c077a1de3e5 | 222 | { |
manl2003 | 3:1c077a1de3e5 | 223 | tic_diff = 100-tic_count_num1; |
manl2003 | 3:1c077a1de3e5 | 224 | FREQ_NUM_MS += tic_diff; |
manl2003 | 3:1c077a1de3e5 | 225 | FREQ_ANAL_MS += tic_diff; |
manl2003 | 3:1c077a1de3e5 | 226 | restartTickers(); |
manl2003 | 3:1c077a1de3e5 | 227 | pc.printf("Modif: %i %i", FREQ_NUM_MS, FREQ_ANAL_MS); |
manl2003 | 3:1c077a1de3e5 | 228 | } |
manl2003 | 3:1c077a1de3e5 | 229 | pc.printf("RTC Tic count: %i, Real Tic count: %i\r\n", tic_count, tic_count_num1); |
manl2003 | 3:1c077a1de3e5 | 230 | tic_count = 0; |
manl2003 | 3:1c077a1de3e5 | 231 | tic_count_num1 = 0; |
manl2003 | 0:b4d43279883c | 232 | } |
manl2003 | 0:b4d43279883c | 233 | } |
manl2003 | 0:b4d43279883c | 234 | |
manl2003 | 3:1c077a1de3e5 | 235 | int main() { |
manl2003 | 3:1c077a1de3e5 | 236 | en_1.mode(PullUp); |
manl2003 | 3:1c077a1de3e5 | 237 | en_2.mode(PullUp); |
manl2003 | 3:1c077a1de3e5 | 238 | |
manl2003 | 3:1c077a1de3e5 | 239 | pc.printf("Depart\r\n"); |
manl2003 | 0:b4d43279883c | 240 | |
manl2003 | 3:1c077a1de3e5 | 241 | |
manl2003 | 3:1c077a1de3e5 | 242 | //Création des specs des threads |
manl2003 | 3:1c077a1de3e5 | 243 | num_args argsNum1(&en_1, 0); |
manl2003 | 3:1c077a1de3e5 | 244 | num_args argsNum2(&en_2, 1); |
manl2003 | 3:1c077a1de3e5 | 245 | analog_args argsAnalog1(&ea_1, 2); |
manl2003 | 3:1c077a1de3e5 | 246 | analog_args argsAnalog2(&ea_2, 3); |
larryspaghetti | 1:7b379ec59b5d | 247 | |
manl2003 | 3:1c077a1de3e5 | 248 | //Créations des threads |
manl2003 | 3:1c077a1de3e5 | 249 | Thread num1(lecture_num, &argsNum1); |
manl2003 | 3:1c077a1de3e5 | 250 | Thread num2(lecture_num, &argsNum2); |
manl2003 | 3:1c077a1de3e5 | 251 | Thread analog1(lecture_analog, &argsAnalog1); |
manl2003 | 3:1c077a1de3e5 | 252 | Thread analog2(lecture_analog, &argsAnalog2); |
manl2003 | 3:1c077a1de3e5 | 253 | Thread collecteur(collection); |
manl2003 | 3:1c077a1de3e5 | 254 | |
manl2003 | 3:1c077a1de3e5 | 255 | //Initialisation des tickers |
manl2003 | 3:1c077a1de3e5 | 256 | RtosTimer temp_ticker_num1(signaleur_num, osTimerPeriodic, &num1); |
manl2003 | 3:1c077a1de3e5 | 257 | ticker_num1 = &temp_ticker_num1; |
manl2003 | 3:1c077a1de3e5 | 258 | RtosTimer temp_ticker_num2(signaleur_num, osTimerPeriodic, &num2); |
manl2003 | 3:1c077a1de3e5 | 259 | ticker_num2 = &temp_ticker_num2; |
manl2003 | 3:1c077a1de3e5 | 260 | RtosTimer temp_ticker_analog1(signaleur_analog, osTimerPeriodic, &analog1); |
manl2003 | 3:1c077a1de3e5 | 261 | ticker_analog1 = &temp_ticker_analog1; |
manl2003 | 3:1c077a1de3e5 | 262 | RtosTimer temp_ticker_analog2(signaleur_analog, osTimerPeriodic, &analog2); |
manl2003 | 3:1c077a1de3e5 | 263 | ticker_analog2 = &temp_ticker_analog2; |
manl2003 | 3:1c077a1de3e5 | 264 | |
larryspaghetti | 1:7b379ec59b5d | 265 | // initialisation du RTC |
larryspaghetti | 1:7b379ec59b5d | 266 | set_time(1453667014); |
manl2003 | 3:1c077a1de3e5 | 267 | |
manl2003 | 3:1c077a1de3e5 | 268 | //Lancement des tickers |
manl2003 | 3:1c077a1de3e5 | 269 | starttickers(); |
manl2003 | 3:1c077a1de3e5 | 270 | |
manl2003 | 3:1c077a1de3e5 | 271 | RTC::attach(&tictoc, RTC::Second); |
manl2003 | 3:1c077a1de3e5 | 272 | |
manl2003 | 3:1c077a1de3e5 | 273 | |
manl2003 | 3:1c077a1de3e5 | 274 | while(1); |
manl2003 | 0:b4d43279883c | 275 | } |