79 lines
2.8 KiB
C
79 lines
2.8 KiB
C
//
|
|
// Created by villuton on 25.03.25.
|
|
//
|
|
#include <stddef.h>
|
|
#include "Nmea_Gga.h"
|
|
#include "Nmea0183Parser_Private.h"
|
|
#include "Nmea_Config.h"
|
|
|
|
bool NmeaGga_Parse(char *str, size_t len, tNmeaGGA *result)
|
|
{
|
|
char *end = str + len;
|
|
char *front = str;
|
|
char *nextDivider = front-1;
|
|
if (Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) {
|
|
if (!Nmea0183ParseUtc(front, nextDivider, &result->utc)) {
|
|
return false;
|
|
}
|
|
} else {
|
|
result->utc = (tNmeaUtc){0};
|
|
}
|
|
result->location.lat =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
|
|
Nmea0183ParseDouble(front, nextDivider - front) : NMEA_DEF_LAT;
|
|
|
|
result->location.ns =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0)?
|
|
*front : 0;
|
|
|
|
result->location.lon =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0)?
|
|
Nmea0183ParseDouble(front, nextDivider - front) : NMEA_DEF_LON;
|
|
|
|
result->location.ew =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
|
|
*front : 0;
|
|
|
|
result->sig =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
|
|
Nmea0183ParseShortCharsDecimalNumber(front,nextDivider - front) : SIG_Invalid;
|
|
|
|
result->satinuse =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
|
|
Nmea0183ParseShortCharsDecimalNumber(front,nextDivider - front) : 0;
|
|
|
|
result->HDOP =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
|
|
Nmea0183ParseDouble(front,nextDivider - front) : 0;
|
|
result->elv =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
|
|
Nmea0183ParseDouble(front,nextDivider - front) : 0;
|
|
result->elv_units =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
|
|
*front : 0;
|
|
result->diff =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
|
|
(*front != DIFF_GEOID_IS_BELOW) ?
|
|
Nmea0183ParseDouble(front,nextDivider - front) : 0
|
|
: 0;
|
|
result->diff_units =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
|
|
*front : 0;
|
|
|
|
if(result->sig == SIG_Differential){
|
|
result->dgps_age =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
|
|
Nmea0183ParseShortCharsDecimalNumber(front,nextDivider - front) : 0;
|
|
result->dgps_sid =
|
|
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
|
|
Nmea0183ParseShortCharsDecimalNumber(front,nextDivider - front) : 0;
|
|
result->dgps_sid =
|
|
((DGPS_SID_MIN <= result->dgps_sid) && (result->dgps_sid<= DGPS_SID_MAX)) ?
|
|
result->dgps_sid : 0;
|
|
} else{
|
|
result->dgps_age = 0;
|
|
result->dgps_sid = 0;
|
|
}
|
|
|
|
return true;
|
|
} |