Skip to content

Commit 97d20ea

Browse files
committed
GPS - Fill GGA
1 parent c4aca50 commit 97d20ea

File tree

2 files changed

+68
-10
lines changed

2 files changed

+68
-10
lines changed

src/components/gps/model.cpp

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,12 @@ GPSModel::CreateGpsDatetime(uint8_t hour, uint8_t minute, uint8_t seconds,
9191
}
9292

9393
bool GPSModel::AddGpsEventRMC(wippersnapper_gps_GPSDateTime *datetime,
94-
uint8_t fix_status, nmea_float_t latitude,
95-
char *lat_dir, nmea_float_t longitude,
96-
char *lon_dir, nmea_float_t speed,
97-
nmea_float_t angle) {
94+
uint8_t fix_status, nmea_float_t lat,
95+
char *lat_dir, nmea_float_t lon, char *lon_dir,
96+
nmea_float_t speed, nmea_float_t angle) {
9897
// Check if we've reached the maximum number of RMC responses
9998
if (_msg_gps_event.rmc_responses_count >= MAX_COUNT_RMC_GGA) {
100-
return false; // Cannot add more RMC responses
99+
return false;
101100
}
102101

103102
// Validate pointers have been provided correctly
@@ -124,8 +123,8 @@ bool GPSModel::AddGpsEventRMC(wippersnapper_gps_GPSDateTime *datetime,
124123
rmc_response.fix_status[1] = '\0';
125124

126125
// Fill lat/lon and direction
127-
snprintf(rmc_response.lat, sizeof(rmc_response.lat), "%.6f", latitude);
128-
snprintf(rmc_response.lon, sizeof(rmc_response.lon), "%.6f", longitude);
126+
snprintf(rmc_response.lat, sizeof(rmc_response.lat), "%.6f", lat);
127+
snprintf(rmc_response.lon, sizeof(rmc_response.lon), "%.6f", lon);
129128
strncpy(rmc_response.lat_dir, lat_dir, sizeof(rmc_response.lat_dir) - 1);
130129
rmc_response.lat_dir[sizeof(rmc_response.lat_dir) - 1] = '\0';
131130
strncpy(rmc_response.lon_dir, lon_dir, sizeof(rmc_response.lon_dir) - 1);
@@ -134,10 +133,63 @@ bool GPSModel::AddGpsEventRMC(wippersnapper_gps_GPSDateTime *datetime,
134133
// Fill current speed over ground, in knots
135134
snprintf(rmc_response.speed, sizeof(rmc_response.speed), "%.1f", speed);
136135
// Fill course in degrees from true north
137-
snprintf(rmc_response.angle, sizeof(rmc_response.angle) "%.1f", angle);
136+
snprintf(rmc_response.angle, sizeof(rmc_response.angle), "%.1f", angle);
138137

139138
_msg_gps_event.rmc_responses[_msg_gps_event.rmc_responses_count] =
140139
rmc_response;
141140
_msg_gps_event.rmc_responses_count++;
142141
return true;
142+
}
143+
144+
bool GPSModel::AddGpsEventGGA(wippersnapper_gps_GPSDateTime *datetime,
145+
uint8_t fix_status, nmea_float_t lat,
146+
char *lat_dir, nmea_float_t lon, char *lon_dir,
147+
uint8_t num_sats, nmea_float_t hdop,
148+
nmea_float_t alt, nmea_float_t geoid_height) {
149+
150+
// Check if we've reached the maximum number of RMC responses
151+
if (_msg_gps_event.gga_responses_count >= MAX_COUNT_RMC_GGA) {
152+
return false;
153+
}
154+
155+
// Validate pointers have been provided correctly
156+
if (!lat_dir || !lon_dir) {
157+
return false;
158+
}
159+
160+
wippersnapper_gps_GPGGAResponse gga_response;
161+
gga_response = wippersnapper_gps_GPGGAResponse_init_zero;
162+
// Assign the datetime, if provided
163+
if (datetime) {
164+
gga_response.has_datetime = true;
165+
gga_response.datetime = *datetime;
166+
} else {
167+
gga_response.has_datetime = false;
168+
}
169+
170+
// Fill lat/lon and direction
171+
snprintf(gga_response.lat, sizeof(gga_response.lat), "%.6f", lat);
172+
snprintf(gga_response.lon, sizeof(gga_response.lon), "%.6f", lon);
173+
strncpy(gga_response.lat_dir, lat_dir, sizeof(gga_response.lat_dir) - 1);
174+
gga_response.lat_dir[sizeof(gga_response.lat_dir) - 1] = '\0';
175+
strncpy(gga_response.lon_dir, lon_dir, sizeof(gga_response.lon_dir) - 1);
176+
gga_response.lon_dir[sizeof(gga_response.lon_dir) - 1] = '\0';
177+
178+
// Determine the fix quality
179+
gga_response.fix_quality = (uint32_t)fix_status;
180+
// Fill number of satellites in use
181+
gga_response.num_satellites = (uint32_t)num_sats;
182+
183+
// Fill horizontal dilution of precision
184+
snprintf(gga_response.hdop, sizeof(gga_response.hdop), "%.1f", hdop);
185+
// Fill altitude in meters above MSL
186+
snprintf(gga_response.altitude, sizeof(gga_response.altitude), "%.1f", alt);
187+
// Fill geoid height in meters
188+
snprintf(gga_response.geoid_height, sizeof(gga_response.geoid_height), "%.1f",
189+
geoid_height);
190+
191+
_msg_gps_event.gga_responses[_msg_gps_event.gga_responses_count] =
192+
gga_response;
193+
_msg_gps_event.gga_responses_count++;
194+
return true;
143195
}

src/components/gps/model.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,16 @@ class GPSModel {
3636
uint8_t day, uint8_t month,
3737
uint8_t year);
3838
bool AddGpsEventRMC(wippersnapper_gps_GPSDateTime *datetime,
39-
uint8_t fix_status, nmea_float_t latitude, char *lat_dir,
40-
nmea_float_t longitude, char *lon_dir, nmea_float_t speed,
39+
uint8_t fix_status, nmea_float_t lat, char *lat_dir,
40+
nmea_float_t lon, char *lon_dir, nmea_float_t speed,
4141
nmea_float_t angle);
4242

43+
bool AddGpsEventGGA(wippersnapper_gps_GPSDateTime *datetime,
44+
uint8_t fix_status, nmea_float_t lat, char *lat_dir,
45+
nmea_float_t lon, char *lon_dir, uint8_t num_sats,
46+
nmea_float_t hdop, nmea_float_t alt,
47+
nmea_float_t geoid_height);
48+
4349
private:
4450
wippersnapper_gps_GPSConfig _msg_gps_config; ///< GPS configuration message
4551
wippersnapper_gps_GPSEvent _msg_gps_event; ///< GPS event message

0 commit comments

Comments
 (0)