S5_mbed
/
APP2_projet
APP2
main.cpp@1:b22fb16401a2, 2017-09-16 (annotated)
- Committer:
- vinceP
- Date:
- Sat Sep 16 14:13:37 2017 +0000
- Revision:
- 1:b22fb16401a2
- Parent:
- 0:d2d3c494b28a
test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vinceP | 0:d2d3c494b28a | 1 | #include "mbed.h" |
vinceP | 0:d2d3c494b28a | 2 | #include "rtos.h" |
vinceP | 0:d2d3c494b28a | 3 | |
vinceP | 0:d2d3c494b28a | 4 | DigitalIn en_1(p15); |
vinceP | 0:d2d3c494b28a | 5 | DigitalIn en_2(p16); |
vinceP | 0:d2d3c494b28a | 6 | AnalogIn ea_1(p19); |
vinceP | 0:d2d3c494b28a | 7 | AnalogIn ea_2(p20); |
vinceP | 0:d2d3c494b28a | 8 | DigitalOut led1(LED1); |
vinceP | 0:d2d3c494b28a | 9 | DigitalOut led2(LED2); |
vinceP | 0:d2d3c494b28a | 10 | DigitalOut led3(LED3); |
vinceP | 0:d2d3c494b28a | 11 | Serial pc(USBTX, USBRX); |
vinceP | 0:d2d3c494b28a | 12 | |
vinceP | 0:d2d3c494b28a | 13 | Thread* lecture_digital; |
vinceP | 0:d2d3c494b28a | 14 | Thread* affichge; |
vinceP | 0:d2d3c494b28a | 15 | Ticker timeThread; |
vinceP | 0:d2d3c494b28a | 16 | |
vinceP | 0:d2d3c494b28a | 17 | int32_t SIGNAL_THREAD_WAKE = 0x2; |
vinceP | 0:d2d3c494b28a | 18 | |
vinceP | 0:d2d3c494b28a | 19 | int conteur_ticker = 0; |
vinceP | 0:d2d3c494b28a | 20 | int derniere_lecture = 0; |
vinceP | 1:b22fb16401a2 | 21 | |
vinceP | 0:d2d3c494b28a | 22 | int derniere_lecture_digital[] = {0,0}; |
vinceP | 1:b22fb16401a2 | 23 | uint32_t donner_analog[5]; |
vinceP | 0:d2d3c494b28a | 24 | bool changement_digital = false; |
vinceP | 0:d2d3c494b28a | 25 | bool changement_digital_pin[] = {false,false}; |
vinceP | 0:d2d3c494b28a | 26 | float seuil_detection = 0.125 * 5 * 65535; |
vinceP | 0:d2d3c494b28a | 27 | |
vinceP | 0:d2d3c494b28a | 28 | typedef struct { |
vinceP | 0:d2d3c494b28a | 29 | int pin; |
vinceP | 0:d2d3c494b28a | 30 | char type; |
vinceP | 0:d2d3c494b28a | 31 | bool active; |
vinceP | 0:d2d3c494b28a | 32 | } message_t; |
vinceP | 0:d2d3c494b28a | 33 | |
vinceP | 0:d2d3c494b28a | 34 | MemoryPool<message_t, 16> mpool; |
vinceP | 0:d2d3c494b28a | 35 | Queue<message_t, 16> queue; |
vinceP | 0:d2d3c494b28a | 36 | |
vinceP | 0:d2d3c494b28a | 37 | void message_digital(int pin, bool act){ |
vinceP | 0:d2d3c494b28a | 38 | message_t *message = mpool.alloc(); |
vinceP | 0:d2d3c494b28a | 39 | message->pin = pin; |
vinceP | 0:d2d3c494b28a | 40 | message->type = 'd'; |
vinceP | 0:d2d3c494b28a | 41 | message->active = act; |
vinceP | 0:d2d3c494b28a | 42 | queue.put(message); |
vinceP | 0:d2d3c494b28a | 43 | } |
vinceP | 0:d2d3c494b28a | 44 | |
vinceP | 1:b22fb16401a2 | 45 | uint32_t calc_moyenne(){ |
vinceP | 1:b22fb16401a2 | 46 | uint32_t somme = donner_analog[0] + donner_analog[1] + donner_analog[2] + donner_analog[3] + donner_analog[4]; |
vinceP | 1:b22fb16401a2 | 47 | return somme; |
vinceP | 0:d2d3c494b28a | 48 | } |
vinceP | 0:d2d3c494b28a | 49 | void lecture_analog() { |
vinceP | 0:d2d3c494b28a | 50 | int* conteur = 0; |
vinceP | 0:d2d3c494b28a | 51 | |
vinceP | 0:d2d3c494b28a | 52 | if((*conteur % 5) == 0){ |
vinceP | 0:d2d3c494b28a | 53 | //led1 = 1; |
vinceP | 0:d2d3c494b28a | 54 | //pc.printf("Conteur = %d \n\r",*conteur); |
vinceP | 0:d2d3c494b28a | 55 | } else { |
vinceP | 0:d2d3c494b28a | 56 | //led1 = 0; |
vinceP | 0:d2d3c494b28a | 57 | } |
vinceP | 0:d2d3c494b28a | 58 | *conteur = *conteur + 1; |
vinceP | 0:d2d3c494b28a | 59 | /* |
vinceP | 0:d2d3c494b28a | 60 | while (true) { |
vinceP | 0:d2d3c494b28a | 61 | // synchronisation sur la période d'échantillonnage |
vinceP | 0:d2d3c494b28a | 62 | // lecture de l'étampe temporelle |
vinceP | 0:d2d3c494b28a | 63 | // lecture des échantillons analogiques |
vinceP | 0:d2d3c494b28a | 64 | // calcul de la nouvelle moyenne courante |
vinceP | 0:d2d3c494b28a | 65 | // génération éventuelle d'un événement |
vinceP | 0:d2d3c494b28a | 66 | }*/ |
vinceP | 0:d2d3c494b28a | 67 | } |
vinceP | 0:d2d3c494b28a | 68 | void changement_signal_digital(int pin, int lecture){ |
vinceP | 0:d2d3c494b28a | 69 | int index; |
vinceP | 0:d2d3c494b28a | 70 | if(pin == 15){ |
vinceP | 0:d2d3c494b28a | 71 | index = 0; |
vinceP | 0:d2d3c494b28a | 72 | } else { |
vinceP | 0:d2d3c494b28a | 73 | index = 1; |
vinceP | 0:d2d3c494b28a | 74 | } |
vinceP | 0:d2d3c494b28a | 75 | if((lecture != derniere_lecture_digital[index]) && !(changement_digital_pin[index])){ |
vinceP | 0:d2d3c494b28a | 76 | //pc.printf("First Lecture: %d last lect: %d changement: %s \n\r", lecture, derniere_lecture_digital[index], changement_digital_pin[index] ? "true" : "false"); |
vinceP | 0:d2d3c494b28a | 77 | changement_digital_pin[index] = true; |
vinceP | 0:d2d3c494b28a | 78 | } else { |
vinceP | 0:d2d3c494b28a | 79 | if((lecture == derniere_lecture_digital[index]) && (changement_digital_pin[index])){ |
vinceP | 0:d2d3c494b28a | 80 | bool etat; |
vinceP | 0:d2d3c494b28a | 81 | if(derniere_lecture_digital[index] == 1){ |
vinceP | 0:d2d3c494b28a | 82 | etat = true; |
vinceP | 0:d2d3c494b28a | 83 | } else { |
vinceP | 0:d2d3c494b28a | 84 | etat = false; |
vinceP | 0:d2d3c494b28a | 85 | } |
vinceP | 0:d2d3c494b28a | 86 | //pc.printf("Second Lecture: %d last lect: %d changement: %s \n\r", lecture, derniere_lecture_digital[index], changement_digital_pin[index] ? "true" : "false"); |
vinceP | 0:d2d3c494b28a | 87 | message_digital(pin,etat); |
vinceP | 0:d2d3c494b28a | 88 | } |
vinceP | 0:d2d3c494b28a | 89 | changement_digital_pin[index] = false; |
vinceP | 0:d2d3c494b28a | 90 | } |
vinceP | 0:d2d3c494b28a | 91 | derniere_lecture_digital[index] = lecture; |
vinceP | 0:d2d3c494b28a | 92 | } |
vinceP | 0:d2d3c494b28a | 93 | void lecture_num(/*void const *args*/) { |
vinceP | 0:d2d3c494b28a | 94 | //ajoute un délais de 50 ms pour la détection |
vinceP | 0:d2d3c494b28a | 95 | while (true) { |
vinceP | 0:d2d3c494b28a | 96 | Thread::signal_wait(SIGNAL_THREAD_WAKE); |
vinceP | 0:d2d3c494b28a | 97 | changement_signal_digital(15,en_1.read()); |
vinceP | 0:d2d3c494b28a | 98 | changement_signal_digital(16,en_2.read()); |
vinceP | 0:d2d3c494b28a | 99 | if((changement_digital_pin[0] == true)||(changement_digital_pin[1] == true)){ |
vinceP | 0:d2d3c494b28a | 100 | changement_digital = true; |
vinceP | 0:d2d3c494b28a | 101 | } else { |
vinceP | 0:d2d3c494b28a | 102 | changement_digital = false; |
vinceP | 0:d2d3c494b28a | 103 | } |
vinceP | 0:d2d3c494b28a | 104 | // synchronisation sur la période d'échantillonnage |
vinceP | 0:d2d3c494b28a | 105 | // lecture de l'étampe temporelle |
vinceP | 0:d2d3c494b28a | 106 | // lecture des échantillons numériques |
vinceP | 0:d2d3c494b28a | 107 | // prise en charge du phénomène de rebond |
vinceP | 0:d2d3c494b28a | 108 | // génération éventuelle d'un événement |
vinceP | 0:d2d3c494b28a | 109 | } |
vinceP | 0:d2d3c494b28a | 110 | } |
vinceP | 0:d2d3c494b28a | 111 | void format_digital_message(message_t *message, char *str){ |
vinceP | 0:d2d3c494b28a | 112 | char etat[30]; |
vinceP | 0:d2d3c494b28a | 113 | if(message->active == true){ |
vinceP | 0:d2d3c494b28a | 114 | sprintf(etat, "activer"); |
vinceP | 0:d2d3c494b28a | 115 | } else { |
vinceP | 0:d2d3c494b28a | 116 | sprintf(etat, "deactiver"); |
vinceP | 0:d2d3c494b28a | 117 | } |
vinceP | 0:d2d3c494b28a | 118 | sprintf(str, "La pin %d a ete %s .",message->pin,etat); |
vinceP | 0:d2d3c494b28a | 119 | } |
vinceP | 0:d2d3c494b28a | 120 | void collection(void/* const *args*/) { |
vinceP | 0:d2d3c494b28a | 121 | while (true) { |
vinceP | 0:d2d3c494b28a | 122 | // attente et lecture d'un événement |
vinceP | 0:d2d3c494b28a | 123 | // écriture de l'événement en sortie (port série) |
vinceP | 0:d2d3c494b28a | 124 | |
vinceP | 0:d2d3c494b28a | 125 | //Lire dans la queue |
vinceP | 0:d2d3c494b28a | 126 | osEvent evt = queue.get(); |
vinceP | 0:d2d3c494b28a | 127 | //si |
vinceP | 0:d2d3c494b28a | 128 | if (evt.status == osEventMessage) { |
vinceP | 0:d2d3c494b28a | 129 | char texte[250]; |
vinceP | 0:d2d3c494b28a | 130 | message_t *message = (message_t*)evt.value.p; |
vinceP | 0:d2d3c494b28a | 131 | if(message->type == 'd'){ |
vinceP | 0:d2d3c494b28a | 132 | format_digital_message(message,texte); |
vinceP | 0:d2d3c494b28a | 133 | } |
vinceP | 0:d2d3c494b28a | 134 | pc.printf("%s \n\r", texte); |
vinceP | 0:d2d3c494b28a | 135 | mpool.free(message); |
vinceP | 0:d2d3c494b28a | 136 | } |
vinceP | 0:d2d3c494b28a | 137 | } |
vinceP | 0:d2d3c494b28a | 138 | } |
vinceP | 0:d2d3c494b28a | 139 | void compteur(){ |
vinceP | 0:d2d3c494b28a | 140 | if((conteur_ticker % 5) == 0){ |
vinceP | 0:d2d3c494b28a | 141 | //lecture_analog(); |
vinceP | 0:d2d3c494b28a | 142 | } |
vinceP | 0:d2d3c494b28a | 143 | if(((conteur_ticker % 2) == 0) || (changement_digital)){ |
vinceP | 0:d2d3c494b28a | 144 | lecture_digital->signal_set(SIGNAL_THREAD_WAKE); |
vinceP | 0:d2d3c494b28a | 145 | } |
vinceP | 0:d2d3c494b28a | 146 | conteur_ticker +=1; |
vinceP | 0:d2d3c494b28a | 147 | } |
vinceP | 0:d2d3c494b28a | 148 | int main() { |
vinceP | 0:d2d3c494b28a | 149 | // initialisation du RTC |
vinceP | 0:d2d3c494b28a | 150 | // démarrage des tâches |
vinceP | 0:d2d3c494b28a | 151 | Thread digi; |
vinceP | 0:d2d3c494b28a | 152 | Thread aff; |
vinceP | 0:d2d3c494b28a | 153 | |
vinceP | 0:d2d3c494b28a | 154 | lecture_digital = &digi; |
vinceP | 0:d2d3c494b28a | 155 | affichge = &aff; |
vinceP | 0:d2d3c494b28a | 156 | |
vinceP | 0:d2d3c494b28a | 157 | aff.start(callback(collection)); |
vinceP | 0:d2d3c494b28a | 158 | digi.start(lecture_num); |
vinceP | 0:d2d3c494b28a | 159 | |
vinceP | 0:d2d3c494b28a | 160 | timeThread.attach(&compteur,0.05); |
vinceP | 0:d2d3c494b28a | 161 | while(1) { |
vinceP | 0:d2d3c494b28a | 162 | //compteur(); |
vinceP | 0:d2d3c494b28a | 163 | //wait(0.05); |
vinceP | 0:d2d3c494b28a | 164 | } |
vinceP | 0:d2d3c494b28a | 165 | } |