// // Created by villuton on 25.03.25. // #include #include "Nmea_Rmc.h" #include "Nmea0183Parser_Private.h" #include "Nmea_Config.h" /** * * @param str NMEA string with RMC solutions * @param len len NMEA string * @param result < (0) tNmeaRMC struct * @return TRUE if parsing complete */ bool NmeaRmc_Parse(char *str, size_t len, tNmeaRMC *result) { char *end = str + len; char *front = str; char *nextDivider = front - 1; result->status = RMC_STATUS_NotValid; if (Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) { if (!Nmea0183ParseUtc(front, nextDivider, &result->time.utc)) { return false; } } else { result->time.utc = (tNmeaUtc){0}; } result->status = (Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ? *front : RMC_STATUS_NotValid; 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->speed = (Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ? Nmea0183ParseDouble(front, nextDivider - front) : 0; result->direction = (Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ? Nmea0183ParseDouble(front, nextDivider - front) : 0; if (Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) { if (!Nmea0183ParseDate(front, nextDivider, &result->time.date)) { return false; } } else { result->time.date = (tNmeaDate){0}; } result->declination = (Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ? Nmea0183ParseDouble(front, nextDivider - front) : 0; result->declin_ew = (Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ? *front : 0; result->mode = (Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ? *front : RMC_MODE_NotValid; return true; }