App S5 / Mbed 2 deprecated S05APP2

Dependencies:   mbed mbed-rtos

main.cpp

Committer:
benjaminroy
Date:
2017-01-27
Revision:
6:6da143aff561
Parent:
5:79b5773e6764
Child:
7:e9f5280d47b3

File content as of revision 6:6da143aff561:

#include "mbed.h"
#include "rtos.h"

Ticker ticker;
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);
DigitalOut led4(LED4);
Thread *t1;
Thread *t2;
Thread *t3;

uint8_t compteur = 0;
bool verifierSiStable = false;
float echantillons1[5];
float echantillons2[5];
float seuil = 0.125;

// -------------------------------------------------------
// -------------------------------------------------------

void lecture_analog(void const *args) {
    int i = 0;
    float moyenne_passee1 = -1;
    float moyenne_passee2 = -1;
        
    while (true) {        
        // Synchronisation sur la période d'échantillonnage
        Thread::signal_wait(0x1);
        
        // Lecture des échantillons analogiques
        float entreeanal_1 = ea_1.read();
        float entreeanal_2 = ea_2.read();
        
        echantillons1[i] = entreeanal_1;
        echantillons2[i] = entreeanal_2;
        
        i++;
        if (i == 5) {
            // Calcul de la moyenne courante du signal (calculée sur  5 échantillons successifs)
            float moyenne_courante1 = (echantillons1[0] + echantillons1[1] + echantillons1[2] + echantillons1[3] + echantillons1[4]) / 5;
            float moyenne_courante2 = (echantillons2[0] + echantillons2[1] + echantillons2[2] + echantillons2[3] + echantillons2[4]) / 5;
            //printf("moyenne courante = %f, moyenne passee = %f, variation = %f\n", moyenne_courante1, moyenne_passee1,  std::abs(1 - (moyenne_courante1 / moyenne_passee1)));
            
            if (moyenne_passee1 != -1) {
                if ((std::abs(1 - (moyenne_courante1 / moyenne_passee1))) > seuil) {
                    // Génération éventuelle d'un événement
                    printf("La variation de la moyenne 1 depasse le seuil fixe\n");
                
                }
            }
            if (moyenne_passee2 != -1) {
                if ((std::abs(1 - (moyenne_courante2 / moyenne_passee2))) > seuil) {
                    // Génération éventuelle d'un événement
                    printf("La variation de la moyenne 2 depasse le seuil fixe\n");
                
                }
            }
            
            moyenne_passee1 = moyenne_courante1;
            moyenne_passee2 = moyenne_courante2;
            i = 0;
        }
    }
}

void lecture_num(void const *args) {    
    while (true) {
        // Synchronisation sur la période d'échantillonnage
        Thread::signal_wait(0x1);
                
        // Lecture des échantillons numériques
        uint8_t entreenum_1 = en_1.read();
        uint8_t entreenum_2 = en_2.read();
        //printf("Valeur de entree numerique 1: %d\n", entreenum_1);
        //printf("Valeur de entree numerique 2: %d\n", entreenum_2);
        
        // Lecture de l'étampe temporelle
        time_t t = std::time(NULL);
        
        // Prise en charge du phénomène de rebond
        if (en_1 || en_2) {
            verifierSiStable = true;
            Thread::signal_wait(0x2);
            
            if (en_1 == 1 && entreenum_1 == en_1.read()) {
                printf("Entree numerique 1 est stable\n");
                // Génération d'un évènement...
                
            } else {
                // Entree numerique 1 n'est pas stable
                Thread::yield();
            }
            if (en_2 == 1 && entreenum_2 == en_2.read()) {
                printf("Entree numerique 2 est stable\n");
                // Génération d'un évènement...
                
            } else {
                // Entre numerique 2 n'est pas stable
                Thread::yield();
            } 
        } 
        else {
            Thread::yield();
        } 
    }
}

void collection(void const *args) {
    while (true) {
        // attente et lecture d'un événement
        // écriture de l'événement en sortie (port série)
    }
}

void alarm() {
    compteur++;
    
    if (verifierSiStable) {
        t1->signal_set(0x2);
        verifierSiStable = false;
    }
    
    if (compteur % 2 == 0) {
        // Entrées numériques échantillionnées à tous les 100 ms
        t1->signal_set(0x1);
    } else if (compteur % 5 == 0) {
        // Entrées analogiques échantillonnées à tous les 250 ms
        t2->signal_set(0x1);
    }
    
    if (compteur % 10 == 0) {
        compteur = 0;
    }
}

int main() {
    // Démarrage des tâches
    printf("Demarrage des taches...\n");

    Thread t_lectureNum(lecture_num);
    Thread t_lectureAnalog(lecture_analog);
    Thread t_collection(collection);
    
    t1 = &t_lectureNum;
    t2 = &t_lectureAnalog;
    t3 = &t_collection;
    
    // Initialisation du RTC
    //ticker.attach(&alarm, 2);
    ticker.attach(&alarm, 0.05);

    while(1) {}
}