IniSat Modèle 1 Version 2 TP 5 : Station Sol Exo 1 : Enregistrement GPS sur carte SD Exo 2 : Mise en place d'un protocole de communication avec la station sol

Dependencies:   mbed

Revision:
0:278eba15d90b
Child:
1:5fcc88ae8ad4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jul 07 11:39:10 2021 +0000
@@ -0,0 +1,197 @@
+/*******************************************************************************
+    Université de Montpellier
+    NemoSpace   IUT de Nîmes
+    IniSat Modèle 1 Version 2
+*******************************************************************************/
+//  La lecture du GPS utilise une liaison série software
+
+//      TP n°5 : Correction
+
+//  Exo 1 : Enregistrement des coordonnées GPS sur carte SD
+//  Exo 2 : Gestion de messages descendants (Supervision) et montants (Commande)
+//  Exo 3 : Tracer sur My Maps votre déplacement autour du batiment (Mission)
+
+#include "mbed.h"
+//#include "platform/mbed_thread.h"
+#include "SDFileSystem.h"
+
+#include "system.h"
+#include "user.h"
+#include "soft_uart.h"
+#include "gps.h"
+
+SDFileSystem sd(PB_5, PB_4, PB_3, PA_11, "sd"); // MOSI, MISO, SCK, CS -> SPI pins on the Inisat
+
+uint8_t etat, etat_mem;
+uint16_t compteur;
+float mes_accu;
+
+uint8_t xb_ptr;
+char xb_buf[10], cmd[3], param[10];
+
+void Rx_interrupt(void);
+
+int main()
+{
+    Init_System();
+    etat = 0;
+    Init_Soft_UART();
+//    thread_sleep_for(1000);
+    xb_ptr = 0;
+// Setup a serial interrupt function to receive data
+    xbee.attach(&Rx_interrupt, Serial::RxIrq);
+    __enable_irq();
+    
+    wait_ms(1000);
+
+    while (1) {
+//        thread_sleep_for(1);        // Boucle toutes les 1 milliseconde environ
+        wait_ms(1);
+        compteur++;
+        
+//      Gestion des modes avec une machine d'états
+        switch (etat) {
+/******************************************************************************/
+// Mode Init :      Mise sous tension
+//                  Initialisation du µC
+            case 0: {
+                Init_User_Fonctions();
+//                thread_sleep_for(1000);
+                wait_ms(1000);
+                Stop_Led();
+                GPS_Init();
+                Start_Led();
+                Set_Led(Ve);
+                
+//  Création d'un fichier "gps_data.txt" sur la carte SD    
+    FILE *fp = fopen("/sd/gps_data.txt", "w");
+    if(fp == NULL) {
+        error("Erreur : fichier non accessible en ecriture\n");
+    }
+    pc.printf("Fichier cree!\r\n");
+    xbee.printf("Liaison Sol\r\n");
+
+//  Write text in file    
+ //   fprintf(fp, "Hello World, greats from Inisat!");
+ //   pc.printf("Write some words in sdtest.txt on sd/mydir directory\r\n"); 
+        
+//  Close file    
+    fclose(fp); 
+//                thread_sleep_for(1000);
+                wait_ms(1000);
+                etat = 1;
+                break; }
+/******************************************************************************/
+//  Mode Gestion :  Gestion des actions
+//                  Contrôle du système
+            case 1:
+                mes_accu = Mes_Bat();
+                if(mes_accu < BAT_SEUIL_BAS_1) {
+                    etat = 4;
+                    Set_Led(Ro);
+                } else {
+                    etat = 2;
+                    Set_Led(Ve);
+                }
+//                thread_sleep_for(1000);
+                wait_ms(1000);
+                break;
+/******************************************************************************/
+//  Mode Mission :  Acquisition de données
+//                      Mesure Batterie
+//                      Mesure Courant faces solaires
+//                      Stockage
+            case 2: 
+                Lect_GPS();
+                GPS_Decodage();
+                Mes_SP();
+                Mes_Temp();
+                mes_accu = Mes_Bat();
+                if(mes_accu > BAT_SEUIL_HAUT_1)
+                {
+                    etat = 3;
+                    Set_Led(Ro_Ve);
+                }
+                else
+                {
+                    etat = 1;
+                }
+//                thread_sleep_for(1000);
+//                wait_ms(1000);
+                break;
+/******************************************************************************/
+//  Mode Radio :    Transmission de données
+//                  Mise en forme pour affichage
+            case 3:
+                Envoi_GPS();
+                Envoi_Mes_Bat();
+//                Envoi_Mes_SP();
+//                Envoi_Mes_Temp();
+                
+//                thread_sleep_for(1000);
+//                wait_ms(1000);
+                etat = 1;
+                break;
+/******************************************************************************/
+//  Mode Survie :   Attente recharge de l'accu
+
+            case 4:
+                mes_accu = Mes_Bat();
+                if(mes_accu < BAT_SEUIL_BAS_2) {
+                    etat = 5;
+                    Stop_User_Fonctions();
+                }
+
+                if(mes_accu > BAT_SEUIL_HAUT_1) {
+                    etat = 1;
+                    Set_Led(Ve);
+                }
+                break;
+/******************************************************************************/
+//  Mode Zombie :   Coupure des consommateurs
+//                  Passage en mode faible consommation
+//                  Diminution de la fréquence du CPU
+//                  Passage en mode Sleep
+            case 5:
+                sleep();
+                mes_accu = Mes_Bat();
+                if(mes_accu > BAT_SEUIL_HAUT_1)
+                    etat = 0;
+                break;
+/******************************************************************************/
+            default:
+                etat = 0;
+                break;
+/******************************************************************************/
+        }   // end switch
+/*        if(etat != etat_mem)            //  Debug des états
+        {
+            pc.printf("Etat_%d\r\n",etat);
+            etat_mem = etat;
+        }*/
+/******************************************************************************/
+    }   // end while
+}   // end main
+/******************************************************************************/
+void Rx_interrupt(void) {
+    if(xbee.readable())
+    {
+        xb_buf[xb_ptr] = xbee.getc();
+        
+        if((xb_buf[xb_ptr] == 0x0A) || (xb_buf[xb_ptr] == 0x0D))      // Test touche entrée en mode ASCII
+        {
+            xb_buf[xb_ptr] = 0;         // Transforme le tableau en chaine de caractères  
+            xb_ptr = 0;
+            if (xb_buf[0] == '$')        // Entete de message valide
+            {
+                cmd[0] = xb_buf[1];
+                xbee.printf("#%c\r\n",cmd[0]+0x20);       // Acquittement
+            }
+//                xb_ok = 1;                      // Trame disponible pour décodage
+//                pc.printf("%s\n\r",buffer);     // Echo  
+        }
+        else {
+            xb_ptr++;
+        }  
+    }
+}
\ No newline at end of file