GPS Library  0.1
GPS driver and NMEA parser
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros
NMEAMessages.h
Go to the documentation of this file.
1 #ifndef __NMEAMESSAGES_H__
2 #define __NMEAMESSAGES_H__
3 
4 #include <Exceptions/Exceptions.h>
5 #include <GPS/Interpreter/NMEA/NMEAInfo.h>
6 #include <GPS/Interpreter/NMEA/I_NMEAMessage.h>
7 #include <inttypes.h>
8 
10 
23 {
24  public:
25  GPGGA_Interpreter(void): I_NMEAMessage("GPGGA") { }
26  virtual ~GPGGA_Interpreter() { }
27 
28  struct data
29  {
30  data(void)
31  {
32  }
33 
34  data & setup(const char * const * msg, int params)
35  {
36  if (params < 12)
37  throw EX::Error("GPGGA: too few parameters");
38  time = NMEA::Time(msg[0]);
39  latitude = NMEA::Position(msg[1]);
40  latitude.HemisphereNS(msg[2]);
41  longitude = NMEA::Position(msg[3]);
42  longitude.HemisphereEW(msg[4]);
43  quality = NMEA::ToInt(msg[5]);
44  no_of_satellites = NMEA::ToInt(msg[6]);
45  hdop = NMEA::FloatData(msg[7]);
46  altitude = NMEA::MeterData(msg[8], msg[9]);
47  geoidal_separation = NMEA::MeterData(msg[10], msg[11]);
48  return *this;
49  }
50 
54  int quality;
59  };
60 
61  private:
62  SYS_DEFINE_CLASS_NAME("GPGGA_Interpreter");
63 
64  virtual void Interpret(const char * const * message, int params, GPS::GPSData & parent, I_GPSDriver * driver = nullptr) override;
65 
67 };
68 
70 
78 {
79  public:
80  GPGSA_Interpreter(void): I_NMEAMessage("GPGSA") { }
81  virtual ~GPGSA_Interpreter() { }
82 
83  struct data
84  {
85  data(void)
86  {
87  }
88 
89  data & setup(const char * const * msg, int params)
90  {
91  if (params < 17)
92  throw EX::Error("GPGSA: too few parameters");
93  Auto = msg[0][0] == 'A';
94  Mode = NMEA::ToInt(msg[1]);
95  pdop = NMEA::FloatData(msg[14]);
96  hdop = NMEA::FloatData(msg[15]);
97  vdop = NMEA::FloatData(msg[16]);
98  const char * const * svs = msg + 2;
99  for (uint8_t * i = sv; i < sv+12; ++i) {
100  *i++ = NMEA::ToInt(*svs++);
101  }
102  return *this;
103  }
104 
105  bool Auto;
106  int Mode;
107  uint8_t sv[12];
111  };
112 
113  private:
114  SYS_DEFINE_CLASS_NAME("GPGSA_Interpreter");
115 
116  virtual void Interpret(const char * const * message, int params, GPS::GPSData & parent, I_GPSDriver * driver = nullptr) override;
117 
119 };
120 
122 
136 {
137  public:
138  GPRMC_Interpreter(void): I_NMEAMessage("GPRMC") { }
139  virtual ~GPRMC_Interpreter() { }
140 
141  struct data
142  {
143  data(void)
144  {
145  }
146 
147  data & setup(const char * const * msg, int params)
148  {
149  if (params < 11)
150  throw EX::Error("GPRMC: too few parameters");
151  valid = msg[1][0] == 'A';
152  time = NMEA::Time(msg[0]);
153  date = NMEA::Date(msg[8]);
154  latitude = NMEA::Position(msg[2]);
155  latitude.HemisphereNS(msg[3]);
156  longitude = NMEA::Position(msg[4]);
157  longitude.HemisphereEW(msg[5]);
158  speed = NMEA::Miles2Kmph(msg[6]);
159  course = NMEA::FloatData(msg[7]);
160  variation = NMEA::VariationData(msg[9], msg[10]);
161  return *this;
162  }
163 
164  bool valid;
172  };
173 
174  private:
175  SYS_DEFINE_CLASS_NAME("GPRMC_Interpreter");
176 
177  virtual void Interpret(const char * const * message, int params, GPS::GPSData & parent, I_GPSDriver * driver = nullptr) override;
178 
180 };
181 
183 
195 {
196  public:
197  GPGSV_Interpreter(void): I_NMEAMessage("GPGSV") { }
198  virtual ~GPGSV_Interpreter() { }
199 
200  struct data
201  {
202  data(void)
203  {
204  }
205 
206  data & setup(const char * const * msg, int params)
207  {
208  if (params < 7)
209  throw EX::Error("GPGSV: too few parameters");
210 
211  total = NMEA::ToInt(msg[0]);
212  current = NMEA::ToInt(msg[1]);
213  svs = NMEA::ToInt(msg[2]);
214  const char * const * svp = msg + 3;
215  // Number of entries in the sv[] array:
216  elements = params <= 23 ? (params-7)/4 : 4;
217  for (int i = 0; i <= elements; ++i) {
218  sv[i].prn = NMEA::ToInt(*svp++, 0);
219  sv[i].elevation = NMEA::ToInt(*svp++, 0);
220  sv[i].azimuth = NMEA::ToInt(*svp++, 0);
221  sv[i].snr = NMEA::ToInt(*svp++, 0);
222  }
223  return *this;
224  }
225 
226  int total;
227  int current;
228  int svs;
229  int elements;
230  struct {
231  int prn;
233  int azimuth;
234  int snr;
235  } sv[4];
236  };
237 
238  private:
239  SYS_DEFINE_CLASS_NAME("GPGSV_Interpreter");
240 
241  virtual void Interpret(const char * const * message, int params, GPS::GPSData & parent, I_GPSDriver * driver = nullptr) override;
242 
244 };
245 
246 #endif /* __NMEAMESSAGES_H__ */
247 
248 /* * * * * * * * * * * * * End - of - File * * * * * * * * * * * * * * */