UniverSpace 2022 / Mbed 2 deprecated IniSat_TP5

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers gps.h Source File

gps.h

00001 /*  L80 QUECTEL GPS Module
00002 *   NMEA 0183 messages
00003 */
00004 #include "mbed.h"
00005 #include <math.h>
00006 // Commandes pour paramétrer le taux par seconde depuis chaque seconde (1 Hz) jusqu'à 10 fois par seconde (10Hz)
00007 #define PMTK_SET_NMEA_UPDATE_1HZ  "$PMTK220,1000*1F"
00008 #define PMTK_SET_NMEA_UPDATE_5HZ  "$PMTK220,200*2C"
00009 #define PMTK_SET_NMEA_UPDATE_10HZ "$PMTK220,100*2F"
00010 
00011 // Code pour sélection de trame unique
00012 #define TRAME_RMC   "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"
00013 #define TRAME_GGA   "$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"
00014 #define TRAME_RMC_GGA "$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28"
00015 #define TRAME_ALL   "$PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28"
00016 
00017 #define Trame_TXT_On "$PQTXT,W,1,1*22"
00018 #define Trame_TXT_Off "$PQTXT,W,0,1*23"
00019 
00020 //  Selection de trames
00021 void Select_Trame(char* trame) {
00022     printStr((char*) trame);
00023     printStr((char*)"\r\n");  
00024     }
00025 
00026 //  Lecture des trames NMEA du GPS
00027 
00028 char buffer[100];
00029 uint8_t rx_ptr = 0;
00030 uint8_t rx_ok = 0;
00031 
00032 void Lect_GPS(void) {
00033     
00034     while(!rx_ok) {
00035     
00036         if (kbhit()) {
00037             buffer[rx_ptr] = _getchar();
00038             
00039             if((buffer[rx_ptr] == 0x0A) || (buffer[rx_ptr] == 0x0D))      // Test touche entrée en mode ASCII
00040             {
00041                 buffer[rx_ptr] = 0;         // Transforme le tableau en chaine de caractères  
00042                 rx_ptr = 0;
00043                 rx_ok = 1;                      // Trame disponible pour décodage
00044 //                pc.printf("%s\n\r",buffer);     // Echo  
00045             }
00046             else {
00047                 rx_ptr++;
00048             }   
00049         }
00050     }
00051     rx_ok = 0;
00052 }
00053 
00054 void GPS_Init(void) {                   // Bloquer les tickers pour envoyer une commande
00055     rx_ok = 0;
00056     Select_Trame((char*)Trame_TXT_Off);
00057     Select_Trame((char*)TRAME_GGA);
00058 }
00059 
00060 struct gps {
00061     char *trame;                // $GPGGA
00062     char *horaire;              // 143512.000
00063     char *lat;
00064     char *ns;
00065     char *longi;
00066     char *ew;
00067     char *fix;               // 0 ou V -> pas de Fix         >1 ou A -> Fix
00068     char *nb_sat;
00069     char *prec;
00070     char *alt;
00071     float latitude;
00072     float longitude;
00073     uint16_t altitude;
00074     char fixe;
00075 } gps;
00076 
00077 //  Décodage Trame NMEA GGA
00078 void GPS_Decodage (void) {
00079 
00080     if(buffer[0] == '$' && buffer[5] == 'A') {
00081 //        pc.printf("GPS: %s\n\r",buffer);     // Echo  
00082         
00083         gps.trame = strtok(buffer, ",");
00084         gps.horaire = strtok(NULL, ",");
00085         
00086         gps.lat = strtok(NULL, ",");
00087         gps.latitude = atof(gps.lat);             
00088         gps.ns = strtok(NULL, ",");
00089 //        if(gps.ns == "S")   {
00090 //            gps.latitude  *= -1.0;
00091 //        }
00092         gps.longi = strtok(NULL, ",");
00093         gps.longitude = atof(gps.longi);        
00094         gps.ew = strtok(NULL, ",");
00095 //        if(gps.ew == "W")   {
00096 //            gps.longitude *= -1.0;
00097 //        }
00098         gps.fix = strtok(NULL, ",");
00099         gps.fixe = atoi(gps.fix);
00100         
00101         gps.nb_sat = strtok(NULL, ",");
00102         gps.prec = strtok(NULL, ",");
00103         gps.alt = strtok(NULL, ",");
00104         gps.altitude = atoi(gps.alt);
00105 
00106         if(gps.fixe) {
00107 //  Conversion en degrée et minute pour Google Maps    
00108             float degrees = floor(gps.latitude / 100.0f);
00109             float minutes = gps.latitude - (degrees * 100.0f);
00110             gps.latitude = degrees + minutes / 60.0f;
00111         
00112             degrees = floor(gps.longitude / 100.0f);
00113             minutes = gps.longitude - (degrees * 100.0f);
00114             gps.longitude = degrees + minutes / 60.0f;
00115         } 
00116     }
00117 }
00118 
00119 void Envoi_GPS(void) {
00120 
00121     if(gps.fixe) {
00122         pc.printf("hms : %s\n",gps.horaire);
00123         pc.printf("lat : %f N\n",gps.latitude);
00124         pc.printf("long: %f E\n",gps.longitude);
00125         pc.printf("alt : %d m\n",gps.altitude);
00126     }
00127     else
00128         pc.printf("GPS: %s\n",buffer);
00129 }
00130 
00131 void XBee_Envoi_GPS(void) {
00132     
00133     if(gps.fixe) {
00134         xbee.printf("H%s\n",gps.horaire);
00135         xbee.printf("lat : %fN\n",gps.latitude);
00136         xbee.printf("long: %fE\n",gps.longitude);
00137         xbee.printf("#A%d\n",gps.altitude);
00138               
00139         FILE *fp = fopen("/sd/gps_data.txt", "a");
00140         fprintf(fp, "%.6f, %.6f, \n",gps.latitude,gps.longitude);   
00141         fclose(fp);
00142     }
00143     else
00144         xbee.printf("GPS: %s\n\r",buffer);
00145 }
00146 //==============================================================================
00147 // Sélection de la trame GGA - Système de positionnement global des données fixées
00148 // Exemple : $GPGGA,143512.000,4347.7852,N,00418.9704,E,1,7,1.29,28.9,M,49.4,M,,*60
00149 
00150 //  UTC Position    143512.000      hhmmss.sss
00151 //  Latitude        4347.7852       ddmm.mmmm
00152 //  N/S Indicator   N               N=Nord - S=Sud
00153 //  Longitude       00418.9704      ddmm.mmmm
00154 //  W/E Indicator   E               W=Ouest - E=Est
00155 //  Position Fix Indicator  1       0-invalid 1-Valid
00156 //  Satellites Used 7               de 0 à 12
00157 //  Précision       1.29            1-bon 9-mauvais
00158 //  Altitude        28.9            valeur
00159 //  Unité pour l'altitude   M       en mètre
00160 //  Autres informations
00161 //  Checksum        *60
00162 //==============================================================================
00163 // Sélection de la trame GLL - Géographic position - Latitude/Longitude
00164 // Exemple : $GPGLL,3723.2475, N, 12158.3416, W, 161229.487, A*2C
00165 //==============================================================================
00166 // Sélection de la trame RMC - Utilisation pour les navires
00167 // Exemple : $GPRMC,141147.000,A,4347.7885,N,00418.9737,E,0.00,350.58,280621,,,A*6D
00168 
00169 //  UTC Position    141147.000      hhmmss.sss
00170 //  Fix Indicator   A               A-valid V-invalid
00171 //  Latitude        4347.7885       ddmm.mmmm
00172 //  N/S Indicator   N               N=Nord - S=Sud
00173 //  Longitude       00418.9737      ddmm.mmmm
00174 //  W/E Indicator   E               W=Ouest - E=Est
00175 //  Vitesse         0.00            en noeuds
00176 //  Route sur le fond 350.58        en degrés
00177 //  Date            280621          ddmmaa
00178 //  Autres informations
00179 //  Checksum        *6D
00180 //==============================================================================