Kart+xxxxx // Radar_RTOS

Dependencies:   Radar_RTOS mbed

Fork of Radar_RTOS by Contest IOT GSE5

Revision:
3:422918db0559
Parent:
2:97cbf2a5ec78
--- 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