S5info_H14
/
APP2
gfdh
main.cpp@3:350e3a76ff72, 2014-01-28 (annotated)
- Committer:
- RufflesAllD
- Date:
- Tue Jan 28 16:10:49 2014 +0000
- Revision:
- 3:350e3a76ff72
- Parent:
- 2:6009cb96f273
gv
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 | 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 | } |