Nmea0183Parser/Solutions/Src/Nmea_Gsa.c

51 lines
1.5 KiB
C

//
// Created by villuton on 26.03.25.
//
#include <stddef.h>
#include <stdbool.h>
#include "Nmea_Gsa.h"
#include "Nmea0183Parser_Private.h"
#include "Nmea_Config.h"
/**
*
* @param str NMEA string with GSA solutions
* @param len len GSA string
* @param result < (0) tNmeaGSA struct
* @return TRUE if parsing complete
*/
bool NmeaGsa_Parse(char *str, size_t len, tNmeaGSA *result)
{
char *end = str + len;
char *front = str;
char *nextDivider = front - 1;
result->fix_mode =
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
*front : GSA_FIX_MODE_EMPTY;
result->fix_type =
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
Nmea0183ParseShortCharsDecimalNumber(front,nextDivider - front) : GSA_NaN;
for(int i = 0; i < NMEA_MAXSAT; i++)
{
result->sat_prn[i] =
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
Nmea0183ParseShortCharsDecimalNumber(front,nextDivider - front) : GSA_FIX_MODE_EMPTY;
}
result->PDOP =
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
Nmea0183ParseDouble(front, nextDivider - front) : 0;
result->HDOP =
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
Nmea0183ParseDouble(front, nextDivider - front) : 0;
result->VDOP =
(Nmea0183ParseNextPortion(&front, &nextDivider, end) > 0) ?
Nmea0183ParseDouble(front, nextDivider - front) : 0;
return true;
}