asd

Dependencies:   mbed-rtos mbed RTC

Committer:
manl2003
Date:
Fri Jan 29 15:26:00 2016 +0000
Revision:
3:1c077a1de3e5
Parent:
2:ebbca46b415f
asd

Who changed what in which revision?

UserRevisionLine numberNew 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 }