179 lines
5.5 KiB
C
179 lines
5.5 KiB
C
|
/*
|
||
|
* Copyright (c) 2023 Trackunit Corporation
|
||
|
*
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*/
|
||
|
|
||
|
#ifndef ZEPHYR_DRIVERS_GNSS_GNSS_NMEA0183_H_
|
||
|
#define ZEPHYR_DRIVERS_GNSS_GNSS_NMEA0183_H_
|
||
|
|
||
|
#include <zephyr/drivers/gnss.h>
|
||
|
|
||
|
/**
|
||
|
* @brief Compute NMEA0183 checksum
|
||
|
*
|
||
|
* @example "PAIR002" -> 0x38
|
||
|
*
|
||
|
* @param str String from which checksum is computed
|
||
|
*
|
||
|
* @retval checksum
|
||
|
*/
|
||
|
uint8_t gnss_nmea0183_checksum(const char *str);
|
||
|
|
||
|
/**
|
||
|
* @brief Encapsulate str in NMEA0183 message format
|
||
|
*
|
||
|
* @example "PAIR%03u", 2 -> "$PAIR002*38"
|
||
|
*
|
||
|
* @param str Destination for encapsulated string
|
||
|
* @param size Size of destination for encapsulated string
|
||
|
* @param fmt Format of string to encapsulate
|
||
|
* @param ... Arguments
|
||
|
*
|
||
|
* @retval checksum
|
||
|
*/
|
||
|
int gnss_nmea0183_snprintk(char *str, size_t size, const char *fmt, ...);
|
||
|
|
||
|
/**
|
||
|
* @brief Computes and validates checksum
|
||
|
*
|
||
|
* @param argv Array of arguments split by ',' including message id and checksum
|
||
|
* @param argc Number of arguments in argv
|
||
|
*
|
||
|
* @retval true if message is intact
|
||
|
* @retval false if message is corrupted
|
||
|
*/
|
||
|
bool gnss_nmea0183_validate_message(char **argv, uint16_t argc);
|
||
|
|
||
|
/**
|
||
|
* @brief Parse a ddmm.mmmm formatted angle to nano degrees
|
||
|
*
|
||
|
* @example "5610.9928" -> 56183214000
|
||
|
*
|
||
|
* @param ddmm_mmmm String representation of angle in ddmm.mmmm format
|
||
|
* @param ndeg Result in nano degrees
|
||
|
*
|
||
|
* @retval -EINVAL if ddmm_mmmm argument is invalid
|
||
|
* @retval 0 if parsed successfully
|
||
|
*/
|
||
|
int gnss_nmea0183_ddmm_mmmm_to_ndeg(const char *ddmm_mmmm, int64_t *ndeg);
|
||
|
|
||
|
/**
|
||
|
* @brief Parse knots to millimeters pr second
|
||
|
*
|
||
|
* @example "15.231" -> 7835
|
||
|
*
|
||
|
* @param str String representation of speed in knots
|
||
|
* @param mms Destination for speed in millimeters pr second
|
||
|
*
|
||
|
* @retval -EINVAL if str could not be parsed or if speed is negative
|
||
|
* @retval 0 if parsed successfully
|
||
|
*/
|
||
|
int gnss_nmea0183_knots_to_mms(const char *str, int64_t *mms);
|
||
|
|
||
|
/**
|
||
|
* @brief Parse hhmmss.sss to struct gnss_time
|
||
|
*
|
||
|
* @example "133243.012" -> { .hour = 13, .minute = 32, .ms = 43012 }
|
||
|
* @example "133243" -> { .hour = 13, .minute = 32, .ms = 43000 }
|
||
|
*
|
||
|
* @param str String representation of hours, minutes, seconds and subseconds
|
||
|
* @param utc Destination for parsed time
|
||
|
*
|
||
|
* @retval -EINVAL if str could not be parsed
|
||
|
* @retval 0 if parsed successfully
|
||
|
*/
|
||
|
int gnss_nmea0183_parse_hhmmss(const char *hhmmss, struct gnss_time *utc);
|
||
|
|
||
|
/**
|
||
|
* @brief Parse ddmmyy to unsigned integers
|
||
|
*
|
||
|
* @example "041122" -> { .mday = 4, .month = 11, .year = 22 }
|
||
|
*
|
||
|
* @param str String representation of speed in knots
|
||
|
* @param utc Destination for parsed time
|
||
|
*
|
||
|
* @retval -EINVAL if str could not be parsed
|
||
|
* @retval 0 if parsed successfully
|
||
|
*/
|
||
|
int gnss_nmea0183_parse_ddmmyy(const char *ddmmyy, struct gnss_time *utc);
|
||
|
|
||
|
/**
|
||
|
* @brief Parses NMEA0183 RMC message
|
||
|
*
|
||
|
* @details Parses the time, date, latitude, longitude, speed, and bearing
|
||
|
* from the NMEA0183 RMC message provided as an array of strings split by ','
|
||
|
*
|
||
|
* @param argv Array of arguments split by ',' including message id and checksum
|
||
|
* @param argc Number of arguments in argv'
|
||
|
* @param data Destination for data parsed from NMEA0183 RMC message
|
||
|
*
|
||
|
* @retval 0 if successful
|
||
|
* @retval -EINVAL if input is invalid
|
||
|
*/
|
||
|
int gnss_nmea0183_parse_rmc(const char **argv, uint16_t argc, struct gnss_data *data);
|
||
|
|
||
|
/**
|
||
|
* @brief Parses NMEA0183 GGA message
|
||
|
*
|
||
|
* @details Parses the GNSS fix quality and status, number of satellites used for
|
||
|
* fix, HDOP, and altitude (geoid separation) from the NMEA0183 GGA message provided
|
||
|
* as an array of strings split by ','
|
||
|
*
|
||
|
* @param argv Array of arguments split by ',' including message id and checksum
|
||
|
* @param argc Number of arguments in argv'
|
||
|
* @param data Destination for data parsed from NMEA0183 GGA message
|
||
|
*
|
||
|
* @retval 0 if successful
|
||
|
* @retval -EINVAL if input is invalid
|
||
|
*/
|
||
|
int gnss_nmea0183_parse_gga(const char **argv, uint16_t argc, struct gnss_data *data);
|
||
|
|
||
|
/** GSV header structure */
|
||
|
struct gnss_nmea0183_gsv_header {
|
||
|
/** Indicates the system of the space-vehicles contained in the message */
|
||
|
enum gnss_system system;
|
||
|
/** Number of GSV messages in total */
|
||
|
uint16_t number_of_messages;
|
||
|
/** Number of this GSV message */
|
||
|
uint16_t message_number;
|
||
|
/** Number of visible space-vehicles */
|
||
|
uint16_t number_of_svs;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief Parses header of NMEA0183 GSV message
|
||
|
*
|
||
|
* @details The GSV messages are part of a list of messages sent in ascending
|
||
|
* order, split by GNSS system.
|
||
|
*
|
||
|
* @param argv Array of arguments split by ',' including message id and checksum
|
||
|
* @param argc Number of arguments in argv
|
||
|
* @param header Destination for parsed NMEA0183 GGA message header
|
||
|
*
|
||
|
* @retval 0 if successful
|
||
|
* @retval -EINVAL if input is invalid
|
||
|
*/
|
||
|
int gnss_nmea0183_parse_gsv_header(const char **argv, uint16_t argc,
|
||
|
struct gnss_nmea0183_gsv_header *header);
|
||
|
|
||
|
/**
|
||
|
* @brief Parses space-vehicles in NMEA0183 GSV message
|
||
|
*
|
||
|
* @details The NMEA0183 GSV message contains up to 4 space-vehicles which follow
|
||
|
* the header.
|
||
|
*
|
||
|
* @param argv Array of arguments split by ',' including message id and checksum
|
||
|
* @param argc Number of arguments in argv
|
||
|
* @param satellites Destination for parsed satellites from NMEA0183 GGA message
|
||
|
* @param size Size of destination for parsed satellites from NMEA0183 GGA message
|
||
|
*
|
||
|
* @retval Number of parsed space-vehicles stored at destination if successful
|
||
|
* @retval -ENOMEM if all space-vehicles in message could not be stored at destination
|
||
|
* @retval -EINVAL if input is invalid
|
||
|
*/
|
||
|
int gnss_nmea0183_parse_gsv_svs(const char **argv, uint16_t argc,
|
||
|
struct gnss_satellite *satellites, uint16_t size);
|
||
|
|
||
|
#endif /* ZEPHYR_DRIVERS_GNSS_GNSS_NMEA0183_H_ */
|