Kart+xxxxx // Radar_RTOS

Dependencies:   Radar_RTOS mbed

Fork of Radar_RTOS by Contest IOT GSE5

Files at this revision

API Documentation at this revision

Comitter:
Alex_Hochart
Date:
Fri Jan 15 08:44:59 2016 +0000
Parent:
2:97cbf2a5ec78
Commit message:
Kart+xxxx

Changed in this revision

Radar_RTOS.lib Show annotated file Show diff for this revision Revisions of this file
UART_Radar.cpp Show annotated file Show diff for this revision Revisions of this file
buzzer.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 97cbf2a5ec78 -r 422918db0559 Radar_RTOS.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Radar_RTOS.lib	Fri Jan 15 08:44:59 2016 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/Contest-IOT-GSE5/code/Radar_RTOS/#97cbf2a5ec78
diff -r 97cbf2a5ec78 -r 422918db0559 UART_Radar.cpp
--- a/UART_Radar.cpp	Wed Dec 02 16:09:22 2015 +0000
+++ b/UART_Radar.cpp	Fri Jan 15 08:44:59 2016 +0000
@@ -2,7 +2,7 @@
 #include "mbed.h"
 #include <string.h>
 Serial carte(PA_9, PA_10); //emission --- tx, rx
-Serial pc(USBTX, USBRX); //reception --- tx, rx
+
 
 void USART1_puts(char *text){
     while(*text != '\0'){
@@ -20,7 +20,7 @@
     int somme=5;
     int i=0;
     msg_formated[0]=2;
-    printf("\n\r");
+    //pc.printf("\n\r");
     while(msg[i]!=0){
         somme= somme + msg[i];
         msg_formated[i+1]=msg[i];
@@ -35,11 +35,11 @@
     msg_formated[i+3]=0;
 
    //A supprimer
-    i=0;
+    /*i=0;
     while(msg_formated[i]!=0){
         printf("[%d] ", msg_formated[i]);
         i++;
-    }
+    }*/
 }
 
 
@@ -56,7 +56,7 @@
     Timer timeout;
     timeout.start();
     while(1){
-        if(timeout.read_ms() > 100) return 1;
+        if(timeout.read_ms() > 100) return 2;
         if(carte.readable()){
             r = carte.getc();
             
@@ -80,7 +80,6 @@
                         frame[I-1]=0;
                         return 0;
                     }else{ //Message invalidé par la somme
-                        frame[0]=0;
                         return 1;
                     }
                     
@@ -95,6 +94,6 @@
 }
 
 int controle(char *frame){
-    if (*frame!=6) return 0;
+    if (*frame == 6) return 0;
     else return 1;  
 }
\ No newline at end of file
diff -r 97cbf2a5ec78 -r 422918db0559 buzzer.h
--- a/buzzer.h	Wed Dec 02 16:09:22 2015 +0000
+++ b/buzzer.h	Fri Jan 15 08:44:59 2016 +0000
@@ -3,26 +3,32 @@
 
 #include "mbed.h"
 
-DigitalOut buzz(PB_8);
+//Instanciation du GPIO.
+DigitalOut buzz(PB_8);      //Sortie digital pour le buzzer.
 
+
+//Class Buzzer regroupant les diférents paramétres utile à la génération du signal du buzzer.
 class Buzzer{
     public :
+    
+    //Déclaration des atributs
+    int TsilenceMs;                                             //Variable temps de silence entre les bips. 
+    typedef enum {BipInit, BipUp, BipDown, Silent} defetat;     //Définie les état possible du buzzer
+    defetat etat;                                               //Variable d'état du buzzer
+    Timer t;                                                    //Timer
+    int i;                                                      //Nombre de pulsation par bip
+    
     Buzzer(){
         TsilenceMs=100;
         etat = BipInit;
         t.reset();
         i=0;
     }
-    int TsilenceMs;
-    
-    typedef enum {BipInit, BipUp, BipDown, Silent} defetat;
-    defetat etat;
-    Timer t;
-    int i;
-    
-    void changeMode(int value);
-    void run();
-};
+
+    //Déclaration des methodes
+    void changeMode(int value);         //Changement du nombre de bips en fonction de la distance
+    void run();                         //Lancement du buzzer
+};      
 
 /*
 Buzzer::Buzzer(){
@@ -55,7 +61,10 @@
  */
 
 
-//Modifie la valeur du temps de silence entre 2 bips en fonction de la distance
+//**********Modifie la valeur du temps de silence entre 2 bips en fonction de la distance.************//
+//
+//Variable value correspond à la distance mesurée en cm.
+//
 void Buzzer::changeMode(int value){
     if(value<=25){                      //0
         TsilenceMs=160;
diff -r 97cbf2a5ec78 -r 422918db0559 main.cpp
--- a/main.cpp	Wed Dec 02 16:09:22 2015 +0000
+++ b/main.cpp	Fri Jan 15 08:44:59 2016 +0000
@@ -6,26 +6,33 @@
 #define TRIG_1  PA_8
 #define ECHO_1  PC_7
 
-
-//DigitalOut buzz(PB_8);
-DigitalOut trig(TRIG_1);
+Serial pc(USBTX, USBRX); //reception --- tx, rx
 
-Ticker mesure_time;
-Ticker send_time;
-Timer distance_time;
-InterruptIn echo(ECHO_1);
+//Instanciation des GPIOs.
+DigitalOut trig(TRIG_1);            //Sortie digital pour le trigger.
+InterruptIn echo(ECHO_1);           //Entrée digital sur interuption pour l'écho.
+InterruptIn position(USER_BUTTON);    //Entrée digital sur interuption pour le levier de vitesse.
 
-Buzzer buzzo;
-Ticker bip;
+//Instanciation du Timer.
+Timer distance_time;            //Timer pour la mesure de distance.
+Ticker mesure_time;             //Timer (fixe) avec interruption pour l'acquisition de la distance.
+Ticker send_time;               //Timer (fixe) avec interruption pour l'envoie de la distance.
+Ticker bip;                     //Timer (fixe) avec interruption pour l'actualisation du buzzer.
 
-char trame[50];
-int essai, err;
-int distance, distance_brut;  
-char message[4];
-int i=0;
+//Instanciation des variables.
+Buzzer buzzo;
+int distance;
 
 
-//Envoie un burst
+/********************Fonction qui génére le burst pour la mesure de distance.****************************/
+//But : Générer un burst et reset le timer de sitance.
+//
+//Donnée :  Le timer distance_time est un timer global.  
+//          trig est un sortie digital. 
+//                   _____________
+// TRIG => ________/              \__....
+//          2 µs         10 µs       
+//   
 void send_burst(){ 
     distance_time.reset(); 
     trig = 0;
@@ -34,64 +41,141 @@
     wait_us(10);
     trig = 0;
 }
+/*******************************************************************************************************/
+
 
 
+
+/*******************************Fonction de minimum et maximum.*****************************************/
+//But : Renvoie le min et le max entre deux entier.
+//
 int max (int a, int b) {
   return (a<b)?b:a;
 }
-
 int min (int a, int b) {
   return (a<b)?a:b;
 }
+/********************************************************************************************************/
 
-//Lance le timer
+
+/******************Routine d'interruption sur front montant du signal echo.*****************************/
+//But : Lancer le timer.
+//
+//Donnée :  Le timer distance_time est un timer global.  
+//                  _....
+// ECHO => ....____/      Start timer.
+//                 ^      
+//
 void echo_rise(){ 
     distance_time.start(); 
 }
+/*********************************************************************************************************/
 
-//Génere la trame et l'envoie à UART
+
+
+/***************************Routine d'envoie de la distance via l'uart.***********************************/
+//But : Transformer la distance en chaine de caractéres.
+//      Envoier via la fonction send() et attendre un acquitement.
+//      Error si on recoie 3 non-acquitement succésif ou atteinte du timeout.
+//
+//Donnée :  L'entier distance est une variable global.
+//          La chaine message contient la distance sur 3 caractére + '\0'.        
+//          L'envoie est répété 3 fois quand il y a erreur. Si 3 erreurs, arret des émission.
+//          Il y a erreur si :  receive ne recoie pas d'acquitement dans un temps impartie.  
+//                              controle renvoie 0, qui corespond à une erreur de checksum.
 void transmit_data(){
+    
+    int essai, err;
+    char message[4];
+    char trame[2];
     message[0]=48+(distance/100)%10;
     message[1]=48+(distance/10)%10;
     message[2]=48+distance%10;
     message[3]=0;
         
     essai=0;
-    printf("%s\n\r",message);
     send(message);
     
-    err=receive(trame);
-  
-    while((controle(trame)==0 || err==1) && essai<3){
+    
+    pc.printf("%c%c%c\n\r",message[0],message[1],message[2]);
+    err=receive(trame);                       //Bug avec le nouvelle affichage
+    pc.printf("error%d\n\r",err);
+ 
+    while((controle(trame)==1 || err!=0) && essai < 3){
+        essai++;
+        if( essai >= 3) while(1);
         send(message);
         err=receive(trame);
-        essai++;
+        pc.printf("error%d\n\r",err);
+        
     }
 }
-
-//Stop le timer et récupére la distance en cm.
-void echo_fall(){ 
-    distance_time.stop(); 
-    distance_brut = distance_time.read_us() /29 / 2;
-    distance_brut = min(distance_brut,230);
-    distance = max(distance_brut,0);
-            //Mise à jour de l'intervale entre chaque bip
-    buzzo.changeMode(distance);
-}
+/**********************************************************************************************************/
 
 
 
 
+/*********************Routine d'interruption sur front descendant du signal echo.**************************/
+//But : Stoper le timer, récupérer la distance en cm
+//      et modifier le silence entre deux bip du buzzer
+//
+//Donnée :  Le timer distance_time est un timer global.
+//          L'entier distance est une variable global.
+//          Le buzzer buzzo est un objet global.    
+//                  _____________________________________
+// ECHO => ________/      Distant = Temps / 29/2         \__.... Stop timer.
+//                                                       ^
+//       
+void echo_fall(){ 
+    distance_time.stop();                               //Stop le timer.
+    
+    distance = distance_time.read_us() /29 / 2;    //Converti le temps (µs) en distance (cm).
+    distance = min(distance,230);             //Definie la valeur max de la distance à 230.
+    distance = max(distance,0);                    //Definie la valeur min de la distance à 0.
+            
+    buzzo.changeMode(distance);                         //Mise à jour de l'intervale entre chaque bip
+}
+/**********************************************************************************************************/
+
+/******************Routine d'interruption sur front montant du signal pos.*****************************/
+//But : Lancer les tâches.
+//                  
+//
+void position_rise(){ 
+       
+        echo.rise(NULL);                            //Routine NULL sur interruption de echo en front montant.
+        echo.fall(NULL);                            //Routine NULL sur interruption de echo en front descendant.
+        mesure_time.detach();                       //Stop la routine send_burst.
+        send_time.detach();                         //Stop la routine transmist_data.                              
+        bip.detach();                               //Stop la routine l'actualisation du buzzer.
+    
+}
+/*********************************************************************************************************/
+
+/******************Routine d'interruption sur front descendant du signal pos.*****************************/
+//But : Stop les tâches.
+//                  
+//
+void position_fall(){ 
+       
+        echo.rise(&echo_rise);                      //Routine echo_rise sur interruption de echo en front montant.
+        echo.fall(&echo_fall);                      //Routine echo_fall sur interruption de echo en front descendant.
+        mesure_time.attach(&send_burst, 0.5);       //Lance send_burst toutes les 500ms.
+        wait(0.1);                                  //Décalage entre send et transmit.
+        send_time.attach(&transmit_data, 0.5);      //Lance transmist_data toutes les 500ms.
+        wait(0.1);                                  //Décalage entre transmit et buzz.
+        bip.attach_us(&buzzo, &Buzzer::run, 400);   //Lance l'actualisation du buzzer toutes les 400µs ( F = 2.5 kHz ).
+    
+}
+/*********************************************************************************************************/
+
+
+
 int main() {
-   
-    echo.rise(&echo_rise);                      //Routine echo_rise sur interruption de echo en front montant.
-    echo.fall(&echo_fall);                      //Routine echo_fall sur interruption de echo en front descendant.
-    mesure_time.attach(&send_burst, 0.5);       //Lance send_burst toutes les 500ms.
-    wait(0.1);                                  //Décalage entre send et transmit.
-    send_time.attach(&transmit_data, 0.5);      //Lance transmist_data toutes les 500ms.
-    wait(0.1);                                  //Décalage entre transmit et buzz.
-    bip.attach_us(&buzzo, &Buzzer::run, 400);
-    
+
+        position.rise(&position_rise);                      //Routine position_rise sur interruption de position en front montant.
+        position.fall(&position_fall);                      //Routine position_fall sur interruption de position en front descendant.
+
     while(1);
 
 }
\ No newline at end of file