gfdh

Dependencies:   mbed-rtos mbed

Committer:
RufflesAllD
Date:
Mon Jan 27 20:58:48 2014 +0000
Revision:
2:6009cb96f273
Parent:
1:96a4c2a39981
Child:
3:350e3a76ff72
Child:
4:6a242f5bc7fa
HEY

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