S5info_H14
/
APP2
gfdh
main.cpp@2:6009cb96f273, 2014-01-27 (annotated)
- 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?
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 | 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 | } |