Interface to the MTK3339 GPS module
Dependents: app_gps lpc812_exp_solution_exp-port-gps-lib
MTK3339.h@0:bd0fe2412980, 2013-11-07 (annotated)
- Committer:
- embeddedartists
- Date:
- Thu Nov 07 11:46:53 2013 +0000
- Revision:
- 0:bd0fe2412980
First release
Who changed what in which revision?
User | Revision | Line number | New 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 |