Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions _test/driver/gps/cases/NMEA_inputs.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
"$GPVTG,90.16,T,,M,1.75,N,3.2,K,A*31",
"$GPGGA,134733.000,5540.3231,N,01231.2938,E,1,10,0.8,24.9,M,41.5,M,,0000*6D",
"$GPRMC,134733.000,A,5540.3231,N,01231.2938,E,1.83,113.00,041112,,,A*67",
"$GPRMC,134733.000,V,0000.0000,N,00000.0000,E,1.83,000.00,041112,,,A*67",
"$GPRMC,111111.111,V,1111.1111,N,11111.1111,E,1.83,111.11,041112,,,A*67",
"$GPGGA,134734.000,5540.3233,S,01231.2941,W,1,10,0.8,23.7,M,41.5,M,,0000*6F",
"$GPRMC,134734.000,A,5540.3233,N,01231.2941,E,1.23,107.22,041112,,,A*63",
"$GPGSA,A,3,03,22,06,19,11,14,32,01,28,18,,,1.8,0.8,1.6*3F",
"$GPGLL,3953.88008971,N,10506.75318910,W,034138.00,A,D*7A",
"$GPGLL,5109.0262317,N,11401.8407304,W,202725.00,A,D*79",
"$GPGLL,,,,,,,",


"$GPGLL,0000.0000000,N,00000.0000000,W,000000.00,V,D*79",
"$GPGLL,1111.1111111,N,11111.1111111,W,111111.11,V,D*79",
"$GPGLL,,,,,,,",
4 changes: 4 additions & 0 deletions _test/driver/gps/cases/gps_parse_actual.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,13 @@
0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0.000000,0.000000,0,0,1.750000,0.000000,0,0,90.160004,T,0.000000,M,N,3.200000,K
55.672054,12.521564,0.000000,1231.293823,5540.323242,134733.000000,N,E,1,10,0.800000,24.900000,M,0,0.000000,0.000000,0,0,0.000000,0,0.000000,0,0,0.000000,0
55.672054,12.521564,0.000000,1231.293823,5540.323242,134733.000000,N,E,0,0,0.000000,0.000000,0,A,1.830000,113.000000,41112,0,0.000000,0,0.000000,0,0,0.000000,0
55.672054,12.521564,0.000000,1231.293823,5540.323242,134733.000000,N,E,0,0,0.000000,0.000000,0,V,1.830000,113.000000,41112,0,0.000000,0,0.000000,0,0,0.000000,0
55.672054,12.521564,0.000000,1231.293823,5540.323242,134733.000000,N,E,0,0,0.000000,0.000000,0,V,1.830000,113.000000,41112,0,0.000000,0,0.000000,0,0,0.000000,0
-55.672054,-12.521567,0.000000,1231.294067,5540.323242,134734.000000,S,W,1,10,0.800000,23.700001,M,0,0.000000,0.000000,0,0,0.000000,0,0.000000,0,0,0.000000,0
55.672054,12.521567,0.000000,1231.294067,5540.323242,134734.000000,N,E,0,0,0.000000,0.000000,0,A,1.230000,107.220001,41112,0,0.000000,0,0.000000,0,0,0.000000,0
0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,0,0.000000,0,0.000000,0,0,0.000000,0
39.898003,-105.112549,0.000000,10506.752930,3953.880127,34138.000000,N,W,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,A,0.000000,0,0.000000,0,0,0.000000,0
51.150440,-114.030678,0.000000,11401.840820,5109.026367,202725.000000,N,W,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,A,0.000000,0,0.000000,0,0,0.000000,0
51.150440,-114.030678,0.000000,11401.840820,5109.026367,202725.000000,N,W,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,V,0.000000,0,0.000000,0,0,0.000000,0
51.150440,-114.030678,0.000000,11401.840820,5109.026367,202725.000000,N,W,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,V,0.000000,0,0.000000,0,0,0.000000,0
0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,0,0.000000,0,0.000000,0,0,0.000000,0
4 changes: 4 additions & 0 deletions _test/driver/gps/cases/gps_parse_expected.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,13 @@
"0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0.000000,0.000000,0,0,1.750000,0.000000,0,0,90.160004,T,0.000000,M,N,3.200000,K",
"55.672054,12.521564,0.000000,1231.293823,5540.323242,134733.000000,N,E,1,10,0.800000,24.900000,M,0,0.000000,0.000000,0,0,0.000000,0,0.000000,0,0,0.000000,0",
"55.672054,12.521564,0.000000,1231.293823,5540.323242,134733.000000,N,E,0,0,0.000000,0.000000,0,A,1.830000,113.000000,41112,0,0.000000,0,0.000000,0,0,0.000000,0",
"55.672054,12.521564,0.000000,1231.293823,5540.323242,134733.000000,N,E,0,0,0.000000,0.000000,0,V,1.830000,113.000000,41112,0,0.000000,0,0.000000,0,0,0.000000,0",
"55.672054,12.521564,0.000000,1231.293823,5540.323242,134733.000000,N,E,0,0,0.000000,0.000000,0,V,1.830000,113.000000,41112,0,0.000000,0,0.000000,0,0,0.000000,0",
"-55.672054,-12.521567,0.000000,1231.294067,5540.323242,134734.000000,S,W,1,10,0.800000,23.700001,M,0,0.000000,0.000000,0,0,0.000000,0,0.000000,0,0,0.000000,0",
"55.672054,12.521567,0.000000,1231.294067,5540.323242,134734.000000,N,E,0,0,0.000000,0.000000,0,A,1.230000,107.220001,41112,0,0.000000,0,0.000000,0,0,0.000000,0",
"0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,0,0.000000,0,0.000000,0,0,0.000000,0",
"39.898003,-105.112549,0.000000,10506.752930,3953.880127,34138.000000,N,W,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,A,0.000000,0,0.000000,0,0,0.000000,0",
"51.150440,-114.030678,0.000000,11401.840820,5109.026367,202725.000000,N,W,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,A,0.000000,0,0.000000,0,0,0.000000,0",
"51.150440,-114.030678,0.000000,11401.840820,5109.026367,202725.000000,N,W,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,V,0.000000,0,0.000000,0,0,0.000000,0",
"51.150440,-114.030678,0.000000,11401.840820,5109.026367,202725.000000,N,W,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,V,0.000000,0,0.000000,0,0,0.000000,0",
"0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0.000000,0.000000,0,0,0.000000,0.000000,0,0,0.000000,0,0.000000,0,0,0.000000,0"
2 changes: 1 addition & 1 deletion _test/driver/gps/test_gps.c
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ void test_GPS_parse
/*------------------------------------------------------------------------------
Initializations
------------------------------------------------------------------------------*/
int num_cases = 15;
int num_cases = 19;
char buffer[200] = ""; // An NMEA message is 82 characters, but the way we parse may end up with more in order to represent the struct

// Source: https://github.com/esutton/gps-nmea-log-files/blob/master/AMOD_AGL3080_20121104_134730.txt
Expand Down
99 changes: 82 additions & 17 deletions gps/gps.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@
Global Variables
------------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------
Local Variables
------------------------------------------------------------------------------*/
static GPS_DATA gps_last_valid_rmc_data;
static GPS_DATA gps_last_valid_gll_data;

/*------------------------------------------------------------------------------
Procedures
------------------------------------------------------------------------------*/
Expand Down Expand Up @@ -280,12 +286,18 @@ int gps_mesg_validate(char *nmeastr){
* *
*******************************************************************************/
void GPS_parse(GPS_DATA* gps_ptr, char *GPSstrParse){




/* Get message type */
char token[8]; // Needs to be 8 chars for memory alignment
strncpy(token, GPSstrParse, 6);
token[6] = '\0';
int idx = 7; /* Skips "$GPXXX,"*/



/* Parse by message type */
if (!strcmp(token, "$GPGGA"))
{
Expand All @@ -303,27 +315,80 @@ if (!strcmp(token, "$GPGGA"))
}
else if (!strcmp(token, "$GPRMC"))
{
gps_ptr->utc_time = gps_string_to_float(GPSstrParse, &idx);
gps_ptr->rmc_status = gps_string_to_char(GPSstrParse, &idx); /* unused */
gps_ptr->nmea_latitude = gps_string_to_float(GPSstrParse, &idx);
gps_ptr->ns = gps_string_to_char(GPSstrParse, &idx);
gps_ptr->nmea_longitude = gps_string_to_float(GPSstrParse, &idx);
gps_ptr->ew = gps_string_to_char(GPSstrParse, &idx);
gps_ptr->speed_k = gps_string_to_float(GPSstrParse, &idx);
gps_ptr->course_d = gps_string_to_float(GPSstrParse, &idx);
gps_ptr->date = (int)(0.5 + gps_string_to_float(GPSstrParse, &idx));
gps_conv_latitude_longitude( gps_ptr );
/* Parse data */
float utc_time = gps_string_to_float(GPSstrParse, &idx);
char rmc_status = gps_string_to_char(GPSstrParse, &idx);
float nmea_latitude = gps_string_to_float(GPSstrParse, &idx);
char ns = gps_string_to_char(GPSstrParse, &idx);
float nmea_longitude = gps_string_to_float(GPSstrParse, &idx);
char ew = gps_string_to_char(GPSstrParse, &idx);
float speed_k = gps_string_to_float(GPSstrParse, &idx);
float course_d = gps_string_to_float(GPSstrParse, &idx);
int date = (int)(0.5 + gps_string_to_float(GPSstrParse, &idx));

/* Save status */
gps_ptr->rmc_status = rmc_status;

/* Save rest of data only if status is A: Active */
if ( rmc_status == 'A' )
{
gps_ptr->utc_time = utc_time;
gps_ptr->nmea_latitude = nmea_latitude;
gps_ptr->ns = ns;
gps_ptr->nmea_longitude = nmea_longitude;
gps_ptr->ew = ew;
gps_ptr->speed_k = speed_k;
gps_ptr->course_d = course_d;
gps_ptr->date = date;
gps_conv_latitude_longitude( gps_ptr );

/* Update last valid data */
gps_last_valid_rmc_data = *gps_ptr;
}
/* Discard new data, use last valid data instead if the status is V: Void */
else if ( rmc_status == 'V' )
{
*gps_ptr = gps_last_valid_rmc_data;

/* Re-save rmc_status since the previous statement may override it */
gps_ptr->rmc_status = rmc_status;
}
}
else if (!strcmp(token, "$GPGLL"))
{
gps_ptr->nmea_latitude = gps_string_to_float(GPSstrParse, &idx);
gps_ptr->ns = gps_string_to_char(GPSstrParse, &idx);
gps_ptr->nmea_longitude = gps_string_to_float(GPSstrParse, &idx);
gps_ptr->ew = gps_string_to_char(GPSstrParse, &idx);
gps_ptr->utc_time = gps_string_to_float(GPSstrParse, &idx);
gps_ptr->gll_status = gps_string_to_char(GPSstrParse, &idx);
gps_conv_latitude_longitude( gps_ptr );
/* Parse data */
float nmea_latitude = gps_string_to_float(GPSstrParse, &idx);
char ns = gps_string_to_char(GPSstrParse, &idx);
float nmea_longitude = gps_string_to_float(GPSstrParse, &idx);
char ew = gps_string_to_char(GPSstrParse, &idx);
float utc_time = gps_string_to_float(GPSstrParse, &idx);
char gll_status = gps_string_to_char(GPSstrParse, &idx);

/* Store status */
gps_ptr->gll_status = gll_status;

/* Save rest of data only if status is A: Data Valid */
if (gll_status == 'A')

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oof ik i didnt follow parentheses spacing standards when i wrote this function so this is fine for consistency. still sadge, don't ever let sophomore me write code again

{
gps_ptr->nmea_latitude = nmea_latitude;
gps_ptr->ns = ns;
gps_ptr->nmea_longitude = nmea_longitude;
gps_ptr->ew = ew;
gps_ptr->utc_time = utc_time;
gps_conv_latitude_longitude( gps_ptr );

gps_last_valid_gll_data = *gps_ptr;
}
else if (gll_status == 'V')
{
*gps_ptr = gps_last_valid_gll_data;

/* Resave gll status since the previous statement may override it */
gps_ptr->gll_status = gll_status;
}
}


else if (!strcmp(token, "$GPVTG"))
{
gps_ptr->course_t = gps_string_to_float(GPSstrParse, &idx);
Expand Down