APP2

Dependencies:   mbed-rtos mbed

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?

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