UniverSpace 2022 / Mbed 2 deprecated IniSat_TP5

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*******************************************************************************
00002     Université de Montpellier
00003     NemoSpace   IUT de Nîmes
00004     IniSat Modèle 1 Version 2
00005 *******************************************************************************/
00006 //  La lecture du GPS utilise une liaison série software
00007 
00008 //      TP n°5 : Correction
00009 
00010 //  Exo 1 : Enregistrement des coordonnées GPS sur carte SD
00011 //  Exo 2 : Gestion de messages descendants (Supervision) et montants (Commande)
00012 //  Exo 3 : Tracer sur My Maps votre déplacement autour du batiment (Mission)
00013 
00014 #include "mbed.h"
00015 //#include "platform/mbed_thread.h"
00016 #include "SDFileSystem.h"
00017 
00018 #include "system.h"
00019 #include "user.h"
00020 #include "soft_uart.h"
00021 #include "gps.h"
00022 
00023 SDFileSystem sd(PB_5, PB_4, PB_3, PA_11, "sd"); // MOSI, MISO, SCK, CS -> SPI pins on the Inisat
00024 
00025 uint8_t etat, etat_mem;
00026 uint16_t compteur;
00027 float mes_accu;
00028 
00029 uint8_t xb_ptr;
00030 char xb_buf[10], cmd[3], param[10];
00031 
00032 void Rx_interrupt(void);
00033 
00034 int main()
00035 {
00036     Init_System();
00037     etat = 0;
00038     Init_Soft_UART();
00039 //    thread_sleep_for(1000);
00040     xb_ptr = 0;
00041     cmd[0] = 'P';           // Controle montant par PC
00042 // Setup a serial interrupt function to receive data
00043     xbee.attach(&Rx_interrupt, Serial::RxIrq);
00044     __enable_irq();
00045     
00046     wait_ms(1000);
00047 
00048     while (1) {
00049 //        thread_sleep_for(1);        // Boucle toutes les 1 milliseconde environ
00050         wait_ms(1);
00051         compteur++;
00052         
00053 //      Gestion des modes avec une machine d'états
00054         switch (etat) {
00055 /******************************************************************************/
00056 // Mode Init :      Mise sous tension
00057 //                  Initialisation du µC
00058             case 0: {
00059                 Init_User_Fonctions();
00060 //                thread_sleep_for(1000);
00061                 wait_ms(1000);
00062                 Stop_Led();
00063                 GPS_Init();
00064                 Start_Led();
00065                 Set_Led(Ve);
00066                 
00067 //  Création d'un fichier "gps_data.txt" sur la carte SD    
00068     FILE *fp = fopen("/sd/gps_data.txt", "w");
00069     if(fp == NULL) {
00070         error("Erreur : fichier non accessible en ecriture\n");
00071     }
00072     pc.printf("Carte SD Ok!\r\n");
00073     xbee.printf("Station Sol par XBee Ok!\r\n");
00074 
00075 //  Write text in file    
00076  //   fprintf(fp, "Hello World, greats from Inisat!");
00077  //   pc.printf("Write some words in sdtest.txt on sd/mydir directory\r\n"); 
00078         
00079 //  Close file    
00080     fclose(fp); 
00081 //                thread_sleep_for(1000);
00082                 wait_ms(1000);
00083                 etat = 1;
00084                 break; }
00085 /******************************************************************************/
00086 //  Mode Gestion :  Gestion des actions
00087 //                  Contrôle du système
00088             case 1:
00089                 mes_accu = Mes_Bat();
00090                 if(mes_accu < BAT_SEUIL_BAS_1) {
00091                     etat = 4;
00092                     Set_Led(Ro);
00093                 } else {
00094                     etat = 2;
00095                     Set_Led(Ve);
00096                 }
00097 //                thread_sleep_for(1000);
00098                 wait_ms(1000);
00099                 break;
00100 /******************************************************************************/
00101 //  Mode Mission :  Acquisition de données
00102 //                      Mesure Batterie
00103 //                      Mesure Courant faces solaires
00104 //                      Stockage
00105             case 2: 
00106                 Lect_GPS();
00107                 GPS_Decodage();
00108                 Mes_SP();
00109                 Mes_Temp();
00110                 mes_accu = Mes_Bat();
00111                 if(mes_accu > BAT_SEUIL_HAUT_1)
00112                 {
00113                     etat = 3;
00114                     Set_Led(Ro_Ve);
00115                 }
00116                 else
00117                 {
00118                     etat = 1;
00119                 }
00120 //                thread_sleep_for(1000);
00121 //                wait_ms(1000);
00122                 break;
00123 /******************************************************************************/
00124 //  Mode Radio :    Transmission de données
00125 //                  Mise en forme pour affichage
00126             case 3:
00127                 switch (cmd[0]) {     // Commn
00128                     case 'P': {         // Commande montante filaire
00129                         Envoi_GPS();
00130                         Envoi_Mes_Bat();
00131 //                      Envoi_Mes_SP();
00132                         Envoi_Mes_Temp();
00133                         break; }
00134                     case 'X':           // Commande montante sans fil par XBee
00135                         XBee_Envoi_GPS();
00136                         XBee_Envoi_Mes_Bat();
00137 //                        XBee_Envoi_Mes_SP();
00138                         XBee_Envoi_Mes_Temp();
00139                         break;
00140                     default:
00141                         cmd[0] = 'P';
00142                         break;
00143                 }
00144                 etat = 1;
00145                 break;
00146 /******************************************************************************/
00147 //  Mode Survie :   Attente recharge de l'accu
00148 
00149             case 4:
00150                 mes_accu = Mes_Bat();
00151                 if(mes_accu < BAT_SEUIL_BAS_2) {
00152                     etat = 5;
00153                     Stop_User_Fonctions();
00154                 }
00155 
00156                 if(mes_accu > BAT_SEUIL_HAUT_1) {
00157                     etat = 1;
00158                     Set_Led(Ve);
00159                 }
00160                 break;
00161 /******************************************************************************/
00162 //  Mode Zombie :   Coupure des consommateurs
00163 //                  Passage en mode faible consommation
00164 //                  Diminution de la fréquence du CPU
00165 //                  Passage en mode Sleep
00166             case 5:
00167                 sleep();
00168                 mes_accu = Mes_Bat();
00169                 if(mes_accu > BAT_SEUIL_HAUT_1)
00170                     etat = 0;
00171                 break;
00172 /******************************************************************************/
00173             default:
00174                 etat = 0;
00175                 break;
00176 /******************************************************************************/
00177         }   // end switch
00178 /*        if(etat != etat_mem)            //  Debug des états
00179         {
00180             pc.printf("Etat_%d\r\n",etat);
00181             etat_mem = etat;
00182         }*/
00183 /******************************************************************************/
00184     }   // end while
00185 }   // end main
00186 /******************************************************************************/
00187 void Rx_interrupt(void) {
00188     if(xbee.readable())
00189     {
00190         xb_buf[xb_ptr] = xbee.getc();
00191         
00192         if((xb_buf[xb_ptr] == 0x0A) || (xb_buf[xb_ptr] == 0x0D))      // Test touche entrée en mode ASCII
00193         {
00194             xb_buf[xb_ptr] = 0;         // Transforme le tableau en chaine de caractères  
00195             xb_ptr = 0;
00196             if (xb_buf[0] == '$')        // Entete de message valide
00197             {
00198                 cmd[0] = xb_buf[1];
00199                 xbee.printf("#%c\r\n",cmd[0]+0x20);       // Acquittement
00200                 param[0] = xb_buf[2];
00201             }
00202 //                xb_ok = 1;                      // Trame disponible pour décodage
00203 //                pc.printf("%s\n\r",buffer);     // Echo  
00204         }
00205         else {
00206             xb_ptr++;
00207         }  
00208     }
00209 }