APP2

Dependencies:   mbed-rtos mbed

Committer:
vinceP
Date:
Sat Sep 16 14:13:37 2017 +0000
Revision:
1:b22fb16401a2
Parent:
0:d2d3c494b28a
test

Who changed what in which revision?

UserRevisionLine numberNew 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 }