LEcture GPS Xbee sous interruption

gps-ea-acc023.h

Committer:
pascalreygner
Date:
2018-08-09
Revision:
3:9a24090ff482
Parent:
2:824735b4c3a3

File content as of revision 3:9a24090ff482:

/* Gestion carte GPS au format XBEE
 * Fournisseur : Embedded Artists - Réf : EA-ACC-023
 *      https://www.embeddedartists.com/products/acc/acc_gps.php
 * Utilise Chipset MT3339 (Mediatek Labs)
 * Décode et affiche trame $GPRMC ou $GPGGA - affiche les autres trames non décodées
 * Caractères reçus sous interruption (UART1-RX)
 *
 * V2 14/3/2018 - ajout décodage trame GGA
 * V3 7/8/2018  - DEBUG AFFICHAGE RMC + GGA / suppression librairies inutiles
 
 * Exemple d'utilisation class GpsXbee (IRQ compatible) :
@code
#include "mbed.h"
#include <stdio.h>
#include "gps-ea-acc023.h"

using namespace gpsxbee_MT3339;
static GpsXbee gpsxbee;
Serial pc2(USBTX, USBRX);           // Port USB vers PC pour debug
DigitalOut led4_GPSON(LED4);    //clignote à chaque trame GPS (1 = allume)

// affichage données GPS quand trame reçue complète au format NMEARMC ou NMEAGGA
main()
{
    pc2.baud(115200); // liaison vers PC DEBUG
    gpsxbee.GpsXbeeInit();
    while(1) {
        if (gpsxbee.gpsTrameRMC == gpsxbee.TRAME_OK && gpsxbee.gpsTrameGGA == gpsxbee.TRAME_OK) {
            gpsxbee.gpsTrameRMC = gpsxbee.TRAME_WAIT;
            printf(" RMC = %s\r\n",gpsxbee.gpsDataRMC);

            gpsxbee.gpsTrameGGA = gpsxbee.TRAME_WAIT;
            printf(" GGA = %s\r\n",gpsxbee.gpsDataGGA);
            led4_GPSON = !led4_GPSON;
        }
    }
}
@endcode

 *  Résultat  = Affichage sur terminal PC (115200 bauds) : Trames décodées :
        RMC : 08/06/18:10H34mn32s - Lat. = 44.957730N - Long. = -0.666333W
        GGA : 08H34mn32s --- Latitude = 44.957730N  --- Longitude = -0.666333W - Nb sat = 9

 */

#ifndef GPSXBEE_H_
#define GPSXBEE_H_

namespace gpsxbee_MT3339 {

class GpsXbee {

public:
    void GpsXbeeInit(void);
    virtual ~GpsXbee();
    void InitRMC(void);
    void InitGGA(void);

    void parseRMC(char* data, int dataLen); // analyse trame GPS
    int  parseData(char* data, int len);
    void lecture(); // Remplissage gpsBuf
    void parseGGA(char* data, int dataLen);


    // Conversion format ddmm.mmmm en mode degrés
    double  getLatitudeAsDegrees(double l,char ns);
    double  getLongitudeAsDegrees(double l,char ns);

    enum NmeaSentenceValue { // type de protocole de message reçu
        NMEA_INVALID    = 0,
        NmeaGga         = 0x01,
        NmeaGsa         = 0x02,
        NmeaGsv         = 0x04,
        NmeaRmc         = 0x08,
        NmeaVtg         = 0x10,
    };
    NmeaSentenceValue NmeaSentence;

    enum gpsTrameValue {
        TRAME_WAIT = 0,     // Trame lue, attente nouvelle trame
        TRAME_IN   = 1,     // Reception Trame en cours
        TRAME_OK   = 2,     // Trame complète prête à lire
        TRAME_ERR  = -1,    // Erreur Trame
    };
    gpsTrameValue  gpsTrameRMC,gpsTrameGGA;
    
    // Message reçu au format $GPRMC
    int rmc_hours;          /** UTC time - hours */
    int rmc_minutes;        /** UTC time - minutes */
    int rmc_seconds;        /** UTC time - seconds */
    int rmc_milliseconds;   /** UTC time - milliseconds */
    char rmc_warning;       /** A = données valides - V = invalides */
    double rmc_latitude;    /** The latitude in ddmm.mmmm format (d = degrees, m = minutes) */
    double rmc_longitude;   /** The longitude in dddmm.mmmm format */
    char rmc_nsIndicator;   /** North / South indicator */
    char rmc_ewIndicator;   /** East / West indicator */
    double rmc_speedKnots;  /** speed in Knots */
    int rmc_jours ;         /** date jjmmaa */
    int rmc_mois ;
    int rmc_ans ;

    // Message reçu au format $GPGGA
    int gga_hours;
    int gga_minutes;
    int gga_seconds;
    int gga_milliseconds;
    double gga_latitude;
    double gga_longitude;
    char gga_nsIndicator;
    char gga_ewIndicator;
    int gga_fix;            //  0 = Fix not available     1 = GPS fix   2 = Differential GPS fix
    int gga_satellites;     /** Number of used satellites */
    double gga_hdop;        /** Horizontal Dilution of Precision */
    double gga_altitude;    /** antenna altitude above/below mean sea-level */
    double gga_geoidal;     /** geoidal separation */

    char gpsDataRMC[200];      /** buffer pour affichage data RMC*/
    char gpsDataGGA[200];      /** buffer pour affichage data GGA*/

private :
    #define MTK3339_BUF_SZ 200      // Taille gpsBuf
    char gpsBuf[MTK3339_BUF_SZ];    // buffer de réception trame GPS

    enum gpsStateValue {
        StateStartGps = 0x30,
        StateDataGps = 0x31,
    };
    gpsStateValue gpsState;         // état réception

    int  gpsBufPos;                 // position index lecture buffer

}; // end class
}  // end namespace
#endif /* GPSXBEE_H_ */