GPSProvider wrapper library for STMicroelectronics' X-NUCLEO-GNSS1A1 Expansion Board.

Dependents:   TeseoLocation

X_NUCLEO_GNSS1A1 Library

GPS_Provider wrapper library for STMicroelectronics' X-NUCLEO-GNSS1A1 component.

Overview

This library includes drivers for ST’s Teseo-LIV3F Global Navigation Satellite System (GNSS) device and middleware for the NMEA protocol support. This firmware package implements the port of the GPS_Provider to STMicroelectronics' X-NUCLEO-GNSS1A1 GNSS Expansion Board.

The key features of the library are:

  • Complete software to build applications using Teseo-LIV3F GNSS device
  • Middleware for the NMEA protocol support

Furthermore the library provides the following advanced features:

  • Geofencing - allows the Teseo-LIV3F receiver to raise a NMEA message when the resolved GNSS position is close to or entering or exiting from a specific circle
  • Odometer - provides information on the traveled distance using only the resolved GNSS position
  • Data Logging - allows the Teseo-LIV3F receiver to save locally on the flash the resolved GNSS position to be retrieved on demand from the Host

Hardware description

The X-NUCLEO-GNSS1A1 is a Global Navigation Satellite System Expansion Board usable with the STM32 Nucleo system and other Arduino compatible platforms. It is designed around the STMicroelectronics Teseo-LIV3F GNSS receiver IC working on multiple constellations (GPS/Galileo/Glonass/BeiDou/QZSS).

The Teseo-LIV3F module is designed for top performance in a minimal space. Within its 10x10mm compact size, Teseo-LIV3F offers superior accuracy thanks to the on board 26MHz Temperature Compensated Crystal Oscillator (TCXO) and a reduced Time To First Fix (TTFF) relying to its dedicated 32KHz Real Time Clock (RTC) oscillator.

The X-NUCLEO-GNSS1A1, hosting the Teseo-LIV3F, is compatible with Arduino UNO R3 connector layout and interfaces with the MCU via the UART channel. To connect by serial port the GNSS receiver and the host the following parameters must be used:

  • 8 data bits
  • No parity
  • 1 stop bit
  • 9600 bauds

A GPS/GLONASS/Beidou antenna, distributed along with the X-NUCLEO-GNSS1A1 Expansion Board, must be connected to the antenna connector present on the Expansion Board. For the X-NUCLEO-GNSS1A1 proper operations, the following jumper settings must be used:

  • J2 open
  • J3 closed
  • J4 closed
  • J5 open
  • J6 closed
  • J7 closed
  • J8 open
  • J9 closed
  • J10 open
  • J11 closed
  • J12 closed
  • J13 closed
  • J14 closed
  • J15 closed

Tested platforms

This firmware has been tested on STM32 NUCLEO-F401RE

Example Application

To run GNSS example applications using X-NUCLEO-GNSS1A1 Expansion Board based on mbed OS, please refer to TeseoLocation page.

Middlewares/NMEAParser.h

Committer:
apalmieri
Date:
2018-11-09
Revision:
0:a77f1f1f8318

File content as of revision 0:a77f1f1f8318:

/**
*******************************************************************************
* @file    NMEAParser.h
* @author  AST / Central Lab
* @version V1.0.0
* @date    18-May-2017
* @brief   NMEA sentence parser
*
*******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*   1. Redistributions of source code must retain the above copyright notice,
*      this list of conditions and the following disclaimer.
*   2. Redistributions in binary form must reproduce the above copyright notice,
*      this list of conditions and the following disclaimer in the documentation
*      and/or other materials provided with the distribution.
*   3. Neither the name of STMicroelectronics nor the names of its contributors
*      may be used to endorse or promote products derived from this software
*      without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
********************************************************************************
*/

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __NMEA_PARSER_H
#define __NMEA_PARSER_H

#ifdef __cplusplus
extern "C" {
#endif
  
#include <stdio.h>
#include <stdint.h>
  
/** @defgroup Middlewares
 *  @brief Contains all platform independent modules (eg. NMEA Sentence Parser, ...).
 *  @{
 */

/** @defgroup ST
 *  @{
 */
 
/** @defgroup LIB_NMEA
 *  @{
 */

/** @defgroup NMEA_PARSER 
 * @{
 */

/** @addtogroup NMEA_PARSER_CONSTANTS_DEFINITIONS
 * @{
 */
/**
 * @brief Constant that indicates the maximum lenght of an NMEA sentence
 */
#define MAX_NMEA_SENTENCE_LEN 80
   
/**
 * @brief Constant that indicates the maximum number of satellites.
 */  
#define MAX_SAT_NUM 12  
  
/**
 * @brief Constant that indicates the maximum lenght of a string.
 */  
#define MAX_STR_LEN 32   
  
/**
 * @brief Constant that indicates the maximum lenght of NMEA message field.
 */
#define MAX_MSG_LEN 32//19
/**
 * @}
 */  

#define MAX_GEOFENCES_NUM 8

/** @addtogroup NMEA_PARSER_TYPES_DEFINITIONS
 * @{
 */
/**
 * @brief Enumeration structure that containes the types of feature messages
 */
typedef enum {
  GNSS_FEATURE_EN_MSG  = 0,
  GNSS_GEOFENCE_CFG_MSG,
  GNSS_GEOFENCE_STATUS_MSG,
  GNSS_GEOFENCE_ALARM_MSG,
  GNSS_ODO_START_MSG,
  GNSS_ODO_STOP_MSG,
  GNSS_DATALOG_CFG_MSG,
  GNSS_DATALOG_START_MSG,
  GNSS_DATALOG_STOP_MSG,
  GNSS_DATALOG_ERASE_MSG
} ParseFeatureMsg_Typedef;

/**
 * @brief Enumeration structure that containes the two success states of a parsing process
 */
typedef enum {
  PARSE_SUCC = 0,  /**< Success status */
  PARSE_FAIL = 1 /**< Fail status */
} ParseStatus_Typedef;
  
/**
 * @brief Enumeration structure that containes the tipologies of Gps fixing process got from a NMEA string
 */
typedef enum {
  INVALID = 0,          /**< Invalid Fix status */
  VALID = 1,            /**< Valid Fix status */
  DGPS_FIX = 2,         /**< DGPS Fix status */
  PPS_FIX = 3,          /**< PPS Fix status */
  REAL_TIME = 4,        /**< Real Time Fix status */
  FLOAT_REAL_TIME = 5,  /**< Float Real Time Fix status */
  ESTIMATED = 6,        /**< Estimated Fix status */
  MANUAL_MODE = 7,      /**< Manual Mode Fix status */
  SIMULATION_MODE = 8   /**< Simulation Mode Fix status */
} GPS_ValidTypedef;

/**
 * @brief Data structure that contains the coordinates informations
 */
typedef struct Coords {
  double lat;   /**< Latitude */
  double lon;   /**< Longitude */
  float alt;   /**< Altitude */
  uint8_t ns;  /**< Nord / Sud latitude type */
  uint8_t ew;  /**< East / West longitude type */
  uint8_t mis; /**< Altitude unit misure */
} Coords;
  
/**
 * @brief Data structure that contains the Gps geoids informations
 */
typedef struct Geoid_Info {
  int height;   /**< Geoid height */
  uint8_t mis;  /**< Geoid height misure unit */
} Geoid_Info;
  
/**
 * @brief Data structure that contains the UTC informations
 */
typedef struct UTC_Info {
  int utc; /**< UTC Info */
  int hh;  /**< Hours */
  int mm;  /**< Minutes */
  int ss;  /**< Seconds */
} UTC_Info;

/**
 * @brief Data structure that contains the UTC informations
 */
typedef struct GSV_SAT_Info {
  int prn;  /**< PRN */
  int elev; /**< Elevation of satellite in degree, 0 ... 90 */
  int azim; /**< Azimuth of satellite in degree, ref. "North, " 0 ... 359 */
  int cn0;  /**< Carrier to noise ratio for satellite in dB, 0 ... 99 */
} GSV_SAT_Info;  

/**
 * @brief Data structure that contains all of the informations about the GPS position 
 */
typedef struct GPGGA_Infos {
  UTC_Info utc;           /**< UTC Time */
  Coords xyz;             /**< Coords data member */
  float acc;              /**< GPS Accuracy */
  int sats;           /**< Number of satellities acquired */
  GPS_ValidTypedef valid; /**< GPS Signal fix quality */
  Geoid_Info geoid;   /**< Geoids data info member */
  int update;         /**< Update time from the last acquired GPS Info */
  int checksum;           /**< Checksum of the message bytes */
} GPGGA_Infos;

/**
 * @brief Data structure that contains all of the informations about the fix data for single or 
 *        combined satellite navigation system.
 */
typedef struct GNS_Infos {
  char constellation[MAX_STR_LEN]; /**< Constellation enabled: GPGNS (GPS), GLGNS (GLONASS), GAGNS (GALILEO), BDGNS (BEIDOU), QZGNS (QZSS), GNGNS (more than one) */ 
  UTC_Info utc;                    /**< UTC Time */
  Coords xyz;                      /**< Coords data member */
  char gps_mode;                   /**< N = NO Fix, A = Autonomous, D = Differential GPS, E = Estimated (dead reckoning mode) */
  char glonass_mode;               /**< N = NO Fix, A = Autonomous, D = Differential Glonass, E = Estimated (dead reckoning mode) */
  int sats;                    /**< Number of satellities acquired */
  float hdop;                      /**< Horizontal Dilution of Precision, max: 99.0 */
  float geo_sep;                   /**< Geoidal separation, meter */
  char dgnss_age;                  /**< Not supported */
  char dgnss_ref;                  /**< Not supported */
  int checksum;                    /**< Checksum of the message bytes */
} GNS_Infos;

/**
 * @brief Data structure that contains all of the GPS Pseudorange Noise Statistics.
 */
typedef struct GPGST_Infos {
  UTC_Info utc;           /**< UTC Time */
  float EHPE;             /**< Equivalent Horizontal Position Error */
  float semi_major_dev;   /**< Standard deviation (meters) of semi-major axis of error ellipse */
  float semi_minor_dev;   /**< Standard deviation (meters) of semi-minor axis of error ellipse */
  float semi_major_angle; /**< Orientation of semi-major axis of error ellipse (true north degrees) */
  float lat_err_dev;      /**< Standard deviation (meters) of latitude error */
  float lon_err_dev;      /**< Standard deviation (meters) of longitude error */
  float alt_err_dev;      /**< Standard deviation (meters) of altitude error */
  int checksum;           /**< Checksum of the message bytes */
} GPGST_Infos;

/**
 * @brief Data structure that contains all the Recommended Minimum Specific GPS/Transit data.
 */
typedef struct GPRMC_Infos {
  UTC_Info utc;           /**< UTC Time */
  char status;            /**< “A” = valid, “V” = Warning */
  Coords xyz;             /**< Coords data member */
  float speed;            /**< Speed over ground in knots */
  float trackgood;        /**< Course made good */
  int date;               /**< Date of Fix */
  float mag_var;          /**< Magnetic Variation */
  char mag_var_dir;       /**< Magnetic Variation Direction */
  int checksum;           /**< Checksum of the message bytes */
} GPRMC_Infos;

/**
 * @brief Data structure that contains all of the informations about the GSA satellites 
 */
typedef struct GSA_Infos {
  char constellation[MAX_STR_LEN]; /**< Constellation enabled: GPGSA (GPS), GLGSA (GLONASS), GAGSA (GALILEO), BDGSA (BEIDOU), GNGSA (more than one) */ 
  char operating_mode;             /**< Operating Mode: 'M' = Manual, 'A' = Auto (2D/3D) */
  int current_mode;                /**< Current Mode: 1. no fix available, 2. 2D, 3. 3D */
  int sat_prn[MAX_SAT_NUM];        /**< Satellites list used in position fix (max N 12) */
  float pdop;                      /**< Position Dilution of Precision, max: 99.0 */
  float hdop;                      /**< Horizontal Dilution of Precision, max: 99.0 */
  float vdop;                      /**< Vertical Dilution of Precision, max: 99.0 */
  int checksum;                    /**< Checksum of the message bytes */
} GSA_Infos;
  
/**
 * @brief Data structure that contains all of the informations about the GSV satellites 
 */
typedef struct GSV_Infos {
  char constellation[MAX_STR_LEN];      /**< Constellation enabled: GPGSV (GPS), GLGSV (GLONASS), GAGSV (GALILEO), BDGSV (BEIDOU), QZGSV (QZSS), GNGSV (more than one) */ 
  int amount;                           /**< Total amount of GSV messages, max. 3 */
  int number;                           /**< Continued GSV number of this message */
  int tot_sats;                         /**< Total Number of Satellites in view, max. 12 */
  GSV_SAT_Info gsv_sat_i[MAX_SAT_NUM];  /**< Satellite info  */
  int checksum;                         /**< Checksum of the message bytes */
} GSV_Infos;

/**
 * @brief Data structure that contains timestamp
 */
typedef struct Timestamp_Info {
  int hh;  /**< Hours */
  int mm;  /**< Minutes */
  int ss;  /**< Seconds */
  int year;  /**< Year */
  int month;  /**< Month */
  int day;  /**< Day */
} Timestamp_Info;

/**
 * @brief Data structure that contains all of the information about Geofence 
 */
typedef struct Geofence_Infos {
  uint8_t op;          /**< Geofence type message (configuration/status) */
  uint8_t result;      /**< Geofence cfg/request result (OK/ERROR) */
  int idAlarm;         /**< Id of the circle raising the alarm */
  Timestamp_Info timestamp;
  int status[MAX_GEOFENCES_NUM];
} Geofence_Infos;

/**
 * @brief Data structure that contains all of the information about Ododmeter 
 */
typedef struct Odometer_Infos {
  uint8_t op;          /**< Odometer type message (configuration/status) */
  uint8_t result;      /**< Odometer cfg/request result (OK/ERROR) */
} Odometer_Infos;

/**
 * @brief Data structure that contains all of the information about Datalog 
 */
typedef struct Datalog_Infos {
  uint8_t op;          /**< Datalog type message (configuration/status) */
  uint8_t result;      /**< Datalog cfg/request result (OK/ERROR) */
} Datalog_Infos;

/**
 * @brief Ack from Teseo
 */
typedef uint8_t Ack_Info;

/**
 * @}
 */

/** @addtogroup NMEA_PARSER_PUBLIC_FUNCTIONS
 * @{
 */
ParseStatus_Typedef parse_gpgga  (GPGGA_Infos *gpgga_data, uint8_t *NMEA);
ParseStatus_Typedef parse_gnsmsg (GNS_Infos   *gns_data,   uint8_t *NMEA);
ParseStatus_Typedef parse_gpgst  (GPGST_Infos *gpgst_data, uint8_t *NMEA);
ParseStatus_Typedef parse_gprmc  (GPRMC_Infos *gprmc_data, uint8_t *NMEA);
ParseStatus_Typedef parse_gsamsg (GSA_Infos   *gsa_data,   uint8_t *NMEA);
ParseStatus_Typedef parse_gsvmsg (GSV_Infos   *gsv_data,   uint8_t *NMEA);
void                copy_data    (GPGGA_Infos *, GPGGA_Infos);

ParseStatus_Typedef parse_pstmgeofence(Geofence_Infos *geofence_data, uint8_t *NMEA);
ParseStatus_Typedef parse_pstmodo(Odometer_Infos *odo_data, uint8_t *NMEA);
ParseStatus_Typedef parse_pstmdatalog(Datalog_Infos *datalog_data, uint8_t *NMEA);
ParseStatus_Typedef parse_pstmsgl(Ack_Info *ack, uint8_t *NMEA);
ParseStatus_Typedef parse_pstmsavepar(Ack_Info *ack, uint8_t *NMEA);
/**
 * @}
 */

/**
 * @}
 */
  
/**
 * @}
 */
  
/**
 * @}
 */ 

/**
 * @}
 */
 
#ifdef __cplusplus
}
#endif

#endif