mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-12-15 04:30:33 +00:00
Remove unrequired includes. Remove tabs. Fix indentation
This commit is contained in:
parent
f600f95864
commit
30988b8e14
@ -32,6 +32,7 @@
|
||||
#ifndef GNSS_SDR_GLONASS_L1_CA_H_
|
||||
#define GNSS_SDR_GLONASS_L1_CA_H_
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <utility> // std::pair
|
||||
#include "MATH_CONSTANTS.h"
|
||||
|
@ -29,30 +29,27 @@
|
||||
*
|
||||
* -------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "glonass_gnav_almanac.h"
|
||||
#include <cmath>
|
||||
#include "GLONASS_L1_CA.h"
|
||||
#include "gnss_satellite.h"
|
||||
|
||||
Glonass_Gnav_Almanac::Glonass_Gnav_Almanac()
|
||||
{
|
||||
i_satellite_freq_channel = 0;
|
||||
i_satellite_PRN = 0;
|
||||
i_satellite_slot_number = 0;
|
||||
|
||||
d_n_A = 0.0;
|
||||
d_H_n_A = 0.0;
|
||||
d_lambda_n_A = 0.0;
|
||||
d_t_lambda_n_A = 0.0;
|
||||
d_Delta_i_n_A = 0.0;
|
||||
d_Delta_T_n_A = 0.0;
|
||||
d_Delta_T_n_A_dot = 0.0;
|
||||
d_epsilon_n_A = 0.0;
|
||||
d_omega_n_A = 0.0;
|
||||
d_M_n_A = 0.0;
|
||||
d_KP = 0.0;
|
||||
d_tau_n_A = 0.0;
|
||||
d_C_n = false;
|
||||
d_l_n = false;
|
||||
i_satellite_freq_channel = 0;
|
||||
i_satellite_PRN = 0;
|
||||
i_satellite_slot_number = 0;
|
||||
|
||||
d_n_A = 0.0;
|
||||
d_H_n_A = 0.0;
|
||||
d_lambda_n_A = 0.0;
|
||||
d_t_lambda_n_A = 0.0;
|
||||
d_Delta_i_n_A = 0.0;
|
||||
d_Delta_T_n_A = 0.0;
|
||||
d_Delta_T_n_A_dot = 0.0;
|
||||
d_epsilon_n_A = 0.0;
|
||||
d_omega_n_A = 0.0;
|
||||
d_M_n_A = 0.0;
|
||||
d_KP = 0.0;
|
||||
d_tau_n_A = 0.0;
|
||||
d_C_n = false;
|
||||
d_l_n = false;
|
||||
}
|
||||
|
@ -34,9 +34,6 @@
|
||||
#ifndef GNSS_SDR_GLONASS_ALMANAC_H_
|
||||
#define GNSS_SDR_GLONASS_ALMANAC_H_
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include "boost/assign.hpp"
|
||||
#include <boost/serialization/nvp.hpp>
|
||||
|
||||
/*!
|
||||
@ -59,8 +56,8 @@ public:
|
||||
double d_M_n_A; //!< Type of satellite n_A [dimensionless]
|
||||
double d_KP; //!< Notification on forthcoming leap second correction of UTC [dimensionless]
|
||||
double d_tau_n_A; //!< Coarse value of d_n_A satellite time correction to GLONASS time at instant t_lambdan_A[s]
|
||||
bool d_C_n; //!< Generalized “unhealthy flag” of n_A satellite at instant of almanac upload [dimensionless]
|
||||
bool d_l_n; //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
bool d_C_n; //!< Generalized “unhealthy flag” of n_A satellite at instant of almanac upload [dimensionless]
|
||||
bool d_l_n; //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
|
||||
// Satellite Identification Information
|
||||
int i_satellite_freq_channel; //!< SV Frequency Channel Number
|
||||
|
@ -32,56 +32,55 @@
|
||||
|
||||
#include "glonass_gnav_ephemeris.h"
|
||||
#include <cmath>
|
||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||
|
||||
#include "GLONASS_L1_CA.h"
|
||||
#include "gnss_satellite.h"
|
||||
|
||||
Glonass_Gnav_Ephemeris::Glonass_Gnav_Ephemeris()
|
||||
{
|
||||
d_m = 0.0; //!< String number within frame [dimensionless]
|
||||
d_t_k = 0.0; //!< GLONASS Time (UTC(SU) + 3 h) referenced to the beginning of the frame within the current day [s]
|
||||
d_t_b = 0.0; //!< Reference ephemeris relative time in GLONASS Time (UTC(SU) + 3 h). Index of a time interval within current day according to UTC(SU) + 03 hours 00 min. [s]
|
||||
d_M = 0.0; //!< Type of satellite transmitting navigation signal [dimensionless]
|
||||
d_gamma_n = 0.0; //!< Relative deviation of predicted carrier frequency value of n- satellite from nominal value at the instant tb [dimensionless]
|
||||
d_tau_n = 0.0; //!< Correction to the nth satellite time (tn) relative to GLONASS time (te),
|
||||
d_Xn = 0.0; //!< Earth-fixed coordinate x of the satellite in PZ-90.02 coordinate system [km].
|
||||
d_Yn = 0.0; //!< Earth-fixed coordinate y of the satellite in PZ-90.02 coordinate system [km]
|
||||
d_Zn = 0.0; //!< Earth-fixed coordinate z of the satellite in PZ-90.02 coordinate system [km]
|
||||
d_VXn = 0.0; //!< Earth-fixed velocity coordinate x of the satellite in PZ-90.02 coordinate system [km/s]
|
||||
d_VYn = 0.0; //!< Earth-fixed velocity coordinate y of the satellite in PZ-90.02 coordinate system [km/s]
|
||||
d_VZn = 0.0; //!< Earth-fixed velocity coordinate z of the satellite in PZ-90.02 coordinate system [km/s]
|
||||
d_AXn = 0.0; //!< Earth-fixed acceleration coordinate x of the satellite in PZ-90.02 coordinate system [km/s^2]
|
||||
d_AYn = 0.0; //!< Earth-fixed acceleration coordinate y of the satellite in PZ-90.02 coordinate system [km/s^2]
|
||||
d_AZn = 0.0; //!< Earth-fixed acceleration coordinate z of the satellite in PZ-90.02 coordinate system [km/s^2]
|
||||
d_B_n = 0.0; //!< Health flag [dimensionless]
|
||||
d_P = 0.0; //!< Technological parameter of control segment, indication the satellite operation mode in respect of time parameters [dimensionless]
|
||||
d_N_T = 0.0; //!< Current date, calendar number of day within four-year interval starting from the 1-st of January in a leap year [days]
|
||||
d_F_T = 0.0; //!< Parameter that provides the predicted satellite user range accuracy at time tb [dimensionless]
|
||||
d_n = 0.0; //!< Index of the satellite transmitting given navigation signal. It corresponds to a slot number within GLONASS constellation
|
||||
d_Delta_tau_n = 0.0; //!< Time difference between navigation RF signal transmitted in L2 sub- band and aviation RF signal transmitted in L1 sub-band by nth satellite. [dimensionless]
|
||||
d_E_n = 0.0; //!< Characterises "age" of a current information [days]
|
||||
d_P_1 = 0.0; //!< Flag of the immediate data updating [minutes]
|
||||
d_P_2 = false; //!< Flag of oddness ("1") or evenness ("0") of the value of (tb) [dimensionless]
|
||||
d_P_3 = false; //!< Flag indicating a number of satellites for which almanac is transmitted within given frame: "1" corresponds to 5 satellites and "0" corresponds to 4 satellites [dimensionless]
|
||||
d_P_4 = false; //!< Flag to show that ephemeris parameters are present. "1" indicates that updated ephemeris or frequency/time parameters have been uploaded by the control segment [dimensionless]
|
||||
d_l3rd_n = false; //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
d_l5th_n = false; //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
d_m = 0.0; //!< String number within frame [dimensionless]
|
||||
d_t_k = 0.0; //!< GLONASS Time (UTC(SU) + 3 h) referenced to the beginning of the frame within the current day [s]
|
||||
d_t_b = 0.0; //!< Reference ephemeris relative time in GLONASS Time (UTC(SU) + 3 h). Index of a time interval within current day according to UTC(SU) + 03 hours 00 min. [s]
|
||||
d_M = 0.0; //!< Type of satellite transmitting navigation signal [dimensionless]
|
||||
d_gamma_n = 0.0; //!< Relative deviation of predicted carrier frequency value of n- satellite from nominal value at the instant tb [dimensionless]
|
||||
d_tau_n = 0.0; //!< Correction to the nth satellite time (tn) relative to GLONASS time (te),
|
||||
d_Xn = 0.0; //!< Earth-fixed coordinate x of the satellite in PZ-90.02 coordinate system [km].
|
||||
d_Yn = 0.0; //!< Earth-fixed coordinate y of the satellite in PZ-90.02 coordinate system [km]
|
||||
d_Zn = 0.0; //!< Earth-fixed coordinate z of the satellite in PZ-90.02 coordinate system [km]
|
||||
d_VXn = 0.0; //!< Earth-fixed velocity coordinate x of the satellite in PZ-90.02 coordinate system [km/s]
|
||||
d_VYn = 0.0; //!< Earth-fixed velocity coordinate y of the satellite in PZ-90.02 coordinate system [km/s]
|
||||
d_VZn = 0.0; //!< Earth-fixed velocity coordinate z of the satellite in PZ-90.02 coordinate system [km/s]
|
||||
d_AXn = 0.0; //!< Earth-fixed acceleration coordinate x of the satellite in PZ-90.02 coordinate system [km/s^2]
|
||||
d_AYn = 0.0; //!< Earth-fixed acceleration coordinate y of the satellite in PZ-90.02 coordinate system [km/s^2]
|
||||
d_AZn = 0.0; //!< Earth-fixed acceleration coordinate z of the satellite in PZ-90.02 coordinate system [km/s^2]
|
||||
d_B_n = 0.0; //!< Health flag [dimensionless]
|
||||
d_P = 0.0; //!< Technological parameter of control segment, indication the satellite operation mode in respect of time parameters [dimensionless]
|
||||
d_N_T = 0.0; //!< Current date, calendar number of day within four-year interval starting from the 1-st of January in a leap year [days]
|
||||
d_F_T = 0.0; //!< Parameter that provides the predicted satellite user range accuracy at time tb [dimensionless]
|
||||
d_n = 0.0; //!< Index of the satellite transmitting given navigation signal. It corresponds to a slot number within GLONASS constellation
|
||||
d_Delta_tau_n = 0.0; //!< Time difference between navigation RF signal transmitted in L2 sub- band and aviation RF signal transmitted in L1 sub-band by nth satellite. [dimensionless]
|
||||
d_E_n = 0.0; //!< Characterises "age" of a current information [days]
|
||||
d_P_1 = 0.0; //!< Flag of the immediate data updating [minutes]
|
||||
d_P_2 = false; //!< Flag of oddness ("1") or evenness ("0") of the value of (tb) [dimensionless]
|
||||
d_P_3 = false; //!< Flag indicating a number of satellites for which almanac is transmitted within given frame: "1" corresponds to 5 satellites and "0" corresponds to 4 satellites [dimensionless]
|
||||
d_P_4 = false; //!< Flag to show that ephemeris parameters are present. "1" indicates that updated ephemeris or frequency/time parameters have been uploaded by the control segment [dimensionless]
|
||||
d_l3rd_n = false; //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
d_l5th_n = false; //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
|
||||
// Satellite Identification Information
|
||||
i_satellite_freq_channel = 0; //!< SV Frequency Channel Number
|
||||
i_satellite_PRN = 0; //!< SV PRN Number, equivalent to slot number for compatibility with GPS
|
||||
i_satellite_slot_number = 0; //!< SV Slot Number
|
||||
d_yr = 1972; //!< Current year, defaults to 1972 (UTC Epoch with leap seconds)
|
||||
d_satClkDrift = 0.0; //!< GLONASS clock error
|
||||
d_dtr = 0.0; //!< relativistic clock correction term
|
||||
d_iode = 0.0; //!< Issue of data, ephemeris (Bit 0-6 of tb)
|
||||
d_tau_c = 0.0;
|
||||
d_TOW = 0.0; // tow of the start of frame
|
||||
d_WN = 0.0; // week number of the start of frame
|
||||
d_tod = 0.0;
|
||||
// Satellite Identification Information
|
||||
i_satellite_freq_channel = 0; //!< SV Frequency Channel Number
|
||||
i_satellite_PRN = 0; //!< SV PRN Number, equivalent to slot number for compatibility with GPS
|
||||
i_satellite_slot_number = 0; //!< SV Slot Number
|
||||
d_yr = 1972; //!< Current year, defaults to 1972 (UTC Epoch with leap seconds)
|
||||
d_satClkDrift = 0.0; //!< GLONASS clock error
|
||||
d_dtr = 0.0; //!< relativistic clock correction term
|
||||
d_iode = 0.0; //!< Issue of data, ephemeris (Bit 0-6 of tb)
|
||||
d_tau_c = 0.0;
|
||||
d_TOW = 0.0; // tow of the start of frame
|
||||
d_WN = 0.0; // week number of the start of frame
|
||||
d_tod = 0.0;
|
||||
}
|
||||
|
||||
|
||||
boost::posix_time::ptime Glonass_Gnav_Ephemeris::compute_GLONASS_time(const double offset_time) const
|
||||
{
|
||||
boost::posix_time::time_duration t(0, 0, offset_time + d_tau_c + d_tau_n);
|
||||
@ -92,74 +91,75 @@ boost::posix_time::ptime Glonass_Gnav_Ephemeris::compute_GLONASS_time(const doub
|
||||
return glonass_time;
|
||||
}
|
||||
|
||||
|
||||
boost::posix_time::ptime Glonass_Gnav_Ephemeris::glot_to_utc(const double offset_time, const double glot2utc_corr) const
|
||||
{
|
||||
double tod = 0.0;
|
||||
double glot2utc = 3*3600;
|
||||
double tod = 0.0;
|
||||
double glot2utc = 3*3600;
|
||||
|
||||
tod = offset_time - glot2utc + glot2utc_corr + d_tau_n;
|
||||
boost::posix_time::time_duration t(0, 0, tod);
|
||||
boost::gregorian::date d1(d_yr, 1, 1);
|
||||
boost::gregorian::days d2(d_N_T - 1);
|
||||
boost::posix_time::ptime utc_time(d1+d2, t);
|
||||
tod = offset_time - glot2utc + glot2utc_corr + d_tau_n;
|
||||
boost::posix_time::time_duration t(0, 0, tod);
|
||||
boost::gregorian::date d1(d_yr, 1, 1);
|
||||
boost::gregorian::days d2(d_N_T - 1);
|
||||
boost::posix_time::ptime utc_time(d1 + d2, t);
|
||||
|
||||
return utc_time;
|
||||
return utc_time;
|
||||
}
|
||||
|
||||
|
||||
void Glonass_Gnav_Ephemeris::glot_to_gpst(double tod_offset, double glot2utc_corr, double glot2gpst_corr, double * wn, double * tow) const
|
||||
{
|
||||
double tod = 0.0;
|
||||
double glot2utc = 3*3600;
|
||||
double days = 0.0;
|
||||
double total_sec = 0.0, sec_of_day = 0.0;
|
||||
int i = 0;
|
||||
double tod = 0.0;
|
||||
double glot2utc = 3*3600;
|
||||
double days = 0.0;
|
||||
double total_sec = 0.0, sec_of_day = 0.0;
|
||||
int i = 0;
|
||||
|
||||
boost::gregorian::date gps_epoch { 1980, 1, 6 };
|
||||
boost::gregorian::date gps_epoch { 1980, 1, 6 };
|
||||
|
||||
// tk is relative to UTC(SU) + 3.00 hrs, so we need to convert to utc and add corrections
|
||||
// tk plus 10 sec is the true tod since get_TOW is called when in str5
|
||||
tod = tod_offset - glot2utc ;
|
||||
// tk is relative to UTC(SU) + 3.00 hrs, so we need to convert to utc and add corrections
|
||||
// tk plus 10 sec is the true tod since get_TOW is called when in str5
|
||||
tod = tod_offset - glot2utc ;
|
||||
|
||||
boost::posix_time::time_duration t(0, 0, tod);
|
||||
boost::gregorian::date d1(d_yr, 1, 1);
|
||||
boost::gregorian::days d2(d_N_T-1);
|
||||
boost::posix_time::ptime utc_time(d1+d2, t);
|
||||
boost::gregorian::date utc_date = utc_time.date();
|
||||
boost::posix_time::ptime gps_time;
|
||||
|
||||
boost::posix_time::time_duration t(0, 0, tod);
|
||||
boost::gregorian::date d1(d_yr, 1, 1);
|
||||
boost::gregorian::days d2(d_N_T-1);
|
||||
boost::posix_time::ptime utc_time(d1+d2, t);
|
||||
boost::gregorian::date utc_date = utc_time.date();
|
||||
boost::posix_time::ptime gps_time;
|
||||
// Adjust for leap second correction
|
||||
for (i = 0; GLONASS_LEAP_SECONDS[i][0]>0; i++)
|
||||
{
|
||||
boost::posix_time::time_duration t3(GLONASS_LEAP_SECONDS[i][3], GLONASS_LEAP_SECONDS[i][4], GLONASS_LEAP_SECONDS[i][5]);
|
||||
boost::gregorian::date d3(GLONASS_LEAP_SECONDS[i][0], GLONASS_LEAP_SECONDS[i][1], GLONASS_LEAP_SECONDS[i][2]);
|
||||
boost::posix_time::ptime ls_time(d3, t3);
|
||||
if (utc_time >= ls_time)
|
||||
{
|
||||
// We add the leap second when going from utc to gpst
|
||||
gps_time = utc_time + boost::posix_time::time_duration(0,0,fabs(GLONASS_LEAP_SECONDS[i][6]));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Adjust for leap second correction
|
||||
for (i = 0; GLONASS_LEAP_SECONDS[i][0]>0; i++)
|
||||
{
|
||||
boost::posix_time::time_duration t3(GLONASS_LEAP_SECONDS[i][3], GLONASS_LEAP_SECONDS[i][4], GLONASS_LEAP_SECONDS[i][5]);
|
||||
boost::gregorian::date d3(GLONASS_LEAP_SECONDS[i][0], GLONASS_LEAP_SECONDS[i][1], GLONASS_LEAP_SECONDS[i][2]);
|
||||
boost::posix_time::ptime ls_time(d3, t3);
|
||||
if (utc_time >= ls_time)
|
||||
{
|
||||
// We add the leap second when going from utc to gpst
|
||||
gps_time = utc_time + boost::posix_time::time_duration(0,0,fabs(GLONASS_LEAP_SECONDS[i][6]));
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Total number of days
|
||||
std::string fdat = boost::posix_time::to_simple_string(gps_time);
|
||||
days = static_cast<double>((utc_date - gps_epoch).days());
|
||||
|
||||
// Total number of days
|
||||
std::string fdat = boost::posix_time::to_simple_string(gps_time);
|
||||
days = static_cast<double>((utc_date - gps_epoch).days());
|
||||
// Total number of seconds
|
||||
sec_of_day = static_cast<double>((gps_time.time_of_day()).total_seconds());
|
||||
total_sec = days*86400 + sec_of_day;
|
||||
|
||||
// Total number of seconds
|
||||
sec_of_day = static_cast<double>((gps_time.time_of_day()).total_seconds());
|
||||
total_sec = days*86400 + sec_of_day;
|
||||
|
||||
// Compute Week number
|
||||
*wn = floor(total_sec/604800);
|
||||
|
||||
// Compute the arithmetic modules to wrap around range
|
||||
*tow = total_sec - 604800*floor(total_sec/604800);
|
||||
// Perform corrections from fractional seconds
|
||||
*tow += glot2utc_corr + glot2gpst_corr;
|
||||
// Compute Week number
|
||||
*wn = floor(total_sec/604800);
|
||||
|
||||
// Compute the arithmetic modules to wrap around range
|
||||
*tow = total_sec - 604800*floor(total_sec/604800);
|
||||
// Perform corrections from fractional seconds
|
||||
*tow += glot2utc_corr + glot2gpst_corr;
|
||||
}
|
||||
|
||||
|
||||
double Glonass_Gnav_Ephemeris::check_t(double time)
|
||||
{
|
||||
double corrTime;
|
||||
@ -176,6 +176,7 @@ double Glonass_Gnav_Ephemeris::check_t(double time)
|
||||
return corrTime;
|
||||
}
|
||||
|
||||
|
||||
// FIXME Fix reference here
|
||||
// 20.3.3.3.3.1 User Algorithm for SV Clock Correction.
|
||||
double Glonass_Gnav_Ephemeris::sv_clock_drift(double transmitTime, double timeCorrUTC)
|
||||
|
@ -35,9 +35,6 @@
|
||||
#define GNSS_SDR_GLONASS_GNAV_EPHEMERIS_H_
|
||||
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include "boost/assign.hpp"
|
||||
#include <boost/serialization/nvp.hpp>
|
||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||
|
||||
@ -64,7 +61,7 @@ public:
|
||||
double d_m; //!< String number within frame [dimensionless]
|
||||
double d_t_k; //!< GLONASS Time (UTC(SU) + 3 h) referenced to the beginning of the frame within the current day [s]
|
||||
double d_t_b; //!< Reference ephemeris relative time in GLONASS Time (UTC(SU) + 3 h). Index of a time interval within current day according to UTC(SU) + 03 hours 00 min. [s]
|
||||
double d_M; //!< Type of satellite transmitting navigation signal [dimensionless]
|
||||
double d_M; //!< Type of satellite transmitting navigation signal [dimensionless]
|
||||
double d_gamma_n; //!< Relative deviation of predicted carrier frequency value of n- satellite from nominal value at the instant tb [dimensionless]
|
||||
double d_tau_n; //!< Correction to the nth satellite time (tn) relative to GLONASS time (te),
|
||||
double d_Xn; //!< Earth-fixed coordinate x of the satellite in PZ-90.02 coordinate system [km].
|
||||
@ -84,25 +81,25 @@ public:
|
||||
double d_Delta_tau_n; //!< Time difference between navigation RF signal transmitted in L2 sub- band and aviation RF signal transmitted in L1 sub-band by nth satellite. [dimensionless]
|
||||
double d_E_n; //!< Characterises "age" of a current information [days]
|
||||
double d_P_1; //!< Flag of the immediate data updating [minutes]
|
||||
bool d_P_2; //!< Flag of oddness ("1") or evenness ("0") of the value of (tb) [dimensionless]
|
||||
bool d_P_3; //!< Flag indicating a number of satellites for which almanac is transmitted within given frame: "1" corresponds to 5 satellites and "0" corresponds to 4 satellites [dimensionless]
|
||||
bool d_P_4; //!< Flag to show that ephemeris parameters are present. "1" indicates that updated ephemeris or frequency/time parameters have been uploaded by the control segment [dimensionless]
|
||||
bool d_l3rd_n; //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
bool d_l5th_n; //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
bool d_P_2; //!< Flag of oddness ("1") or evenness ("0") of the value of (tb) [dimensionless]
|
||||
bool d_P_3; //!< Flag indicating a number of satellites for which almanac is transmitted within given frame: "1" corresponds to 5 satellites and "0" corresponds to 4 satellites [dimensionless]
|
||||
bool d_P_4; //!< Flag to show that ephemeris parameters are present. "1" indicates that updated ephemeris or frequency/time parameters have been uploaded by the control segment [dimensionless]
|
||||
bool d_l3rd_n; //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is healthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
bool d_l5th_n; //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is healthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
|
||||
// Inmediate deliverables of ephemeris information
|
||||
// Satellite Identification Information
|
||||
int i_satellite_freq_channel; //!< SV Frequency Channel Number
|
||||
int i_satellite_freq_channel; //!< SV Frequency Channel Number
|
||||
unsigned int i_satellite_PRN; //!< SV PRN Number, equivalent to slot number for compatibility with GPS
|
||||
unsigned int i_satellite_slot_number; //!< SV Slot Number
|
||||
double d_yr; //!< Current year
|
||||
double d_satClkDrift; //!< GLONASS clock error
|
||||
double d_dtr; //!< relativistic clock correction term
|
||||
double d_iode; //!< Issue of data, ephemeris (Bit 0-6 of tb)
|
||||
double d_tau_c; //!< GLONASST 2 UTC correction (todo) may be eliminated
|
||||
double d_TOW; //!< GLONASST IN GPST seconds of week
|
||||
double d_WN; //!< GLONASST IN GPST week number of the start of frame
|
||||
double d_tod; //!< Time of Day since ephemeris where decoded
|
||||
double d_tau_c; //!< GLONASST 2 UTC correction (todo) may be eliminated
|
||||
double d_TOW; //!< GLONASST IN GPST seconds of week
|
||||
double d_WN; //!< GLONASST IN GPST week number of the start of frame
|
||||
double d_tod; //!< Time of Day since ephemeris where decoded
|
||||
|
||||
template<class Archive>
|
||||
|
||||
@ -137,14 +134,14 @@ public:
|
||||
archive & make_nvp("d_N_T", d_N_T); //!< Current date, calendar number of day within four-year interval starting from the 1-st of January in a leap year [days]
|
||||
archive & make_nvp("d_F_T", d_F_T); //!< Parameter that provides the predicted satellite user range accuracy at time tb [dimensionless]
|
||||
archive & make_nvp("d_n", d_n); //!< Index of the satellite transmitting given navigation signal. It corresponds to a slot number within GLONASS constellation
|
||||
archive & make_nvp("d_Delta_tau_n", d_Delta_tau_n);//!< Time difference between navigation RF signal transmitted in L2 sub- band and aviation RF signal transmitted in L1 sub-band by nth satellite. [dimensionless]
|
||||
archive & make_nvp("d_Delta_tau_n", d_Delta_tau_n); //!< Time difference between navigation RF signal transmitted in L2 sub- band and aviation RF signal transmitted in L1 sub-band by nth satellite. [dimensionless]
|
||||
archive & make_nvp("d_E_n", d_E_n); //!< Characterises "age" of a current information [days]
|
||||
archive & make_nvp("d_P_1", d_P_1); //!< Flag of the immediate data updating.
|
||||
archive & make_nvp("d_P_2", d_P_2); //!< Flag of oddness ("1") or evenness ("0") of the value of (tb) [dimensionless]
|
||||
archive & make_nvp("d_P_3", d_P_3); //!< Flag indicating a number of satellites for which almanac is transmitted within given frame: "1" corresponds to 5 satellites and "0" corresponds to 4 satellites [dimensionless]
|
||||
archive & make_nvp("d_P_4", d_P_4); //!< Flag to show that ephemeris parameters are present. "1" indicates that updated ephemeris or frequency/time parameters have been uploaded by the control segment [dimensionless]
|
||||
archive & make_nvp("d_l3rd_n", d_l3rd_n); //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
archive & make_nvp("d_l5th_n", d_l5th_n); //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
archive & make_nvp("d_l3rd_n", d_l3rd_n); //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
archive & make_nvp("d_l5th_n", d_l5th_n); //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless]
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -31,30 +31,25 @@
|
||||
*/
|
||||
|
||||
#include "glonass_gnav_navigation_message.h"
|
||||
#include <boost/crc.hpp>
|
||||
#include <boost/dynamic_bitset.hpp>
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <gnss_satellite.h>
|
||||
#include <glog/logging.h>
|
||||
|
||||
|
||||
void Glonass_Gnav_Navigation_Message::reset()
|
||||
{
|
||||
//!< Satellite Identification
|
||||
// Satellite Identification
|
||||
i_satellite_PRN = 0;
|
||||
i_alm_satellite_slot_number = 0; //!< SV Orbit Slot Number
|
||||
flag_update_slot_number = false;
|
||||
|
||||
//!< Ephmeris Flags
|
||||
// Ephmeris Flags
|
||||
flag_all_ephemeris = false;
|
||||
flag_ephemeris_str_1 = false;
|
||||
flag_ephemeris_str_2 = false;
|
||||
flag_ephemeris_str_3 = false;
|
||||
flag_ephemeris_str_4 = false;
|
||||
|
||||
//!< Almanac Flags
|
||||
// Almanac Flags
|
||||
flag_all_almanac = false;
|
||||
flag_almanac_str_6 = false;
|
||||
flag_almanac_str_7 = false;
|
||||
@ -67,12 +62,12 @@ void Glonass_Gnav_Navigation_Message::reset()
|
||||
flag_almanac_str_14 = false;
|
||||
flag_almanac_str_15 = false;
|
||||
|
||||
//!< UTC and System Clocks Flags
|
||||
// UTC and System Clocks Flags
|
||||
flag_utc_model_valid = false; //!< If set, it indicates that the UTC model parameters are filled
|
||||
flag_utc_model_str_5 = false; //!< Clock info send in string 5 of navigation data
|
||||
flag_utc_model_str_15 = false; //!< Clock info send in string 15 of frame 5 of navigation data
|
||||
|
||||
//broadcast orbit 1
|
||||
// broadcast orbit 1
|
||||
flag_TOW_set = false;
|
||||
flag_TOW_new = false;
|
||||
|
||||
@ -89,7 +84,7 @@ void Glonass_Gnav_Navigation_Message::reset()
|
||||
// Data update information
|
||||
d_previous_tb = 0.0;
|
||||
for(unsigned int i = 0; i < GLONASS_L1_CA_NBR_SATS; i++)
|
||||
d_previous_Na[i] = 0.0;
|
||||
d_previous_Na[i] = 0.0;
|
||||
|
||||
std::map<int,std::string> satelliteBlock; //!< Map that stores to which block the PRN belongs http://www.navcen.uscg.gov/?Do=constellationStatus
|
||||
|
||||
@ -97,9 +92,9 @@ void Glonass_Gnav_Navigation_Message::reset()
|
||||
std::string _system ("GLONASS");
|
||||
//TODO SHould number of channels be hardcoded?
|
||||
for(unsigned int i = 1; i < 14; i++)
|
||||
{
|
||||
satelliteBlock[i] = gnss_sat.what_block(_system, i);
|
||||
}
|
||||
{
|
||||
satelliteBlock[i] = gnss_sat.what_block(_system, i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -123,11 +118,11 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset<GLONASS_GNAV_STRING_B
|
||||
int C_Sigma = 0;
|
||||
std::vector<int> string_bits(GLONASS_GNAV_STRING_BITS);
|
||||
|
||||
//!< Populate data and hamming code vectors
|
||||
for(int i = 0; i < static_cast<int>(GLONASS_GNAV_STRING_BITS); i++)
|
||||
{
|
||||
string_bits[i] = static_cast<int>(bits[i]);
|
||||
}
|
||||
//!< Populate data and hamming code vectors
|
||||
for(int i = 0; i < static_cast<int>(GLONASS_GNAV_STRING_BITS); i++)
|
||||
{
|
||||
string_bits[i] = static_cast<int>(bits[i]);
|
||||
}
|
||||
|
||||
//!< Compute C1 term
|
||||
sum_bits = 0;
|
||||
@ -210,7 +205,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset<GLONASS_GNAV_STRING_B
|
||||
return true;
|
||||
}
|
||||
else
|
||||
// All other conditions are assumed errors. TODO: Add correction for case B
|
||||
// All other conditions are assumed errors. TODO: Add correction for case B
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -258,14 +253,14 @@ signed long int Glonass_Gnav_Navigation_Message::read_navigation_signed(std::bit
|
||||
signed long int sign = 0;
|
||||
int num_of_slices = parameter.size();
|
||||
// read the MSB and perform the sign extension
|
||||
if (bits[GLONASS_GNAV_STRING_BITS - parameter[0].first] == 1)
|
||||
{
|
||||
sign = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
sign = 1;
|
||||
}
|
||||
if (bits[GLONASS_GNAV_STRING_BITS - parameter[0].first] == 1)
|
||||
{
|
||||
sign = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
sign = 1;
|
||||
}
|
||||
for (int i = 0; i < num_of_slices; i++)
|
||||
{
|
||||
for (int j = 1; j < parameter[i].second; j++)
|
||||
@ -331,327 +326,332 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
|
||||
|
||||
// Decode all 15 string messages
|
||||
d_string_ID = static_cast<unsigned int>(read_navigation_unsigned(string_bits, STRING_ID));
|
||||
switch (d_string_ID) {
|
||||
case 1:
|
||||
//--- It is string 1 -----------------------------------------------
|
||||
gnav_ephemeris.d_P_1 = (static_cast<double>(read_navigation_unsigned(string_bits, P1)) + 1) * 15;
|
||||
gnav_ephemeris.d_t_k = static_cast<double>(read_navigation_unsigned(string_bits, T_K_HR)) * 3600 +
|
||||
static_cast<double>(read_navigation_unsigned(string_bits, T_K_MIN)) * 60 +
|
||||
static_cast<double>(read_navigation_unsigned(string_bits, T_K_SEC)) * 30;
|
||||
gnav_ephemeris.d_VXn = static_cast<double>(read_navigation_signed(string_bits, X_N_DOT)) * TWO_N20;
|
||||
gnav_ephemeris.d_AXn = static_cast<double>(read_navigation_signed(string_bits, X_N_DOT_DOT)) * TWO_N30;
|
||||
gnav_ephemeris.d_Xn = static_cast<double>(read_navigation_signed(string_bits, X_N)) * TWO_N11;
|
||||
switch (d_string_ID)
|
||||
{
|
||||
case 1:
|
||||
//--- It is string 1 -----------------------------------------------
|
||||
gnav_ephemeris.d_P_1 = (static_cast<double>(read_navigation_unsigned(string_bits, P1)) + 1) * 15;
|
||||
gnav_ephemeris.d_t_k = static_cast<double>(read_navigation_unsigned(string_bits, T_K_HR)) * 3600 +
|
||||
static_cast<double>(read_navigation_unsigned(string_bits, T_K_MIN)) * 60 +
|
||||
static_cast<double>(read_navigation_unsigned(string_bits, T_K_SEC)) * 30;
|
||||
gnav_ephemeris.d_VXn = static_cast<double>(read_navigation_signed(string_bits, X_N_DOT)) * TWO_N20;
|
||||
gnav_ephemeris.d_AXn = static_cast<double>(read_navigation_signed(string_bits, X_N_DOT_DOT)) * TWO_N30;
|
||||
gnav_ephemeris.d_Xn = static_cast<double>(read_navigation_signed(string_bits, X_N)) * TWO_N11;
|
||||
|
||||
flag_ephemeris_str_1 = true;
|
||||
flag_ephemeris_str_1 = true;
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
//--- It is string 2 -----------------------------------------------
|
||||
if (flag_ephemeris_str_1 == true)
|
||||
{
|
||||
gnav_ephemeris.d_B_n = static_cast<double>(read_navigation_unsigned(string_bits, B_N));
|
||||
gnav_ephemeris.d_P_2 = static_cast<bool>(read_navigation_bool(string_bits, P2));
|
||||
gnav_ephemeris.d_t_b = static_cast<double>(read_navigation_unsigned(string_bits, T_B)) * 15 * 60;
|
||||
gnav_ephemeris.d_VYn = static_cast<double>(read_navigation_signed(string_bits, Y_N_DOT)) * TWO_N20;
|
||||
gnav_ephemeris.d_AYn = static_cast<double>(read_navigation_signed(string_bits, Y_N_DOT_DOT)) * TWO_N30;
|
||||
gnav_ephemeris.d_Yn = static_cast<double>(read_navigation_signed(string_bits, Y_N)) * TWO_N11;
|
||||
case 2:
|
||||
//--- It is string 2 -----------------------------------------------
|
||||
if (flag_ephemeris_str_1 == true)
|
||||
{
|
||||
gnav_ephemeris.d_B_n = static_cast<double>(read_navigation_unsigned(string_bits, B_N));
|
||||
gnav_ephemeris.d_P_2 = static_cast<bool>(read_navigation_bool(string_bits, P2));
|
||||
gnav_ephemeris.d_t_b = static_cast<double>(read_navigation_unsigned(string_bits, T_B)) * 15 * 60;
|
||||
gnav_ephemeris.d_VYn = static_cast<double>(read_navigation_signed(string_bits, Y_N_DOT)) * TWO_N20;
|
||||
gnav_ephemeris.d_AYn = static_cast<double>(read_navigation_signed(string_bits, Y_N_DOT_DOT)) * TWO_N30;
|
||||
gnav_ephemeris.d_Yn = static_cast<double>(read_navigation_signed(string_bits, Y_N)) * TWO_N11;
|
||||
|
||||
gnav_ephemeris.d_iode = read_navigation_unsigned(string_bits, T_B);
|
||||
flag_ephemeris_str_2 = true;
|
||||
}
|
||||
gnav_ephemeris.d_iode = read_navigation_unsigned(string_bits, T_B);
|
||||
flag_ephemeris_str_2 = true;
|
||||
}
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
// --- It is string 3 ----------------------------------------------
|
||||
if (flag_ephemeris_str_2 == true)
|
||||
{
|
||||
gnav_ephemeris.d_P_3 = static_cast<bool>(read_navigation_bool(string_bits, P3));
|
||||
gnav_ephemeris.d_gamma_n = static_cast<double>(read_navigation_signed(string_bits, GAMMA_N)) * TWO_N40;
|
||||
gnav_ephemeris.d_P = static_cast<double>(read_navigation_unsigned(string_bits, P));
|
||||
gnav_ephemeris.d_l3rd_n = static_cast<bool>(read_navigation_bool(string_bits, EPH_L_N));
|
||||
gnav_ephemeris.d_VZn = static_cast<double>(read_navigation_signed(string_bits, Z_N_DOT)) * TWO_N20;
|
||||
gnav_ephemeris.d_AZn = static_cast<double>(read_navigation_signed(string_bits, Z_N_DOT_DOT)) * TWO_N30;
|
||||
gnav_ephemeris.d_Zn = static_cast<double>(read_navigation_signed(string_bits, Z_N)) * TWO_N11;
|
||||
case 3:
|
||||
// --- It is string 3 ----------------------------------------------
|
||||
if (flag_ephemeris_str_2 == true)
|
||||
{
|
||||
gnav_ephemeris.d_P_3 = static_cast<bool>(read_navigation_bool(string_bits, P3));
|
||||
gnav_ephemeris.d_gamma_n = static_cast<double>(read_navigation_signed(string_bits, GAMMA_N)) * TWO_N40;
|
||||
gnav_ephemeris.d_P = static_cast<double>(read_navigation_unsigned(string_bits, P));
|
||||
gnav_ephemeris.d_l3rd_n = static_cast<bool>(read_navigation_bool(string_bits, EPH_L_N));
|
||||
gnav_ephemeris.d_VZn = static_cast<double>(read_navigation_signed(string_bits, Z_N_DOT)) * TWO_N20;
|
||||
gnav_ephemeris.d_AZn = static_cast<double>(read_navigation_signed(string_bits, Z_N_DOT_DOT)) * TWO_N30;
|
||||
gnav_ephemeris.d_Zn = static_cast<double>(read_navigation_signed(string_bits, Z_N)) * TWO_N11;
|
||||
|
||||
flag_ephemeris_str_3 = true;
|
||||
}
|
||||
flag_ephemeris_str_3 = true;
|
||||
}
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
// --- It is string 4 ----------------------------------------------
|
||||
if (flag_ephemeris_str_3 == true)
|
||||
{
|
||||
gnav_ephemeris.d_tau_n = static_cast<double>(read_navigation_signed(string_bits, TAU_N)) * TWO_N30;
|
||||
gnav_ephemeris.d_Delta_tau_n = static_cast<double>(read_navigation_signed(string_bits, DELTA_TAU_N)) * TWO_N30;
|
||||
gnav_ephemeris.d_E_n = static_cast<double>(read_navigation_unsigned(string_bits, E_N));
|
||||
gnav_ephemeris.d_P_4 = static_cast<bool>(read_navigation_bool(string_bits, P4));
|
||||
gnav_ephemeris.d_F_T = static_cast<double>(read_navigation_unsigned(string_bits, F_T));
|
||||
gnav_ephemeris.d_N_T = static_cast<double>(read_navigation_unsigned(string_bits, N_T));
|
||||
gnav_ephemeris.d_n = static_cast<double>(read_navigation_unsigned(string_bits, N));
|
||||
gnav_ephemeris.d_M = static_cast<double>(read_navigation_unsigned(string_bits, M));
|
||||
case 4:
|
||||
// --- It is string 4 ----------------------------------------------
|
||||
if (flag_ephemeris_str_3 == true)
|
||||
{
|
||||
gnav_ephemeris.d_tau_n = static_cast<double>(read_navigation_signed(string_bits, TAU_N)) * TWO_N30;
|
||||
gnav_ephemeris.d_Delta_tau_n = static_cast<double>(read_navigation_signed(string_bits, DELTA_TAU_N)) * TWO_N30;
|
||||
gnav_ephemeris.d_E_n = static_cast<double>(read_navigation_unsigned(string_bits, E_N));
|
||||
gnav_ephemeris.d_P_4 = static_cast<bool>(read_navigation_bool(string_bits, P4));
|
||||
gnav_ephemeris.d_F_T = static_cast<double>(read_navigation_unsigned(string_bits, F_T));
|
||||
gnav_ephemeris.d_N_T = static_cast<double>(read_navigation_unsigned(string_bits, N_T));
|
||||
gnav_ephemeris.d_n = static_cast<double>(read_navigation_unsigned(string_bits, N));
|
||||
gnav_ephemeris.d_M = static_cast<double>(read_navigation_unsigned(string_bits, M));
|
||||
|
||||
// Fill in ephemeris deliverables in the code
|
||||
flag_update_slot_number = true;
|
||||
gnav_ephemeris.i_satellite_slot_number = static_cast<unsigned int>(gnav_ephemeris.d_n);
|
||||
gnav_ephemeris.i_satellite_PRN = static_cast<unsigned int>(gnav_ephemeris.d_n);
|
||||
// Fill in ephemeris deliverables in the code
|
||||
flag_update_slot_number = true;
|
||||
gnav_ephemeris.i_satellite_slot_number = static_cast<unsigned int>(gnav_ephemeris.d_n);
|
||||
gnav_ephemeris.i_satellite_PRN = static_cast<unsigned int>(gnav_ephemeris.d_n);
|
||||
|
||||
flag_ephemeris_str_4 = true;
|
||||
}
|
||||
flag_ephemeris_str_4 = true;
|
||||
}
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
// --- It is string 5 ----------------------------------------------
|
||||
if (flag_ephemeris_str_4 == true)
|
||||
{
|
||||
gnav_utc_model.d_N_A = static_cast<double>(read_navigation_unsigned(string_bits, N_A));
|
||||
gnav_utc_model.d_tau_c = static_cast<double>(read_navigation_signed(string_bits, TAU_C)) * TWO_N31;
|
||||
gnav_utc_model.d_N_4 = static_cast<double>(read_navigation_unsigned(string_bits, N_4));
|
||||
gnav_utc_model.d_tau_gps = static_cast<double>(read_navigation_signed(string_bits, TAU_GPS)) * TWO_N30;
|
||||
gnav_ephemeris.d_l5th_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||
case 5:
|
||||
// --- It is string 5 ----------------------------------------------
|
||||
if (flag_ephemeris_str_4 == true)
|
||||
{
|
||||
gnav_utc_model.d_N_A = static_cast<double>(read_navigation_unsigned(string_bits, N_A));
|
||||
gnav_utc_model.d_tau_c = static_cast<double>(read_navigation_signed(string_bits, TAU_C)) * TWO_N31;
|
||||
gnav_utc_model.d_N_4 = static_cast<double>(read_navigation_unsigned(string_bits, N_4));
|
||||
gnav_utc_model.d_tau_gps = static_cast<double>(read_navigation_signed(string_bits, TAU_GPS)) * TWO_N30;
|
||||
gnav_ephemeris.d_l5th_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||
|
||||
flag_utc_model_str_5 = true;
|
||||
flag_utc_model_str_5 = true;
|
||||
|
||||
// Compute Year and DoY based on Algorithm A3.11 of GLONASS ICD
|
||||
// 1). Current year number J in the four-year interval is calculated
|
||||
if (gnav_ephemeris.d_N_T >= 1 && gnav_ephemeris.d_N_T <= 366)
|
||||
{
|
||||
J = 1;
|
||||
}
|
||||
else if (gnav_ephemeris.d_N_T >= 367 && gnav_ephemeris.d_N_T <= 731)
|
||||
{
|
||||
J = 2;
|
||||
}
|
||||
else if (gnav_ephemeris.d_N_T >= 732 && gnav_ephemeris.d_N_T <= 1096)
|
||||
{
|
||||
J = 3;
|
||||
}
|
||||
else if (gnav_ephemeris.d_N_T >= 1097 && gnav_ephemeris.d_N_T <= 1461)
|
||||
{
|
||||
J = 4;
|
||||
}
|
||||
// 2). Current year in common form is calculated by the following formula:
|
||||
gnav_ephemeris.d_yr = 1996 + 4.0 * (gnav_utc_model.d_N_4 - 1.0) + (J - 1.0);
|
||||
gnav_ephemeris.d_tau_c = gnav_utc_model.d_tau_c;
|
||||
// Compute Year and DoY based on Algorithm A3.11 of GLONASS ICD
|
||||
// 1). Current year number J in the four-year interval is calculated
|
||||
if (gnav_ephemeris.d_N_T >= 1 && gnav_ephemeris.d_N_T <= 366)
|
||||
{
|
||||
J = 1;
|
||||
}
|
||||
else if (gnav_ephemeris.d_N_T >= 367 && gnav_ephemeris.d_N_T <= 731)
|
||||
{
|
||||
J = 2;
|
||||
}
|
||||
else if (gnav_ephemeris.d_N_T >= 732 && gnav_ephemeris.d_N_T <= 1096)
|
||||
{
|
||||
J = 3;
|
||||
}
|
||||
else if (gnav_ephemeris.d_N_T >= 1097 && gnav_ephemeris.d_N_T <= 1461)
|
||||
{
|
||||
J = 4;
|
||||
}
|
||||
// 2). Current year in common form is calculated by the following formula:
|
||||
gnav_ephemeris.d_yr = 1996 + 4.0 * (gnav_utc_model.d_N_4 - 1.0) + (J - 1.0);
|
||||
gnav_ephemeris.d_tau_c = gnav_utc_model.d_tau_c;
|
||||
|
||||
// 3). Set TOW once the year has been defined, it helps with leap second determination
|
||||
if (flag_ephemeris_str_1 == true)
|
||||
{
|
||||
gnav_ephemeris.glot_to_gpst(gnav_ephemeris.d_t_k+10, gnav_utc_model.d_tau_c, gnav_utc_model.d_tau_gps, &gnav_ephemeris.d_WN, &gnav_ephemeris.d_TOW);
|
||||
flag_TOW_set = true;
|
||||
flag_TOW_new = true;
|
||||
}
|
||||
// 3). Set TOW once the year has been defined, it helps with leap second determination
|
||||
if (flag_ephemeris_str_1 == true)
|
||||
{
|
||||
gnav_ephemeris.glot_to_gpst(gnav_ephemeris.d_t_k+10, gnav_utc_model.d_tau_c, gnav_utc_model.d_tau_gps, &gnav_ephemeris.d_WN, &gnav_ephemeris.d_TOW);
|
||||
flag_TOW_set = true;
|
||||
flag_TOW_new = true;
|
||||
}
|
||||
|
||||
// 4) Set time of day (tod) when ephemeris data is complety decoded
|
||||
gnav_ephemeris.d_tod = gnav_ephemeris.d_t_k + 2*d_string_ID;
|
||||
}
|
||||
// 4) Set time of day (tod) when ephemeris data is complety decoded
|
||||
gnav_ephemeris.d_tod = gnav_ephemeris.d_t_k + 2*d_string_ID;
|
||||
}
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
// --- It is string 6 ----------------------------------------------
|
||||
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||
// Make sure a valid frame_ID or satellite slot number is returned
|
||||
if(d_frame_ID == 0)
|
||||
return 0;
|
||||
case 6:
|
||||
// --- It is string 6 ----------------------------------------------
|
||||
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||
// Make sure a valid frame_ID or satellite slot number is returned
|
||||
if(d_frame_ID == 0)
|
||||
return 0;
|
||||
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||
|
||||
flag_almanac_str_6 = true;
|
||||
flag_almanac_str_6 = true;
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
// --- It is string 7 ----------------------------------------------
|
||||
if (flag_almanac_str_6 == true)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||
case 7:
|
||||
// --- It is string 7 ----------------------------------------------
|
||||
if (flag_almanac_str_6 == true)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||
|
||||
// Set satellite information for redundancy purposes
|
||||
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||
}
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
// Set satellite information for redundancy purposes
|
||||
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||
}
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
|
||||
if (i_alm_satellite_slot_number == gnav_ephemeris.i_satellite_slot_number)
|
||||
{
|
||||
gnav_ephemeris.i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel;
|
||||
}
|
||||
flag_almanac_str_7 = true;
|
||||
}
|
||||
if (i_alm_satellite_slot_number == gnav_ephemeris.i_satellite_slot_number)
|
||||
{
|
||||
gnav_ephemeris.i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel;
|
||||
}
|
||||
flag_almanac_str_7 = true;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
break;
|
||||
case 8:
|
||||
// --- It is string 8 ----------------------------------------------
|
||||
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||
// Make sure a valid frame_ID or satellite slot number is returned
|
||||
if(d_frame_ID == 0)
|
||||
return 0;
|
||||
case 8:
|
||||
// --- It is string 8 ----------------------------------------------
|
||||
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||
// Make sure a valid frame_ID or satellite slot number is returned
|
||||
if(d_frame_ID == 0)
|
||||
return 0;
|
||||
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||
|
||||
flag_almanac_str_8 = true;
|
||||
flag_almanac_str_8 = true;
|
||||
|
||||
break;
|
||||
case 9:
|
||||
// --- It is string 9 ----------------------------------------------
|
||||
if (flag_almanac_str_8 == true)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||
break;
|
||||
|
||||
// Set satellite information for redundancy purposes
|
||||
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||
}
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
case 9:
|
||||
// --- It is string 9 ----------------------------------------------
|
||||
if (flag_almanac_str_8 == true)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||
|
||||
flag_almanac_str_9 = true;
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
// --- It is string 10 ---------------------------------------------
|
||||
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||
// Make sure a valid frame_ID or satellite slot number is returned
|
||||
if(d_frame_ID == 0)
|
||||
return 0;
|
||||
// Set satellite information for redundancy purposes
|
||||
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||
}
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||
flag_almanac_str_9 = true;
|
||||
}
|
||||
break;
|
||||
|
||||
flag_almanac_str_10 = true;
|
||||
case 10:
|
||||
// --- It is string 10 ---------------------------------------------
|
||||
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||
// Make sure a valid frame_ID or satellite slot number is returned
|
||||
if(d_frame_ID == 0)
|
||||
return 0;
|
||||
|
||||
break;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||
|
||||
case 11:
|
||||
// --- It is string 11 ---------------------------------------------
|
||||
if (flag_almanac_str_10 == true)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||
flag_almanac_str_10 = true;
|
||||
|
||||
// Set satellite information for redundancy purposes
|
||||
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||
}
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
break;
|
||||
|
||||
flag_almanac_str_11 = true;
|
||||
}
|
||||
break;
|
||||
case 12:
|
||||
// --- It is string 12 ---------------------------------------------
|
||||
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||
// Make sure a valid frame_ID or satellite slot number is returned
|
||||
if(d_frame_ID == 0)
|
||||
return 0;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||
case 11:
|
||||
// --- It is string 11 ---------------------------------------------
|
||||
if (flag_almanac_str_10 == true)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||
|
||||
flag_almanac_str_12 = true;
|
||||
// Set satellite information for redundancy purposes
|
||||
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||
}
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
|
||||
break;
|
||||
flag_almanac_str_11 = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case 13:
|
||||
// --- It is string 13 ---------------------------------------------
|
||||
if (flag_almanac_str_12 == true)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||
case 12:
|
||||
// --- It is string 12 ---------------------------------------------
|
||||
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||
// Make sure a valid frame_ID or satellite slot number is returned
|
||||
if(d_frame_ID == 0)
|
||||
return 0;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||
|
||||
// Set satellite information for redundancy purposes
|
||||
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||
}
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
flag_almanac_str_12 = true;
|
||||
|
||||
flag_almanac_str_13 = true;
|
||||
}
|
||||
break;
|
||||
case 14:
|
||||
// --- It is string 14 ---------------------------------------------
|
||||
if (d_frame_ID == 5)
|
||||
{
|
||||
gnav_utc_model.d_B1 = static_cast<double>(read_navigation_unsigned(string_bits, B1));
|
||||
gnav_utc_model.d_B2 = static_cast<double>(read_navigation_unsigned(string_bits, B2));
|
||||
}
|
||||
else
|
||||
{
|
||||
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||
// Make sure a valid frame_ID or satellite slot number is returned
|
||||
if(d_frame_ID == 0)
|
||||
return 0;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||
break;
|
||||
|
||||
flag_almanac_str_14 = true;
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
// --- It is string 13 ---------------------------------------------
|
||||
if (flag_almanac_str_12 == true)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||
|
||||
case 15:
|
||||
// --- It is string 15 ----------------------------------------------
|
||||
if (d_frame_ID != 5 and flag_almanac_str_14 == true) {
|
||||
// Set satellite information for redundancy purposes
|
||||
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||
{
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||
}
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
|
||||
flag_almanac_str_13 = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case 14:
|
||||
// --- It is string 14 ---------------------------------------------
|
||||
if (d_frame_ID == 5)
|
||||
{
|
||||
gnav_utc_model.d_B1 = static_cast<double>(read_navigation_unsigned(string_bits, B1));
|
||||
gnav_utc_model.d_B2 = static_cast<double>(read_navigation_unsigned(string_bits, B2));
|
||||
}
|
||||
else
|
||||
{
|
||||
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||
// Make sure a valid frame_ID or satellite slot number is returned
|
||||
if(d_frame_ID == 0)
|
||||
return 0;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||
|
||||
flag_almanac_str_14 = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case 15:
|
||||
// --- It is string 15 ----------------------------------------------
|
||||
if (d_frame_ID != 5 and flag_almanac_str_14 == true) {
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||
@ -668,14 +668,14 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
|
||||
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||
|
||||
flag_almanac_str_15 = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
LOG(INFO) << "GLONASS GNAV: Invalid String ID of received. Received " << d_string_ID
|
||||
<< ", but acceptable range is from 1-15";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
LOG(INFO) << "GLONASS GNAV: Invalid String ID of received. Received " << d_string_ID
|
||||
<< ", but acceptable range is from 1-15";
|
||||
|
||||
break;
|
||||
} // switch string ID ...
|
||||
break;
|
||||
} // switch string ID
|
||||
|
||||
return d_string_ID;
|
||||
}
|
||||
@ -704,8 +704,8 @@ bool Glonass_Gnav_Navigation_Message::have_new_ephemeris() //Check if we have a
|
||||
bool new_eph = false;
|
||||
// We need to make sure we have received the ephemeris info plus the time info
|
||||
if ((flag_ephemeris_str_1 == true) and (flag_ephemeris_str_2 == true) and
|
||||
(flag_ephemeris_str_3 == true) and (flag_ephemeris_str_4 == true) and
|
||||
(flag_utc_model_str_5 == true))
|
||||
(flag_ephemeris_str_3 == true) and (flag_ephemeris_str_4 == true) and
|
||||
(flag_utc_model_str_5 == true))
|
||||
{
|
||||
if(d_previous_tb != gnav_ephemeris.d_t_b)
|
||||
{
|
||||
@ -729,7 +729,7 @@ bool Glonass_Gnav_Navigation_Message::have_new_utc_model() // Check if we have a
|
||||
{
|
||||
if (flag_utc_model_str_5 == true)
|
||||
{
|
||||
flag_utc_model_str_5 = false; // clear the flag
|
||||
flag_utc_model_str_5 = false; // clear the flag
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
@ -36,10 +36,6 @@
|
||||
|
||||
|
||||
#include <bitset>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include "GLONASS_L1_CA.h"
|
||||
#include "glonass_gnav_ephemeris.h"
|
||||
#include "glonass_gnav_almanac.h"
|
||||
@ -70,16 +66,16 @@ public:
|
||||
|
||||
Glonass_Gnav_Ephemeris gnav_ephemeris; //!< Ephemeris information decoded
|
||||
Glonass_Gnav_Utc_Model gnav_utc_model; //!< UTC model information
|
||||
Glonass_Gnav_Almanac gnav_almanac[GLONASS_L1_CA_NBR_SATS]; //!< Almanac information for all 24 satellites
|
||||
Glonass_Gnav_Almanac gnav_almanac[GLONASS_L1_CA_NBR_SATS]; //!< Almanac information for all 24 satellites
|
||||
|
||||
//!< Ephmeris Flags and control variables
|
||||
// Ephemeris Flags and control variables
|
||||
bool flag_all_ephemeris; //!< Flag indicating that all strings containing ephemeris have been received
|
||||
bool flag_ephemeris_str_1; //!< Flag indicating that ephemeris 1/4 (string 1) have been received
|
||||
bool flag_ephemeris_str_2; //!< Flag indicating that ephemeris 2/4 (string 2) have been received
|
||||
bool flag_ephemeris_str_3; //!< Flag indicating that ephemeris 3/4 (string 3) have been received
|
||||
bool flag_ephemeris_str_4; //!< Flag indicating that ephemeris 4/4 (string 4) have been received
|
||||
|
||||
//!< Almanac Flags
|
||||
// Almanac Flags
|
||||
bool flag_all_almanac; //!< Flag indicating that all almanac have been received
|
||||
bool flag_almanac_str_6; //!< Flag indicating that almanac of string 6 have been received
|
||||
bool flag_almanac_str_7; //!< Flag indicating that almanac of string 7 have been received
|
||||
@ -91,23 +87,22 @@ public:
|
||||
bool flag_almanac_str_13; //!< Flag indicating that almanac of string 13 have been received
|
||||
bool flag_almanac_str_14; //!< Flag indicating that almanac of string 14 have been received
|
||||
bool flag_almanac_str_15; //!< Flag indicating that almanac of string 15 have been received
|
||||
unsigned int i_alm_satellite_slot_number; //!< SV Orbit Slot Number
|
||||
unsigned int i_alm_satellite_slot_number; //!< SV Orbit Slot Number
|
||||
|
||||
//!< UTC and System Clocks Flags
|
||||
bool flag_utc_model_valid; //!< If set, it indicates that the UTC model parameters are filled
|
||||
bool flag_utc_model_str_5; //!< Clock info send in string 5 of navigation data
|
||||
bool flag_utc_model_str_15; //!< Clock info send in string 15 of frame 5 of navigation data
|
||||
// UTC and System Clocks Flags
|
||||
bool flag_utc_model_valid; //!< If set, it indicates that the UTC model parameters are filled
|
||||
bool flag_utc_model_str_5; //!< Clock info send in string 5 of navigation data
|
||||
bool flag_utc_model_str_15; //!< Clock info send in string 15 of frame 5 of navigation data
|
||||
|
||||
bool flag_TOW_set; //!< Flag indicating when the TOW has been set
|
||||
bool flag_TOW_new; //!< Flag indicating when a new TOW has been computed
|
||||
|
||||
double d_satClkCorr; //!< Satellite clock error
|
||||
double d_dtr; //!< Relativistic clock correction term
|
||||
double d_satClkDrift; //!< Satellite clock drift
|
||||
|
||||
double d_previous_tb; //!< Previous iode for the Glonass_Gnav_Ephemeris object. Used to determine when new data arrives
|
||||
double d_previous_Na[GLONASS_L1_CA_NBR_SATS]; //!< Previous time for almanac of the Glonass_Gnav_Almanac object
|
||||
double d_satClkCorr; //!< Satellite clock error
|
||||
double d_dtr; //!< Relativistic clock correction term
|
||||
double d_satClkDrift; //!< Satellite clock drift
|
||||
|
||||
double d_previous_tb; //!< Previous iode for the Glonass_Gnav_Ephemeris object. Used to determine when new data arrives
|
||||
double d_previous_Na[GLONASS_L1_CA_NBR_SATS]; //!< Previous time for almanac of the Glonass_Gnav_Almanac object
|
||||
|
||||
/*!
|
||||
* \brief Compute CRC for GLONASS GNAV strings
|
||||
@ -116,10 +111,10 @@ public:
|
||||
bool CRC_test(std::bitset<GLONASS_GNAV_STRING_BITS> bits);
|
||||
|
||||
/*!
|
||||
* \brief Computes the frame number being decoded given the satellite slot number
|
||||
* \param satellite_slot_number [in] Satellite slot number identifier
|
||||
* \returns Frame number being decoded, 0 if operation was not successful.
|
||||
*/
|
||||
* \brief Computes the frame number being decoded given the satellite slot number
|
||||
* \param satellite_slot_number [in] Satellite slot number identifier
|
||||
* \returns Frame number being decoded, 0 if operation was not successful.
|
||||
*/
|
||||
unsigned int get_frame_number(unsigned int satellite_slot_number);
|
||||
|
||||
/*!
|
||||
|
Loading…
Reference in New Issue
Block a user