Merge branch 'next' of https://github.com/gnss-sdr/gnss-sdr into vtl_experimental

This commit is contained in:
Javier Arribas 2020-11-16 10:14:53 +01:00
commit 426d3bcb14
24 changed files with 3739 additions and 2991 deletions

View File

@ -330,7 +330,7 @@ set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master")
set(GNSSSDR_GPSTK_LOCAL_VERSION "3.0.0")
set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.18")
set(GNSSSDR_PUGIXML_LOCAL_VERSION "1.10")
set(GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION "3.13.0")
set(GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION "3.14.0")
set(GNSSSDR_BENCHMARK_LOCAL_VERSION "1.5.2")
set(GNSSSDR_MATHJAX_EXTERNAL_VERSION "2.7.7")

View File

@ -12,7 +12,7 @@ string(REGEX MATCH "[0-9]+" DARWIN_VERSION ${DARWIN_VERSION})
if(${DARWIN_VERSION} MATCHES "20")
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++17")
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
set(MACOS_DISTRIBUTION "macOS Big Sur 10.16")
set(MACOS_DISTRIBUTION "macOS Big Sur 11.0")
endif()
if(${DARWIN_VERSION} MATCHES "19")

File diff suppressed because it is too large Load Diff

View File

@ -255,20 +255,17 @@ private:
bool d_dump;
bool d_dump_mat;
bool d_rinex_output_enabled;
bool d_rinex_header_written;
bool d_rinex_header_updated;
bool d_geojson_output_enabled;
bool d_gpx_output_enabled;
bool d_kml_output_enabled;
bool d_nmea_output_file_enabled;
bool d_rtcm_enabled;
bool d_first_fix;
bool d_xml_storage;
bool d_flag_monitor_pvt_enabled;
bool d_show_local_time_zone;
bool d_waiting_obs_block_rx_clock_offset_correction_msg;
bool d_enable_rx_clock_correction;
bool d_rtcm_writing_started;
bool d_rtcm_enabled;
};

File diff suppressed because it is too large Load Diff

View File

@ -48,6 +48,7 @@
#include <map> // for map
#include <sstream> // for stringstream
#include <string> // for string
#include <vector>
/** \addtogroup PVT
@ -73,6 +74,7 @@ class Gps_Ephemeris;
class Gps_Iono;
class Gps_Navigation_Message;
class Gps_Utc_Model;
class Rtklib_Solver;
/*!
@ -83,152 +85,571 @@ class Rinex_Printer
{
public:
/*!
* \brief Default constructor. Creates GNSS Navigation and Observables RINEX files and their headers
* \brief Constructor. Creates GNSS Navigation and Observables RINEX files.
*/
explicit Rinex_Printer(int version = 0, const std::string& base_path = ".", const std::string& base_name = "-");
explicit Rinex_Printer(int version = 0,
const std::string& base_path = ".",
const std::string& base_name = "-");
/*!
* \brief Default destructor. Closes GNSS Navigation and Observables RINEX files
* \brief Destructor. Removes created files if empty.
*/
~Rinex_Printer();
/*!
* \brief Generates the GPS L1 C/A Navigation Data header
* \brief Print RINEX annotation. If it is the first annotation, it also
* prints the RINEX headers for navigation and observation files. If it is
* not the first annotation, it only annotates the observation, and updates
* the navigation header if UTC data was not available when writting it for
* the first time. The meaning of type_of_rx is as follows:
*
* type_of_rx | Signals
* ------------- | -------------
* 0 | Unknown
* 1 | GPS L1 C/A
* 2 | GPS L2C
* 3 | GPS L5
* 4 | Galileo E1B
* 5 | Galileo E5a
* 6 | Galileo E5b
* 7 | GPS L1 C/A + GPS L2C
* 8 | GPS L1 C/A + GPS L5
* 9 | GPS L1 C/A + Galileo E1B
* 10 | GPS L1 C/A + Galileo E5a
* 11 | GPS L1 C/A + Galileo E5b
* 12 | Galileo E1B + GPS L2C
* 13 | Galileo E5a + GPS L5
* 14 | Galileo E1B + Galileo E5a
* 15 | Galileo E1B + Galileo E5b
* 16 | GPS L2C + GPS L5
* 17 | GPS L2C + Galileo E5a
* 20 | GPS L5 + Galileo E5b
* 21 | GPS L1 C/A + Galileo E1B + GPS L2C
* 22 | GPS L1 C/A + Galileo E1B + GPS L5
* 23 | GLONASS L1 C/A
* 24 | GLONASS L2 C/A
* 25 | GLONASS L1 C/A + GLONASS L2 C/A
* 26 | GPS L1 C/A + GLONASS L1 C/A
* 27 | Galileo E1B + GLONASS L1 C/A
* 28 | GPS L2C + GLONASS L1 C/A
* 29 | GPS L1 C/A + GLONASS L2 C/A
* 30 | Galileo E1B + GLONASS L2 C/A
* 31 | GPS L2C + GLONASS L2 C/A
* 32 | GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a
* 33 | GPS L1 C/A + Galileo E1B + Galileo E5a
* 100 | Galileo E6B
* 101 | Galileo E1B + Galileo E6B
* 102 | Galileo E5a + Galileo E6B
* 103 | Galileo E5b + Galileo E6B
* 104 | Galileo E1B + Galileo E5a + Galileo E6B
* 105 | Galileo E1B + Galileo E5b + Galileo E6B
* 106 | GPS L1 C/A + Galileo E1B + Galileo E6B
* 500 | BeiDou B1I
* 501 | BeiDou B1I + GPS L1 C/A
* 502 | BeiDou B1I + Galileo E1B
* 503 | BeiDou B1I + GLONASS L1 C/A
* 504 | BeiDou B1I + GPS L1 C/A + Galileo E1B
* 505 | BeiDou B1I + GPS L1 C/A + GLONASS L1 C/A + Galileo E1B
* 506 | BeiDou B1I + Beidou B3I
* 600 | BeiDou B3I
* 601 | BeiDou B3I + GPS L2C
* 602 | BeiDou B3I + GLONASS L2 C/A
* 603 | BeiDou B3I + GPS L2C + GLONASS L2 C/A
* 604 | BeiDou B3I + GPS L1 C/A
* 605 | BeiDou B3I + Galileo E1B
* 606 | BeiDou B3I + GLONASS L1 C/A
* 607 | BeiDou B3I + GPS L1 C/A + Galileo E1B
* 608 | BeiDou B3I + GPS L1 C/A + Galileo E1B + BeiDou B1I
* 609 | BeiDou B3I + GPS L1 C/A + Galileo E1B + GLONASS L1 C/A
* 610 | BeiDou B3I + GPS L1 C/A + Galileo E1B + GLONASS L1 C/A + BeiDou B1I
* 1000 | GPS L1 C/A + GPS L2C + GPS L5
* 1001 | GPS L1 C/A + Galileo E1B + GPS L2C + GPS L5 + Galileo E5a
*
*/
void rinex_nav_header(std::fstream& out, const Gps_Iono& iono, const Gps_Utc_Model& utc_model, const Gps_Ephemeris& eph) const;
void print_rinex_annotation(const Rtklib_Solver* pvt_solver,
const std::map<int, Gnss_Synchro>& gnss_observables_map,
double rx_time,
int type_of_rx,
bool flag_write_RINEX_obs_output);
/*!
* \brief Generates the GPS L2C(M) Navigation Data header
* \brief Print RINEX annotation for GPS NAV message
*/
void rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono& iono, const Gps_CNAV_Utc_Model& utc_model) const;
void log_rinex_nav_gps_nav(int type_of_rx,
const std::map<int32_t, Gps_Ephemeris>& new_eph);
/*!
* \brief Generates the Galileo Navigation Data header
* \brief Print RINEX annotation for GPS CNAV message
*/
void rinex_nav_header(std::fstream& out, const Galileo_Iono& iono, const Galileo_Utc_Model& utc_model) const;
void log_rinex_nav_gps_cnav(int type_of_rx,
const std::map<int32_t, Gps_CNAV_Ephemeris>& new_cnav_eph);
/*!
* \brief Generates the Mixed (GPS/Galileo) Navigation Data header
* \brief Print RINEX annotation for Galileo NAV message
*/
void rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono, const Gps_Utc_Model& gps_utc_model, const Gps_Ephemeris& eph, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model) const;
void log_rinex_nav_gal_nav(int type_of_rx,
const std::map<int32_t, Galileo_Ephemeris>& new_gal_eph);
/*!
* \brief Generates the Mixed (GPS CNAV/Galileo) Navigation Data header
* \brief Print RINEX annotation for Glonass GNAV message
*/
void rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono& iono, const Gps_CNAV_Utc_Model& utc_model, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model) const;
void log_rinex_nav_glo_gnav(int type_of_rx,
const std::map<int32_t, Glonass_Gnav_Ephemeris>& new_glo_eph);
/*!
* \brief Generates the GLONASS L1, L2 C/A Navigation Data header
* \brief Print RINEX annotation for BeiDou DNAV message
*/
void rinex_nav_header(std::fstream& out, const Glonass_Gnav_Utc_Model& utc_model, const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
void log_rinex_nav_bds_dnav(int type_of_rx,
const std::map<int32_t, Beidou_Dnav_Ephemeris>& new_bds_eph);
/*!
* \brief Generates the Mixed (Galileo/GLONASS) Navigation Data header
* \brief Set processing for signals older than 2009
*/
void rinex_nav_header(std::fstream& out, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac) const;
void set_pre_2009_file(bool pre_2009_file);
/*!
* \brief Generates the Mixed (GPS L1 C/A/GLONASS L1, L2) Navigation Data header
* \brief Returns true is the RINEX file headers are already written
*/
void rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono, const Gps_Utc_Model& gps_utc_model, const Gps_Ephemeris& eph, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac);
inline bool is_rinex_header_written() const
{
return d_rinex_header_written;
}
/*!
* \brief Generates the Mixed (GPS L2C C/A/GLONASS L1, L2) Navigation Data header
* \brief Returns name of RINEX navigation file(s)
*/
void rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono& gps_iono, const Gps_CNAV_Utc_Model& gps_utc_model, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac);
inline std::vector<std::string> get_navfilename() const
{
return output_navfilename;
}
/*!
* \brief Generates the BDS B1I or B3I Navigation Data header
*/
void rinex_nav_header(std::fstream& out, const Beidou_Dnav_Iono& iono, const Beidou_Dnav_Utc_Model& utc_model) const;
* \brief Returns name of RINEX observation file
*/
inline std::string get_obsfilename() const
{
return obsfilename;
}
/*!
* \brief Generates the Mixed GPS L1,L5 + BDS B1I, B3I Navigation Data header
*/
void rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono, const Gps_Utc_Model& gps_utc_model, const Gps_Ephemeris& eph, const Beidou_Dnav_Iono& bds_dnav_iono, const Beidou_Dnav_Utc_Model& bds_dnav_utc_model) const;
/*!
* \brief Generates the Mixed GPS L2C + BDS B1I, B3I Navigation Data header
private:
/*
* Generates the GPS Observation data header
*/
void rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono& gps_cnav_iono, const Gps_CNAV_Utc_Model& gps_cnav_utc_model, const Beidou_Dnav_Iono& bds_dnav_iono, const Beidou_Dnav_Utc_Model& bds_dnav_utc_model);
void rinex_obs_header(std::fstream& out,
const Gps_Ephemeris& eph,
double d_TOW_first_observation);
/*!
* \brief Generates the Mixed GLONASS L1,L2 + BDS B1I, B3I Navigation Data header
/*
* Generates the GPS L2 Observation data header
*/
void rinex_nav_header(std::fstream& out, const Glonass_Gnav_Utc_Model& glo_gnav_utc_model, const Beidou_Dnav_Iono& bds_dnav_iono, const Beidou_Dnav_Utc_Model& bds_dnav_utc_model) const;
void rinex_obs_header(std::fstream& out,
const Gps_CNAV_Ephemeris& eph,
double d_TOW_first_observation,
const std::string& gps_bands = "2S");
/*!
* \brief Generates the Mixed (Galileo/BDS B1I, B3I) Navigation Data header
/*
* Generates the dual frequency GPS L1 & L2/L5 Observation data header
*/
void rinex_nav_header(std::fstream& out, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model, const Beidou_Dnav_Iono& bds_dnav_iono, const Beidou_Dnav_Utc_Model& bds_dnav_utc_model) const;
void rinex_obs_header(std::fstream& out,
const Gps_Ephemeris& eph,
const Gps_CNAV_Ephemeris& eph_cnav,
double d_TOW_first_observation,
const std::string& gps_bands = "1C 2S");
/*!
* \brief Generates the GPS Observation data header
/*
* Generates the Galileo Observation data header.
* Example: bands("1B"), bands("1B 5X"), bands("5X"), ... Default: "1B".
*/
void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph, double d_TOW_first_observation);
void rinex_obs_header(std::fstream& out,
const Galileo_Ephemeris& eph,
double d_TOW_first_observation,
const std::string& bands = "1B");
/*!
* \brief Generates the GPS L2 Observation data header
/*
* Generates the Mixed (GPS/Galileo) Observation data header.
* Example: galileo_bands("1B"), galileo_bands("1B 5X"),
* galileo_bands("5X"), ... Default: "1B".
*/
void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& eph, double d_TOW_first_observation, const std::string& gps_bands = "2S");
void rinex_obs_header(std::fstream& out,
const Gps_Ephemeris& gps_eph,
const Galileo_Ephemeris& galileo_eph,
double d_TOW_first_observation,
const std::string& galileo_bands = "1B");
/*!
* \brief Generates the dual frequency GPS L1 & L2/L5 Observation data header
/*
* Generates the Mixed (GPS/Galileo) Observation data header.
* Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
*/
void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph, const Gps_CNAV_Ephemeris& eph_cnav, double d_TOW_first_observation, const std::string& gps_bands = "1C 2S");
void rinex_obs_header(std::fstream& out,
const Gps_Ephemeris& gps_eph,
const Gps_CNAV_Ephemeris& eph_cnav,
const Galileo_Ephemeris& galileo_eph,
double d_TOW_first_observation,
const std::string& gps_bands = "1C 2S",
const std::string& galileo_bands = "1B");
/*!
* \brief Generates the Galileo Observation data header. Example: bands("1B"), bands("1B 5X"), bands("5X"), ... Default: "1B".
/*
* Generates the Mixed (GPS/Galileo) Observation data header.
* Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
*/
void rinex_obs_header(std::fstream& out, const Galileo_Ephemeris& eph, double d_TOW_first_observation, const std::string& bands = "1B");
void rinex_obs_header(std::fstream& out,
const Gps_CNAV_Ephemeris& eph_cnav,
const Galileo_Ephemeris& galileo_eph,
double d_TOW_first_observation,
const std::string& gps_bands = "2S",
const std::string& galileo_bands = "1B");
/*!
* \brief Generates the Mixed (GPS/Galileo) Observation data header. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
/*
* Generates the GLONASS GNAV Observation data header.
* Example: bands("1C"), bands("1C 2C"), bands("2C"), ... Default: "1C".
*/
void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Galileo_Ephemeris& galileo_eph, double d_TOW_first_observation, const std::string& galileo_bands = "1B");
void rinex_obs_header(std::fstream& out,
const Glonass_Gnav_Ephemeris& eph,
double d_TOW_first_observation,
const std::string& bands = "1G");
/*!
* \brief Generates the Mixed (GPS/Galileo) Observation data header. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
/*
* Generates the Mixed (GPS L1 C/A /GLONASS) Observation data header.
* Example: galileo_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
*/
void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& eph_cnav, const Galileo_Ephemeris& galileo_eph, double d_TOW_first_observation, const std::string& gps_bands = "1C 2S", const std::string& galileo_bands = "1B");
void rinex_obs_header(std::fstream& out,
const Gps_Ephemeris& gps_eph,
const Glonass_Gnav_Ephemeris& glonass_gnav_eph,
double d_TOW_first_observation,
const std::string& glonass_bands = "1C");
/*!
* \brief Generates the Mixed (GPS/Galileo) Observation data header. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
/*
* Generates the Mixed (Galileo/GLONASS) Observation data header.
* Example: galileo_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
*/
void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& eph_cnav, const Galileo_Ephemeris& galileo_eph, double d_TOW_first_observation, const std::string& gps_bands = "2S", const std::string& galileo_bands = "1B");
void rinex_obs_header(std::fstream& out,
const Galileo_Ephemeris& galileo_eph,
const Glonass_Gnav_Ephemeris& glonass_gnav_eph,
double d_TOW_first_observation,
const std::string& galileo_bands = "1B",
const std::string& glonass_bands = "1C");
/*!
* \brief Generates the GLONASS GNAV Observation data header. Example: bands("1C"), bands("1C 2C"), bands("2C"), ... Default: "1C".
/*
* Generates the Mixed (GPS L2C/GLONASS) Observation data header.
* Example: galileo_bands("1G")... Default: "1G".
*/
void rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephemeris& eph, double d_TOW_first_observation, const std::string& bands = "1G");
void rinex_obs_header(std::fstream& out,
const Gps_CNAV_Ephemeris& gps_cnav_eph,
const Glonass_Gnav_Ephemeris& glonass_gnav_eph,
double d_TOW_first_observation,
const std::string& glonass_bands = "1G");
/*!
* \brief Generates the Mixed (GPS L1 C/A /GLONASS) Observation data header. Example: galileo_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
/*
* Generates the a Beidou B1I Observation data header. Example: beidou_bands("B1")
*/
void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double d_TOW_first_observation, const std::string& glonass_bands = "1C");
void rinex_obs_header(std::fstream& out,
const Beidou_Dnav_Ephemeris& eph,
double d_TOW_first_observation,
const std::string& bands);
/*!
* \brief Generates the Mixed (Galileo/GLONASS) Observation data header. Example: galileo_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
*/
void rinex_obs_header(std::fstream& out, const Galileo_Ephemeris& galileo_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double d_TOW_first_observation, const std::string& galileo_bands = "1B", const std::string& glonass_bands = "1C");
/*!
* \brief Generates the Mixed (GPS L2C/GLONASS) Observation data header. Example: galileo_bands("1G")... Default: "1G".
*/
void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& gps_cnav_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double d_TOW_first_observation, const std::string& glonass_bands = "1G");
/*!
* \brief Generates the a Beidou B1I Observation data header. Example: beidou_bands("B1")
*/
void rinex_obs_header(std::fstream& out, const Beidou_Dnav_Ephemeris& eph, double d_TOW_first_observation, const std::string& bands);
/*!
* \brief Generates the SBAS raw data header
/*
* Generates the SBAS raw data header
*/
void rinex_sbs_header(std::fstream& out) const;
/*!
* \brief Computes the BDS Time and returns a boost::posix_time::ptime object
/*
* Writes GPS L1 observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out,
const Gps_Ephemeris& eph,
double obs_time,
const std::map<int32_t, Gnss_Synchro>& observables) const;
/*
* Writes GPS L2 observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out,
const Gps_CNAV_Ephemeris& eph,
double obs_time,
const std::map<int32_t, Gnss_Synchro>& observables) const;
/*
* Writes dual frequency GPS L1 and L2 observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out,
const Gps_Ephemeris& eph,
const Gps_CNAV_Ephemeris& eph_cnav,
double obs_time,
const std::map<int32_t, Gnss_Synchro>& observables,
bool triple_band = false) const;
/*
* Writes Galileo observables into the RINEX file.
* Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
*/
void log_rinex_obs(std::fstream& out,
const Galileo_Ephemeris& eph,
double obs_time,
const std::map<int32_t, Gnss_Synchro>& observables,
const std::string& galileo_bands = "1B") const;
/*
* Writes Mixed GPS / Galileo observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out,
const Gps_Ephemeris& gps_eph,
const Galileo_Ephemeris& galileo_eph,
double gps_obs_time,
const std::map<int32_t, Gnss_Synchro>& observables) const;
/*
* Writes Mixed GPS / Galileo observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out,
const Gps_CNAV_Ephemeris& eph,
const Galileo_Ephemeris& galileo_eph,
double gps_obs_time,
const std::map<int32_t, Gnss_Synchro>& observables) const;
/*
* Writes Mixed GPS / Galileo observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out,
const Gps_Ephemeris& gps_eph,
const Gps_CNAV_Ephemeris& gps_cnav_eph,
const Galileo_Ephemeris& galileo_eph,
double gps_obs_time,
const std::map<int32_t, Gnss_Synchro>& observables,
bool triple_band = false) const;
/*
* Writes GLONASS GNAV observables into the RINEX file.
* Example: glonass_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
*/
void log_rinex_obs(std::fstream& out,
const Glonass_Gnav_Ephemeris& eph,
double obs_time,
const std::map<int32_t, Gnss_Synchro>& observables,
const std::string& glonass_bands = "1C") const;
/*
* Writes Mixed GPS L1 C/A - GLONASS observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out,
const Gps_Ephemeris& gps_eph,
const Glonass_Gnav_Ephemeris& glonass_gnav_eph,
double gps_obs_time,
const std::map<int32_t, Gnss_Synchro>& observables) const;
/*
* Writes Mixed GPS L2C - GLONASS observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out,
const Gps_CNAV_Ephemeris& gps_eph,
const Glonass_Gnav_Ephemeris& glonass_gnav_eph,
double gps_obs_time,
const std::map<int32_t, Gnss_Synchro>& observables) const;
/*
* Writes Mixed Galileo/GLONASS observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out,
const Galileo_Ephemeris& galileo_eph,
const Glonass_Gnav_Ephemeris& glonass_gnav_eph,
double galileo_obs_time,
const std::map<int32_t, Gnss_Synchro>& observables) const;
/*
* Writes BDS B1I observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out,
const Beidou_Dnav_Ephemeris& eph,
double obs_time,
const std::map<int32_t, Gnss_Synchro>& observables,
const std::string& bds_bands) const;
/*
* Generates the GPS L1 C/A Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Gps_Iono& iono,
const Gps_Utc_Model& utc_model,
const Gps_Ephemeris& eph) const;
/*
* Generates the GPS L2C(M) Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Gps_CNAV_Iono& iono,
const Gps_CNAV_Utc_Model& utc_model) const;
/*
* Generates the Galileo Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Galileo_Iono& iono,
const Galileo_Utc_Model& utc_model) const;
/*
* Generates the Mixed (GPS/Galileo) Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Gps_Iono& gps_iono,
const Gps_Utc_Model& gps_utc_model,
const Gps_Ephemeris& eph,
const Galileo_Iono& galileo_iono,
const Galileo_Utc_Model& galileo_utc_model) const;
/*
* Generates the Mixed (GPS CNAV/Galileo) Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Gps_CNAV_Iono& iono,
const Gps_CNAV_Utc_Model& utc_model,
const Galileo_Iono& galileo_iono,
const Galileo_Utc_Model& galileo_utc_model) const;
/*
* Generates the GLONASS L1, L2 C/A Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Glonass_Gnav_Utc_Model& utc_model,
const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
/*
* Generates the Mixed (Galileo/GLONASS) Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Galileo_Iono& galileo_iono,
const Galileo_Utc_Model& galileo_utc_model,
const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model,
const Glonass_Gnav_Almanac& glonass_gnav_almanac) const;
/*
* Generates the Mixed (GPS L1 C/A/GLONASS L1, L2) Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Gps_Iono& gps_iono,
const Gps_Utc_Model& gps_utc_model,
const Gps_Ephemeris& eph,
const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model,
const Glonass_Gnav_Almanac& glonass_gnav_almanac);
/*
* Generates the Mixed (GPS L2C C/A/GLONASS L1, L2) Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Gps_CNAV_Iono& gps_iono,
const Gps_CNAV_Utc_Model& gps_utc_model,
const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model,
const Glonass_Gnav_Almanac& glonass_gnav_almanac);
/*
* Generates the BDS B1I or B3I Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Beidou_Dnav_Iono& iono,
const Beidou_Dnav_Utc_Model& utc_model) const;
/*
* Generates the Mixed GPS L1,L5 + BDS B1I, B3I Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Gps_Iono& gps_iono,
const Gps_Utc_Model& gps_utc_model,
const Gps_Ephemeris& eph,
const Beidou_Dnav_Iono& bds_dnav_iono,
const Beidou_Dnav_Utc_Model& bds_dnav_utc_model) const;
/*
* Generates the Mixed GPS L2C + BDS B1I, B3I Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Gps_CNAV_Iono& gps_cnav_iono,
const Gps_CNAV_Utc_Model& gps_cnav_utc_model,
const Beidou_Dnav_Iono& bds_dnav_iono,
const Beidou_Dnav_Utc_Model& bds_dnav_utc_model);
/*
* Generates the Mixed GLONASS L1,L2 + BDS B1I, B3I Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Glonass_Gnav_Utc_Model& glo_gnav_utc_model,
const Beidou_Dnav_Iono& bds_dnav_iono,
const Beidou_Dnav_Utc_Model& bds_dnav_utc_model) const;
/*
* Generates the Mixed (Galileo/BDS B1I, B3I) Navigation Data header
*/
void rinex_nav_header(std::fstream& out,
const Galileo_Iono& galileo_iono,
const Galileo_Utc_Model& galileo_utc_model,
const Beidou_Dnav_Iono& bds_dnav_iono,
const Beidou_Dnav_Utc_Model& bds_dnav_utc_model) const;
/*
* Writes data from the GPS L1 C/A navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out,
const std::map<int32_t, Gps_Ephemeris>& eph_map) const;
/*
* Writes data from the GPS L2 navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out,
const std::map<int32_t, Gps_CNAV_Ephemeris>& eph_map);
/*
* Writes data from the Galileo navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out,
const std::map<int32_t, Galileo_Ephemeris>& eph_map) const;
/*
* Writes data from the Mixed (GPS/Galileo) navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out,
const std::map<int32_t, Gps_Ephemeris>& gps_eph_map,
const std::map<int32_t, Galileo_Ephemeris>& galileo_eph_map);
/*
* Writes data from the Mixed (GPS/Galileo) navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out,
const std::map<int32_t, Gps_CNAV_Ephemeris>& gps_cnav_eph_map,
const std::map<int32_t, Galileo_Ephemeris>& galileo_eph_map);
/*
* Writes data from the GLONASS GNAV navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out,
const std::map<int32_t, Glonass_Gnav_Ephemeris>& eph_map) const;
/*
* Writes data from the Mixed (GPS/GLONASS GNAV) navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out,
const std::map<int32_t, Gps_Ephemeris>& gps_eph_map,
const std::map<int32_t, Glonass_Gnav_Ephemeris>& glonass_gnav_eph_map) const;
/*
* Writes data from the Mixed (GPS/GLONASS GNAV) navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out,
const std::map<int32_t, Gps_CNAV_Ephemeris>& gps_cnav_eph_map,
const std::map<int32_t, Glonass_Gnav_Ephemeris>& glonass_gnav_eph_map);
/*
* Writes data from the Mixed (Galileo/ GLONASS GNAV) navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out,
const std::map<int32_t, Galileo_Ephemeris>& galileo_eph_map,
const std::map<int32_t, Glonass_Gnav_Ephemeris>& glonass_gnav_eph_map);
/*
* Writes data from the Beidou B1I navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out,
const std::map<int32_t, Beidou_Dnav_Ephemeris>& eph_map) const;
/*
* Computes the BDS Time and returns a boost::posix_time::ptime object
* \details Function used to convert the observation time into BDT time which is used
* as the default time for RINEX files
* \param eph BeiDou DNAV Ephemeris object
@ -236,28 +657,28 @@ public:
*/
boost::posix_time::ptime compute_BDS_time(const Beidou_Dnav_Ephemeris& eph, double obs_time) const;
/*!
* \brief Computes the UTC time and returns a boost::posix_time::ptime object
/*
* Computes the UTC time and returns a boost::posix_time::ptime object
*/
boost::posix_time::ptime compute_UTC_time(const Gps_Navigation_Message& nav_msg) const;
/*!
* \brief Computes the GPS time and returns a boost::posix_time::ptime object
/*
* Computes the GPS time and returns a boost::posix_time::ptime object
*/
boost::posix_time::ptime compute_GPS_time(const Gps_Ephemeris& eph, double obs_time) const;
/*!
* \brief Computes the GPS time and returns a boost::posix_time::ptime object
/*
* Computes the GPS time and returns a boost::posix_time::ptime object
*/
boost::posix_time::ptime compute_GPS_time(const Gps_CNAV_Ephemeris& eph, double obs_time) const;
/*!
* \brief Computes the Galileo time and returns a boost::posix_time::ptime object
/*
* Computes the Galileo time and returns a boost::posix_time::ptime object
*/
boost::posix_time::ptime compute_Galileo_time(const Galileo_Ephemeris& eph, double obs_time) const;
/*!
* \brief Computes the UTC Time and returns a boost::posix_time::ptime object
/*
* Computes the UTC Time and returns a boost::posix_time::ptime object
* \details Function used as a method to convert the observation time into UTC time which is used
* as the default time for RINEX files
* \param eph GLONASS GNAV Ephemeris object
@ -265,183 +686,97 @@ public:
*/
boost::posix_time::ptime compute_UTC_time(const Glonass_Gnav_Ephemeris& eph, double obs_time) const;
/*!
* \brief Computes number of leap seconds of GPS relative to UTC
/*
* Computes number of leap seconds of GPS relative to UTC
* \param eph GLONASS GNAV Ephemeris object
* \param gps_obs_time Observation time in GPS seconds of week
*/
double get_leap_second(const Glonass_Gnav_Ephemeris& eph, double gps_obs_time) const;
/*!
* \brief Writes data from the GPS L1 C/A navigation message into the RINEX file
/*
* Represents GPS time in the date time format. Leap years are considered, but leap seconds are not.
*/
void log_rinex_nav(std::fstream& out, const std::map<int32_t, Gps_Ephemeris>& eph_map) const;
void to_date_time(int gps_week,
int gps_tow,
int& year,
int& month,
int& day,
int& hour,
int& minute,
int& second) const;
/*!
* \brief Writes data from the GPS L2 navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out, const std::map<int32_t, Gps_CNAV_Ephemeris>& eph_map);
/*!
* \brief Writes data from the Galileo navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out, const std::map<int32_t, Galileo_Ephemeris>& eph_map) const;
/*!
* \brief Writes data from the Mixed (GPS/Galileo) navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out, const std::map<int32_t, Gps_Ephemeris>& gps_eph_map, const std::map<int32_t, Galileo_Ephemeris>& galileo_eph_map);
/*!
* \brief Writes data from the Mixed (GPS/Galileo) navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out, const std::map<int32_t, Gps_CNAV_Ephemeris>& gps_cnav_eph_map, const std::map<int32_t, Galileo_Ephemeris>& galileo_eph_map);
/*!
* \brief Writes data from the GLONASS GNAV navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out, const std::map<int32_t, Glonass_Gnav_Ephemeris>& eph_map) const;
/*!
* \brief Writes data from the Mixed (GPS/GLONASS GNAV) navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out, const std::map<int32_t, Gps_Ephemeris>& gps_eph_map, const std::map<int32_t, Glonass_Gnav_Ephemeris>& glonass_gnav_eph_map) const;
/*!
* \brief Writes data from the Mixed (GPS/GLONASS GNAV) navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out, const std::map<int32_t, Gps_CNAV_Ephemeris>& gps_cnav_eph_map, const std::map<int32_t, Glonass_Gnav_Ephemeris>& glonass_gnav_eph_map);
/*!
* \brief Writes data from the Mixed (Galileo/ GLONASS GNAV) navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out, const std::map<int32_t, Galileo_Ephemeris>& galileo_eph_map, const std::map<int32_t, Glonass_Gnav_Ephemeris>& glonass_gnav_eph_map);
/*!
* \brief Writes data from the Beidou B1I navigation message into the RINEX file
*/
void log_rinex_nav(std::fstream& out, const std::map<int32_t, Beidou_Dnav_Ephemeris>& eph_map) const;
/*!
* \brief Writes GPS L1 observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables) const;
/*!
* \brief Writes GPS L2 observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out, const Gps_CNAV_Ephemeris& eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables) const;
/*!
* \brief Writes dual frequency GPS L1 and L2 observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& eph, const Gps_CNAV_Ephemeris& eph_cnav, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, bool triple_band = false) const;
/*!
* \brief Writes Galileo observables into the RINEX file. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
*/
void log_rinex_obs(std::fstream& out, const Galileo_Ephemeris& eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, const std::string& galileo_bands = "1B") const;
/*!
* \brief Writes Mixed GPS / Galileo observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map<int32_t, Gnss_Synchro>& observables) const;
/*!
* \brief Writes Mixed GPS / Galileo observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out, const Gps_CNAV_Ephemeris& eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map<int32_t, Gnss_Synchro>& observables) const;
/*!
* \brief Writes Mixed GPS / Galileo observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& gps_cnav_eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map<int32_t, Gnss_Synchro>& observables, bool triple_band = false) const;
/*!
* \brief Writes GLONASS GNAV observables into the RINEX file. Example: glonass_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B".
*/
void log_rinex_obs(std::fstream& out, const Glonass_Gnav_Ephemeris& eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, const std::string& glonass_bands = "1C") const;
/*!
* \brief Writes Mixed GPS L1 C/A - GLONASS observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double gps_obs_time, const std::map<int32_t, Gnss_Synchro>& observables) const;
/*!
* \brief Writes Mixed GPS L2C - GLONASS observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out, const Gps_CNAV_Ephemeris& gps_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double gps_obs_time, const std::map<int32_t, Gnss_Synchro>& observables) const;
/*!
* \brief Writes Mixed Galileo/GLONASS observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out, const Galileo_Ephemeris& galileo_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double galileo_obs_time, const std::map<int32_t, Gnss_Synchro>& observables) const;
/*!
* \brief Writes BDS B1I observables into the RINEX file
*/
void log_rinex_obs(std::fstream& out, const Beidou_Dnav_Ephemeris& eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, const std::string& bds_bands) const;
/*!
* \brief Represents GPS time in the date time format. Leap years are considered, but leap seconds are not.
*/
void to_date_time(int gps_week, int gps_tow, int& year, int& month, int& day, int& hour, int& minute, int& second) const;
/*!
* \brief Writes raw SBAS messages into the RINEX file
/*
* Writes raw SBAS messages into the RINEX file
*/
// void log_rinex_sbs(std::fstream & out, const Sbas_Raw_Msg & sbs_message);
void update_nav_header(std::fstream& out, const Gps_Utc_Model& utc_model, const Gps_Iono& gps_iono, const Gps_Ephemeris& eph) const;
void update_nav_header(std::fstream& out,
const Gps_Utc_Model& utc_model,
const Gps_Iono& gps_iono, const Gps_Ephemeris& eph) const;
void update_nav_header(std::fstream& out, const Gps_CNAV_Utc_Model& utc_model, const Gps_CNAV_Iono& iono) const;
void update_nav_header(std::fstream& out,
const Gps_CNAV_Utc_Model& utc_model,
const Gps_CNAV_Iono& iono) const;
void update_nav_header(std::fstream& out, const Gps_Iono& gps_iono, const Gps_Utc_Model& gps_utc_model, const Gps_Ephemeris& eph, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model) const;
void update_nav_header(std::fstream& out,
const Gps_Iono& gps_iono,
const Gps_Utc_Model& gps_utc_model,
const Gps_Ephemeris& eph,
const Galileo_Iono& galileo_iono,
const Galileo_Utc_Model& galileo_utc_model) const;
void update_nav_header(std::fstream& out, const Gps_CNAV_Utc_Model& utc_model, const Gps_CNAV_Iono& iono, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model) const;
void update_nav_header(std::fstream& out,
const Gps_CNAV_Utc_Model& utc_model,
const Gps_CNAV_Iono& iono,
const Galileo_Iono& galileo_iono,
const Galileo_Utc_Model& galileo_utc_model) const;
void update_nav_header(std::fstream& out, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& utc_model) const;
void update_nav_header(std::fstream& out,
const Galileo_Iono& galileo_iono,
const Galileo_Utc_Model& utc_model) const;
void update_nav_header(std::fstream& out, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac) const;
void update_nav_header(std::fstream& out,
const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model,
const Glonass_Gnav_Almanac& glonass_gnav_almanac) const;
void update_nav_header(std::fstream& out, const Gps_Iono& gps_iono, const Gps_Utc_Model& gps_utc, const Gps_Ephemeris& eph, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac) const;
void update_nav_header(std::fstream& out,
const Gps_Iono& gps_iono,
const Gps_Utc_Model& gps_utc,
const Gps_Ephemeris& eph,
const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model,
const Glonass_Gnav_Almanac& glonass_gnav_almanac) const;
void update_nav_header(std::fstream& out, const Gps_CNAV_Iono& gps_iono, const Gps_CNAV_Utc_Model& gps_utc_model, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac) const;
void update_nav_header(std::fstream& out,
const Gps_CNAV_Iono& gps_iono,
const Gps_CNAV_Utc_Model& gps_utc_model,
const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model,
const Glonass_Gnav_Almanac& glonass_gnav_almanac) const;
void update_nav_header(std::fstream& out, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac) const;
void update_nav_header(std::fstream& out,
const Galileo_Iono& galileo_iono,
const Galileo_Utc_Model& galileo_utc_model,
const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model,
const Glonass_Gnav_Almanac& glonass_gnav_almanac) const;
void update_nav_header(std::fstream& out, const Beidou_Dnav_Utc_Model& utc_model, const Beidou_Dnav_Iono& beidou_dnav_iono) const;
void update_nav_header(std::fstream& out,
const Beidou_Dnav_Utc_Model& utc_model,
const Beidou_Dnav_Iono& beidou_dnav_iono) const;
void update_obs_header(std::fstream& out, const Gps_Utc_Model& utc_model) const;
void update_obs_header(std::fstream& out,
const Gps_Utc_Model& utc_model) const;
void update_obs_header(std::fstream& out, const Gps_CNAV_Utc_Model& utc_model) const;
void update_obs_header(std::fstream& out,
const Gps_CNAV_Utc_Model& utc_model) const;
void update_obs_header(std::fstream& out, const Galileo_Utc_Model& galileo_utc_model) const;
void update_obs_header(std::fstream& out,
const Galileo_Utc_Model& galileo_utc_model) const;
void update_obs_header(std::fstream& out, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model) const;
void update_obs_header(std::fstream& out,
const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model) const;
void update_obs_header(std::fstream& out, const Beidou_Dnav_Utc_Model& utc_model) const;
void update_obs_header(std::fstream& out,
const Beidou_Dnav_Utc_Model& utc_model) const;
void set_pre_2009_file(bool pre_2009_file);
std::fstream obsFile; //!< Output file stream for RINEX observation file
std::fstream navFile; //!< Output file stream for RINEX navigation data file
std::fstream sbsFile; //!< Output file stream for RINEX SBAS raw data file
std::fstream navGalFile; //!< Output file stream for RINEX Galileo navigation data file
std::fstream navGloFile; //!< Output file stream for RINEX GLONASS navigation data file
std::fstream navBdsFile; //!< Output file stream for RINEX Galileo navigation data file
std::fstream navMixFile; //!< Output file stream for RINEX Mixed navigation data file
std::string navfilename;
std::string obsfilename;
std::string sbsfilename;
std::string navGalfilename;
std::string navGlofilename;
std::string navBdsfilename;
std::string navMixfilename;
private:
/*
* Generation of RINEX signal strength indicators
*/
@ -653,12 +988,32 @@ private:
std::map<std::string, std::string> satelliteSystem; // GPS, GLONASS, SBAS payload, Galileo or Beidou
std::map<std::string, std::string> observationType; // PSEUDORANGE, CARRIER_PHASE, DOPPLER, SIGNAL_STRENGTH
std::map<std::string, std::string> observationCode; // GNSS observation descriptors
std::string stringVersion; // RINEX version (2.10/2.11 or 3.01/3.02)
double fake_cnav_iode;
int version; // RINEX version (2 for 2.10/2.11 and 3 for 3.01)
int numberTypesObservations; // Number of available types of observable in the system. Should be public?
bool pre_2009_file_;
std::fstream obsFile; // Output file stream for RINEX observation file
std::fstream navFile; // Output file stream for RINEX navigation data file
std::fstream sbsFile; // Output file stream for RINEX SBAS raw data file
std::fstream navGalFile; // Output file stream for RINEX Galileo navigation data file
std::fstream navGloFile; // Output file stream for RINEX GLONASS navigation data file
std::fstream navBdsFile; // Output file stream for RINEX Galileo navigation data file
std::fstream navMixFile; // Output file stream for RINEX Mixed navigation data file
std::string navfilename; // Name of RINEX navigation file for GPS L1
std::string obsfilename; // Name of RINEX observation file
std::string sbsfilename; // Name of RINEX SBAS file
std::string navGalfilename; // Name of RINEX navigation file for Galileo
std::string navGlofilename; // Name of RINEX navigation file for Glonass
std::string navBdsfilename; // Name of RINEX navigation file for BeiDou
std::string navMixfilename; // Name of RINEX navigation file for fixed signals
std::vector<std::string> output_navfilename; // Name of output RINEX navigation file(s)
std::string d_stringVersion; // RINEX version (2.10/2.11 or 3.01/3.02)
double d_fake_cnav_iode;
int d_version; // RINEX version (2 for 2.10/2.11 and 3 for 3.01)
int d_numberTypesObservations; // Number of available types of observable in the system. Should be public?
bool d_rinex_header_updated;
bool d_rinex_header_written;
bool d_pre_2009_file;
};

File diff suppressed because it is too large Load Diff

View File

@ -42,6 +42,7 @@ class Gnss_Synchro;
class Gps_CNAV_Ephemeris;
class Gps_Ephemeris;
class Rtcm;
class Rtklib_Solver;
/*!
* \brief This class provides a implementation of a subset of the RTCM Standard 10403.2 messages
@ -52,19 +53,63 @@ public:
/*!
* \brief Default constructor.
*/
Rtcm_Printer(const std::string& filename, bool flag_rtcm_file_dump, bool flag_rtcm_server, bool flag_rtcm_tty_port, uint16_t rtcm_tcp_port, uint16_t rtcm_station_id, const std::string& rtcm_dump_devname, bool time_tag_name = true, const std::string& base_path = ".");
Rtcm_Printer(const std::string& filename,
bool flag_rtcm_file_dump,
bool flag_rtcm_server,
bool flag_rtcm_tty_port,
uint16_t rtcm_tcp_port,
uint16_t rtcm_station_id,
const std::string& rtcm_dump_devname,
bool time_tag_name = true,
const std::string& base_path = ".");
/*!
* \brief Default destructor.
*/
~Rtcm_Printer();
/*!
* \brief Print RTCM messages.
*/
void Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver,
const std::map<int, Gnss_Synchro>& gnss_observables_map,
double rx_time,
int32_t type_of_rx,
int32_t rtcm_MSM_rate_ms,
int32_t rtcm_MT1019_rate_ms,
int32_t rtcm_MT1020_rate_ms,
int32_t rtcm_MT1045_rate_ms,
int32_t rtcm_MT1077_rate_ms,
int32_t rtcm_MT1097_rate_ms,
bool flag_write_RTCM_MSM_output,
bool flag_write_RTCM_1019_output,
bool flag_write_RTCM_1020_output,
bool flag_write_RTCM_1045_output,
bool enable_rx_clock_correction);
uint32_t lock_time(const Gps_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
uint32_t lock_time(const Gps_CNAV_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
uint32_t lock_time(const Galileo_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
/*!
* \brief Locks time for logging given GLONASS GNAV Broadcast Ephemeris
* \note Code added as part of GSoC 2017 program
* \params glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris
* \params obs_time Time of observation at the moment of printing
* \params observables Set of observables as defined by the platform
* \return locked time during logging process
*/
uint32_t lock_time(const Glonass_Gnav_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
std::string print_MT1005_test(); //!< For testing purposes
private:
bool Print_Rtcm_MT1001(const Gps_Ephemeris& gps_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
bool Print_Rtcm_MT1002(const Gps_Ephemeris& gps_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
bool Print_Rtcm_MT1003(const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& cnav_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
bool Print_Rtcm_MT1004(const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& cnav_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
/*!
/*
* \brief Prints L1-Only GLONASS RTK Observables
* \details This GLONASS message type is not generally used or supported; type 1012 is to be preferred.
* \note Code added as part of GSoC 2017 program
@ -75,7 +120,7 @@ public:
*/
bool Print_Rtcm_MT1009(const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
/*!
/*
* \brief Prints Extended L1-Only GLONASS RTK Observables
* \details This GLONASS message type is used when only L1 data is present and bandwidth is very tight, often 1012 is used in such cases.
* \note Code added as part of GSoC 2017 program
@ -86,7 +131,7 @@ public:
*/
bool Print_Rtcm_MT1010(const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
/*!
/*
* \brief Prints L1&L2 GLONASS RTK Observables
* \details This GLONASS message type is not generally used or supported; type 1012 is to be preferred
* \note Code added as part of GSoC 2017 program
@ -98,7 +143,7 @@ public:
*/
bool Print_Rtcm_MT1011(const Glonass_Gnav_Ephemeris& glonass_gnav_ephL1, const Glonass_Gnav_Ephemeris& glonass_gnav_ephL2, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
/*!
/*
* \brief Prints Extended L1&L2 GLONASS RTK Observables
* \details This GLONASS message type is the most common observational message type, with L1/L2/SNR content. This is one of the most common messages found.
* \note Code added as part of GSoC 2017 program
@ -110,10 +155,10 @@ public:
*/
bool Print_Rtcm_MT1012(const Glonass_Gnav_Ephemeris& glonass_gnav_ephL1, const Glonass_Gnav_Ephemeris& glonass_gnav_ephL2, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
bool Print_Rtcm_MT1019(const Gps_Ephemeris& gps_eph); //!< GPS Ephemeris, should be broadcast in the event that the IODC does not match the IODE, and every 2 minutes.
bool Print_Rtcm_MT1045(const Galileo_Ephemeris& gal_eph); //!< Galileo Ephemeris, should be broadcast every 2 minutes
bool Print_Rtcm_MT1019(const Gps_Ephemeris& gps_eph); // GPS Ephemeris, should be broadcast in the event that the IODC does not match the IODE, and every 2 minutes.
bool Print_Rtcm_MT1045(const Galileo_Ephemeris& gal_eph); // Galileo Ephemeris, should be broadcast every 2 minutes
/*!
/*
* \brief Prints GLONASS GNAV Ephemeris
* \details This GLONASS message should be broadcast every 2 minutes
* \note Code added as part of GSoC 2017 program
@ -136,22 +181,6 @@ public:
bool divergence_free,
bool more_messages);
std::string print_MT1005_test(); //!< For testing purposes
uint32_t lock_time(const Gps_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
uint32_t lock_time(const Gps_CNAV_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
uint32_t lock_time(const Galileo_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
/*!
* \brief Locks time for logging given GLONASS GNAV Broadcast Ephemeris
* \note Code added as part of GSoC 2017 program
* \params glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris
* \params obs_time Time of observation at the moment of printing
* \params observables Set of observables as defined by the platform
* \return locked time during logging process
*/
uint32_t lock_time(const Glonass_Gnav_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
private:
int32_t init_serial(const std::string& serial_device); // serial port control
void close_serial();
bool Print_Message(const std::string& message);
@ -164,6 +193,7 @@ private:
int32_t rtcm_dev_descriptor; // RTCM serial device descriptor (i.e. COM port)
uint16_t port;
uint16_t station_id;
bool d_rtcm_writing_started;
bool d_rtcm_file_dump;
};

View File

@ -326,6 +326,7 @@ const int MAXSTRMSG = 1024; //!< max length of stream message
using fatalfunc_t = void(const char *); //!< fatal callback function type
// clang-format off
#define STR_MODE_R 0x1 /* stream mode: read */
#define STR_MODE_W 0x2 /* stream mode: write */
#define STR_MODE_RW 0x3 /* stream mode: read/write */
@ -347,6 +348,7 @@ using fatalfunc_t = void(const char *); //!< fatal callback function type
#define NR_PPP(opt) (IT_PPP(opt) + ((opt)->tropopt < TROPOPT_EST ? 0 : ((opt)->tropopt == TROPOPT_EST ? 1 : 3))) /* number of solutions */
#define IB_PPP(s, opt) (NR_PPP(opt) + (s)-1) /* state index of phase bias */
#define NX_PPP(opt) (IB_PPP(MAXSAT, opt) + 1) /* number of estimated states */
// clang-format on
#define NF_RTK(opt) ((opt)->ionoopt == IONOOPT_IFLC ? 1 : (opt)->nf)
#define NP_RTK(opt) ((opt)->dynamics == 0 ? 3 : 9)

View File

@ -63,10 +63,12 @@ const double TTOL_MOVEB = (1.0 + 2 * DTTOL);
/* state variable index */
// clang-format off
#define II_RTK(s, opt) (NP_RTK(opt) + (s)-1) /* ionos (s:satellite no) */
#define IT_RTK(r, opt) (NP_RTK(opt) + NI_RTK(opt) + NT_RTK(opt) / 2 * (r)) /* tropos (r:0=rov,1:ref) */
#define IL_RTK(f, opt) (NP_RTK(opt) + NI_RTK(opt) + NT_RTK(opt) + (f)) /* receiver h/w bias */
#define IB_RTK(s, f, opt) (NR_RTK(opt) + MAXSAT * (f) + (s)-1) /* phase bias (s:satno,f:freq) */
// clang-format on
int rtkopenstat(const char *file, int level);

View File

@ -36,7 +36,7 @@
/** \addtogroup GNSS_Block_Interfaces
* \{ */
// clang-format off
#if GNURADIO_USES_STD_POINTERS
#include <memory>
template <typename T>
@ -57,6 +57,8 @@ gnss_shared_ptr<C> gnss_make_shared(Args &&... args)
return boost::make_shared<C>(std::forward<Args>(args)...);
}
#endif
// clang-format on
/*!
* \brief This abstract class represents an interface to GNSS blocks.

View File

@ -132,6 +132,7 @@ asn_dec_rval_t NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
return rval;
}
// clang-format off
/*
* Encode the NativeInteger using the standard INTEGER type DER encoder.
*/
@ -172,6 +173,7 @@ asn_enc_rval_t NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr,
}
return erval;
}
// clang-format on
/*
* Decode the chunk of XML text encoding INTEGER.

View File

@ -19,6 +19,7 @@ extern "C"
{
#endif
// clang-format off
/* Environment version might be used to avoid running with the old library */
#define ASN1C_ENVIRONMENT_VERSION 922 /* Compile-time version */
int get_asn1c_environment_version(void); /* Run-time version */
@ -60,6 +61,7 @@ extern "C"
}
#endif /* EMIT_ASN_DEBUG */
#endif /* ASN_DEBUG */
// clang-format on
/*
* Invoke the application-supplied callback and fail, if something is wrong.

View File

@ -61,6 +61,7 @@ typedef unsigned int uint32_t;
#include <types/vxTypes.h>
#else /* !defined(__vxworks) */
// clang-format off
#include <inttypes.h> /* C99 specifies this file */
/*
* 1. Earlier FreeBSD version didn't have <stdint.h>,
@ -127,5 +128,6 @@ typedef unsigned int uint32_t;
#define MIN(a, b) ((a) < (b) ? (a) : (b)) /* Unsafe variant */
#endif /* __GNUC__ */
#endif /* MIN */
// clang-format on
#endif /* _ASN_SYSTEM_H_ */

View File

@ -44,6 +44,7 @@ static int _charclass[256] = {
#define ALPHA(c) (_charclass[(unsigned char)(c)] == 3)
/* Aliases for characters, ASCII/UTF-8 */
// clang-format off
#define EXCLAM 0x21 /* '!' */
#define CQUOTE 0x22 /* '"' */
#define CDASH 0x2d /* '-' */
@ -52,6 +53,7 @@ static int _charclass[256] = {
#define CEQUAL 0x3d /* '=' */
#define RANGLE 0x3e /* '>' */
#define CQUEST 0x3f /* '?' */
// clang-format on
/* Invoke token callback */
#define TOKEN_CB_CALL(type, _ns, _current_too, _final) \

View File

@ -759,6 +759,7 @@ GeneralizedTime_t *asn_time2GT_frac(GeneralizedTime_t *opt_gt,
gmtoff = GMTOFF(*tm);
// clang-format off
if (force_gmt && gmtoff)
{
tm_s = *tm;
@ -771,7 +772,7 @@ GeneralizedTime_t *asn_time2GT_frac(GeneralizedTime_t *opt_gt,
gmtoff = 0;
#endif
}
// clang-format on
size = snprintf(buf, buf_size, "%04d%02d%02d%02d%02d%02d",
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec);

View File

@ -132,6 +132,7 @@ asn_dec_rval_t NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
return rval;
}
// clang-format off
/*
* Encode the NativeInteger using the standard INTEGER type DER encoder.
*/
@ -172,6 +173,7 @@ asn_enc_rval_t NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr,
}
return erval;
}
// clang-format on
/*
* Decode the chunk of XML text encoding INTEGER.

View File

@ -19,6 +19,7 @@ extern "C"
{
#endif
// clang-format off
/* Environment version might be used to avoid running with the old library */
#define ASN1C_ENVIRONMENT_VERSION 922 /* Compile-time version */
int get_asn1c_environment_version(void); /* Run-time version */
@ -60,6 +61,7 @@ extern "C"
}
#endif /* EMIT_ASN_DEBUG */
#endif /* ASN_DEBUG */
// clang-format on
/*
* Invoke the application-supplied callback and fail, if something is wrong.

View File

@ -61,6 +61,7 @@ typedef unsigned int uint32_t;
#include <types/vxTypes.h>
#else /* !defined(__vxworks) */
// clang-format off
#include <inttypes.h> /* C99 specifies this file */
/*
* 1. Earlier FreeBSD version didn't have <stdint.h>,
@ -127,5 +128,6 @@ typedef unsigned int uint32_t;
#define MIN(a, b) ((a) < (b) ? (a) : (b)) /* Unsafe variant */
#endif /* __GNUC__ */
#endif /* MIN */
// clang-format on
#endif /* _ASN_SYSTEM_H_ */

View File

@ -44,6 +44,7 @@ static int _charclass[256] = {
#define ALPHA(c) (_charclass[(unsigned char)(c)] == 3)
/* Aliases for characters, ASCII/UTF-8 */
// clang-format off
#define EXCLAM 0x21 /* '!' */
#define CQUOTE 0x22 /* '"' */
#define CDASH 0x2d /* '-' */
@ -52,6 +53,7 @@ static int _charclass[256] = {
#define CEQUAL 0x3d /* '=' */
#define RANGLE 0x3e /* '>' */
#define CQUEST 0x3f /* '?' */
// clang-format on
/* Invoke token callback */
#define TOKEN_CB_CALL(type, _ns, _current_too, _final) \

View File

@ -53,8 +53,10 @@ DEFINE_bool(show_plots, true, "Show plots on screen. Disable for non-interactive
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__)
// defined for 32 and 64-bit environments
// clang-format off
#include <io.h> // for _access(), _mktemp()
#define GP_MAX_TMP_FILES 27 // 27 temporary files it's Microsoft restriction
// clang-format on
#elif defined(unix) || defined(__unix) || defined(__unix__) || defined(__APPLE__)
// all UNIX-like OSs (Linux, *BSD, macOS, Solaris, ...)
#include <unistd.h> // for access(), mkstemp()

View File

@ -2,12 +2,21 @@ SPDX-License-Identifier: GPL-3.0-or-later
SPDX-FileCopyrightText: 2020 Carles Fernandez-Prades <carles.fernandez@cttc.es>
--- CMakeLists.txt 2020-10-25 10:06:26.000000000 +0100
+++ CMakeLists.txt 2020-10-25 10:06:11.000000000 +0100
@@ -74,7 +74,7 @@
@@ -74,7 +74,16 @@
include( BuildSetup.cmake )
-
+set(STADYN "STATIC")
+if(POLICY CMP0063)
+ cmake_policy(SET CMP0063 NEW)
+ set(CMAKE_CXX_VISIBILITY_PRESET hidden)
+ set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
+else()
+ if((CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32)
+ add_definitions(-fvisibility=hidden)
+ endif()
+endif()
#============================================================
# Core Library Target Files
#============================================================

View File

@ -133,7 +133,6 @@ DECLARE_string(log_dir);
#include "unit-tests/system-parameters/glonass_gnav_ephemeris_test.cc"
#include "unit-tests/system-parameters/glonass_gnav_nav_message_test.cc"
#if EXTRA_TESTS
#include "unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc"
// #include "unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc"

View File

@ -18,24 +18,182 @@
*/
#include "rinex_printer.h"
#include "rtklib_rtkpos.h"
#include "rtklib_solver.h"
#include <fstream>
#include <string>
#if HAS_STD_FILESYSTEM
#include <system_error>
namespace errorlib = std;
#if HAS_STD_FILESYSTEM_EXPERIMENTAL
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
#else
#include <filesystem>
namespace fs = std::filesystem;
#endif
#else
#include <boost/filesystem/operations.hpp> // for create_directories, exists
#include <boost/filesystem/path.hpp> // for path, operator<<
#include <boost/filesystem/path_traits.hpp> // for filesystem
#include <boost/system/error_code.hpp> // for error_code
namespace fs = boost::filesystem;
namespace errorlib = boost::system;
#endif
TEST(RinexPrinterTest, GalileoObsHeader)
class RinexPrinterTest : public ::testing::Test
{
protected:
RinexPrinterTest()
{
this->conf();
}
~RinexPrinterTest() = default;
void conf();
rtk_t rtk;
};
void RinexPrinterTest::conf()
{
snrmask_t snrmask = {{}, {{}, {}}};
int positioning_mode = 0; // Single
int number_of_frequencies = 1;
double elevation_mask = 5;
int navigation_system = 1; // GPS
int integer_ambiguity_resolution_gps = 0;
int integer_ambiguity_resolution_glo = 0;
int integer_ambiguity_resolution_bds = 0;
int outage_reset_ambiguity = 5;
int min_lock_to_fix_ambiguity = 0;
int iono_model = 0;
int trop_model = 0;
int dynamics_model = 0;
int earth_tide = 0;
int number_filter_iter = 1;
double code_phase_error_ratio_l1 = 100.0;
double code_phase_error_ratio_l2 = 100.0;
double code_phase_error_ratio_l5 = 100.0;
double carrier_phase_error_factor_a = 0.003;
double carrier_phase_error_factor_b = 0.003;
double bias_0 = 30.0;
double iono_0 = 0.03;
double trop_0 = 0.3;
double sigma_bias = 1e-4;
double sigma_iono = 1e-3;
double sigma_trop = 1e-4;
double sigma_acch = 1e-1;
double sigma_accv = 1e-2;
double sigma_pos = 0.0;
double min_ratio_to_fix_ambiguity = 3.0;
double min_elevation_to_fix_ambiguity = 0.0;
double slip_threshold = 0.05;
double threshold_reject_innovation = 30.0;
double threshold_reject_gdop = 30.0;
int sat_PCV = 0;
int rec_PCV = 0;
int phwindup = 0;
int reject_GPS_IIA = 0;
int raim_fde = 0;
prcopt_t rtklib_configuration_options = {
positioning_mode, /* positioning mode (PMODE_XXX) see src/algorithms/libs/rtklib/rtklib.h */
0, /* solution type (0:forward,1:backward,2:combined) */
number_of_frequencies, /* number of frequencies (1:L1, 2:L1+L2, 3:L1+L2+L5)*/
navigation_system, /* navigation system */
elevation_mask * D2R, /* elevation mask angle (degrees) */
snrmask, /* snrmask_t snrmask SNR mask */
0, /* satellite ephemeris/clock (EPHOPT_XXX) */
integer_ambiguity_resolution_gps, /* AR mode (0:off,1:continuous,2:instantaneous,3:fix and hold,4:ppp-ar) */
integer_ambiguity_resolution_glo, /* GLONASS AR mode (0:off,1:on,2:auto cal,3:ext cal) */
integer_ambiguity_resolution_bds, /* BeiDou AR mode (0:off,1:on) */
outage_reset_ambiguity, /* obs outage count to reset bias */
min_lock_to_fix_ambiguity, /* min lock count to fix ambiguity */
10, /* min fix count to hold ambiguity */
1, /* max iteration to resolve ambiguity */
iono_model, /* ionosphere option (IONOOPT_XXX) */
trop_model, /* troposphere option (TROPOPT_XXX) */
dynamics_model, /* dynamics model (0:none, 1:velocity, 2:accel) */
earth_tide, /* earth tide correction (0:off,1:solid,2:solid+otl+pole) */
number_filter_iter, /* number of filter iteration */
0, /* code smoothing window size (0:none) */
0, /* interpolate reference obs (for post mission) */
0, /* sbssat_t sbssat SBAS correction options */
0, /* sbsion_t sbsion[MAXBAND+1] SBAS satellite selection (0:all) */
0, /* rover position for fixed mode */
0, /* base position for relative mode */
/* 0:pos in prcopt, 1:average of single pos, */
/* 2:read from file, 3:rinex header, 4:rtcm pos */
{code_phase_error_ratio_l1, code_phase_error_ratio_l2, code_phase_error_ratio_l5}, /* eratio[NFREQ] code/phase error ratio */
{100.0, carrier_phase_error_factor_a, carrier_phase_error_factor_b, 0.0, 1.0}, /* err[5]: measurement error factor [0]:reserved, [1-3]:error factor a/b/c of phase (m) , [4]:doppler frequency (hz) */
{bias_0, iono_0, trop_0}, /* std[3]: initial-state std [0]bias,[1]iono [2]trop*/
{sigma_bias, sigma_iono, sigma_trop, sigma_acch, sigma_accv, sigma_pos}, /* prn[6] process-noise std */
5e-12, /* sclkstab: satellite clock stability (sec/sec) */
{min_ratio_to_fix_ambiguity, 0.9999, 0.25, 0.1, 0.05, 0.0, 0.0, 0.0}, /* thresar[8]: AR validation threshold */
min_elevation_to_fix_ambiguity, /* elevation mask of AR for rising satellite (deg) */
0.0, /* elevation mask to hold ambiguity (deg) */
slip_threshold, /* slip threshold of geometry-free phase (m) */
30.0, /* max difference of time (sec) */
threshold_reject_innovation, /* reject threshold of innovation (m) */
threshold_reject_gdop, /* reject threshold of gdop */
{}, /* double baseline[2] baseline length constraint {const,sigma} (m) */
{}, /* double ru[3] rover position for fixed mode {x,y,z} (ecef) (m) */
{}, /* double rb[3] base position for relative mode {x,y,z} (ecef) (m) */
{"", ""}, /* char anttype[2][MAXANT] antenna types {rover,base} */
{{}, {}}, /* double antdel[2][3] antenna delta {{rov_e,rov_n,rov_u},{ref_e,ref_n,ref_u}} */
{}, /* pcv_t pcvr[2] receiver antenna parameters {rov,base} */
{}, /* unsigned char exsats[MAXSAT] excluded satellites (1:excluded, 2:included) */
0, /* max averaging epoches */
0, /* initialize by restart */
1, /* output single by dgps/float/fix/ppp outage */
{"", ""}, /* char rnxopt[2][256] rinex options {rover,base} */
{sat_PCV, rec_PCV, phwindup, reject_GPS_IIA, raim_fde}, /* posopt[6] positioning options [0]: satellite and receiver antenna PCV model; [1]: interpolate antenna parameters; [2]: apply phase wind-up correction for PPP modes; [3]: exclude measurements of GPS Block IIA satellites satellite [4]: RAIM FDE (fault detection and exclusion) [5]: handle day-boundary clock jump */
0, /* solution sync mode (0:off,1:on) */
{{}, {}}, /* odisp[2][6*11] ocean tide loading parameters {rov,base} */
{{}, {{}, {}}, {{}, {}}, {}, {}}, /* exterr_t exterr extended receiver error model */
0, /* disable L2-AR */
{} /* char pppopt[256] ppp option "-GAP_RESION=" default gap to reset iono parameters (ep) */
};
rtkinit(&rtk, &rtklib_configuration_options);
}
TEST_F(RinexPrinterTest, GalileoObsHeader)
{
auto pvt_solution = std::make_shared<Rtklib_Solver>(rtk, 12, "filename", false, false);
auto eph = Galileo_Ephemeris();
eph.i_satellite_PRN = 1;
pvt_solution->galileo_ephemeris_map[1] = eph;
std::map<int, Gnss_Synchro> gnss_observables_map;
Gnss_Synchro gs{};
gs.PRN = 1;
gnss_observables_map[1] = gs;
auto rp = std::make_shared<Rinex_Printer>();
rp->print_rinex_annotation(pvt_solution.get(),
gnss_observables_map,
0.0,
4,
true);
std::string obsfile = rp->get_obsfilename();
std::string navfile = rp->get_navfilename()[0];
rp = nullptr; // close the RINEX files so we can inspect them
std::fstream fstr(obsfile.c_str(), std::fstream::in);
fstr.seekg(0);
std::string line_aux;
std::string line_str;
bool no_more_finds = false;
const Galileo_Ephemeris eph = Galileo_Ephemeris();
std::shared_ptr<Rinex_Printer> rp1;
rp1 = std::make_shared<Rinex_Printer>();
rp1->rinex_obs_header(rp1->obsFile, eph, 0.0);
rp1->obsFile.seekp(0);
while (!rp1->obsFile.eof())
while (!fstr.eof())
{
std::getline(rp1->obsFile, line_str);
std::getline(fstr, line_str);
if (!no_more_finds)
{
if (line_str.find("SYS / # / OBS TYPES", 59) != std::string::npos)
@ -47,21 +205,29 @@ TEST(RinexPrinterTest, GalileoObsHeader)
}
std::string expected_str("E 4 C1B L1B D1B S1B SYS / # / OBS TYPES ");
EXPECT_EQ(0, expected_str.compare(line_aux));
if (remove(rp1->obsfilename.c_str()) != 0)
{
LOG(INFO) << "Error deleting temporary file";
}
line_aux.clear();
fstr.close();
fs::remove(obsfile);
fs::remove(navfile);
auto rp2 = std::make_shared<Rinex_Printer>();
rp2->print_rinex_annotation(pvt_solution.get(),
gnss_observables_map,
0.0,
15,
true);
obsfile = rp2->get_obsfilename();
navfile = rp2->get_navfilename()[0];
rp2 = nullptr; // close the RINEX files so we can inspect them
std::fstream fstr2(obsfile.c_str(), std::fstream::in);
fstr2.seekg(0);
std::shared_ptr<Rinex_Printer> rp2;
rp2 = std::make_shared<Rinex_Printer>();
std::string bands("1B 5X 7X");
rp2->rinex_obs_header(rp2->obsFile, eph, 0.0, bands);
rp2->obsFile.seekp(0);
no_more_finds = false;
while (!rp2->obsFile.eof())
while (!fstr2.eof())
{
std::getline(rp2->obsFile, line_str);
std::getline(fstr2, line_str);
if (!no_more_finds)
{
if (line_str.find("SYS / # / OBS TYPES", 59) != std::string::npos)
@ -71,32 +237,49 @@ TEST(RinexPrinterTest, GalileoObsHeader)
}
}
}
std::string expected_str2("E 12 C1B L1B D1B S1B C5X L5X D5X S5X C7X L7X D7X S7X SYS / # / OBS TYPES ");
std::string expected_str2("E 8 C1B L1B D1B S1B C7X L7X D7X S7X SYS / # / OBS TYPES ");
EXPECT_EQ(0, expected_str2.compare(line_aux));
if (remove(rp2->obsfilename.c_str()) != 0)
{
LOG(INFO) << "Error deleting temporary file";
}
fstr2.close();
fs::remove(obsfile);
fs::remove(navfile);
}
TEST(RinexPrinterTest, GlonassObsHeader)
TEST_F(RinexPrinterTest, GlonassObsHeader)
{
auto pvt_solution = std::make_shared<Rtklib_Solver>(rtk, 12, "filename", false, false);
auto eph = Glonass_Gnav_Ephemeris();
eph.i_satellite_PRN = 1;
pvt_solution->glonass_gnav_ephemeris_map[1] = eph;
std::map<int, Gnss_Synchro> gnss_observables_map;
Gnss_Synchro gs{};
gs.PRN = 1;
gnss_observables_map[1] = gs;
auto rp = std::make_shared<Rinex_Printer>(3);
rp->print_rinex_annotation(pvt_solution.get(),
gnss_observables_map,
0.0,
23,
true);
std::string obsfile = rp->get_obsfilename();
std::string navfile = rp->get_navfilename()[0];
rp = nullptr; // close the RINEX files so we can inspect them
std::fstream fstr(obsfile.c_str(), std::fstream::in);
fstr.seekg(0);
std::string line_aux;
std::string line_str;
bool no_more_finds = false;
const Glonass_Gnav_Ephemeris eph = Glonass_Gnav_Ephemeris();
std::shared_ptr<Rinex_Printer> rp1;
rp1 = std::make_shared<Rinex_Printer>(3);
const std::string bands = "1G";
rp1->rinex_obs_header(rp1->obsFile, eph, 0.0, bands);
rp1->obsFile.seekp(0);
while (!rp1->obsFile.eof())
while (!fstr.eof())
{
std::getline(rp1->obsFile, line_str);
std::getline(fstr, line_str);
if (!no_more_finds)
{
if (line_str.find("SYS / # / OBS TYPES", 59) != std::string::npos)
@ -108,32 +291,54 @@ TEST(RinexPrinterTest, GlonassObsHeader)
}
std::string expected_str("R 4 C1C L1C D1C S1C SYS / # / OBS TYPES ");
EXPECT_EQ(0, expected_str.compare(line_aux));
if (remove(rp1->obsfilename.c_str()) != 0)
{
LOG(INFO) << "Error deleting temporary file";
}
line_aux.clear();
fstr.close();
fs::remove(obsfile);
fs::remove(navfile);
}
TEST(RinexPrinterTest, MixedObsHeader)
TEST_F(RinexPrinterTest, MixedObsHeader)
{
std::string line_aux;
std::string line_aux2;
std::string line_str;
bool no_more_finds = false;
const Galileo_Ephemeris eph_gal = Galileo_Ephemeris();
const Gps_Ephemeris eph_gps = Gps_Ephemeris();
auto eph_gal = Galileo_Ephemeris();
auto eph_gps = Gps_Ephemeris();
eph_gal.i_satellite_PRN = 1;
eph_gps.i_satellite_PRN = 1;
auto pvt_solution = std::make_shared<Rtklib_Solver>(rtk, 12, "filename", false, false);
pvt_solution->galileo_ephemeris_map[1] = eph_gal;
std::shared_ptr<Rinex_Printer> rp1;
rp1 = std::make_shared<Rinex_Printer>();
rp1->rinex_obs_header(rp1->obsFile, eph_gps, eph_gal, 0.0, "1B 5X");
rp1->obsFile.seekp(0);
pvt_solution->gps_ephemeris_map[1] = eph_gps;
std::map<int, Gnss_Synchro> gnss_observables_map;
Gnss_Synchro gs{};
gs.PRN = 1;
gnss_observables_map[1] = gs;
gnss_observables_map[2] = gs;
auto rp = std::make_shared<Rinex_Printer>();
rp->print_rinex_annotation(pvt_solution.get(),
gnss_observables_map,
0.0,
33,
true);
std::string obsfile = rp->get_obsfilename();
std::string navfile = rp->get_navfilename()[0];
rp = nullptr; // close the RINEX files so we can inspect them
std::fstream fstr(obsfile.c_str(), std::fstream::in);
fstr.seekg(0);
int systems_found = 0;
while (!rp1->obsFile.eof())
while (!fstr.eof())
{
std::getline(rp1->obsFile, line_str);
std::getline(fstr, line_str);
if (!no_more_finds)
{
if (line_str.find("SYS / # / OBS TYPES", 59) != std::string::npos)
@ -156,31 +361,54 @@ TEST(RinexPrinterTest, MixedObsHeader)
std::string expected_str2("E 8 C1B L1B D1B S1B C5X L5X D5X S5X SYS / # / OBS TYPES ");
EXPECT_EQ(0, expected_str.compare(line_aux));
EXPECT_EQ(0, expected_str2.compare(line_aux2));
if (remove(rp1->obsfilename.c_str()) != 0)
{
LOG(INFO) << "Error deleting temporary file";
}
fstr.close();
fs::remove(obsfile);
fs::remove(navfile);
}
TEST(RinexPrinterTest, MixedObsHeaderGpsGlo)
TEST_F(RinexPrinterTest, MixedObsHeaderGpsGlo)
{
std::string line_aux;
std::string line_aux2;
std::string line_str;
bool no_more_finds = false;
const Glonass_Gnav_Ephemeris eph_glo = Glonass_Gnav_Ephemeris();
const Gps_Ephemeris eph_gps = Gps_Ephemeris();
auto eph_glo = Glonass_Gnav_Ephemeris();
auto eph_gps = Gps_Ephemeris();
eph_glo.i_satellite_PRN = 1;
eph_gps.i_satellite_PRN = 1;
auto pvt_solution = std::make_shared<Rtklib_Solver>(rtk, 12, "filename", false, false);
pvt_solution->glonass_gnav_ephemeris_map[1] = eph_glo;
pvt_solution->gps_ephemeris_map[1] = eph_gps;
std::map<int, Gnss_Synchro> gnss_observables_map;
Gnss_Synchro gs{};
gs.PRN = 1;
gnss_observables_map[1] = gs;
gnss_observables_map[2] = gs;
auto rp = std::make_shared<Rinex_Printer>();
rp->print_rinex_annotation(pvt_solution.get(),
gnss_observables_map,
0.0,
26,
true);
std::string obsfile = rp->get_obsfilename();
std::string navfile = rp->get_navfilename()[0];
rp = nullptr; // close the RINEX files so we can inspect them
std::fstream fstr(obsfile.c_str(), std::fstream::in);
fstr.seekg(0);
std::shared_ptr<Rinex_Printer> rp1;
rp1 = std::make_shared<Rinex_Printer>();
rp1->rinex_obs_header(rp1->obsFile, eph_gps, eph_glo, 0.0, "1G");
rp1->obsFile.seekp(0);
int systems_found = 0;
while (!rp1->obsFile.eof())
while (!fstr.eof())
{
std::getline(rp1->obsFile, line_str);
std::getline(fstr, line_str);
if (!no_more_finds)
{
if (line_str.find("SYS / # / OBS TYPES", 59) != std::string::npos)
@ -203,25 +431,22 @@ TEST(RinexPrinterTest, MixedObsHeaderGpsGlo)
std::string expected_str2("R 4 C1C L1C D1C S1C SYS / # / OBS TYPES ");
EXPECT_EQ(0, expected_str.compare(line_aux));
EXPECT_EQ(0, expected_str2.compare(line_aux2));
if (remove(rp1->obsfilename.c_str()) != 0)
{
LOG(INFO) << "Error deleting temporary file";
}
fstr.close();
fs::remove(obsfile);
fs::remove(navfile);
}
TEST(RinexPrinterTest, GalileoObsLog)
TEST_F(RinexPrinterTest, GalileoObsLog)
{
std::string line_aux;
std::string line_str;
bool no_more_finds = false;
const Galileo_Ephemeris eph = Galileo_Ephemeris();
std::shared_ptr<Rinex_Printer> rp;
rp = std::make_shared<Rinex_Printer>();
rp->rinex_obs_header(rp->obsFile, eph, 0.0);
std::map<int, Gnss_Synchro> gnss_pseudoranges_map;
auto eph = Galileo_Ephemeris();
eph.i_satellite_PRN = 1;
auto pvt_solution = std::make_shared<Rtklib_Solver>(rtk, 12, "filename", false, false);
pvt_solution->galileo_ephemeris_map[1] = eph;
std::map<int, Gnss_Synchro> gnss_observables_map;
Gnss_Synchro gs1 = Gnss_Synchro();
Gnss_Synchro gs2 = Gnss_Synchro();
@ -250,17 +475,30 @@ TEST(RinexPrinterTest, GalileoObsLog)
gs4.Carrier_Doppler_hz = 1534;
gs4.CN0_dB_hz = 42;
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
rp->log_rinex_obs(rp->obsFile, eph, 0.0, gnss_pseudoranges_map);
rp->obsFile.seekp(0);
auto rp = std::make_shared<Rinex_Printer>();
rp->print_rinex_annotation(pvt_solution.get(),
gnss_observables_map,
0.0,
4,
true);
while (!rp->obsFile.eof())
std::string obsfile = rp->get_obsfilename();
std::string navfile = rp->get_navfilename()[0];
rp = nullptr; // close the RINEX files so we can inspect them
std::fstream fstr(obsfile.c_str(), std::fstream::in);
fstr.seekg(0);
while (!fstr.eof())
{
std::getline(rp->obsFile, line_str);
std::getline(fstr, line_str);
if (!no_more_finds)
{
if (line_str.find("E22", 0) != std::string::npos)
@ -273,26 +511,22 @@ TEST(RinexPrinterTest, GalileoObsLog)
std::string expected_str("E22 22000000.000 7 3.724 7 1534.000 7 42.000 ");
EXPECT_EQ(0, expected_str.compare(line_aux));
if (remove(rp->obsfilename.c_str()) != 0)
{
LOG(INFO) << "Error deleting temporary file";
}
fstr.close();
fs::remove(obsfile);
fs::remove(navfile);
}
TEST(RinexPrinterTest, GlonassObsLog)
TEST_F(RinexPrinterTest, GlonassObsLog)
{
std::string line_aux;
std::string line_str;
bool no_more_finds = false;
const Glonass_Gnav_Ephemeris eph = Glonass_Gnav_Ephemeris();
std::shared_ptr<Rinex_Printer> rp;
rp = std::make_shared<Rinex_Printer>();
rp->rinex_obs_header(rp->obsFile, eph, 0.0);
std::map<int, Gnss_Synchro> gnss_pseudoranges_map;
auto eph = Glonass_Gnav_Ephemeris();
eph.i_satellite_PRN = 22;
auto pvt_solution = std::make_shared<Rtklib_Solver>(rtk, 12, "filename", false, false);
pvt_solution->glonass_gnav_ephemeris_map[1] = eph;
std::map<int, Gnss_Synchro> gnss_observables_map;
Gnss_Synchro gs1 = Gnss_Synchro();
Gnss_Synchro gs2 = Gnss_Synchro();
@ -321,17 +555,30 @@ TEST(RinexPrinterTest, GlonassObsLog)
gs4.Carrier_Doppler_hz = 1534;
gs4.CN0_dB_hz = 42;
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
rp->log_rinex_obs(rp->obsFile, eph, 0.0, gnss_pseudoranges_map);
rp->obsFile.seekp(0);
auto rp = std::make_shared<Rinex_Printer>();
rp->print_rinex_annotation(pvt_solution.get(),
gnss_observables_map,
0.0,
23,
true);
while (!rp->obsFile.eof())
std::string obsfile = rp->get_obsfilename();
std::string navfile = rp->get_navfilename()[0];
rp = nullptr; // close the RINEX files so we can inspect them
std::fstream fstr(obsfile.c_str(), std::fstream::in);
fstr.seekg(0);
while (!fstr.eof())
{
std::getline(rp->obsFile, line_str);
std::getline(fstr, line_str);
if (!no_more_finds)
{
if (line_str.find("R22", 0) != std::string::npos)
@ -344,27 +591,25 @@ TEST(RinexPrinterTest, GlonassObsLog)
std::string expected_str("R22 22000000.000 7 3.724 7 1534.000 7 42.000 ");
EXPECT_EQ(0, expected_str.compare(line_aux));
if (remove(rp->obsfilename.c_str()) != 0)
{
LOG(INFO) << "Error deleting temporary file";
}
fstr.close();
fs::remove(navfile);
fs::remove(obsfile);
}
TEST(RinexPrinterTest, GpsObsLogDualBand)
TEST_F(RinexPrinterTest, GpsObsLogDualBand)
{
std::string line_aux;
std::string line_str;
bool no_more_finds = false;
const Gps_Ephemeris eph_gps = Gps_Ephemeris();
const Gps_CNAV_Ephemeris eph_cnav = Gps_CNAV_Ephemeris();
std::shared_ptr<Rinex_Printer> rp;
rp = std::make_shared<Rinex_Printer>();
rp->rinex_obs_header(rp->obsFile, eph_gps, eph_cnav, 0.0);
std::map<int, Gnss_Synchro> gnss_pseudoranges_map;
auto eph = Gps_Ephemeris();
auto eph_cnav = Gps_CNAV_Ephemeris();
eph.i_satellite_PRN = 1;
eph_cnav.i_satellite_PRN = 1;
auto pvt_solution = std::make_shared<Rtklib_Solver>(rtk, 12, "filename", false, false);
pvt_solution->gps_ephemeris_map[1] = eph;
pvt_solution->gps_cnav_ephemeris_map[1] = eph_cnav;
std::map<int, Gnss_Synchro> gnss_observables_map;
Gnss_Synchro gs1 = Gnss_Synchro();
Gnss_Synchro gs2 = Gnss_Synchro();
@ -405,17 +650,30 @@ TEST(RinexPrinterTest, GpsObsLogDualBand)
gs3.Carrier_Doppler_hz = -1534;
gs3.CN0_dB_hz = 47;
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
rp->log_rinex_obs(rp->obsFile, eph_gps, eph_cnav, 0.0, gnss_pseudoranges_map);
rp->obsFile.seekp(0);
auto rp = std::make_shared<Rinex_Printer>();
rp->print_rinex_annotation(pvt_solution.get(),
gnss_observables_map,
0.0,
7,
true);
while (!rp->obsFile.eof())
std::string obsfile = rp->get_obsfilename();
std::string navfile = rp->get_navfilename()[0];
rp = nullptr; // close the RINEX files so we can inspect them
std::fstream fstr(obsfile.c_str(), std::fstream::in);
fstr.seekg(0);
while (!fstr.eof())
{
std::getline(rp->obsFile, line_str);
std::getline(fstr, line_str);
if (!no_more_finds)
{
if (line_str.find("G08", 0) != std::string::npos)
@ -428,28 +686,20 @@ TEST(RinexPrinterTest, GpsObsLogDualBand)
std::string expected_str("G08 22000002.100 6 7.226 6 321.000 6 39.000 22000000.000 7 3.724 7 1534.000 7 42.000");
EXPECT_EQ(0, expected_str.compare(line_aux));
if (remove(rp->obsfilename.c_str()) != 0)
{
LOG(INFO) << "Error deleting temporary file";
}
fstr.close();
fs::remove(navfile);
fs::remove(obsfile);
}
TEST(RinexPrinterTest, GalileoObsLogDualBand)
TEST_F(RinexPrinterTest, GalileoObsLogDualBand)
{
std::string line_aux;
std::string line_str;
bool no_more_finds = false;
const Galileo_Ephemeris eph = Galileo_Ephemeris();
std::shared_ptr<Rinex_Printer> rp;
rp = std::make_shared<Rinex_Printer>();
std::string bands("1B 5X");
rp->rinex_obs_header(rp->obsFile, eph, 0.0, bands);
std::map<int, Gnss_Synchro> gnss_pseudoranges_map;
auto pvt_solution = std::make_shared<Rtklib_Solver>(rtk, 12, "filename", false, false);
auto eph = Galileo_Ephemeris();
eph.i_satellite_PRN = 1;
pvt_solution->galileo_ephemeris_map[1] = eph;
std::map<int, Gnss_Synchro> gnss_observables_map;
Gnss_Synchro gs1 = Gnss_Synchro();
Gnss_Synchro gs2 = Gnss_Synchro();
Gnss_Synchro gs3 = Gnss_Synchro();
@ -489,17 +739,34 @@ TEST(RinexPrinterTest, GalileoObsLogDualBand)
gs4.Carrier_Doppler_hz = 1534;
gs4.CN0_dB_hz = 42;
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
rp->log_rinex_obs(rp->obsFile, eph, 0.0, gnss_pseudoranges_map, bands);
rp->obsFile.seekp(0);
auto rp = std::make_shared<Rinex_Printer>();
while (!rp->obsFile.eof())
rp->print_rinex_annotation(pvt_solution.get(),
gnss_observables_map,
0.0,
14,
true);
std::string obsfile = rp->get_obsfilename();
std::string navfile = rp->get_navfilename()[0];
rp = nullptr; // close the RINEX files so we can inspect them
std::fstream fstr(obsfile.c_str(), std::fstream::in);
fstr.seekg(0);
std::string line_aux;
std::string line_str;
bool no_more_finds = false;
while (!fstr.eof())
{
std::getline(rp->obsFile, line_str);
std::getline(fstr, line_str);
if (!no_more_finds)
{
if (line_str.find("E08", 0) != std::string::npos)
@ -512,27 +779,25 @@ TEST(RinexPrinterTest, GalileoObsLogDualBand)
std::string expected_str("E08 22000002.100 6 7.226 6 321.000 6 39.000 22000000.000 7 3.724 7 1534.000 7 42.000");
EXPECT_EQ(0, expected_str.compare(line_aux));
if (remove(rp->obsfilename.c_str()) != 0)
{
LOG(INFO) << "Error deleting temporary file";
}
fstr.close();
fs::remove(navfile);
fs::remove(obsfile);
}
TEST(RinexPrinterTest, MixedObsLog)
TEST_F(RinexPrinterTest, MixedObsLog)
{
std::string line_aux;
std::string line_str;
bool no_more_finds = false;
const Galileo_Ephemeris eph_gal = Galileo_Ephemeris();
const Gps_Ephemeris eph_gps = Gps_Ephemeris();
std::shared_ptr<Rinex_Printer> rp;
rp = std::make_shared<Rinex_Printer>();
rp->rinex_obs_header(rp->obsFile, eph_gps, eph_gal, 0.0, "1B 5X");
std::map<int, Gnss_Synchro> gnss_pseudoranges_map;
auto eph_gps = Gps_Ephemeris();
auto eph_gal = Galileo_Ephemeris();
eph_gps.i_satellite_PRN = 1;
eph_gal.i_satellite_PRN = 1;
auto pvt_solution = std::make_shared<Rtklib_Solver>(rtk, 12, "filename", false, false);
pvt_solution->gps_ephemeris_map[1] = eph_gps;
pvt_solution->galileo_ephemeris_map[1] = eph_gal;
std::map<int, Gnss_Synchro> gnss_observables_map;
Gnss_Synchro gs1 = Gnss_Synchro();
Gnss_Synchro gs2 = Gnss_Synchro();
@ -598,22 +863,35 @@ TEST(RinexPrinterTest, MixedObsLog)
gs8.Carrier_Doppler_hz = -20;
gs8.CN0_dB_hz = 42;
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(5, gs5));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(6, gs6));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(7, gs7));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(8, gs8));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(5, gs5));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(6, gs6));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(7, gs7));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(8, gs8));
rp->log_rinex_obs(rp->obsFile, eph_gps, eph_gal, 0.0, gnss_pseudoranges_map);
auto rp = std::make_shared<Rinex_Printer>();
rp->obsFile.seekp(0);
rp->print_rinex_annotation(pvt_solution.get(),
gnss_observables_map,
0.0,
9,
true);
while (!rp->obsFile.eof())
std::string obsfile = rp->get_obsfilename();
std::string navfile = rp->get_navfilename()[0];
rp = nullptr; // close the RINEX files so we can inspect them
std::fstream fstr(obsfile.c_str(), std::fstream::in);
fstr.seekg(0);
while (!fstr.eof())
{
std::getline(rp->obsFile, line_str);
std::getline(fstr, line_str);
if (!no_more_finds)
{
if (line_str.find("E16", 0) != std::string::npos)
@ -625,27 +903,25 @@ TEST(RinexPrinterTest, MixedObsLog)
}
std::string expected_str("E16 22000000.000 7 0.127 7 -20.000 7 42.000 22000000.000 6 8.292 6 1534.000 6 41.000");
EXPECT_EQ(0, expected_str.compare(line_aux));
if (remove(rp->obsfilename.c_str()) != 0)
{
LOG(INFO) << "Error deleting temporary file";
}
fstr.close();
fs::remove(navfile);
fs::remove(obsfile);
}
TEST(RinexPrinterTest, MixedObsLogGpsGlo)
TEST_F(RinexPrinterTest, MixedObsLogGpsGlo)
{
std::string line_aux;
std::string line_str;
bool no_more_finds = false;
const Glonass_Gnav_Ephemeris eph_glo = Glonass_Gnav_Ephemeris();
const Gps_Ephemeris eph_gps = Gps_Ephemeris();
std::shared_ptr<Rinex_Printer> rp;
rp = std::make_shared<Rinex_Printer>();
rp->rinex_obs_header(rp->obsFile, eph_gps, eph_glo, 0.0, "1G");
std::map<int, Gnss_Synchro> gnss_pseudoranges_map;
auto eph_gps = Gps_Ephemeris();
auto eph_glo = Glonass_Gnav_Ephemeris();
eph_gps.i_satellite_PRN = 1;
eph_glo.i_satellite_PRN = 1;
auto pvt_solution = std::make_shared<Rtklib_Solver>(rtk, 12, "filename", false, false);
pvt_solution->gps_ephemeris_map[1] = eph_gps;
pvt_solution->glonass_gnav_ephemeris_map[1] = eph_glo;
std::map<int, Gnss_Synchro> gnss_observables_map;
Gnss_Synchro gs1 = Gnss_Synchro();
Gnss_Synchro gs2 = Gnss_Synchro();
@ -709,22 +985,35 @@ TEST(RinexPrinterTest, MixedObsLogGpsGlo)
gs8.Carrier_Doppler_hz = -20;
gs8.CN0_dB_hz = 42;
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(5, gs5));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(6, gs6));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(7, gs7));
gnss_pseudoranges_map.insert(std::pair<int, Gnss_Synchro>(8, gs8));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(1, gs1));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(2, gs2));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(3, gs3));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(4, gs4));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(5, gs5));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(6, gs6));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(7, gs7));
gnss_observables_map.insert(std::pair<int, Gnss_Synchro>(8, gs8));
rp->log_rinex_obs(rp->obsFile, eph_gps, eph_glo, 0.0, gnss_pseudoranges_map);
auto rp = std::make_shared<Rinex_Printer>();
rp->obsFile.seekp(0);
rp->print_rinex_annotation(pvt_solution.get(),
gnss_observables_map,
0.0,
26,
true);
while (!rp->obsFile.eof())
std::string obsfile = rp->get_obsfilename();
std::string navfile = rp->get_navfilename()[0];
rp = nullptr; // close the RINEX files so we can inspect them
std::fstream fstr(obsfile.c_str(), std::fstream::in);
fstr.seekg(0);
while (!fstr.eof())
{
std::getline(rp->obsFile, line_str);
std::getline(fstr, line_str);
if (!no_more_finds)
{
if (line_str.find("R16", 0) != std::string::npos)
@ -737,9 +1026,7 @@ TEST(RinexPrinterTest, MixedObsLogGpsGlo)
std::string expected_str("R16 22000000.000 6 8.292 6 1534.000 6 41.000 22000000.000 7 0.127 7 -20.000 7 42.000");
EXPECT_EQ(0, expected_str.compare(line_aux));
if (remove(rp->obsfilename.c_str()) != 0)
{
LOG(INFO) << "Error deleting temporary file";
}
fstr.close();
fs::remove(navfile);
fs::remove(obsfile);
}