MTK3339

Fork of MTK3339 by EmbeddedArtists AB

Committer:
den90
Date:
Mon Jul 13 10:03:49 2015 +0000
Revision:
1:1427f72611a4
Parent:
0:bd0fe2412980
Dennis

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