Nmea0183Parser/Solutions/Src/Nmea_Rmc.c

79 lines
2.4 KiB
C

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