S5info_H14
/
APP2
gfdh
main.cpp@4:6a242f5bc7fa, 2014-01-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |