![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
APP2
main.cpp
- Committer:
- vinceP
- Date:
- 2017-09-16
- Revision:
- 1:b22fb16401a2
- Parent:
- 0:d2d3c494b28a
File content as of revision 1:b22fb16401a2:
#include "mbed.h" #include "rtos.h" DigitalIn en_1(p15); DigitalIn en_2(p16); AnalogIn ea_1(p19); AnalogIn ea_2(p20); DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); Serial pc(USBTX, USBRX); Thread* lecture_digital; Thread* affichge; Ticker timeThread; int32_t SIGNAL_THREAD_WAKE = 0x2; int conteur_ticker = 0; int derniere_lecture = 0; int derniere_lecture_digital[] = {0,0}; uint32_t donner_analog[5]; bool changement_digital = false; bool changement_digital_pin[] = {false,false}; float seuil_detection = 0.125 * 5 * 65535; typedef struct { int pin; char type; bool active; } message_t; MemoryPool<message_t, 16> mpool; Queue<message_t, 16> queue; void message_digital(int pin, bool act){ message_t *message = mpool.alloc(); message->pin = pin; message->type = 'd'; message->active = act; queue.put(message); } uint32_t calc_moyenne(){ uint32_t somme = donner_analog[0] + donner_analog[1] + donner_analog[2] + donner_analog[3] + donner_analog[4]; return somme; } void lecture_analog() { int* conteur = 0; if((*conteur % 5) == 0){ //led1 = 1; //pc.printf("Conteur = %d \n\r",*conteur); } else { //led1 = 0; } *conteur = *conteur + 1; /* while (true) { // synchronisation sur la période d'échantillonnage // lecture de l'étampe temporelle // lecture des échantillons analogiques // calcul de la nouvelle moyenne courante // génération éventuelle d'un événement }*/ } void changement_signal_digital(int pin, int lecture){ int index; if(pin == 15){ index = 0; } else { index = 1; } if((lecture != derniere_lecture_digital[index]) && !(changement_digital_pin[index])){ //pc.printf("First Lecture: %d last lect: %d changement: %s \n\r", lecture, derniere_lecture_digital[index], changement_digital_pin[index] ? "true" : "false"); changement_digital_pin[index] = true; } else { if((lecture == derniere_lecture_digital[index]) && (changement_digital_pin[index])){ bool etat; if(derniere_lecture_digital[index] == 1){ etat = true; } else { etat = false; } //pc.printf("Second Lecture: %d last lect: %d changement: %s \n\r", lecture, derniere_lecture_digital[index], changement_digital_pin[index] ? "true" : "false"); message_digital(pin,etat); } changement_digital_pin[index] = false; } derniere_lecture_digital[index] = lecture; } void lecture_num(/*void const *args*/) { //ajoute un délais de 50 ms pour la détection while (true) { Thread::signal_wait(SIGNAL_THREAD_WAKE); changement_signal_digital(15,en_1.read()); changement_signal_digital(16,en_2.read()); if((changement_digital_pin[0] == true)||(changement_digital_pin[1] == true)){ changement_digital = true; } else { changement_digital = false; } // synchronisation sur la période d'échantillonnage // lecture de l'étampe temporelle // lecture des échantillons numériques // prise en charge du phénomène de rebond // génération éventuelle d'un événement } } void format_digital_message(message_t *message, char *str){ char etat[30]; if(message->active == true){ sprintf(etat, "activer"); } else { sprintf(etat, "deactiver"); } sprintf(str, "La pin %d a ete %s .",message->pin,etat); } void collection(void/* const *args*/) { while (true) { // attente et lecture d'un événement // écriture de l'événement en sortie (port série) //Lire dans la queue osEvent evt = queue.get(); //si if (evt.status == osEventMessage) { char texte[250]; message_t *message = (message_t*)evt.value.p; if(message->type == 'd'){ format_digital_message(message,texte); } pc.printf("%s \n\r", texte); mpool.free(message); } } } void compteur(){ if((conteur_ticker % 5) == 0){ //lecture_analog(); } if(((conteur_ticker % 2) == 0) || (changement_digital)){ lecture_digital->signal_set(SIGNAL_THREAD_WAKE); } conteur_ticker +=1; } int main() { // initialisation du RTC // démarrage des tâches Thread digi; Thread aff; lecture_digital = &digi; affichge = &aff; aff.start(callback(collection)); digi.start(lecture_num); timeThread.attach(&compteur,0.05); while(1) { //compteur(); //wait(0.05); } }