APP2

Dependencies:   mbed-rtos mbed

Revision:
0:d2d3c494b28a
Child:
1:b22fb16401a2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Sep 15 21:30:49 2017 +0000
@@ -0,0 +1,162 @@
+#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};
+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);
+}
+
+int calc_moyenne(){
+    //uint32_t somme = donner_analog[0] + donner_analog[1] + donner_analog[2] + donner_analog[3] + donner_analog[4];
+}
+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);
+    }
+}