gfdh

Dependencies:   mbed-rtos mbed

Committer:
RufflesAllD
Date:
Tue Jan 28 16:10:49 2014 +0000
Revision:
3:350e3a76ff72
Parent:
2:6009cb96f273
gv

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