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