Nmea0183Parser/Solutions/Src/Nmea_Gga.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;
}