MTK3339
Fork of MTK3339 by
MTK3339.h@1:1427f72611a4, 2015-07-13 (annotated)
- Committer:
- den90
- Date:
- Mon Jul 13 10:03:49 2015 +0000
- Revision:
- 1:1427f72611a4
- Parent:
- 0:bd0fe2412980
Dennis
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 | |
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 |