// // Created by xemon on 01.09.22. // #ifndef NMEA_0183_PARSER_NMEA_0183_PARSER_H #define NMEA_0183_PARSER_NMEA_0183_PARSER_H #include "stdint.h" #include "stddef.h" #include "stdbool.h" typedef struct { uint8_t hour; uint8_t minute; uint8_t second; uint16_t millisecond; } tNmeaTimeRmc; typedef struct { uint8_t day; uint8_t month; uint8_t year; } tNmeaDateRmc; typedef struct { double latitude; char nsIndicator; double longitude; double horizontDiluitPrecis; double altitude; char ewIndicator; } tNmeaLocationRmc; typedef struct { double declination; double nsat; double mode; } tNmeaMagneticRmc; typedef struct { char status; tNmeaDateRmc date; tNmeaTimeRmc time; tNmeaLocationRmc location; tNmeaMagneticRmc magnetic; double knotVelocity; double kmhVelocity; double headingAngle; } tNmeaRmc; typedef struct { double lat; double lon; } tLocationPointInDegDouble; typedef struct { float lat; float lon; } tLocationPointInDeg; typedef struct { double latitude; char nsIndicator; double longitude; char ewIndicator; } tNmeaLocationGga; typedef enum { NO_SOLUTIONS = 0, AUTO = 1, DIFF = 2, RTK_FIX = 4, RTK_DIFF = 5, EXTRAPOLATION = 6, FIX_LOCATION = 7, SIMULATE = 8, SBAS = 9, } eNmeaGgaGpsQual; typedef struct { tNmeaTimeRmc time; tNmeaLocationGga location; eNmeaGgaGpsQual qual; uint8_t sats; float hdop; double altitude; char altitudeUnit; double undulation; char undulationUnit; uint8_t ageSec; uint16_t stnID; } tNmeaGga; bool bNmea0183ParseGGA(char *ggaString, size_t len, tNmeaGga *result); uint32_t iNmea0183TimestampFromRmc(tNmeaRmc *env); tLocationPointInDegDouble iNmea0183_DegLocationDoubleFromRmc(tNmeaRmc *env); tLocationPointInDeg iNmea0183_DegLocationFromRmc(tNmeaRmc *env); void vNmea0183Sign(char *str, size_t *strLen); bool bNmea0183ParseRMC(char *rmcString, size_t len, tNmeaRmc *result); bool bNmea0183IsRmcString(char *nmeaString, size_t len); bool bNmea0183IsValidString(char *nmeaString, size_t len); #endif //NMEA_0183_PARSER_NMEA_0183_PARSER__H