Skip to content

Commit 71f707c

Browse files
committed
GPS - Parse GGA/RMC into Event
1 parent 4722ee9 commit 71f707c

File tree

3 files changed

+80
-25
lines changed

3 files changed

+80
-25
lines changed

src/components/gps/controller.cpp

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ void GPSController::update() {
183183
}
184184
}
185185
WS_DEBUG_PRINTLN("[gps] Finished reading GPS data.");
186-
187-
// We are done reading for this period
186+
// We are done reading for this period, create a new GPSEvent message
187+
_gps_model->CreateGPSEvent();
188188

189189
// TODO: This is for debugging purposes only, remove later!
190190
WS_DEBUG_PRINT("[gps] Read ");
@@ -224,11 +224,50 @@ void GPSController::update() {
224224
Serial.println((int)drv->GetAdaGps()->antenna);
225225
}
226226

227-
// TODO: Okay so here we are going to create the model of gps data
228-
}
229-
WS_DEBUG_PRINTLN("[gps] Finished processing NMEA sentences.");
230-
// TODO: Successfully parsed the NMEA sentence, update the model
227+
// now, let's build the model from the sentence
228+
// $GPGGA
229+
// $GPRMC
230+
if (strncmp(nmea_sentence, "$GPRMC", 7)) {
231+
// parse GPRMC into event
232+
WS_DEBUG_PRINT(
233+
"[gps] Adding GGA to GPSEvent..."); // TODO: This is for debug,
234+
// remove in production!
235+
wippersnapper_gps_GPSDateTime datetime = _gps_model->CreateGpsDatetime(
236+
drv->GetAdaGps()->hour, drv->GetAdaGps()->minute,
237+
drv->GetAdaGps()->seconds, drv->GetAdaGps()->milliseconds,
238+
drv->GetAdaGps()->day, drv->GetAdaGps()->month,
239+
drv->GetAdaGps()->year);
240+
_gps_model->AddGpsEventRMC(
241+
datetime, drv->GetAdaGps()->fix, drv->GetAdaGps()->latitude,
242+
&drv->GetAdaGps()->lat, drv->GetAdaGps()->longitude,
243+
&drv->GetAdaGps()->lon, drv->GetAdaGps()->speed,
244+
drv->GetAdaGps()->angle);
245+
WS_DEBUG_PRINTLN("added!"); // TODO: THIS IS FOR DEBUG, REMOVE IN PROD
246+
} else if (strncmp(nmea_sentence, "$GPRMC", 7)) {
247+
// parse GPGGA into event
248+
WS_DEBUG_PRINT(
249+
"[gps] Adding GGA to GPSEvent..."); // TODO: This is for debug,
250+
// remove in production!
251+
wippersnapper_gps_GPSDateTime datetime = _gps_model->CreateGpsDatetime(
252+
drv->GetAdaGps()->hour, drv->GetAdaGps()->minute,
253+
drv->GetAdaGps()->seconds, drv->GetAdaGps()->milliseconds,
254+
drv->GetAdaGps()->day, drv->GetAdaGps()->month,
255+
drv->GetAdaGps()->year);
256+
_gps_model->AddGpsEventGGA(
257+
datetime, drv->GetAdaGps()->fix, drv->GetAdaGps()->latitude,
258+
&drv->GetAdaGps()->lat, drv->GetAdaGps()->longitude,
259+
&drv->GetAdaGps()->lon, drv->GetAdaGps()->satellites,
260+
drv->GetAdaGps()->HDOP, drv->GetAdaGps()->altitude,
261+
drv->GetAdaGps()->geoidheight);
262+
WS_DEBUG_PRINTLN("added!"); // TODO: THIS IS FOR DEBUG, REMOVE IN PROD
263+
} else {
264+
WS_DEBUG_PRINTLN(
265+
"[gps] WARNING - Parsed sentence is not type RMC or GGA!");
266+
}
267+
WS_DEBUG_PRINTLN("[gps] Finished processing NMEA sentences.");
268+
_gps_model->EncodeGPSEvent();
231269

232-
drv->SetPollPeriodPrv(cur_time);
270+
drv->SetPollPeriodPrv(cur_time);
271+
}
233272
}
234273
}

src/components/gps/model.cpp

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,30 @@ void GPSModel::CreateGPSEvent() {
6363
_msg_gps_event.rmc_responses_count = 0;
6464
}
6565

66+
/*!
67+
* @brief Encodes the GPSEvent message into a buffer.
68+
* @returns True if the encoding was successful, false otherwise.
69+
*/
70+
bool GPSModel::EncodeGPSEvent() {
71+
// Calculate the size of the encoded message
72+
size_t sz_msg;
73+
if (!pb_get_encoded_size(&sz_msg, wippersnapper_gps_GPSEvent_fields,
74+
&_msg_gps_event))
75+
return false;
76+
77+
// Attempt to encode the message into a buffer
78+
uint8_t buf[sz_msg];
79+
pb_ostream_t msg_stream = pb_ostream_from_buffer(buf, sizeof(buf));
80+
return pb_encode(&msg_stream, wippersnapper_gps_GPSEvent_fields,
81+
&_msg_gps_event);
82+
}
83+
84+
/*!
85+
* @brief Returns a pointer to the GPSEvent message.
86+
* @returns Pointer to the GPSEvent message.
87+
*/
88+
wippersnapper_gps_GPSEvent *GPSModel::GetGPSEvent() { return &_msg_gps_event; };
89+
6690
/*!
6791
* @brief Creates a GPSDateTime message with the provided parameters.
6892
* @param hour GMT hour of the day (0-23).
@@ -90,7 +114,7 @@ GPSModel::CreateGpsDatetime(uint8_t hour, uint8_t minute, uint8_t seconds,
90114
return datetime;
91115
}
92116

93-
bool GPSModel::AddGpsEventRMC(wippersnapper_gps_GPSDateTime *datetime,
117+
bool GPSModel::AddGpsEventRMC(wippersnapper_gps_GPSDateTime datetime,
94118
uint8_t fix_status, float lat, char *lat_dir,
95119
float lon, char *lon_dir, float speed,
96120
float angle) {
@@ -106,13 +130,8 @@ bool GPSModel::AddGpsEventRMC(wippersnapper_gps_GPSDateTime *datetime,
106130

107131
wippersnapper_gps_GPSRMCResponse rmc_response;
108132
rmc_response = wippersnapper_gps_GPSRMCResponse_init_zero;
109-
// Assign the datetime, if provided
110-
if (datetime) {
111-
rmc_response.has_datetime = true;
112-
rmc_response.datetime = *datetime;
113-
} else {
114-
rmc_response.has_datetime = false;
115-
}
133+
rmc_response.has_datetime = true;
134+
rmc_response.datetime = datetime;
116135

117136
// Determine the fix status
118137
if (fix_status == 1 || fix_status == 2) {
@@ -141,7 +160,7 @@ bool GPSModel::AddGpsEventRMC(wippersnapper_gps_GPSDateTime *datetime,
141160
return true;
142161
}
143162

144-
bool GPSModel::AddGpsEventGGA(wippersnapper_gps_GPSDateTime *datetime,
163+
bool GPSModel::AddGpsEventGGA(wippersnapper_gps_GPSDateTime datetime,
145164
uint8_t fix_status, float lat, char *lat_dir,
146165
float lon, char *lon_dir, uint8_t num_sats,
147166
float hdop, float alt, float geoid_height) {
@@ -158,13 +177,8 @@ bool GPSModel::AddGpsEventGGA(wippersnapper_gps_GPSDateTime *datetime,
158177

159178
wippersnapper_gps_GPGGAResponse gga_response;
160179
gga_response = wippersnapper_gps_GPGGAResponse_init_zero;
161-
// Assign the datetime, if provided
162-
if (datetime) {
163-
gga_response.has_datetime = true;
164-
gga_response.datetime = *datetime;
165-
} else {
166-
gga_response.has_datetime = false;
167-
}
180+
gga_response.has_datetime = true;
181+
gga_response.datetime = datetime;
168182

169183
// Fill lat/lon and direction
170184
snprintf(gga_response.lat, sizeof(gga_response.lat), "%.6f", lat);

src/components/gps/model.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,18 @@ class GPSModel {
3030
wippersnapper_gps_GPSConfig *GetGPSConfigMsg();
3131
// GPSEvent API
3232
void CreateGPSEvent();
33+
bool EncodeGPSEvent();
34+
wippersnapper_gps_GPSEvent *GetGPSEvent();
3335
wippersnapper_gps_GPSDateTime CreateGpsDatetime(uint8_t hour, uint8_t minute,
3436
uint8_t seconds,
3537
uint8_t milliseconds,
3638
uint8_t day, uint8_t month,
3739
uint8_t year);
38-
bool AddGpsEventRMC(wippersnapper_gps_GPSDateTime *datetime,
40+
bool AddGpsEventRMC(wippersnapper_gps_GPSDateTime datetime,
3941
uint8_t fix_status, float lat, char *lat_dir, float lon,
4042
char *lon_dir, float speed, float angle);
4143

42-
bool AddGpsEventGGA(wippersnapper_gps_GPSDateTime *datetime,
44+
bool AddGpsEventGGA(wippersnapper_gps_GPSDateTime datetime,
4345
uint8_t fix_status, float lat, char *lat_dir, float lon,
4446
char *lon_dir, uint8_t num_sats, float hdop, float alt,
4547
float geoid_height);

0 commit comments

Comments
 (0)