Add NMEA0183 Parser example to illustrate how to use uart event driver together with esp event library to get GPS information.
218 lines
6.8 KiB
C
218 lines
6.8 KiB
C
// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#pragma once
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "esp_types.h"
|
|
#include "esp_event.h"
|
|
#include "esp_err.h"
|
|
#include "driver/uart.h"
|
|
|
|
#define GPS_MAX_SATELLITES_IN_USE (12)
|
|
#define GPS_MAX_SATELLITES_IN_VIEW (16)
|
|
|
|
/**
|
|
* @brief Declare of NMEA Parser Event base
|
|
*
|
|
*/
|
|
ESP_EVENT_DECLARE_BASE(ESP_NMEA_EVENT)
|
|
|
|
/**
|
|
* @brief GPS fix type
|
|
*
|
|
*/
|
|
typedef enum {
|
|
GPS_FIX_INVALID, /*!< Not fixed */
|
|
GPS_FIX_GPS, /*!< GPS */
|
|
GPS_FIX_DGPS, /*!< Differential GPS */
|
|
} gps_fix_t;
|
|
|
|
/**
|
|
* @brief GPS fix mode
|
|
*
|
|
*/
|
|
typedef enum {
|
|
GPS_MODE_INVALID = 1, /*!< Not fixed */
|
|
GPS_MODE_2D, /*!< 2D GPS */
|
|
GPS_MODE_3D /*!< 3D GPS */
|
|
} gps_fix_mode_t;
|
|
|
|
/**
|
|
* @brief GPS satellite information
|
|
*
|
|
*/
|
|
typedef struct {
|
|
uint8_t num; /*!< Satellite number */
|
|
uint8_t elevation; /*!< Satellite elevation */
|
|
uint16_t azimuth; /*!< Satellite azimuth */
|
|
uint8_t snr; /*!< Satellite signal noise ratio */
|
|
} gps_satellite_t;
|
|
|
|
/**
|
|
* @brief GPS time
|
|
*
|
|
*/
|
|
typedef struct {
|
|
uint8_t hour; /*!< Hour */
|
|
uint8_t minute; /*!< Minute */
|
|
uint8_t second; /*!< Second */
|
|
uint16_t thousand; /*!< Thousand */
|
|
} gps_time_t;
|
|
|
|
/**
|
|
* @brief GPS date
|
|
*
|
|
*/
|
|
typedef struct {
|
|
uint8_t day; /*!< Day (start from 1) */
|
|
uint8_t month; /*!< Month (start from 1) */
|
|
uint16_t year; /*!< Year (start from 2000) */
|
|
} gps_date_t;
|
|
|
|
/**
|
|
* @brief NMEA Statement
|
|
*
|
|
*/
|
|
typedef enum {
|
|
STATEMENT_UNKNOWN = 0, /*!< Unknown statement */
|
|
STATEMENT_GGA, /*!< GGA */
|
|
STATEMENT_GSA, /*!< GSA */
|
|
STATEMENT_RMC, /*!< RMC */
|
|
STATEMENT_GSV, /*!< GSV */
|
|
STATEMENT_GLL, /*!< GLL */
|
|
STATEMENT_VTG /*!< VTG */
|
|
} nmea_statement_t;
|
|
|
|
/**
|
|
* @brief GPS object
|
|
*
|
|
*/
|
|
typedef struct {
|
|
float latitude; /*!< Latitude (degrees) */
|
|
float longitude; /*!< Longitude (degrees) */
|
|
float altitude; /*!< Altitude (meters) */
|
|
gps_fix_t fix; /*!< Fix status */
|
|
uint8_t sats_in_use; /*!< Number of satellites in use */
|
|
gps_time_t tim; /*!< time in UTC */
|
|
gps_fix_mode_t fix_mode; /*!< Fix mode */
|
|
uint8_t sats_id_in_use[GPS_MAX_SATELLITES_IN_USE]; /*!< ID list of satellite in use */
|
|
float dop_h; /*!< Horizontal dilution of precision */
|
|
float dop_p; /*!< Position dilution of precision */
|
|
float dop_v; /*!< Vertical dilution of precision */
|
|
uint8_t sats_in_view; /*!< Number of satellites in view */
|
|
gps_satellite_t sats_desc_in_view[GPS_MAX_SATELLITES_IN_VIEW]; /*!< Information of satellites in view */
|
|
gps_date_t date; /*!< Fix date */
|
|
bool valid; /*!< GPS validity */
|
|
float speed; /*!< Ground speed, unit: m/s */
|
|
float cog; /*!< Course over ground */
|
|
float variation; /*!< Magnetic variation */
|
|
} gps_t;
|
|
|
|
/**
|
|
* @brief Configuration of NMEA Parser
|
|
*
|
|
*/
|
|
typedef struct {
|
|
struct {
|
|
uart_port_t uart_port; /*!< UART port number */
|
|
uint32_t rx_pin; /*!< UART Rx Pin number */
|
|
uint32_t baud_rate; /*!< UART baud rate */
|
|
uart_word_length_t data_bits; /*!< UART data bits length */
|
|
uart_parity_t parity; /*!< UART parity */
|
|
uart_stop_bits_t stop_bits; /*!< UART stop bits length */
|
|
uint32_t event_queue_size; /*!< UART event queue size */
|
|
} uart; /*!< UART specific configuration */
|
|
} nmea_parser_config_t;
|
|
|
|
/**
|
|
* @brief NMEA Parser Handle
|
|
*
|
|
*/
|
|
typedef void *nmea_parser_handle_t;
|
|
|
|
/**
|
|
* @brief Default configuration for NMEA Parser
|
|
*
|
|
*/
|
|
#define NMEA_PARSER_CONFIG_DEFAULT() \
|
|
{ \
|
|
.uart = { \
|
|
.uart_port = UART_NUM_1, \
|
|
.rx_pin = 2, \
|
|
.baud_rate = 9600, \
|
|
.data_bits = UART_DATA_8_BITS, \
|
|
.parity = UART_PARITY_DISABLE, \
|
|
.stop_bits = UART_STOP_BITS_1, \
|
|
.event_queue_size = 16 \
|
|
} \
|
|
}
|
|
|
|
/**
|
|
* @brief NMEA Parser Event ID
|
|
*
|
|
*/
|
|
typedef enum {
|
|
GPS_UPDATE, /*!< GPS information has been updated */
|
|
GPS_UNKNOWN /*!< Unknown statements detected */
|
|
} nmea_event_id_t;
|
|
|
|
/**
|
|
* @brief Init NMEA Parser
|
|
*
|
|
* @param config Configuration of NMEA Parser
|
|
* @return nmea_parser_handle_t handle of NMEA parser
|
|
*/
|
|
nmea_parser_handle_t nmea_parser_init(const nmea_parser_config_t *config);
|
|
|
|
/**
|
|
* @brief Deinit NMEA Parser
|
|
*
|
|
* @param nmea_hdl handle of NMEA parser
|
|
* @return esp_err_t ESP_OK on success, ESP_FAIL on error
|
|
*/
|
|
esp_err_t nmea_parser_deinit(nmea_parser_handle_t nmea_hdl);
|
|
|
|
/**
|
|
* @brief Add user defined handler for NMEA parser
|
|
*
|
|
* @param nmea_hdl handle of NMEA parser
|
|
* @param event_handler user defined event handler
|
|
* @param handler_args handler specific arguments
|
|
* @return esp_err_t
|
|
* - ESP_OK: Success
|
|
* - ESP_ERR_NO_MEM: Cannot allocate memory for the handler
|
|
* - ESP_ERR_INVALIG_ARG: Invalid combination of event base and event id
|
|
* - Others: Fail
|
|
*/
|
|
esp_err_t nmea_parser_add_handler(nmea_parser_handle_t nmea_hdl, esp_event_handler_t event_handler, void *handler_args);
|
|
|
|
/**
|
|
* @brief Remove user defined handler for NMEA parser
|
|
*
|
|
* @param nmea_hdl handle of NMEA parser
|
|
* @param event_handler user defined event handler
|
|
* @return esp_err_t
|
|
* - ESP_OK: Success
|
|
* - ESP_ERR_INVALIG_ARG: Invalid combination of event base and event id
|
|
* - Others: Fail
|
|
*/
|
|
esp_err_t nmea_parser_remove_handler(nmea_parser_handle_t nmea_hdl, esp_event_handler_t event_handler);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|