@@ -91,13 +91,12 @@ GPSModel::CreateGpsDatetime(uint8_t hour, uint8_t minute, uint8_t seconds,
91
91
}
92
92
93
93
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) {
98
97
// Check if we've reached the maximum number of RMC responses
99
98
if (_msg_gps_event.rmc_responses_count >= MAX_COUNT_RMC_GGA) {
100
- return false ; // Cannot add more RMC responses
99
+ return false ;
101
100
}
102
101
103
102
// Validate pointers have been provided correctly
@@ -124,8 +123,8 @@ bool GPSModel::AddGpsEventRMC(wippersnapper_gps_GPSDateTime *datetime,
124
123
rmc_response.fix_status [1 ] = ' \0 ' ;
125
124
126
125
// 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 );
129
128
strncpy (rmc_response.lat_dir , lat_dir, sizeof (rmc_response.lat_dir ) - 1 );
130
129
rmc_response.lat_dir [sizeof (rmc_response.lat_dir ) - 1 ] = ' \0 ' ;
131
130
strncpy (rmc_response.lon_dir , lon_dir, sizeof (rmc_response.lon_dir ) - 1 );
@@ -134,10 +133,63 @@ bool GPSModel::AddGpsEventRMC(wippersnapper_gps_GPSDateTime *datetime,
134
133
// Fill current speed over ground, in knots
135
134
snprintf (rmc_response.speed , sizeof (rmc_response.speed ), " %.1f" , speed);
136
135
// 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);
138
137
139
138
_msg_gps_event.rmc_responses [_msg_gps_event.rmc_responses_count ] =
140
139
rmc_response;
141
140
_msg_gps_event.rmc_responses_count ++;
142
141
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 ;
143
195
}
0 commit comments