gfdh

Dependencies:   mbed-rtos mbed

Committer:
joGenie
Date:
Tue Jan 28 02:45:00 2014 +0000
Revision:
4:6a242f5bc7fa
Parent:
2:6009cb96f273
Quelques changement;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joGenie 0:f7d5819b29d5 1 #include "mbed.h"
joGenie 0:f7d5819b29d5 2 #include "rtos.h"
joGenie 0:f7d5819b29d5 3
joGenie 4:6a242f5bc7fa 4 // Digital in
joGenie 0:f7d5819b29d5 5 DigitalIn en_1(p15);
joGenie 0:f7d5819b29d5 6 DigitalIn en_2(p16);
RufflesAllD 1:96a4c2a39981 7
joGenie 4:6a242f5bc7fa 8 // Analog in
joGenie 0:f7d5819b29d5 9 AnalogIn ea_1(p19);
joGenie 0:f7d5819b29d5 10 AnalogIn ea_2(p20);
joGenie 0:f7d5819b29d5 11
joGenie 4:6a242f5bc7fa 12 // Serial port usb
RufflesAllD 1:96a4c2a39981 13 Serial pc(USBTX, USBRX);
RufflesAllD 1:96a4c2a39981 14
joGenie 4:6a242f5bc7fa 15 // Mutex
RufflesAllD 2:6009cb96f273 16 Mutex event_mutex;
RufflesAllD 2:6009cb96f273 17
joGenie 4:6a242f5bc7fa 18 /**
joGenie 4:6a242f5bc7fa 19 Event definition
joGenie 4:6a242f5bc7fa 20 */
joGenie 4:6a242f5bc7fa 21 struct Event
RufflesAllD 2:6009cb96f273 22 {
joGenie 4:6a242f5bc7fa 23 char *def; //! Description of event
joGenie 4:6a242f5bc7fa 24 time_t time; //! Timestamps
RufflesAllD 2:6009cb96f273 25 };
RufflesAllD 2:6009cb96f273 26
joGenie 4:6a242f5bc7fa 27 // List FIFO of events
joGenie 4:6a242f5bc7fa 28 Queue<Event, 16> queue;
RufflesAllD 2:6009cb96f273 29
joGenie 4:6a242f5bc7fa 30 /** Put event in a queue
joGenie 4:6a242f5bc7fa 31 *
joGenie 4:6a242f5bc7fa 32 * @param ev Event to put
joGenie 4:6a242f5bc7fa 33 */
joGenie 4:6a242f5bc7fa 34 void put(Event *ev)
RufflesAllD 1:96a4c2a39981 35 {
RufflesAllD 2:6009cb96f273 36 event_mutex.lock();
RufflesAllD 2:6009cb96f273 37 queue.put(ev);
joGenie 4:6a242f5bc7fa 38 delete ev;
RufflesAllD 2:6009cb96f273 39 event_mutex.unlock();
RufflesAllD 2:6009cb96f273 40 }
RufflesAllD 2:6009cb96f273 41
RufflesAllD 2:6009cb96f273 42 void showTime(char *buffer, time_t time)
RufflesAllD 2:6009cb96f273 43 {
RufflesAllD 2:6009cb96f273 44 strftime(buffer, 32, "%Y-%m-%d %H:%M:%S\n\r", localtime(&time));
RufflesAllD 2:6009cb96f273 45 }
RufflesAllD 2:6009cb96f273 46
RufflesAllD 2:6009cb96f273 47 unsigned short moyenne(unsigned short* mean_values)
RufflesAllD 2:6009cb96f273 48 {
RufflesAllD 2:6009cb96f273 49 unsigned int mean = 0;
RufflesAllD 1:96a4c2a39981 50
RufflesAllD 2:6009cb96f273 51 for (int i = 0; i < 5; i++)
RufflesAllD 2:6009cb96f273 52 {
RufflesAllD 2:6009cb96f273 53 mean += mean_values[i];
RufflesAllD 2:6009cb96f273 54 }
RufflesAllD 2:6009cb96f273 55
RufflesAllD 2:6009cb96f273 56 return mean/5;
RufflesAllD 1:96a4c2a39981 57 }
RufflesAllD 1:96a4c2a39981 58
joGenie 0:f7d5819b29d5 59 void lecture_analog(void const *args)
joGenie 0:f7d5819b29d5 60 {
RufflesAllD 2:6009cb96f273 61 unsigned short values_ea_1[5] = {0};
RufflesAllD 2:6009cb96f273 62 unsigned short values_ea_2[5] = {0};
RufflesAllD 2:6009cb96f273 63
RufflesAllD 2:6009cb96f273 64 const unsigned short valeur_ecart = 0x1FFF; // le huitième de 0xFFFF
RufflesAllD 2:6009cb96f273 65
RufflesAllD 2:6009cb96f273 66 int init_mean = 0;
RufflesAllD 2:6009cb96f273 67
RufflesAllD 2:6009cb96f273 68 int compteur = 0;
RufflesAllD 2:6009cb96f273 69
joGenie 0:f7d5819b29d5 70 while (true)
joGenie 0:f7d5819b29d5 71 {
joGenie 0:f7d5819b29d5 72 // synchronisation sur la période d'échantillonnage
RufflesAllD 2:6009cb96f273 73 Thread::signal_wait(0x2);
RufflesAllD 2:6009cb96f273 74
RufflesAllD 2:6009cb96f273 75 if (init_mean < 5)
RufflesAllD 2:6009cb96f273 76 {
RufflesAllD 2:6009cb96f273 77 values_ea_1[init_mean] = ea_1.read_u16();
RufflesAllD 2:6009cb96f273 78 values_ea_2[init_mean] = ea_2.read_u16();
RufflesAllD 2:6009cb96f273 79 init_mean++;
RufflesAllD 2:6009cb96f273 80 }
RufflesAllD 2:6009cb96f273 81 else
RufflesAllD 2:6009cb96f273 82 {
joGenie 4:6a242f5bc7fa 83 Event *ev = new Event;
RufflesAllD 2:6009cb96f273 84
RufflesAllD 2:6009cb96f273 85 // lecture de l'étampe temporelle
RufflesAllD 2:6009cb96f273 86 ev->time = time(NULL);
RufflesAllD 2:6009cb96f273 87
RufflesAllD 2:6009cb96f273 88 // lecture des échantillons analogiques
RufflesAllD 2:6009cb96f273 89 unsigned short value_ea_1 = ea_1.read_u16();
RufflesAllD 2:6009cb96f273 90 unsigned short value_ea_2 = ea_2.read_u16();
RufflesAllD 2:6009cb96f273 91
RufflesAllD 2:6009cb96f273 92 // calcul de la nouvelle moyenne courante
RufflesAllD 2:6009cb96f273 93 unsigned short mean_value_ea_1 = moyenne(values_ea_1);
RufflesAllD 2:6009cb96f273 94 unsigned short mean_value_ea_2 = moyenne(values_ea_2);
RufflesAllD 2:6009cb96f273 95
RufflesAllD 2:6009cb96f273 96 // génération éventuelle d'un événement
RufflesAllD 2:6009cb96f273 97 if (abs(value_ea_1 - mean_value_ea_1) > valeur_ecart)
RufflesAllD 2:6009cb96f273 98 {
RufflesAllD 2:6009cb96f273 99 ev->def = "analog1";
RufflesAllD 2:6009cb96f273 100 put(ev);
RufflesAllD 2:6009cb96f273 101 }
RufflesAllD 2:6009cb96f273 102 if (abs(value_ea_2 - mean_value_ea_2) > valeur_ecart)
RufflesAllD 2:6009cb96f273 103 {
RufflesAllD 2:6009cb96f273 104 ev->def = "analog2";
RufflesAllD 2:6009cb96f273 105 put(ev);
RufflesAllD 2:6009cb96f273 106 }
RufflesAllD 2:6009cb96f273 107
RufflesAllD 2:6009cb96f273 108 values_ea_1[compteur] = value_ea_1;
RufflesAllD 2:6009cb96f273 109 values_ea_2[compteur] = value_ea_2;
RufflesAllD 2:6009cb96f273 110
RufflesAllD 2:6009cb96f273 111 compteur = (compteur+1) % 5;
RufflesAllD 2:6009cb96f273 112 }
joGenie 0:f7d5819b29d5 113 }
joGenie 0:f7d5819b29d5 114 }
joGenie 0:f7d5819b29d5 115
RufflesAllD 2:6009cb96f273 116 void timer250ms(void const *thread)
RufflesAllD 1:96a4c2a39981 117 {
RufflesAllD 2:6009cb96f273 118 Thread *t = (Thread*)thread;
RufflesAllD 2:6009cb96f273 119 t->signal_set(0x02);
RufflesAllD 1:96a4c2a39981 120 }
RufflesAllD 1:96a4c2a39981 121
joGenie 0:f7d5819b29d5 122 void lecture_num(void const *args)
joGenie 0:f7d5819b29d5 123 {
RufflesAllD 2:6009cb96f273 124 int state1 = en_1;
RufflesAllD 2:6009cb96f273 125 int state2 = en_2;
RufflesAllD 2:6009cb96f273 126 bool stateChanged[2] = {false, false};
RufflesAllD 2:6009cb96f273 127
joGenie 0:f7d5819b29d5 128 while (true)
joGenie 0:f7d5819b29d5 129 {
RufflesAllD 2:6009cb96f273 130 // synchronisation sur la période d'échantillonnage
RufflesAllD 1:96a4c2a39981 131 Thread::signal_wait(0x1);
RufflesAllD 2:6009cb96f273 132
joGenie 4:6a242f5bc7fa 133 Event *ev = new Event;
RufflesAllD 2:6009cb96f273 134
joGenie 0:f7d5819b29d5 135 // lecture de l'étampe temporelle
RufflesAllD 2:6009cb96f273 136 ev->time = time(NULL);
RufflesAllD 2:6009cb96f273 137
joGenie 0:f7d5819b29d5 138 // lecture des échantillons numériques
RufflesAllD 2:6009cb96f273 139 stateChanged[0] = (state1 != en_1);
RufflesAllD 2:6009cb96f273 140 stateChanged[1] = (state2 != en_2);
RufflesAllD 2:6009cb96f273 141
joGenie 0:f7d5819b29d5 142 // prise en charge du phénomène de rebond
joGenie 0:f7d5819b29d5 143 // génération éventuelle d'un événement
RufflesAllD 2:6009cb96f273 144 if (stateChanged[0] || stateChanged[1])
RufflesAllD 2:6009cb96f273 145 {
RufflesAllD 2:6009cb96f273 146 wait(0.05);
RufflesAllD 2:6009cb96f273 147 if (state1 != en_1 && stateChanged[0])
RufflesAllD 2:6009cb96f273 148 {
RufflesAllD 2:6009cb96f273 149 ev->def = "digital1";
RufflesAllD 2:6009cb96f273 150 put(ev);
RufflesAllD 2:6009cb96f273 151 state1 = en_1;
RufflesAllD 2:6009cb96f273 152 }
RufflesAllD 2:6009cb96f273 153 if (state2 != en_2 && stateChanged[1])
RufflesAllD 2:6009cb96f273 154 {
RufflesAllD 2:6009cb96f273 155 ev->def = "digital2";
RufflesAllD 2:6009cb96f273 156 put(ev);
RufflesAllD 2:6009cb96f273 157 state2 = en_2;
RufflesAllD 2:6009cb96f273 158 }
RufflesAllD 2:6009cb96f273 159
RufflesAllD 2:6009cb96f273 160 stateChanged[0] = false;
RufflesAllD 2:6009cb96f273 161 stateChanged[1] = false;
RufflesAllD 2:6009cb96f273 162 }
joGenie 0:f7d5819b29d5 163 }
joGenie 0:f7d5819b29d5 164 }
joGenie 0:f7d5819b29d5 165
RufflesAllD 2:6009cb96f273 166 void timer100ms(void const *thread)
RufflesAllD 2:6009cb96f273 167 {
RufflesAllD 2:6009cb96f273 168 Thread *t = (Thread*)thread;
RufflesAllD 2:6009cb96f273 169 t->signal_set(0x01);
RufflesAllD 2:6009cb96f273 170 }
RufflesAllD 2:6009cb96f273 171
joGenie 0:f7d5819b29d5 172 void collection(void const *args)
joGenie 0:f7d5819b29d5 173 {
joGenie 0:f7d5819b29d5 174 while (true)
joGenie 0:f7d5819b29d5 175 {
joGenie 0:f7d5819b29d5 176 // attente et lecture d'un événement
RufflesAllD 2:6009cb96f273 177 osEvent evt = queue.get();
RufflesAllD 2:6009cb96f273 178
joGenie 0:f7d5819b29d5 179 // écriture de l'événement en sortie (port série)
RufflesAllD 2:6009cb96f273 180 if (evt.status == osEventMessage)
RufflesAllD 2:6009cb96f273 181 {
joGenie 4:6a242f5bc7fa 182 Event *ev = (Event*)evt.value.p;
RufflesAllD 2:6009cb96f273 183
RufflesAllD 2:6009cb96f273 184 char *buffer = new char;
RufflesAllD 2:6009cb96f273 185 showTime(buffer, ev->time);
RufflesAllD 2:6009cb96f273 186
RufflesAllD 2:6009cb96f273 187 pc.printf("%s: %s", ev->def, buffer);
RufflesAllD 2:6009cb96f273 188 }
joGenie 0:f7d5819b29d5 189 }
joGenie 0:f7d5819b29d5 190 }
joGenie 0:f7d5819b29d5 191
joGenie 0:f7d5819b29d5 192 int main()
joGenie 0:f7d5819b29d5 193 {
joGenie 0:f7d5819b29d5 194 // initialisation du RTC
RufflesAllD 1:96a4c2a39981 195 set_time(1390820561); //2014-01-27 11:02:41
RufflesAllD 1:96a4c2a39981 196
joGenie 0:f7d5819b29d5 197 // démarrage des tâches
RufflesAllD 1:96a4c2a39981 198 Thread thread1(lecture_num);
RufflesAllD 2:6009cb96f273 199 RtosTimer timer_num(timer100ms, osTimerPeriodic, (void*)&thread1);
RufflesAllD 2:6009cb96f273 200 timer_num.start(100);
RufflesAllD 2:6009cb96f273 201
RufflesAllD 2:6009cb96f273 202 Thread thread2(lecture_analog);
RufflesAllD 2:6009cb96f273 203 RtosTimer timer_analog(timer250ms, osTimerPeriodic, (void*)&thread2);
RufflesAllD 2:6009cb96f273 204 timer_analog.start(250);
RufflesAllD 2:6009cb96f273 205
RufflesAllD 2:6009cb96f273 206 Thread thread3(collection);
RufflesAllD 1:96a4c2a39981 207
RufflesAllD 1:96a4c2a39981 208 while(true) {}
joGenie 0:f7d5819b29d5 209 }