2014-03-23 09:43:16 +00:00
|
|
|
/*!
|
|
|
|
* \file rtcm_printer.cc
|
|
|
|
* \brief Implementation of a RTCM 3.2 printer for GNSS-SDR
|
|
|
|
* This class provides a implementation of a subset of the RTCM Standard 10403.2
|
|
|
|
* for Differential GNSS Services
|
|
|
|
*
|
|
|
|
* \author Carles Fernandez-Prades, 2014. cfernandez(at)cttc.es
|
|
|
|
*
|
2020-07-28 14:57:15 +00:00
|
|
|
* -----------------------------------------------------------------------------
|
2014-03-23 09:43:16 +00:00
|
|
|
*
|
2020-12-30 12:35:06 +00:00
|
|
|
* GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
|
2014-03-23 09:43:16 +00:00
|
|
|
* This file is part of GNSS-SDR.
|
|
|
|
*
|
2020-12-30 12:35:06 +00:00
|
|
|
* Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors)
|
2020-02-08 00:20:02 +00:00
|
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
2014-03-23 09:43:16 +00:00
|
|
|
*
|
2020-07-28 14:57:15 +00:00
|
|
|
* -----------------------------------------------------------------------------
|
2014-03-23 09:43:16 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "rtcm_printer.h"
|
2019-03-06 17:45:27 +00:00
|
|
|
#include "galileo_ephemeris.h"
|
|
|
|
#include "glonass_gnav_ephemeris.h"
|
|
|
|
#include "glonass_gnav_utc_model.h"
|
2021-01-16 13:37:19 +00:00
|
|
|
#include "gnss_sdr_filesystem.h"
|
2020-06-25 00:50:07 +00:00
|
|
|
#include "gnss_sdr_make_unique.h"
|
2019-03-06 17:45:27 +00:00
|
|
|
#include "gnss_synchro.h"
|
|
|
|
#include "gps_cnav_ephemeris.h"
|
|
|
|
#include "gps_ephemeris.h"
|
|
|
|
#include "rtcm.h"
|
2020-11-14 00:57:29 +00:00
|
|
|
#include "rtklib_solver.h"
|
2019-07-16 10:02:13 +00:00
|
|
|
#include <boost/exception/diagnostic_information.hpp>
|
2018-02-26 02:15:53 +00:00
|
|
|
#include <glog/logging.h>
|
2019-03-06 17:45:27 +00:00
|
|
|
#include <ctime> // for tm
|
|
|
|
#include <exception> // for exception
|
|
|
|
#include <fcntl.h> // for O_RDWR
|
|
|
|
#include <iostream> // for cout, cerr
|
2014-03-23 09:43:16 +00:00
|
|
|
#include <termios.h> // for tcgetattr
|
2019-03-06 17:45:27 +00:00
|
|
|
#include <unistd.h> // for close, write
|
2020-11-22 10:05:16 +00:00
|
|
|
|
2014-03-23 09:43:16 +00:00
|
|
|
|
2018-12-03 21:38:46 +00:00
|
|
|
Rtcm_Printer::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, const std::string& base_path)
|
2014-03-23 09:43:16 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time();
|
|
|
|
const tm timeinfo = boost::posix_time::to_tm(pt);
|
2018-10-27 22:42:28 +00:00
|
|
|
d_rtcm_file_dump = flag_rtcm_file_dump;
|
|
|
|
rtcm_base_path = base_path;
|
|
|
|
if (d_rtcm_file_dump)
|
|
|
|
{
|
2019-06-10 19:41:13 +00:00
|
|
|
fs::path full_path(fs::current_path());
|
|
|
|
const fs::path p(rtcm_base_path);
|
|
|
|
if (!fs::exists(p))
|
2018-10-27 22:42:28 +00:00
|
|
|
{
|
|
|
|
std::string new_folder;
|
2020-12-30 20:49:29 +00:00
|
|
|
for (const auto& folder : fs::path(rtcm_base_path))
|
2018-10-27 22:42:28 +00:00
|
|
|
{
|
|
|
|
new_folder += folder.string();
|
2019-06-10 19:41:13 +00:00
|
|
|
errorlib::error_code ec;
|
|
|
|
if (!fs::exists(new_folder))
|
2018-10-27 22:42:28 +00:00
|
|
|
{
|
2019-06-10 19:41:13 +00:00
|
|
|
if (!fs::create_directory(new_folder, ec))
|
2018-10-27 22:42:28 +00:00
|
|
|
{
|
2020-07-07 16:53:50 +00:00
|
|
|
std::cout << "Could not create the " << new_folder << " folder.\n";
|
2018-10-27 22:42:28 +00:00
|
|
|
rtcm_base_path = full_path.string();
|
|
|
|
}
|
|
|
|
}
|
2019-06-10 19:41:13 +00:00
|
|
|
new_folder += fs::path::preferred_separator;
|
2018-10-27 22:42:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
rtcm_base_path = p.string();
|
|
|
|
}
|
2018-12-02 14:42:38 +00:00
|
|
|
if (rtcm_base_path != ".")
|
2018-10-27 22:42:28 +00:00
|
|
|
{
|
2020-07-07 16:53:50 +00:00
|
|
|
std::cout << "RTCM binary file will be stored at " << rtcm_base_path << '\n';
|
2018-10-27 22:42:28 +00:00
|
|
|
}
|
|
|
|
|
2019-06-10 19:41:13 +00:00
|
|
|
rtcm_base_path = rtcm_base_path + fs::path::preferred_separator;
|
2018-10-27 22:42:28 +00:00
|
|
|
}
|
2015-12-24 19:56:41 +00:00
|
|
|
|
|
|
|
if (time_tag_name)
|
|
|
|
{
|
|
|
|
std::stringstream strm0;
|
2018-08-11 11:56:24 +00:00
|
|
|
const int32_t year = timeinfo.tm_year - 100;
|
2015-12-24 19:56:41 +00:00
|
|
|
strm0 << year;
|
2018-08-11 11:56:24 +00:00
|
|
|
const int32_t month = timeinfo.tm_mon + 1;
|
2018-03-03 01:03:39 +00:00
|
|
|
if (month < 10)
|
2015-12-24 19:56:41 +00:00
|
|
|
{
|
|
|
|
strm0 << "0";
|
|
|
|
}
|
|
|
|
strm0 << month;
|
2018-08-11 11:56:24 +00:00
|
|
|
const int32_t day = timeinfo.tm_mday;
|
2018-03-03 01:03:39 +00:00
|
|
|
if (day < 10)
|
2015-12-24 19:56:41 +00:00
|
|
|
{
|
|
|
|
strm0 << "0";
|
|
|
|
}
|
|
|
|
strm0 << day << "_";
|
2018-08-11 11:56:24 +00:00
|
|
|
const int32_t hour = timeinfo.tm_hour;
|
2018-03-03 01:03:39 +00:00
|
|
|
if (hour < 10)
|
2015-12-24 19:56:41 +00:00
|
|
|
{
|
|
|
|
strm0 << "0";
|
|
|
|
}
|
|
|
|
strm0 << hour;
|
2018-08-11 11:56:24 +00:00
|
|
|
const int32_t min = timeinfo.tm_min;
|
2018-03-03 01:03:39 +00:00
|
|
|
if (min < 10)
|
2015-12-24 19:56:41 +00:00
|
|
|
{
|
|
|
|
strm0 << "0";
|
|
|
|
}
|
|
|
|
strm0 << min;
|
2018-08-11 11:56:24 +00:00
|
|
|
const int32_t sec = timeinfo.tm_sec;
|
2018-03-03 01:03:39 +00:00
|
|
|
if (sec < 10)
|
2015-12-24 19:56:41 +00:00
|
|
|
{
|
|
|
|
strm0 << "0";
|
|
|
|
}
|
|
|
|
strm0 << sec;
|
|
|
|
|
2018-03-03 01:03:39 +00:00
|
|
|
rtcm_filename = filename + "_" + strm0.str() + ".rtcm";
|
2015-12-24 19:56:41 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
rtcm_filename = filename + ".rtcm";
|
|
|
|
}
|
2018-10-27 22:42:28 +00:00
|
|
|
rtcm_filename = rtcm_base_path + rtcm_filename;
|
|
|
|
if (d_rtcm_file_dump)
|
2014-03-23 09:43:16 +00:00
|
|
|
{
|
2018-10-27 22:42:28 +00:00
|
|
|
rtcm_file_descriptor.open(rtcm_filename.c_str(), std::ios::out);
|
|
|
|
if (rtcm_file_descriptor.is_open())
|
|
|
|
{
|
|
|
|
DLOG(INFO) << "RTCM printer writing on " << rtcm_filename.c_str();
|
|
|
|
}
|
2018-10-28 00:02:28 +00:00
|
|
|
else
|
|
|
|
{
|
2020-07-07 16:53:50 +00:00
|
|
|
std::cout << "File " << rtcm_filename << "cannot be saved. Wrong permissions?\n";
|
2018-10-28 00:02:28 +00:00
|
|
|
}
|
2014-03-23 09:43:16 +00:00
|
|
|
}
|
|
|
|
|
2019-02-05 00:31:09 +00:00
|
|
|
rtcm_devname = rtcm_dump_devname;
|
2014-03-23 09:43:16 +00:00
|
|
|
if (flag_rtcm_tty_port == true)
|
|
|
|
{
|
|
|
|
rtcm_dev_descriptor = init_serial(rtcm_devname.c_str());
|
|
|
|
if (rtcm_dev_descriptor != -1)
|
|
|
|
{
|
|
|
|
DLOG(INFO) << "RTCM printer writing on " << rtcm_devname.c_str();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
rtcm_dev_descriptor = -1;
|
|
|
|
}
|
2015-12-24 19:56:41 +00:00
|
|
|
|
2016-05-06 19:00:08 +00:00
|
|
|
port = rtcm_tcp_port;
|
|
|
|
station_id = rtcm_station_id;
|
2020-11-14 00:57:29 +00:00
|
|
|
d_rtcm_writing_started = false;
|
2016-05-06 19:00:08 +00:00
|
|
|
|
2020-06-25 00:50:07 +00:00
|
|
|
rtcm = std::make_unique<Rtcm>(port);
|
2016-05-06 19:00:08 +00:00
|
|
|
|
2018-03-03 01:03:39 +00:00
|
|
|
if (flag_rtcm_server)
|
2015-12-24 19:56:41 +00:00
|
|
|
{
|
|
|
|
rtcm->run_server();
|
|
|
|
}
|
2014-03-23 09:43:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Rtcm_Printer::~Rtcm_Printer()
|
|
|
|
{
|
2020-06-25 00:50:07 +00:00
|
|
|
DLOG(INFO) << "RTCM printer destructor called.";
|
2018-03-03 01:03:39 +00:00
|
|
|
if (rtcm->is_server_running())
|
2015-12-24 19:56:41 +00:00
|
|
|
{
|
2017-01-14 14:43:34 +00:00
|
|
|
try
|
2018-03-03 01:03:39 +00:00
|
|
|
{
|
2017-01-14 14:43:34 +00:00
|
|
|
rtcm->stop_server();
|
2018-03-03 01:03:39 +00:00
|
|
|
}
|
|
|
|
catch (const boost::exception& e)
|
|
|
|
{
|
2017-01-14 14:43:34 +00:00
|
|
|
LOG(WARNING) << "Boost exception: " << boost::diagnostic_information(e);
|
2018-03-03 01:03:39 +00:00
|
|
|
}
|
|
|
|
catch (const std::exception& ex)
|
|
|
|
{
|
2017-01-14 14:43:34 +00:00
|
|
|
LOG(WARNING) << "STD exception: " << ex.what();
|
2018-03-03 01:03:39 +00:00
|
|
|
}
|
2015-12-24 19:56:41 +00:00
|
|
|
}
|
2014-03-23 09:43:16 +00:00
|
|
|
if (rtcm_file_descriptor.is_open())
|
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const auto pos = rtcm_file_descriptor.tellp();
|
2019-02-10 20:55:51 +00:00
|
|
|
try
|
|
|
|
{
|
|
|
|
rtcm_file_descriptor.close();
|
|
|
|
}
|
|
|
|
catch (const std::exception& e)
|
|
|
|
{
|
|
|
|
std::cerr << e.what() << '\n';
|
|
|
|
}
|
2015-05-23 07:44:47 +00:00
|
|
|
if (pos == 0)
|
|
|
|
{
|
2019-07-13 12:28:48 +00:00
|
|
|
errorlib::error_code ec;
|
|
|
|
if (!fs::remove(fs::path(rtcm_filename), ec))
|
2019-02-11 20:13:02 +00:00
|
|
|
{
|
|
|
|
LOG(INFO) << "Error deleting temporary RTCM file";
|
|
|
|
}
|
2015-05-23 07:44:47 +00:00
|
|
|
}
|
2014-03-23 09:43:16 +00:00
|
|
|
}
|
2019-02-10 20:55:51 +00:00
|
|
|
try
|
|
|
|
{
|
|
|
|
close_serial();
|
|
|
|
}
|
|
|
|
catch (const std::exception& e)
|
|
|
|
{
|
|
|
|
std::cerr << e.what() << '\n';
|
|
|
|
}
|
2014-03-23 09:43:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-11-14 00:57:29 +00:00
|
|
|
void Rtcm_Printer::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)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if (d_rtcm_writing_started)
|
|
|
|
{
|
|
|
|
switch (type_of_rx)
|
|
|
|
{
|
|
|
|
case 1: // GPS L1 C/A
|
|
|
|
if (flag_write_RTCM_1019_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 4: // Galileo E1B
|
|
|
|
case 5: // Galileo E5a
|
|
|
|
case 6: // Galileo E5b
|
|
|
|
if (flag_write_RTCM_1045_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 7: // GPS L1 C/A + GPS L2C
|
|
|
|
if (flag_write_RTCM_1019_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin();
|
|
|
|
if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend()))
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 8: // L1+L5
|
|
|
|
if (flag_write_RTCM_1019_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin();
|
|
|
|
if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend()))
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 9: // GPS L1 C/A + Galileo E1B
|
|
|
|
if (flag_write_RTCM_1019_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_1045_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
int gps_channel = 0;
|
|
|
|
int gal_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gps_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "G")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gps_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 13: // L5+E5a
|
|
|
|
if (flag_write_RTCM_1045_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flag_write_RTCM_MSM_output and rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin();
|
|
|
|
int gal_channel = 0;
|
|
|
|
int gps_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gps_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "G")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gps_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend() and (rtcm_MT1097_rate_ms != 0))
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend() and (rtcm_MT1077_rate_ms != 0))
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 14: // Galileo E1B + Galileo E5a
|
|
|
|
case 15: // Galileo E1B + Galileo E5b
|
|
|
|
if (flag_write_RTCM_1045_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 23: // GLONASS L1 C/A
|
|
|
|
case 24: // GLONASS L2 C/A
|
|
|
|
case 25: // GLONASS L1 C/A + GLONASS L2 C/A
|
|
|
|
if (flag_write_RTCM_1020_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& glonass_gnav_ephemeris_iter : pvt_solver->glonass_gnav_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1020(glonass_gnav_ephemeris_iter.second, pvt_solver->glonass_gnav_utc_model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
const auto glo_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin();
|
|
|
|
if (glo_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, {}, glo_gnav_ephemeris_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 26: // GPS L1 C/A + GLONASS L1 C/A
|
|
|
|
if (flag_write_RTCM_1019_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_1020_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& glonass_gnav_ephemeris_iter : pvt_solver->glonass_gnav_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1020(glonass_gnav_ephemeris_iter.second, pvt_solver->glonass_gnav_utc_model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin();
|
|
|
|
auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
int gps_channel = 0;
|
|
|
|
int glo_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gps_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "G")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gps_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (glo_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "R")
|
|
|
|
{
|
|
|
|
glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
glo_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 27: // GLONASS L1 C/A + Galileo E1B
|
|
|
|
if (flag_write_RTCM_1020_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_1045_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin();
|
|
|
|
int gal_channel = 0;
|
|
|
|
int glo_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (glo_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "R")
|
|
|
|
{
|
|
|
|
glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
glo_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 29: // GPS L1 C/A + GLONASS L2 C/A
|
|
|
|
if (flag_write_RTCM_1019_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_1020_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin();
|
|
|
|
int gps_channel = 0;
|
|
|
|
int glo_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gps_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "G")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gps_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (glo_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "R")
|
|
|
|
{
|
|
|
|
glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
glo_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 30: // GLONASS L2 C/A + Galileo E1B
|
|
|
|
if (flag_write_RTCM_1020_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_1045_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin();
|
|
|
|
int gal_channel = 0;
|
|
|
|
int glo_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (glo_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "R")
|
|
|
|
{
|
|
|
|
glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
glo_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 32: // L1+E1+L5+E5a
|
|
|
|
if (flag_write_RTCM_1019_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_1045_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
int gal_channel = 0;
|
|
|
|
int gps_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gps_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "G")
|
|
|
|
{
|
|
|
|
gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gps_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 101: // Galileo E1B + Galileo E6B
|
|
|
|
case 102: // Galileo E5a + Galileo E6B
|
|
|
|
case 103: // Galileo E5b + Galileo E6B
|
|
|
|
case 104: // Galileo E1B + Galileo E5a + Galileo E6B
|
|
|
|
case 105: // Galileo E1B + Galileo E5b + Galileo E6B
|
|
|
|
if (flag_write_RTCM_1045_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B
|
|
|
|
if (flag_write_RTCM_1019_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_1045_output == true)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (flag_write_RTCM_MSM_output == true)
|
|
|
|
{
|
|
|
|
auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
int gps_channel = 0;
|
|
|
|
int gal_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gps_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "G")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gps_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!d_rtcm_writing_started) // the first time
|
|
|
|
{
|
|
|
|
switch (type_of_rx)
|
|
|
|
{
|
|
|
|
case 1: // GPS L1 C/A
|
|
|
|
if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 4: // Galileo E1B
|
|
|
|
case 5: // Galileo E5a
|
|
|
|
case 6: // Galileo E5b
|
|
|
|
if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 7: // GPS L1 C/A + GPS L2C
|
|
|
|
if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin();
|
|
|
|
if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend()))
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 8: // L1+L5
|
|
|
|
if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin();
|
|
|
|
if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend()))
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 9: // GPS L1 C/A + Galileo E1B
|
|
|
|
if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MT1045_rate_ms != 0)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
int gps_channel = 0;
|
|
|
|
int gal_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gps_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "G")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gps_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 13: // L5+E5a
|
|
|
|
if (rtcm_MT1045_rate_ms != 0)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
int gal_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend() and (rtcm_MT1097_rate_ms != 0))
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 14: // Galileo E1B + Galileo E5a
|
|
|
|
case 15: // Galileo E1B + Galileo E5b
|
|
|
|
if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 23: // GLONASS L1 C/A
|
|
|
|
case 24: // GLONASS L2 C/A
|
|
|
|
case 25: // GLONASS L1 C/A + GLONASS L2 C/A
|
|
|
|
if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
const auto glo_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin();
|
|
|
|
if (glo_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, {}, glo_gnav_ephemeris_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 26: // GPS L1 C/A + GLONASS L1 C/A
|
|
|
|
if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin();
|
|
|
|
int gps_channel = 0;
|
|
|
|
int glo_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gps_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "G")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gps_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (glo_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "R")
|
|
|
|
{
|
|
|
|
glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
glo_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 27: // GLONASS L1 C/A + Galileo E1B
|
|
|
|
if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
int gal_channel = 0;
|
|
|
|
int glo_channel = 0;
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin();
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (glo_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "R")
|
|
|
|
{
|
|
|
|
glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
glo_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 29: // GPS L1 C/A + GLONASS L2 C/A
|
|
|
|
if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin();
|
|
|
|
int gps_channel = 0;
|
|
|
|
int glo_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gps_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "G")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gps_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (glo_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "R")
|
|
|
|
{
|
|
|
|
glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
glo_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 30: // GLONASS L2 C/A + Galileo E1B
|
|
|
|
if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
int gal_channel = 0;
|
|
|
|
int glo_channel = 0;
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin();
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (glo_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "R")
|
|
|
|
{
|
|
|
|
glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
glo_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 32: // L1+E1+L5+E5a
|
|
|
|
if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
int gps_channel = 0;
|
|
|
|
int gal_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gps_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "G")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gps_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 101: // Galileo E1B + Galileo E6B
|
|
|
|
case 102: // Galileo E5a + Galileo E6B
|
|
|
|
case 103: // Galileo E5b + Galileo E6B
|
|
|
|
if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 104: // Galileo E1B + Galileo E5a + Galileo E6B
|
|
|
|
case 105: // Galileo E1B + Galileo E5b + Galileo E6B
|
|
|
|
if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B
|
|
|
|
if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0
|
|
|
|
{
|
|
|
|
for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1019(gps_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MT1045_rate_ms != 0)
|
|
|
|
{
|
|
|
|
for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map)
|
|
|
|
{
|
|
|
|
Print_Rtcm_MT1045(gal_eph_iter.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (rtcm_MSM_rate_ms != 0)
|
|
|
|
{
|
|
|
|
auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin();
|
|
|
|
auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin();
|
|
|
|
int gps_channel = 0;
|
|
|
|
int gal_channel = 0;
|
|
|
|
for (const auto& gnss_observables_iter : gnss_observables_map)
|
|
|
|
{
|
|
|
|
const std::string system(gnss_observables_iter.second.System, 1);
|
|
|
|
if (gps_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "G")
|
|
|
|
{
|
|
|
|
// This is a channel with valid GPS signal
|
|
|
|
gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gps_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gal_channel == 0)
|
|
|
|
{
|
|
|
|
if (system == "E")
|
|
|
|
{
|
|
|
|
gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN);
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
gal_channel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend())
|
|
|
|
{
|
|
|
|
Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_rtcm_writing_started = true;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const boost::exception& ex)
|
|
|
|
{
|
|
|
|
std::cout << "RTCM boost exception: " << boost::diagnostic_information(ex) << '\n';
|
|
|
|
LOG(ERROR) << "RTCM boost exception: " << boost::diagnostic_information(ex);
|
|
|
|
}
|
|
|
|
catch (const std::exception& ex)
|
|
|
|
{
|
|
|
|
std::cout << "RTCM std exception: " << ex.what() << '\n';
|
|
|
|
LOG(ERROR) << "RTCM std exception: " << ex.what();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
bool Rtcm_Printer::Print_Rtcm_MT1001(const Gps_Ephemeris& gps_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables)
|
2015-11-21 12:01:50 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const std::string m1001 = rtcm->print_MT1001(gps_eph, obs_time, observables, station_id);
|
2015-11-21 12:01:50 +00:00
|
|
|
Rtcm_Printer::Print_Message(m1001);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-11-24 16:57:05 +00:00
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
bool Rtcm_Printer::Print_Rtcm_MT1002(const Gps_Ephemeris& gps_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables)
|
2015-12-24 19:56:41 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const std::string m1002 = rtcm->print_MT1002(gps_eph, obs_time, observables, station_id);
|
2015-12-24 19:56:41 +00:00
|
|
|
Rtcm_Printer::Print_Message(m1002);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
bool Rtcm_Printer::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)
|
2016-11-04 08:19:31 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const std::string m1003 = rtcm->print_MT1003(gps_eph, cnav_eph, obs_time, observables, station_id);
|
2016-11-04 08:19:31 +00:00
|
|
|
Rtcm_Printer::Print_Message(m1003);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
bool Rtcm_Printer::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)
|
2016-11-04 08:19:31 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const std::string m1003 = rtcm->print_MT1004(gps_eph, cnav_eph, obs_time, observables, station_id);
|
2016-11-04 08:19:31 +00:00
|
|
|
Rtcm_Printer::Print_Message(m1003);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
bool Rtcm_Printer::Print_Rtcm_MT1009(const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables)
|
2017-08-01 18:23:34 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const std::string m1009 = rtcm->print_MT1009(glonass_gnav_eph, obs_time, observables, station_id);
|
2017-08-01 18:23:34 +00:00
|
|
|
Rtcm_Printer::Print_Message(m1009);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
bool Rtcm_Printer::Print_Rtcm_MT1010(const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables)
|
2017-08-01 18:23:34 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const std::string m1010 = rtcm->print_MT1010(glonass_gnav_eph, obs_time, observables, station_id);
|
2017-08-01 18:23:34 +00:00
|
|
|
Rtcm_Printer::Print_Message(m1010);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
bool Rtcm_Printer::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)
|
2017-08-01 18:23:34 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const std::string m1011 = rtcm->print_MT1011(glonass_gnav_ephL1, glonass_gnav_ephL2, obs_time, observables, station_id);
|
2017-08-01 18:23:34 +00:00
|
|
|
Rtcm_Printer::Print_Message(m1011);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
bool Rtcm_Printer::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)
|
2017-08-01 18:23:34 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const std::string m1012 = rtcm->print_MT1012(glonass_gnav_ephL1, glonass_gnav_ephL2, obs_time, observables, station_id);
|
2017-08-01 18:23:34 +00:00
|
|
|
Rtcm_Printer::Print_Message(m1012);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-03-03 01:03:39 +00:00
|
|
|
bool Rtcm_Printer::Print_Rtcm_MT1019(const Gps_Ephemeris& gps_eph)
|
2015-11-21 12:01:50 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const std::string m1019 = rtcm->print_MT1019(gps_eph);
|
2015-11-21 12:01:50 +00:00
|
|
|
Rtcm_Printer::Print_Message(m1019);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-11-24 16:57:05 +00:00
|
|
|
|
2018-03-03 01:03:39 +00:00
|
|
|
bool Rtcm_Printer::Print_Rtcm_MT1020(const Glonass_Gnav_Ephemeris& glonass_gnav_eph, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model)
|
2017-08-01 18:23:34 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const std::string m1020 = rtcm->print_MT1020(glonass_gnav_eph, glonass_gnav_utc_model);
|
2017-08-01 18:23:34 +00:00
|
|
|
Rtcm_Printer::Print_Message(m1020);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-03-03 01:03:39 +00:00
|
|
|
bool Rtcm_Printer::Print_Rtcm_MT1045(const Galileo_Ephemeris& gal_eph)
|
2015-11-21 12:01:50 +00:00
|
|
|
{
|
2020-07-19 07:39:32 +00:00
|
|
|
const std::string m1045 = rtcm->print_MT1045(gal_eph);
|
2015-11-21 12:01:50 +00:00
|
|
|
Rtcm_Printer::Print_Message(m1045);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-03-23 09:43:16 +00:00
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
bool Rtcm_Printer::Print_Rtcm_MSM(uint32_t msm_number, const Gps_Ephemeris& gps_eph,
|
2018-03-03 01:03:39 +00:00
|
|
|
const Gps_CNAV_Ephemeris& gps_cnav_eph,
|
|
|
|
const Galileo_Ephemeris& gal_eph,
|
|
|
|
const Glonass_Gnav_Ephemeris& glo_gnav_eph,
|
|
|
|
double obs_time,
|
2018-08-11 11:56:24 +00:00
|
|
|
const std::map<int32_t, Gnss_Synchro>& observables,
|
|
|
|
uint32_t clock_steering_indicator,
|
|
|
|
uint32_t external_clock_indicator,
|
|
|
|
int32_t smooth_int,
|
2018-03-03 01:03:39 +00:00
|
|
|
bool divergence_free,
|
|
|
|
bool more_messages)
|
2015-12-25 09:25:22 +00:00
|
|
|
{
|
|
|
|
std::string msm;
|
2018-03-03 01:03:39 +00:00
|
|
|
if (msm_number == 1)
|
2015-12-25 09:25:22 +00:00
|
|
|
{
|
2017-08-01 18:23:34 +00:00
|
|
|
msm = rtcm->print_MSM_1(gps_eph, gps_cnav_eph, gal_eph, glo_gnav_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages);
|
2015-12-25 09:25:22 +00:00
|
|
|
}
|
2018-03-03 01:03:39 +00:00
|
|
|
else if (msm_number == 2)
|
2015-12-25 09:25:22 +00:00
|
|
|
{
|
2017-08-01 18:23:34 +00:00
|
|
|
msm = rtcm->print_MSM_2(gps_eph, gps_cnav_eph, gal_eph, glo_gnav_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages);
|
2015-12-25 09:25:22 +00:00
|
|
|
}
|
2018-03-03 01:03:39 +00:00
|
|
|
else if (msm_number == 3)
|
2015-12-25 09:25:22 +00:00
|
|
|
{
|
2017-08-01 18:23:34 +00:00
|
|
|
msm = rtcm->print_MSM_3(gps_eph, gps_cnav_eph, gal_eph, glo_gnav_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages);
|
2015-12-25 09:25:22 +00:00
|
|
|
}
|
2018-03-03 01:03:39 +00:00
|
|
|
else if (msm_number == 4)
|
2015-12-25 09:25:22 +00:00
|
|
|
{
|
2017-08-01 18:23:34 +00:00
|
|
|
msm = rtcm->print_MSM_4(gps_eph, gps_cnav_eph, gal_eph, glo_gnav_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages);
|
2015-12-25 09:25:22 +00:00
|
|
|
}
|
2018-03-03 01:03:39 +00:00
|
|
|
else if (msm_number == 5)
|
2015-12-25 09:25:22 +00:00
|
|
|
{
|
2017-08-01 18:23:34 +00:00
|
|
|
msm = rtcm->print_MSM_5(gps_eph, gps_cnav_eph, gal_eph, glo_gnav_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages);
|
2015-12-25 09:25:22 +00:00
|
|
|
}
|
2018-03-03 01:03:39 +00:00
|
|
|
else if (msm_number == 6)
|
2015-12-25 09:25:22 +00:00
|
|
|
{
|
2017-08-01 18:23:34 +00:00
|
|
|
msm = rtcm->print_MSM_6(gps_eph, gps_cnav_eph, gal_eph, glo_gnav_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages);
|
2015-12-25 09:25:22 +00:00
|
|
|
}
|
2018-03-03 01:03:39 +00:00
|
|
|
else if (msm_number == 7)
|
2015-12-25 09:25:22 +00:00
|
|
|
{
|
2017-08-01 18:23:34 +00:00
|
|
|
msm = rtcm->print_MSM_7(gps_eph, gps_cnav_eph, gal_eph, glo_gnav_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages);
|
2015-12-25 09:25:22 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-12-25 11:27:08 +00:00
|
|
|
Rtcm_Printer::Print_Message(msm);
|
2015-12-25 09:25:22 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-12-03 18:01:47 +00:00
|
|
|
int Rtcm_Printer::init_serial(const std::string& serial_device)
|
2014-03-23 09:43:16 +00:00
|
|
|
{
|
2015-11-23 23:32:52 +00:00
|
|
|
/*
|
|
|
|
* Opens the serial device and sets the default baud rate for a RTCM transmission (9600,8,N,1)
|
2014-03-23 09:43:16 +00:00
|
|
|
*/
|
2018-08-11 11:56:24 +00:00
|
|
|
int32_t fd = 0;
|
2019-07-28 10:01:11 +00:00
|
|
|
// clang-format off
|
2019-07-20 09:13:28 +00:00
|
|
|
struct termios options{};
|
2019-07-28 10:01:11 +00:00
|
|
|
// clang-format on
|
2020-07-19 07:39:32 +00:00
|
|
|
const int64_t BAUD = B9600; // BAUD = B38400;
|
|
|
|
const int64_t DATABITS = CS8;
|
|
|
|
const int64_t STOPBITS = 0;
|
|
|
|
const int64_t PARITYON = 0;
|
|
|
|
const int64_t PARITY = 0;
|
2014-03-23 09:43:16 +00:00
|
|
|
|
2018-12-08 17:49:31 +00:00
|
|
|
fd = open(serial_device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY | O_CLOEXEC);
|
2019-02-11 20:13:02 +00:00
|
|
|
if (fd == -1)
|
|
|
|
{
|
|
|
|
return fd; // failed to open TTY port
|
|
|
|
}
|
2014-03-23 09:43:16 +00:00
|
|
|
|
2019-02-11 20:13:02 +00:00
|
|
|
if (fcntl(fd, F_SETFL, 0) == -1)
|
|
|
|
{
|
|
|
|
LOG(INFO) << "Error enabling direct I/O"; // clear all flags on descriptor, enable direct I/O
|
|
|
|
}
|
|
|
|
tcgetattr(fd, &options); // read serial port options
|
2014-03-23 09:43:16 +00:00
|
|
|
|
|
|
|
options.c_cflag = BAUD | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
|
|
|
|
// enable receiver, set 8 bit data, ignore control lines
|
2019-07-28 10:01:11 +00:00
|
|
|
// options.c_cflag |= (CLOCAL | CREAD | CS8);
|
2014-03-23 09:43:16 +00:00
|
|
|
options.c_iflag = IGNPAR;
|
|
|
|
|
|
|
|
// set the new port options
|
|
|
|
tcsetattr(fd, TCSANOW, &options);
|
|
|
|
return fd;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-12-30 20:49:29 +00:00
|
|
|
void Rtcm_Printer::close_serial() const
|
2014-03-23 09:43:16 +00:00
|
|
|
{
|
|
|
|
if (rtcm_dev_descriptor != -1)
|
|
|
|
{
|
|
|
|
close(rtcm_dev_descriptor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-03-03 01:03:39 +00:00
|
|
|
bool Rtcm_Printer::Print_Message(const std::string& message)
|
2014-03-23 09:43:16 +00:00
|
|
|
{
|
2019-07-28 10:01:11 +00:00
|
|
|
// write to file
|
2018-10-27 22:42:28 +00:00
|
|
|
if (d_rtcm_file_dump)
|
2018-03-03 01:03:39 +00:00
|
|
|
{
|
2018-10-27 22:42:28 +00:00
|
|
|
try
|
|
|
|
{
|
2020-07-07 16:53:50 +00:00
|
|
|
rtcm_file_descriptor << message << '\n';
|
2018-10-27 22:42:28 +00:00
|
|
|
}
|
|
|
|
catch (const std::exception& ex)
|
|
|
|
{
|
|
|
|
DLOG(INFO) << "RTCM printer cannot write on the output file " << rtcm_filename.c_str();
|
|
|
|
return false;
|
|
|
|
}
|
2018-03-03 01:03:39 +00:00
|
|
|
}
|
2015-11-21 12:01:50 +00:00
|
|
|
|
2019-07-28 10:01:11 +00:00
|
|
|
// write to serial device
|
2015-11-24 16:57:05 +00:00
|
|
|
if (rtcm_dev_descriptor != -1)
|
2014-03-23 09:43:16 +00:00
|
|
|
{
|
2018-03-03 01:03:39 +00:00
|
|
|
if (write(rtcm_dev_descriptor, message.c_str(), message.length()) == -1)
|
2015-11-24 16:57:05 +00:00
|
|
|
{
|
2017-08-14 11:59:00 +00:00
|
|
|
DLOG(INFO) << "RTCM printer cannot write on serial device " << rtcm_devname.c_str();
|
2020-07-07 16:53:50 +00:00
|
|
|
std::cout << "RTCM printer cannot write on serial device " << rtcm_devname.c_str() << '\n';
|
2015-11-24 16:57:05 +00:00
|
|
|
return false;
|
|
|
|
}
|
2014-03-23 09:43:16 +00:00
|
|
|
}
|
2015-11-21 12:01:50 +00:00
|
|
|
return true;
|
2014-03-23 09:43:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-11-23 23:32:52 +00:00
|
|
|
std::string Rtcm_Printer::print_MT1005_test()
|
2015-11-21 12:01:50 +00:00
|
|
|
{
|
2015-11-23 23:32:52 +00:00
|
|
|
std::string test = rtcm->print_MT1005_test();
|
2015-11-21 12:01:50 +00:00
|
|
|
return test;
|
|
|
|
}
|
2016-02-09 18:43:07 +00:00
|
|
|
|
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
uint32_t Rtcm_Printer::lock_time(const Gps_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro)
|
2016-02-09 18:43:07 +00:00
|
|
|
{
|
2016-05-04 17:53:53 +00:00
|
|
|
return rtcm->lock_time(eph, obs_time, gnss_synchro);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
uint32_t Rtcm_Printer::lock_time(const Gps_CNAV_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro)
|
2016-05-04 17:53:53 +00:00
|
|
|
{
|
|
|
|
return rtcm->lock_time(eph, obs_time, gnss_synchro);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
uint32_t Rtcm_Printer::lock_time(const Galileo_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro)
|
2016-05-04 17:53:53 +00:00
|
|
|
{
|
|
|
|
return rtcm->lock_time(eph, obs_time, gnss_synchro);
|
2016-02-09 18:43:07 +00:00
|
|
|
}
|
2017-08-01 18:23:34 +00:00
|
|
|
|
|
|
|
|
2018-08-11 11:56:24 +00:00
|
|
|
uint32_t Rtcm_Printer::lock_time(const Glonass_Gnav_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro)
|
2017-08-01 18:23:34 +00:00
|
|
|
{
|
|
|
|
return rtcm->lock_time(eph, obs_time, gnss_synchro);
|
|
|
|
}
|