Interface to the MTK3339 GPS module

Dependents:   app_gps lpc812_exp_solution_exp-port-gps-lib

Committer:
embeddedartists
Date:
Thu Nov 07 11:46:53 2013 +0000
Revision:
0:bd0fe2412980
First release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
embeddedartists 0:bd0fe2412980 1 #ifndef MTK3339_H
embeddedartists 0:bd0fe2412980 2 #define MTK3339_H
embeddedartists 0:bd0fe2412980 3
embeddedartists 0:bd0fe2412980 4 /**
embeddedartists 0:bd0fe2412980 5 * An interface to the MTK3339 GPS module.
embeddedartists 0:bd0fe2412980 6 */
embeddedartists 0:bd0fe2412980 7 class MTK3339 {
embeddedartists 0:bd0fe2412980 8 public:
embeddedartists 0:bd0fe2412980 9
embeddedartists 0:bd0fe2412980 10
embeddedartists 0:bd0fe2412980 11 enum NmeaSentence {
embeddedartists 0:bd0fe2412980 12 NmeaInvalid = 0,
embeddedartists 0:bd0fe2412980 13 NmeaGga = 0x01,
embeddedartists 0:bd0fe2412980 14 // NmeaGsa = 0x02,
embeddedartists 0:bd0fe2412980 15 // NmeaGsv = 0x04,
embeddedartists 0:bd0fe2412980 16 // NmeaRmc = 0x08,
embeddedartists 0:bd0fe2412980 17 NmeaVtg = 0x10
embeddedartists 0:bd0fe2412980 18 };
embeddedartists 0:bd0fe2412980 19
embeddedartists 0:bd0fe2412980 20 struct GgaType {
embeddedartists 0:bd0fe2412980 21 /** UTC time - hours */
embeddedartists 0:bd0fe2412980 22 int hours;
embeddedartists 0:bd0fe2412980 23 /** UTC time - minutes */
embeddedartists 0:bd0fe2412980 24 int minutes;
embeddedartists 0:bd0fe2412980 25 /** UTC time - seconds */
embeddedartists 0:bd0fe2412980 26 int seconds;
embeddedartists 0:bd0fe2412980 27 /** UTC time - milliseconds */
embeddedartists 0:bd0fe2412980 28 int milliseconds;
embeddedartists 0:bd0fe2412980 29
embeddedartists 0:bd0fe2412980 30 /** The latitude in ddmm.mmmm format (d = degrees, m = minutes) */
embeddedartists 0:bd0fe2412980 31 double latitude;
embeddedartists 0:bd0fe2412980 32 /** The longitude in dddmm.mmmm format */
embeddedartists 0:bd0fe2412980 33 double longitude;
embeddedartists 0:bd0fe2412980 34 /** North / South indicator */
embeddedartists 0:bd0fe2412980 35 char nsIndicator;
embeddedartists 0:bd0fe2412980 36 /** East / West indicator */
embeddedartists 0:bd0fe2412980 37 char ewIndicator;
embeddedartists 0:bd0fe2412980 38
embeddedartists 0:bd0fe2412980 39 /**
embeddedartists 0:bd0fe2412980 40 * Position indicator:
embeddedartists 0:bd0fe2412980 41 * 0 = Fix not available
embeddedartists 0:bd0fe2412980 42 * 1 = GPS fix
embeddedartists 0:bd0fe2412980 43 * 2 = Differential GPS fix
embeddedartists 0:bd0fe2412980 44 */
embeddedartists 0:bd0fe2412980 45 int fix;
embeddedartists 0:bd0fe2412980 46
embeddedartists 0:bd0fe2412980 47 /** Number of used satellites */
embeddedartists 0:bd0fe2412980 48 int satellites;
embeddedartists 0:bd0fe2412980 49 /** Horizontal Dilution of Precision */
embeddedartists 0:bd0fe2412980 50 double hdop;
embeddedartists 0:bd0fe2412980 51 /** antenna altitude above/below mean sea-level */
embeddedartists 0:bd0fe2412980 52 double altitude;
embeddedartists 0:bd0fe2412980 53 /** geoidal separation */
embeddedartists 0:bd0fe2412980 54 double geoidal;
embeddedartists 0:bd0fe2412980 55 };
embeddedartists 0:bd0fe2412980 56
embeddedartists 0:bd0fe2412980 57 struct VtgType {
embeddedartists 0:bd0fe2412980 58 /** heading in degrees */
embeddedartists 0:bd0fe2412980 59 double course;
embeddedartists 0:bd0fe2412980 60 /** speed in Knots */
embeddedartists 0:bd0fe2412980 61 double speedKnots;
embeddedartists 0:bd0fe2412980 62 /** Speed in kilometer per hour */
embeddedartists 0:bd0fe2412980 63 double speedKmHour;
embeddedartists 0:bd0fe2412980 64 /**
embeddedartists 0:bd0fe2412980 65 * Mode
embeddedartists 0:bd0fe2412980 66 * A = Autonomous mode
embeddedartists 0:bd0fe2412980 67 * D = Differential mode
embeddedartists 0:bd0fe2412980 68 * E = Estimated mode
embeddedartists 0:bd0fe2412980 69 */
embeddedartists 0:bd0fe2412980 70 char mode;
embeddedartists 0:bd0fe2412980 71 };
embeddedartists 0:bd0fe2412980 72
embeddedartists 0:bd0fe2412980 73 /**
embeddedartists 0:bd0fe2412980 74 * Create an interface to the MTK3339 GPS module
embeddedartists 0:bd0fe2412980 75 *
embeddedartists 0:bd0fe2412980 76 * @param tx UART TX line pin
embeddedartists 0:bd0fe2412980 77 * @param rx UART RX line pin
embeddedartists 0:bd0fe2412980 78 */
embeddedartists 0:bd0fe2412980 79 MTK3339(PinName tx, PinName rx);
embeddedartists 0:bd0fe2412980 80
embeddedartists 0:bd0fe2412980 81 /**
embeddedartists 0:bd0fe2412980 82 * Start to read data from the GPS module.
embeddedartists 0:bd0fe2412980 83 *
embeddedartists 0:bd0fe2412980 84 * @param fptr A pointer to a void function that will be called when there
embeddedartists 0:bd0fe2412980 85 * is data available.
embeddedartists 0:bd0fe2412980 86 * @param mask specifies which sentence types (NmeaSentence) that are of
embeddedartists 0:bd0fe2412980 87 * interest. The callback function will only be called for messages
embeddedartists 0:bd0fe2412980 88 * specified in this mask.
embeddedartists 0:bd0fe2412980 89 */
embeddedartists 0:bd0fe2412980 90 void start(void (*fptr)(void), int mask);
embeddedartists 0:bd0fe2412980 91
embeddedartists 0:bd0fe2412980 92 /**
embeddedartists 0:bd0fe2412980 93 * Start to read data from the GPS module.
embeddedartists 0:bd0fe2412980 94 *
embeddedartists 0:bd0fe2412980 95 * @param tptr pointer to the object to call the member function on
embeddedartists 0:bd0fe2412980 96 * @param mptr pointer to the member function to be called
embeddedartists 0:bd0fe2412980 97 * @param mask specifies which sentence types (NmeaSentence) that are of
embeddedartists 0:bd0fe2412980 98 * interest. The member function will only be called for messages
embeddedartists 0:bd0fe2412980 99 * specified in this mask.
embeddedartists 0:bd0fe2412980 100 */
embeddedartists 0:bd0fe2412980 101 template<typename T>
embeddedartists 0:bd0fe2412980 102 void start(T* tptr, void (T::*mptr)(void), int mask) {
embeddedartists 0:bd0fe2412980 103 if((mptr != NULL) && (tptr != NULL) && mask) {
embeddedartists 0:bd0fe2412980 104 _dataCallback.attach(tptr, mptr);
embeddedartists 0:bd0fe2412980 105 _sentenceMask = mask;
embeddedartists 0:bd0fe2412980 106 _serial.attach(this, &MTK3339::uartIrq, Serial::RxIrq);
embeddedartists 0:bd0fe2412980 107 }
embeddedartists 0:bd0fe2412980 108 }
embeddedartists 0:bd0fe2412980 109
embeddedartists 0:bd0fe2412980 110 /**
embeddedartists 0:bd0fe2412980 111 * Stop to read data from GPS module
embeddedartists 0:bd0fe2412980 112 */
embeddedartists 0:bd0fe2412980 113 void stop();
embeddedartists 0:bd0fe2412980 114
embeddedartists 0:bd0fe2412980 115 /**
embeddedartists 0:bd0fe2412980 116 * Get the type of the data reported in available data callback.
embeddedartists 0:bd0fe2412980 117 * This method will only return a valid type when called within the
embeddedartists 0:bd0fe2412980 118 * callback.
embeddedartists 0:bd0fe2412980 119 */
embeddedartists 0:bd0fe2412980 120 NmeaSentence getAvailableDataType();
embeddedartists 0:bd0fe2412980 121
embeddedartists 0:bd0fe2412980 122 /**
embeddedartists 0:bd0fe2412980 123 * Get latitude in degrees (decimal format)
embeddedartists 0:bd0fe2412980 124 */
embeddedartists 0:bd0fe2412980 125 double getLatitudeAsDegrees();
embeddedartists 0:bd0fe2412980 126 /**
embeddedartists 0:bd0fe2412980 127 * Get longitude in degrees (decimal format)
embeddedartists 0:bd0fe2412980 128 */
embeddedartists 0:bd0fe2412980 129 double getLongitudeAsDegrees();
embeddedartists 0:bd0fe2412980 130
embeddedartists 0:bd0fe2412980 131 /**
embeddedartists 0:bd0fe2412980 132 * Time, position and fix related data
embeddedartists 0:bd0fe2412980 133 */
embeddedartists 0:bd0fe2412980 134 GgaType gga;
embeddedartists 0:bd0fe2412980 135
embeddedartists 0:bd0fe2412980 136 /**
embeddedartists 0:bd0fe2412980 137 * Course and speed information relative to ground
embeddedartists 0:bd0fe2412980 138 */
embeddedartists 0:bd0fe2412980 139 VtgType vtg;
embeddedartists 0:bd0fe2412980 140
embeddedartists 0:bd0fe2412980 141
embeddedartists 0:bd0fe2412980 142 private:
embeddedartists 0:bd0fe2412980 143
embeddedartists 0:bd0fe2412980 144 enum PrivConstants {
embeddedartists 0:bd0fe2412980 145 MTK3339_BUF_SZ = 255
embeddedartists 0:bd0fe2412980 146 };
embeddedartists 0:bd0fe2412980 147
embeddedartists 0:bd0fe2412980 148 enum DataState {
embeddedartists 0:bd0fe2412980 149 StateStart = 0,
embeddedartists 0:bd0fe2412980 150 StateData
embeddedartists 0:bd0fe2412980 151 };
embeddedartists 0:bd0fe2412980 152
embeddedartists 0:bd0fe2412980 153 FunctionPointer _dataCallback;
embeddedartists 0:bd0fe2412980 154 char _buf[MTK3339_BUF_SZ];
embeddedartists 0:bd0fe2412980 155 int _bufPos;
embeddedartists 0:bd0fe2412980 156 DataState _state;
embeddedartists 0:bd0fe2412980 157 int _sentenceMask;
embeddedartists 0:bd0fe2412980 158 NmeaSentence _availDataType;
embeddedartists 0:bd0fe2412980 159
embeddedartists 0:bd0fe2412980 160 Serial _serial;
embeddedartists 0:bd0fe2412980 161
embeddedartists 0:bd0fe2412980 162
embeddedartists 0:bd0fe2412980 163 void parseGGA(char* data, int dataLen);
embeddedartists 0:bd0fe2412980 164 void parseVTG(char* data, int dataLen);
embeddedartists 0:bd0fe2412980 165 void parseData(char* data, int len);
embeddedartists 0:bd0fe2412980 166 void uartIrq();
embeddedartists 0:bd0fe2412980 167
embeddedartists 0:bd0fe2412980 168
embeddedartists 0:bd0fe2412980 169 };
embeddedartists 0:bd0fe2412980 170
embeddedartists 0:bd0fe2412980 171 #endif
embeddedartists 0:bd0fe2412980 172