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

main.cpp

Committer:
Giamarchi
Date:
2022-05-31
Revision:
1:5fcc88ae8ad4
Parent:
0:278eba15d90b

File content as of revision 1:5fcc88ae8ad4:

/*******************************************************************************
    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;
    cmd[0] = 'P';           // Controle montant par PC
// 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("Carte SD Ok!\r\n");
    xbee.printf("Station Sol par XBee Ok!\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:
                switch (cmd[0]) {     // Commn
                    case 'P': {         // Commande montante filaire
                        Envoi_GPS();
                        Envoi_Mes_Bat();
//                      Envoi_Mes_SP();
                        Envoi_Mes_Temp();
                        break; }
                    case 'X':           // Commande montante sans fil par XBee
                        XBee_Envoi_GPS();
                        XBee_Envoi_Mes_Bat();
//                        XBee_Envoi_Mes_SP();
                        XBee_Envoi_Mes_Temp();
                        break;
                    default:
                        cmd[0] = 'P';
                        break;
                }
                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
                param[0] = xb_buf[2];
            }
//                xb_ok = 1;                      // Trame disponible pour décodage
//                pc.printf("%s\n\r",buffer);     // Echo  
        }
        else {
            xb_ptr++;
        }  
    }
}