/* * Copyright (c) 2023 Trackunit Corporation * * SPDX-License-Identifier: Apache-2.0 */ /* * The GNSS NMEA0183 match is a set of modem_chat match handlers and a context to be * passed to said handlers, to parse the NMEA0183 messages received from a NMEA0183 * based GNSS device. * * The context struct gnss_nmea0183_match_data *data is placed as the first member * of the data structure which is passed to the modem_chat instance through the * user_data member. * * struct my_gnss_nmea0183_driver { * gnss_nmea0183_match_data match_data; * ... * }; * * The struct gnss_nmea0183_match_data context must be initialized using * gnss_nmea0183_match_init(). * * When initializing the modem_chat instance, the three match callbacks must be added * as part of the unsolicited matches. * * MODEM_CHAT_MATCHES_DEFINE(unsol_matches, * MODEM_CHAT_MATCH_WILDCARD("$??GGA,", ",*", gnss_nmea0183_match_gga_callback), * MODEM_CHAT_MATCH_WILDCARD("$??RMC,", ",*", gnss_nmea0183_match_rmc_callback), * #if CONFIG_GNSS_SATELLITES * MODEM_CHAT_MATCH_WILDCARD("$??GSV,", ",*", gnss_nmea0183_match_gsv_callback), * #endif * */ #ifndef ZEPHYR_DRIVERS_GNSS_GNSS_NMEA0183_MATCH_H_ #define ZEPHYR_DRIVERS_GNSS_GNSS_NMEA0183_MATCH_H_ #include #include #include #include struct gnss_nmea0183_match_data { const struct device *gnss; struct gnss_data data; #if CONFIG_GNSS_SATELLITES struct gnss_satellite *satellites; uint16_t satellites_size; uint16_t satellites_length; #endif uint32_t gga_utc; uint32_t rmc_utc; uint8_t gsv_message_number; }; /** GNSS NMEA0183 match configuration structure */ struct gnss_nmea0183_match_config { /** The GNSS device from which the data is published */ const struct device *gnss; #if CONFIG_GNSS_SATELLITES /** Buffer for parsed satellites */ struct gnss_satellite *satellites; /** Number of elements in buffer for parsed satellites */ uint16_t satellites_size; #endif }; /** * @brief Match callback for the NMEA GGA NMEA0183 message * * @details Should be used as the callback of a modem_chat match which matches "$??GGA," */ void gnss_nmea0183_match_gga_callback(struct modem_chat *chat, char **argv, uint16_t argc, void *user_data); /** * @brief Match callback for the NMEA RMC NMEA0183 message * * @details Should be used as the callback of a modem_chat match which matches "$??RMC," */ void gnss_nmea0183_match_rmc_callback(struct modem_chat *chat, char **argv, uint16_t argc, void *user_data); /** * @brief Match callback for the NMEA GSV NMEA0183 message * * @details Should be used as the callback of a modem_chat match which matches "$??GSV," */ void gnss_nmea0183_match_gsv_callback(struct modem_chat *chat, char **argv, uint16_t argc, void *user_data); /** * @brief Initialize a GNSS NMEA0183 match instance * * @param data GNSS NMEA0183 match instance to initialize * @param config Configuration to apply to GNSS NMEA0183 match instance */ int gnss_nmea0183_match_init(struct gnss_nmea0183_match_data *data, const struct gnss_nmea0183_match_config *config); #endif /* ZEPHYR_DRIVERS_GNSS_GNSS_NMEA0183_MATCH_H_ */