// // Created by villuton on 25.03.25. // #include #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; }