SerialGPS.

Dependents:   SerialGPS_TestProgram Nucleo_SerialGPS_to_PC Nucleo_SerialGPS_to_PC SensorInterface ... more

SerialGPS.h

Committer:
shintamainjp
Date:
2010-10-12
Revision:
1:a5b887e09aa4
Parent:
0:3d0c5d7e5d0a

File content as of revision 1:a5b887e09aa4:

/**
 * Serial GPS module interface driver class (Version 0.0.1)
 * This interface driver supports NMEA-0183 serial based modules.
 *
 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
 * http://shinta.main.jp/
 */
#include "mbed.h"
#include "SerialBuffered.h"

/**
 * Serial GPS module interface driver class (Version 0.0.1)
 * This interface driver supports NMEA-0183 serial based modules.
 *
 * = A list of NMEA-0183 Based GPS modules =
 *   GT-720F : http://akizukidenshi.com/catalog/g/gM-02711/
 *
 * = References =
 *   NMEA Reference Manual (January 2005) - SiRF Technology, Inc.
 */
class SerialGPS {
public:

    /**
     * Create.
     *
     * @param tx A pin of transmit.
     * @param rx A pin of receive.
     * @param baud Baud rate. (Default = 9600)
     */
    SerialGPS(PinName tx, PinName rx, int baud = 9600);

    /**
     * Destroy.
     */
    ~SerialGPS();

    /**
     * GGA - Global Positioning System Fixed Data.
     *
     * $GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M, , , ,0000*18
     */
    typedef struct {
        int hour;
        int min;
        int sec;
        double latitude;
        char ns;
        double longitude;
        char ew;
        int position_fix;
        int satellites_used;
        double hdop;
        int altitude;
        char altitude_unit;
    } gps_gga_t;

    /**
     * GSA hGNSS DOP and Active Satellites.
     *
     * $GPGSA,A,3,07,02,26,27,09,04,15, , , , , ,1.8,1.0,1.5*33
     */
    typedef struct {
        char selmode;
        int fix;
    } gps_gsa_t;

    /**
     * for RMC:
     *  Time, date, position, course and speed data.
     */
    typedef struct {
        int hour;
        int min;
        int sec;
        char status;
        double nl;
        double el;
    } gps_rmc_t;

    /**
     * for GSV:
     *  The number of GPS satellites in view satellite ID numbers,
     *  elevation, azimuth, and SNR values.
     */
    typedef struct {
        int num;
        int elevation;
        int azimuth;
        int snr;
    } gps_gsv_satellite_t;

    /**
     * for GSV:
     *  The number of GPS satellites in view satellite ID numbers,
     *  elevation, azimuth, and SNR values.
     */
    typedef struct {
        int msgcnt;
        int msgnum;
        int satcnt;
        gps_gsv_satellite_t satellite[4];
    } gps_gsv_t;

    /**
     * Callback function structure.
     */
    typedef struct {
        /**
         * A callback function for logging data.
         */
        void (*cbfunc_log)(char *str);

        /**
         * A callback function for GGA.
         *
         * GGA - Global Positioning System Fixed Data.
         */
        void (*cbfunc_gga)(gps_gga_t *p);

        /**
         * A callback function for GLL.
         *
         * GLL - Geographic Position - Latitude/Longitude.
         */
        // TODO

        /**
         * A callback function for GSA.
         *
         * GSA - GNSS DOP and Active Satellites.
         */
        void (*cbfunc_gsa)(gps_gsa_t *p);

        /**
         * A callback function for GSV.
         *
         * GSV - GNSS Satellites in View.
         */
        void (*cbfunc_gsv)(gps_gsv_t *p);

        /**
         * A callback function for MSS.
         *
         * MSS - MSK Receiver Signal.
         */
        // TODO

        /**
         * A callback function for RMC.
         *
         * RMC - Recommended Minimum Specific GNSS Data.
         */
        void (*cbfunc_rmc)(gps_rmc_t *p);

        /**
         * A callback function for VTG.
         *
         * VTG - Course Over Ground and Ground Speed.
         */
        // TODO

        /**
         * A callback function for ZDA.
         *
         * ZDA - SiRF Timing Message.
         */
        // TODO

    } gps_callback_t;

    /**
     * Processing.
     */
    bool processing();

    /**
     * Attach a callback function.
     *
     * @param cbfuncs A pointer to a call back function structure.
     */
    void attach(gps_callback_t *cbfuncs);

    /**
     * Detach a callback function.
     */
    void detach(void);

private:
    SerialBuffered ser;
    gps_callback_t *cbfuncs;
    static const int PARAM_TXTMAXLEN = 64;
    static const int PARAM_ARRAYSIZE = 64;
    static bool exists(char c, char *buf) {
        const size_t n = strlen(buf);
        for (int i = 0; i < n; i++) {
            if (c == buf[i]) {
                return true;
            }
        }
        return false;
    }
    static char *parse(char *src, char *des, size_t siz, char *delim);
    static int parseAndCallbackGGA(char *src, gps_callback_t *cbfuncs);
    static int parseAndCallbackGSA(char *src, gps_callback_t *cbfuncs);
    static int parseAndCallbackRMC(char *src, gps_callback_t *cbfuncs);
    static int parseAndCallbackGSV(char *src, gps_callback_t *cbfuncs);
    static int parseAndCallbackUnknown(char *src, gps_callback_t *cbfuncs);
    static uint8_t calcCheckSum(char *buf, size_t siz);
};