Philippe Fontaine
/
rtos_basic
tiens nic
Fork of rtos_basic by
main.cpp@11:fe7d53172c00, 2017-01-29 (annotated)
- Committer:
- philfontaine
- Date:
- Sun Jan 29 23:06:46 2017 +0000
- Revision:
- 11:fe7d53172c00
- Parent:
- 10:dc33cd3f4eb9
ok
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
emilmont | 1:491820ee784d | 1 | #include "mbed.h" |
philfontaine | 11:fe7d53172c00 | 2 | #include "rtos.h" |
philfontaine | 11:fe7d53172c00 | 3 | #include "AnalogBuffer.h" |
philfontaine | 11:fe7d53172c00 | 4 | |
philfontaine | 11:fe7d53172c00 | 5 | const int SEUIL_ANALOG = 0x2000; |
philfontaine | 11:fe7d53172c00 | 6 | DigitalIn en_1(p15); |
philfontaine | 11:fe7d53172c00 | 7 | DigitalIn en_2(p16); |
philfontaine | 11:fe7d53172c00 | 8 | AnalogIn ea_1(p19); |
philfontaine | 11:fe7d53172c00 | 9 | AnalogIn ea_2(p20); |
philfontaine | 11:fe7d53172c00 | 10 | bool digital_1; |
philfontaine | 11:fe7d53172c00 | 11 | bool digital_2; |
philfontaine | 11:fe7d53172c00 | 12 | AnalogBuffer ab_1; |
philfontaine | 11:fe7d53172c00 | 13 | AnalogBuffer ab_2; |
philfontaine | 11:fe7d53172c00 | 14 | |
philfontaine | 11:fe7d53172c00 | 15 | typedef struct { |
philfontaine | 11:fe7d53172c00 | 16 | bool isAnalog; |
philfontaine | 11:fe7d53172c00 | 17 | bool digital; |
philfontaine | 11:fe7d53172c00 | 18 | unsigned short analog; |
philfontaine | 11:fe7d53172c00 | 19 | time_t rtc_time; |
philfontaine | 11:fe7d53172c00 | 20 | } mail_t; |
philfontaine | 11:fe7d53172c00 | 21 | |
philfontaine | 11:fe7d53172c00 | 22 | Mail<mail_t, 16> mail_box; |
philfontaine | 11:fe7d53172c00 | 23 | |
philfontaine | 11:fe7d53172c00 | 24 | void lecture_analog(void const *args) { |
philfontaine | 11:fe7d53172c00 | 25 | Timer timer; |
philfontaine | 11:fe7d53172c00 | 26 | unsigned short old_average_1 = 0; |
philfontaine | 11:fe7d53172c00 | 27 | unsigned short old_average_2 = 0; |
emilmont | 1:491820ee784d | 28 | while (true) { |
philfontaine | 11:fe7d53172c00 | 29 | timer.start(); // synchronisation sur la période d'échantillonnage |
philfontaine | 11:fe7d53172c00 | 30 | time_t rtc_time = time(NULL); // lecture de l'étampe temporelle |
philfontaine | 11:fe7d53172c00 | 31 | ab_1.put(ea_1.read_u16()); // lecture des échantillons analogiques |
philfontaine | 11:fe7d53172c00 | 32 | ab_2.put(ea_2.read_u16()); |
philfontaine | 11:fe7d53172c00 | 33 | unsigned short new_average_1 = ab_1.average(); // calcul de la nouvelle moyenne courante |
philfontaine | 11:fe7d53172c00 | 34 | unsigned short new_average_2 = ab_2.average(); |
philfontaine | 11:fe7d53172c00 | 35 | int diff_1 = abs(new_average_1 - old_average_1); |
philfontaine | 11:fe7d53172c00 | 36 | int diff_2 = abs(new_average_2 - old_average_2); |
philfontaine | 11:fe7d53172c00 | 37 | if (diff_1 > SEUIL_ANALOG) { |
philfontaine | 11:fe7d53172c00 | 38 | mail_t* mail = mail_box.alloc(); |
philfontaine | 11:fe7d53172c00 | 39 | mail->isAnalog = true; |
philfontaine | 11:fe7d53172c00 | 40 | mail->analog = new_average_1; |
philfontaine | 11:fe7d53172c00 | 41 | mail->rtc_time = rtc_time; |
philfontaine | 11:fe7d53172c00 | 42 | mail_box.put(mail); |
philfontaine | 11:fe7d53172c00 | 43 | } |
philfontaine | 11:fe7d53172c00 | 44 | if (diff_2 > SEUIL_ANALOG) { |
philfontaine | 11:fe7d53172c00 | 45 | mail_t* mail = mail_box.alloc(); |
philfontaine | 11:fe7d53172c00 | 46 | mail->isAnalog = true; |
philfontaine | 11:fe7d53172c00 | 47 | mail->analog = new_average_1; |
philfontaine | 11:fe7d53172c00 | 48 | mail->rtc_time = rtc_time; |
philfontaine | 11:fe7d53172c00 | 49 | mail_box.put(mail); |
philfontaine | 11:fe7d53172c00 | 50 | } |
philfontaine | 11:fe7d53172c00 | 51 | old_average_1 = new_average_1; |
philfontaine | 11:fe7d53172c00 | 52 | old_average_2 = new_average_2; |
philfontaine | 11:fe7d53172c00 | 53 | Thread::wait(250 - timer.read_ms()); |
philfontaine | 11:fe7d53172c00 | 54 | timer.stop(); |
philfontaine | 11:fe7d53172c00 | 55 | timer.reset(); // Necessaire?? |
emilmont | 1:491820ee784d | 56 | } |
emilmont | 1:491820ee784d | 57 | } |
philfontaine | 11:fe7d53172c00 | 58 | void lecture_num(void const *args) { |
philfontaine | 11:fe7d53172c00 | 59 | Timer timer; |
emilmont | 1:491820ee784d | 60 | while (true) { |
philfontaine | 11:fe7d53172c00 | 61 | timer.start(); // synchronisation sur la période d'échantillonnage |
philfontaine | 11:fe7d53172c00 | 62 | time_t rtc_time = time(NULL); // lecture de l'étampe temporelle |
philfontaine | 11:fe7d53172c00 | 63 | bool new_digital_1 = en_1.read(); // lecture des échantillons numériques |
philfontaine | 11:fe7d53172c00 | 64 | bool new_digital_2 = en_2.read(); // lecture des échantillons numériques |
philfontaine | 11:fe7d53172c00 | 65 | |
philfontaine | 11:fe7d53172c00 | 66 | if ((new_digital_1 != digital_1) || (new_digital_2 != digital_2)) { |
philfontaine | 11:fe7d53172c00 | 67 | // prise en charge du phénomène de rebond |
philfontaine | 11:fe7d53172c00 | 68 | Thread::wait(50); |
philfontaine | 11:fe7d53172c00 | 69 | if (new_digital_1 != digital_1) { |
philfontaine | 11:fe7d53172c00 | 70 | new_digital_1 = en_1.read(); |
philfontaine | 11:fe7d53172c00 | 71 | if (new_digital_1 != digital_1) { |
philfontaine | 11:fe7d53172c00 | 72 | // génération éventuelle d'un événement |
philfontaine | 11:fe7d53172c00 | 73 | mail_t* mail = mail_box.alloc(); |
philfontaine | 11:fe7d53172c00 | 74 | mail->isAnalog = false; |
philfontaine | 11:fe7d53172c00 | 75 | mail->digital = new_digital_1; |
philfontaine | 11:fe7d53172c00 | 76 | mail->rtc_time = rtc_time; |
philfontaine | 11:fe7d53172c00 | 77 | mail_box.put(mail); |
philfontaine | 11:fe7d53172c00 | 78 | digital_1 = new_digital_1; |
philfontaine | 11:fe7d53172c00 | 79 | } |
philfontaine | 11:fe7d53172c00 | 80 | } |
philfontaine | 11:fe7d53172c00 | 81 | if (new_digital_2 != digital_2) { |
philfontaine | 11:fe7d53172c00 | 82 | new_digital_2 = en_2.read(); |
philfontaine | 11:fe7d53172c00 | 83 | if (new_digital_2 != digital_2) { |
philfontaine | 11:fe7d53172c00 | 84 | // génération éventuelle d'un événement |
philfontaine | 11:fe7d53172c00 | 85 | mail_t* mail = mail_box.alloc(); |
philfontaine | 11:fe7d53172c00 | 86 | mail->isAnalog = false; |
philfontaine | 11:fe7d53172c00 | 87 | mail->digital = new_digital_2; |
philfontaine | 11:fe7d53172c00 | 88 | mail->rtc_time = rtc_time; |
philfontaine | 11:fe7d53172c00 | 89 | mail_box.put(mail); |
philfontaine | 11:fe7d53172c00 | 90 | digital_2 = new_digital_2; |
philfontaine | 11:fe7d53172c00 | 91 | } |
philfontaine | 11:fe7d53172c00 | 92 | } |
philfontaine | 11:fe7d53172c00 | 93 | } |
philfontaine | 11:fe7d53172c00 | 94 | Thread::wait(100 - timer.read_ms()); |
philfontaine | 11:fe7d53172c00 | 95 | timer.stop(); |
philfontaine | 11:fe7d53172c00 | 96 | timer.reset(); // Necessaire?? |
emilmont | 1:491820ee784d | 97 | } |
emilmont | 1:491820ee784d | 98 | } |
philfontaine | 11:fe7d53172c00 | 99 | |
philfontaine | 11:fe7d53172c00 | 100 | void collection(void const *args) { |
philfontaine | 11:fe7d53172c00 | 101 | while (true) { |
philfontaine | 11:fe7d53172c00 | 102 | // attente et lecture d'un événement |
philfontaine | 11:fe7d53172c00 | 103 | // écriture de l'événement en sortie (port série) |
philfontaine | 11:fe7d53172c00 | 104 | osEvent evt = mail_box.get(); |
philfontaine | 11:fe7d53172c00 | 105 | if (evt.status == osEventMail) { |
philfontaine | 11:fe7d53172c00 | 106 | mail_t *mail = (mail_t*)evt.value.p; |
philfontaine | 11:fe7d53172c00 | 107 | if(mail->isAnalog) { |
philfontaine | 11:fe7d53172c00 | 108 | pc.printf("%s Analog: %X", ctime(&mail->rtc_time), mail->analog); |
philfontaine | 11:fe7d53172c00 | 109 | } else { |
philfontaine | 11:fe7d53172c00 | 110 | pc.printf("%s Digital: %d", ctime(&mail->rtc_time), mail->digital); |
philfontaine | 11:fe7d53172c00 | 111 | } |
philfontaine | 11:fe7d53172c00 | 112 | mail_box.free(mail); |
philfontaine | 11:fe7d53172c00 | 113 | } |
philfontaine | 11:fe7d53172c00 | 114 | } |
philfontaine | 11:fe7d53172c00 | 115 | } |
philfontaine | 11:fe7d53172c00 | 116 | |
philfontaine | 11:fe7d53172c00 | 117 | int main() { |
philfontaine | 11:fe7d53172c00 | 118 | // initialisation du RTC |
philfontaine | 11:fe7d53172c00 | 119 | // démarrage des tâches |
philfontaine | 11:fe7d53172c00 | 120 | while(1) { |
philfontaine | 11:fe7d53172c00 | 121 | } |
philfontaine | 11:fe7d53172c00 | 122 | } |