Code for autonomous rover for Sparkfun AVC. DataBus won 3rd in 2012 and the same code was used on Troubled Child, a 1986 Jeep Grand Wagoneer to win 1st in 2014.

Dependencies:   mbed Watchdog SDFileSystem DigoleSerialDisp

Sensors/GPS/Ublox6.h

Committer:
shimniok
Date:
2018-11-30
Revision:
25:bb5356402687
Parent:
0:a6a169de725f

File content as of revision 25:bb5356402687:

#ifndef __UBLOX6_H
#define __UBLOX6_H

/**
 * uBlox UBX Protocol Reader - Wayne Holder
 * Ported to mbed - Michael Shimniok
 *
 * Note: RX pad on 3DR Module is output, TX is input
 */
#include "mbed.h"
#include "GPS.h"

#define MAX_LENGTH 512

#define  SYNC1       0xB5
#define  SYNC2       0x62
#define  POSLLH_MSG  0x02
#define  SBAS_MSG    0x32
#define  VELNED_MSG  0x12
#define  STATUS_MSG  0x03
#define  SOL_MSG     0x06
#define  DOP_MSG     0x04
#define  DGPS_MSG    0x31
#define  SVINFO_MSG  0x30

#define CFG 0x06
#define NAV 0x01

#define MSG 0x01

#define LONG(X)    *(int32_t *)(&data[X])
#define ULONG(X)   *(uint32_t *)(&data[X])
#define INT(X)     *(int16_t *)(&data[X])
#define UINT(X)    *(uint16_t *)(&data[X])

class Ublox6: public GPS {
public:
    /**
     * create a new interface for Ublox6
     */
    Ublox6(PinName rx, PinName tx);

    /**
     * Initalize everything necessary for the GPS to collect the required data
     */
    virtual void init(void);
    
    /**
     * Set baud rate
     */    
    virtual void setBaud(int baud);

    /**
     * return serial object
     */
    virtual Serial *getSerial(void);

    /**
     * Disable serial data collection
     */    
    virtual void disable(void);

    /**
     * Enable serial data collection
     */
    virtual void enable(void);
    
    /**
    * Enable verbose messages for debugging
    */
    virtual void enableVerbose(void);

    /**
    * Disable verbose messages for debugging
    */    
    virtual void disableVerbose(void);

    /**
     * get latitude
     */    
    virtual double latitude(void);   
    
    /**
     * get longitude
     */
    virtual double longitude(void);

    /**
     * Get Horizontal Dilution of Precision
     * @return float horizontal dilution of precision
     */
    virtual float hdop(void);

    /**
     * get count of active satellites
     */
    virtual int sat_count(void);

    /**
     * get speed in m/s
     */    
    virtual float speed_mps(void);
    
    /**
     * get heading in degrees
     */
    virtual float heading_deg(void);
    
    /**
     * determine if data is available to be used
     */
    virtual bool available(void);
    
    /**
     * reset the data available flag
     */
    virtual void reset_available(void);

    int getAvailable(void) { return _available; }

    void setUpdateRate(int rate) { return; }

private:
    /**
     * Configure which Nmea messages to enable/disable
     */
    void recv_handler();

    /**
     * UBX protocol parser (Wayne Holder)
     */    
    void parse(unsigned char cc);

    /** serial object */
    Serial serial;
    int _available;     // is data available?
    float _latitude;    // temp storage, latitude
    float _longitude;   // temp storage, longitude
    float _hdop;        // horiz dilution of precision
    float _course_deg;  // course in degrees
    float _speed_mps;   // speed in m/s
    int _sat_count;     // satellite count
    //unsigned char buf[MAX_LENGTH]; // FIFO buffer for processing UBX
    //int in;             // buffer input, write to here
    //int out;            // buffer output, read from here   
};

#endif