79 lines
2.4 KiB
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;
|
|
} |