Revised Embedded Artists' MTK3339 library to save all raw GPS messages and enable optional decoding of RMC message.

Fork of MTK3339 by EmbeddedArtists AB

Committer:
tbronez
Date:
Tue Dec 29 16:46:07 2015 +0000
Revision:
4:c9861b0d3219
Parent:
2:2391d165df47
Added additional statements useful for debugging

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tbronez 1:3057ad6a5d4b 1 // Header to represent serial interface to MTK3339 GPS chip
tbronez 1:3057ad6a5d4b 2 // Original author: Embedded Artists
tbronez 2:2391d165df47 3 // Revised by T. Bronez, 2015-07-31
tbronez 1:3057ad6a5d4b 4
embeddedartists 0:bd0fe2412980 5 #ifndef MTK3339_H
embeddedartists 0:bd0fe2412980 6 #define MTK3339_H
tbronez 1:3057ad6a5d4b 7 #include <time.h>
embeddedartists 0:bd0fe2412980 8
embeddedartists 0:bd0fe2412980 9 /**
embeddedartists 0:bd0fe2412980 10 * An interface to the MTK3339 GPS module.
embeddedartists 0:bd0fe2412980 11 */
embeddedartists 0:bd0fe2412980 12 class MTK3339 {
embeddedartists 0:bd0fe2412980 13 public:
embeddedartists 0:bd0fe2412980 14
embeddedartists 0:bd0fe2412980 15 enum NmeaSentence {
tbronez 1:3057ad6a5d4b 16 NMEA_NONE = 0x00,
tbronez 1:3057ad6a5d4b 17 NMEA_GGA = 0x01,
tbronez 1:3057ad6a5d4b 18 NMEA_GSA = 0x02,
tbronez 1:3057ad6a5d4b 19 NMEA_GSV = 0x04,
tbronez 1:3057ad6a5d4b 20 NMEA_RMC = 0x08,
tbronez 1:3057ad6a5d4b 21 NMEA_VTG = 0x10
embeddedartists 0:bd0fe2412980 22 };
embeddedartists 0:bd0fe2412980 23
tbronez 1:3057ad6a5d4b 24 struct RmcType {
tbronez 1:3057ad6a5d4b 25 char status; // A valid, V invalid, blank unknown
tbronez 1:3057ad6a5d4b 26 double lat_dd; // latitude in decimal degrees
tbronez 1:3057ad6a5d4b 27 double lon_dd; // longitude in decimal degrees
tbronez 1:3057ad6a5d4b 28 struct tm gps_tm; // date and time (to seconds)
tbronez 1:3057ad6a5d4b 29 int msec; // millseconds
embeddedartists 0:bd0fe2412980 30 };
embeddedartists 0:bd0fe2412980 31
embeddedartists 0:bd0fe2412980 32 /**
embeddedartists 0:bd0fe2412980 33 * Create an interface to the MTK3339 GPS module
embeddedartists 0:bd0fe2412980 34 *
embeddedartists 0:bd0fe2412980 35 * @param tx UART TX line pin
embeddedartists 0:bd0fe2412980 36 * @param rx UART RX line pin
embeddedartists 0:bd0fe2412980 37 */
embeddedartists 0:bd0fe2412980 38 MTK3339(PinName tx, PinName rx);
embeddedartists 0:bd0fe2412980 39
embeddedartists 0:bd0fe2412980 40 /**
embeddedartists 0:bd0fe2412980 41 * Start to read data from the GPS module.
embeddedartists 0:bd0fe2412980 42 *
embeddedartists 0:bd0fe2412980 43 * @param fptr A pointer to a void function that will be called when there
embeddedartists 0:bd0fe2412980 44 * is data available.
embeddedartists 0:bd0fe2412980 45 * @param mask specifies which sentence types (NmeaSentence) that are of
embeddedartists 0:bd0fe2412980 46 * interest. The callback function will only be called for messages
embeddedartists 0:bd0fe2412980 47 * specified in this mask.
embeddedartists 0:bd0fe2412980 48 */
embeddedartists 0:bd0fe2412980 49 void start(void (*fptr)(void), int mask);
embeddedartists 0:bd0fe2412980 50
embeddedartists 0:bd0fe2412980 51 /**
embeddedartists 0:bd0fe2412980 52 * Start to read data from the GPS module.
embeddedartists 0:bd0fe2412980 53 *
embeddedartists 0:bd0fe2412980 54 * @param tptr pointer to the object to call the member function on
embeddedartists 0:bd0fe2412980 55 * @param mptr pointer to the member function to be called
embeddedartists 0:bd0fe2412980 56 * @param mask specifies which sentence types (NmeaSentence) that are of
embeddedartists 0:bd0fe2412980 57 * interest. The member function will only be called for messages
embeddedartists 0:bd0fe2412980 58 * specified in this mask.
embeddedartists 0:bd0fe2412980 59 */
embeddedartists 0:bd0fe2412980 60 template<typename T>
embeddedartists 0:bd0fe2412980 61 void start(T* tptr, void (T::*mptr)(void), int mask) {
embeddedartists 0:bd0fe2412980 62 if((mptr != NULL) && (tptr != NULL) && mask) {
embeddedartists 0:bd0fe2412980 63 _dataCallback.attach(tptr, mptr);
embeddedartists 0:bd0fe2412980 64 _sentenceMask = mask;
embeddedartists 0:bd0fe2412980 65 _serial.attach(this, &MTK3339::uartIrq, Serial::RxIrq);
embeddedartists 0:bd0fe2412980 66 }
embeddedartists 0:bd0fe2412980 67 }
embeddedartists 0:bd0fe2412980 68
embeddedartists 0:bd0fe2412980 69 /**
embeddedartists 0:bd0fe2412980 70 * Stop to read data from GPS module
embeddedartists 0:bd0fe2412980 71 */
embeddedartists 0:bd0fe2412980 72 void stop();
embeddedartists 0:bd0fe2412980 73
embeddedartists 0:bd0fe2412980 74 /**
embeddedartists 0:bd0fe2412980 75 * Get the type of the data reported in available data callback.
embeddedartists 0:bd0fe2412980 76 * This method will only return a valid type when called within the
embeddedartists 0:bd0fe2412980 77 * callback.
embeddedartists 0:bd0fe2412980 78 */
embeddedartists 0:bd0fe2412980 79 NmeaSentence getAvailableDataType();
embeddedartists 0:bd0fe2412980 80
embeddedartists 0:bd0fe2412980 81 /**
tbronez 1:3057ad6a5d4b 82 * Time, position and date related data
tbronez 1:3057ad6a5d4b 83 */
tbronez 1:3057ad6a5d4b 84 enum PubConstants {
tbronez 1:3057ad6a5d4b 85 MSG_BUF_SZ = 100
tbronez 2:2391d165df47 86 };
tbronez 2:2391d165df47 87 // Leave room for a terminating \0 in each buffer
tbronez 2:2391d165df47 88 char ggaMsg[MSG_BUF_SZ+1]; // longest observed strlen = 72
tbronez 2:2391d165df47 89 char gsaMsg[MSG_BUF_SZ+1]; // longest observed strlen = 56
tbronez 2:2391d165df47 90 char gsvMsg[MSG_BUF_SZ+1]; // longest observed strlen = 68
tbronez 2:2391d165df47 91 char rmcMsg[MSG_BUF_SZ+1]; // longest observed strlen = 70
tbronez 2:2391d165df47 92 char vtgMsg[MSG_BUF_SZ+1]; // longest observed strlen = 37
embeddedartists 0:bd0fe2412980 93
tbronez 1:3057ad6a5d4b 94 RmcType rmc;
tbronez 1:3057ad6a5d4b 95 void decodeRMC();
embeddedartists 0:bd0fe2412980 96
embeddedartists 0:bd0fe2412980 97 private:
embeddedartists 0:bd0fe2412980 98
embeddedartists 0:bd0fe2412980 99 enum PrivConstants {
embeddedartists 0:bd0fe2412980 100 MTK3339_BUF_SZ = 255
embeddedartists 0:bd0fe2412980 101 };
embeddedartists 0:bd0fe2412980 102
embeddedartists 0:bd0fe2412980 103 enum DataState {
embeddedartists 0:bd0fe2412980 104 StateStart = 0,
embeddedartists 0:bd0fe2412980 105 StateData
embeddedartists 0:bd0fe2412980 106 };
embeddedartists 0:bd0fe2412980 107
embeddedartists 0:bd0fe2412980 108 FunctionPointer _dataCallback;
embeddedartists 0:bd0fe2412980 109 char _buf[MTK3339_BUF_SZ];
embeddedartists 0:bd0fe2412980 110 int _bufPos;
embeddedartists 0:bd0fe2412980 111 DataState _state;
embeddedartists 0:bd0fe2412980 112 int _sentenceMask;
embeddedartists 0:bd0fe2412980 113 NmeaSentence _availDataType;
embeddedartists 0:bd0fe2412980 114 Serial _serial;
embeddedartists 0:bd0fe2412980 115
tbronez 1:3057ad6a5d4b 116 void saveRMC(char* data, int dataLen);
tbronez 1:3057ad6a5d4b 117 void saveGGA(char* data, int dataLen);
tbronez 1:3057ad6a5d4b 118 void saveGSA(char* data, int dataLen);
tbronez 1:3057ad6a5d4b 119 void saveGSV(char* data, int dataLen);
tbronez 1:3057ad6a5d4b 120 void saveVTG(char* data, int dataLen);
tbronez 1:3057ad6a5d4b 121 void saveData(char* data, int len);
embeddedartists 0:bd0fe2412980 122 void uartIrq();
embeddedartists 0:bd0fe2412980 123
embeddedartists 0:bd0fe2412980 124 };
embeddedartists 0:bd0fe2412980 125
embeddedartists 0:bd0fe2412980 126 #endif
embeddedartists 0:bd0fe2412980 127