mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2025-01-16 12:12:57 +00:00
Clean source code, update to new gnss_synchro parameter name
This commit is contained in:
parent
a2a9fef7f7
commit
5fc1e018fd
@ -147,8 +147,8 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
// ********************************************************************************
|
// ********************************************************************************
|
||||||
// ****** PREPARE THE DATA (SV EPHEMERIS AND OBSERVATIONS) ************************
|
// ****** PREPARE THE DATA (SV EPHEMERIS AND OBSERVATIONS) ************************
|
||||||
// ********************************************************************************
|
// ********************************************************************************
|
||||||
int valid_obs = 0; //valid observations counter
|
int valid_obs = 0; // valid observations counter
|
||||||
int glo_valid_obs = 0; //GLONASS L1/L2 valid observations counter
|
int glo_valid_obs = 0; // GLONASS L1/L2 valid observations counter
|
||||||
|
|
||||||
obsd_t obs_data[MAXOBS];
|
obsd_t obs_data[MAXOBS];
|
||||||
eph_t eph_data[MAXOBS];
|
eph_t eph_data[MAXOBS];
|
||||||
@ -156,7 +156,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
|
|
||||||
for (gnss_observables_iter = gnss_observables_map.cbegin();
|
for (gnss_observables_iter = gnss_observables_map.cbegin();
|
||||||
gnss_observables_iter != gnss_observables_map.cend();
|
gnss_observables_iter != gnss_observables_map.cend();
|
||||||
gnss_observables_iter++) //CHECK INCONSISTENCY when combining GLONASS + other system
|
gnss_observables_iter++) // CHECK INCONSISTENCY when combining GLONASS + other system
|
||||||
{
|
{
|
||||||
switch (gnss_observables_iter->second.System)
|
switch (gnss_observables_iter->second.System)
|
||||||
{
|
{
|
||||||
@ -170,9 +170,9 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
galileo_ephemeris_iter = galileo_ephemeris_map.find(gnss_observables_iter->second.PRN);
|
galileo_ephemeris_iter = galileo_ephemeris_map.find(gnss_observables_iter->second.PRN);
|
||||||
if (galileo_ephemeris_iter != galileo_ephemeris_map.cend())
|
if (galileo_ephemeris_iter != galileo_ephemeris_map.cend())
|
||||||
{
|
{
|
||||||
//convert ephemeris from GNSS-SDR class to RTKLIB structure
|
// convert ephemeris from GNSS-SDR class to RTKLIB structure
|
||||||
eph_data[valid_obs] = eph_to_rtklib(galileo_ephemeris_iter->second);
|
eph_data[valid_obs] = eph_to_rtklib(galileo_ephemeris_iter->second);
|
||||||
//convert observation from GNSS-SDR class to RTKLIB structure
|
// convert observation from GNSS-SDR class to RTKLIB structure
|
||||||
obsd_t newobs = {{0, 0}, '0', '0', {}, {}, {}, {}, {}, {}};
|
obsd_t newobs = {{0, 0}, '0', '0', {}, {}, {}, {}, {}, {}};
|
||||||
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
||||||
gnss_observables_iter->second,
|
gnss_observables_iter->second,
|
||||||
@ -201,17 +201,17 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
obs_data[i + glo_valid_obs] = insert_obs_to_rtklib(obs_data[i + glo_valid_obs],
|
obs_data[i + glo_valid_obs] = insert_obs_to_rtklib(obs_data[i + glo_valid_obs],
|
||||||
gnss_observables_iter->second,
|
gnss_observables_iter->second,
|
||||||
galileo_ephemeris_iter->second.WN_5,
|
galileo_ephemeris_iter->second.WN_5,
|
||||||
2); //Band 3 (L5/E5)
|
2); // Band 3 (L5/E5)
|
||||||
found_E1_obs = true;
|
found_E1_obs = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found_E1_obs)
|
if (!found_E1_obs)
|
||||||
{
|
{
|
||||||
//insert Galileo E5 obs as new obs and also insert its ephemeris
|
// insert Galileo E5 obs as new obs and also insert its ephemeris
|
||||||
//convert ephemeris from GNSS-SDR class to RTKLIB structure
|
// convert ephemeris from GNSS-SDR class to RTKLIB structure
|
||||||
eph_data[valid_obs] = eph_to_rtklib(galileo_ephemeris_iter->second);
|
eph_data[valid_obs] = eph_to_rtklib(galileo_ephemeris_iter->second);
|
||||||
//convert observation from GNSS-SDR class to RTKLIB structure
|
// convert observation from GNSS-SDR class to RTKLIB structure
|
||||||
unsigned char default_code_ = static_cast<unsigned char>(CODE_NONE);
|
unsigned char default_code_ = static_cast<unsigned char>(CODE_NONE);
|
||||||
obsd_t newobs = {{0, 0}, '0', '0', {}, {},
|
obsd_t newobs = {{0, 0}, '0', '0', {}, {},
|
||||||
{default_code_, default_code_, default_code_},
|
{default_code_, default_code_, default_code_},
|
||||||
@ -219,7 +219,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
||||||
gnss_observables_iter->second,
|
gnss_observables_iter->second,
|
||||||
galileo_ephemeris_iter->second.WN_5,
|
galileo_ephemeris_iter->second.WN_5,
|
||||||
2); //Band 3 (L5/E5)
|
2); // Band 3 (L5/E5)
|
||||||
valid_obs++;
|
valid_obs++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -240,9 +240,9 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
gps_ephemeris_iter = gps_ephemeris_map.find(gnss_observables_iter->second.PRN);
|
gps_ephemeris_iter = gps_ephemeris_map.find(gnss_observables_iter->second.PRN);
|
||||||
if (gps_ephemeris_iter != gps_ephemeris_map.cend())
|
if (gps_ephemeris_iter != gps_ephemeris_map.cend())
|
||||||
{
|
{
|
||||||
//convert ephemeris from GNSS-SDR class to RTKLIB structure
|
// convert ephemeris from GNSS-SDR class to RTKLIB structure
|
||||||
eph_data[valid_obs] = eph_to_rtklib(gps_ephemeris_iter->second);
|
eph_data[valid_obs] = eph_to_rtklib(gps_ephemeris_iter->second);
|
||||||
//convert observation from GNSS-SDR class to RTKLIB structure
|
// convert observation from GNSS-SDR class to RTKLIB structure
|
||||||
obsd_t newobs = {{0, 0}, '0', '0', {}, {}, {}, {}, {}, {}};
|
obsd_t newobs = {{0, 0}, '0', '0', {}, {}, {}, {}, {}, {}};
|
||||||
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
||||||
gnss_observables_iter->second,
|
gnss_observables_iter->second,
|
||||||
@ -255,7 +255,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
DLOG(INFO) << "No ephemeris data for SV " << gnss_observables_iter->first;
|
DLOG(INFO) << "No ephemeris data for SV " << gnss_observables_iter->first;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//GPS L2
|
// GPS L2
|
||||||
if (sig_.compare("2S") == 0)
|
if (sig_.compare("2S") == 0)
|
||||||
{
|
{
|
||||||
gps_cnav_ephemeris_iter = gps_cnav_ephemeris_map.find(gnss_observables_iter->second.PRN);
|
gps_cnav_ephemeris_iter = gps_cnav_ephemeris_map.find(gnss_observables_iter->second.PRN);
|
||||||
@ -276,7 +276,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
obs_data[i + glo_valid_obs] = insert_obs_to_rtklib(obs_data[i + glo_valid_obs],
|
obs_data[i + glo_valid_obs] = insert_obs_to_rtklib(obs_data[i + glo_valid_obs],
|
||||||
gnss_observables_iter->second,
|
gnss_observables_iter->second,
|
||||||
eph_data[i].week,
|
eph_data[i].week,
|
||||||
1); //Band 2 (L2)
|
1); // Band 2 (L2)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -285,9 +285,9 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 3. If not found, insert the GPS L2 ephemeris and the observation
|
// 3. If not found, insert the GPS L2 ephemeris and the observation
|
||||||
//convert ephemeris from GNSS-SDR class to RTKLIB structure
|
// convert ephemeris from GNSS-SDR class to RTKLIB structure
|
||||||
eph_data[valid_obs] = eph_to_rtklib(gps_cnav_ephemeris_iter->second);
|
eph_data[valid_obs] = eph_to_rtklib(gps_cnav_ephemeris_iter->second);
|
||||||
//convert observation from GNSS-SDR class to RTKLIB structure
|
// convert observation from GNSS-SDR class to RTKLIB structure
|
||||||
unsigned char default_code_ = static_cast<unsigned char>(CODE_NONE);
|
unsigned char default_code_ = static_cast<unsigned char>(CODE_NONE);
|
||||||
obsd_t newobs = {{0, 0}, '0', '0', {}, {},
|
obsd_t newobs = {{0, 0}, '0', '0', {}, {},
|
||||||
{default_code_, default_code_, default_code_},
|
{default_code_, default_code_, default_code_},
|
||||||
@ -295,7 +295,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
||||||
gnss_observables_iter->second,
|
gnss_observables_iter->second,
|
||||||
gps_cnav_ephemeris_iter->second.i_GPS_week,
|
gps_cnav_ephemeris_iter->second.i_GPS_week,
|
||||||
1); //Band 2 (L2)
|
1); // Band 2 (L2)
|
||||||
valid_obs++;
|
valid_obs++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -304,7 +304,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
DLOG(INFO) << "No ephemeris data for SV " << gnss_observables_iter->second.PRN;
|
DLOG(INFO) << "No ephemeris data for SV " << gnss_observables_iter->second.PRN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//GPS L5
|
// GPS L5
|
||||||
if (sig_.compare("L5") == 0)
|
if (sig_.compare("L5") == 0)
|
||||||
{
|
{
|
||||||
gps_cnav_ephemeris_iter = gps_cnav_ephemeris_map.find(gnss_observables_iter->second.PRN);
|
gps_cnav_ephemeris_iter = gps_cnav_ephemeris_map.find(gnss_observables_iter->second.PRN);
|
||||||
@ -324,7 +324,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
obs_data[i + glo_valid_obs] = insert_obs_to_rtklib(obs_data[i],
|
obs_data[i + glo_valid_obs] = insert_obs_to_rtklib(obs_data[i],
|
||||||
gnss_observables_iter->second,
|
gnss_observables_iter->second,
|
||||||
gps_cnav_ephemeris_iter->second.i_GPS_week,
|
gps_cnav_ephemeris_iter->second.i_GPS_week,
|
||||||
2); //Band 3 (L5)
|
2); // Band 3 (L5)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -332,9 +332,9 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 3. If not found, insert the GPS L5 ephemeris and the observation
|
// 3. If not found, insert the GPS L5 ephemeris and the observation
|
||||||
//convert ephemeris from GNSS-SDR class to RTKLIB structure
|
// convert ephemeris from GNSS-SDR class to RTKLIB structure
|
||||||
eph_data[valid_obs] = eph_to_rtklib(gps_cnav_ephemeris_iter->second);
|
eph_data[valid_obs] = eph_to_rtklib(gps_cnav_ephemeris_iter->second);
|
||||||
//convert observation from GNSS-SDR class to RTKLIB structure
|
// convert observation from GNSS-SDR class to RTKLIB structure
|
||||||
unsigned char default_code_ = static_cast<unsigned char>(CODE_NONE);
|
unsigned char default_code_ = static_cast<unsigned char>(CODE_NONE);
|
||||||
obsd_t newobs = {{0, 0}, '0', '0', {}, {},
|
obsd_t newobs = {{0, 0}, '0', '0', {}, {},
|
||||||
{default_code_, default_code_, default_code_},
|
{default_code_, default_code_, default_code_},
|
||||||
@ -342,7 +342,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
||||||
gnss_observables_iter->second,
|
gnss_observables_iter->second,
|
||||||
gps_cnav_ephemeris_iter->second.i_GPS_week,
|
gps_cnav_ephemeris_iter->second.i_GPS_week,
|
||||||
2); //Band 3 (L5)
|
2); // Band 3 (L5)
|
||||||
valid_obs++;
|
valid_obs++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -363,14 +363,14 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
glonass_gnav_ephemeris_iter = glonass_gnav_ephemeris_map.find(gnss_observables_iter->second.PRN);
|
glonass_gnav_ephemeris_iter = glonass_gnav_ephemeris_map.find(gnss_observables_iter->second.PRN);
|
||||||
if (glonass_gnav_ephemeris_iter != glonass_gnav_ephemeris_map.cend())
|
if (glonass_gnav_ephemeris_iter != glonass_gnav_ephemeris_map.cend())
|
||||||
{
|
{
|
||||||
//convert ephemeris from GNSS-SDR class to RTKLIB structure
|
// convert ephemeris from GNSS-SDR class to RTKLIB structure
|
||||||
geph_data[glo_valid_obs] = eph_to_rtklib(glonass_gnav_ephemeris_iter->second, gnav_utc);
|
geph_data[glo_valid_obs] = eph_to_rtklib(glonass_gnav_ephemeris_iter->second, gnav_utc);
|
||||||
//convert observation from GNSS-SDR class to RTKLIB structure
|
// convert observation from GNSS-SDR class to RTKLIB structure
|
||||||
obsd_t newobs = {{0, 0}, '0', '0', {}, {}, {}, {}, {}, {}};
|
obsd_t newobs = {{0, 0}, '0', '0', {}, {}, {}, {}, {}, {}};
|
||||||
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
||||||
gnss_observables_iter->second,
|
gnss_observables_iter->second,
|
||||||
glonass_gnav_ephemeris_iter->second.d_WN,
|
glonass_gnav_ephemeris_iter->second.d_WN,
|
||||||
0); //Band 0 (L1)
|
0); // Band 0 (L1)
|
||||||
glo_valid_obs++;
|
glo_valid_obs++;
|
||||||
}
|
}
|
||||||
else // the ephemeris are not available for this SV
|
else // the ephemeris are not available for this SV
|
||||||
@ -400,15 +400,15 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
}
|
}
|
||||||
if (!found_L1_obs)
|
if (!found_L1_obs)
|
||||||
{
|
{
|
||||||
//insert GLONASS GNAV L2 obs as new obs and also insert its ephemeris
|
// insert GLONASS GNAV L2 obs as new obs and also insert its ephemeris
|
||||||
//convert ephemeris from GNSS-SDR class to RTKLIB structure
|
// convert ephemeris from GNSS-SDR class to RTKLIB structure
|
||||||
geph_data[glo_valid_obs] = eph_to_rtklib(glonass_gnav_ephemeris_iter->second, gnav_utc);
|
geph_data[glo_valid_obs] = eph_to_rtklib(glonass_gnav_ephemeris_iter->second, gnav_utc);
|
||||||
//convert observation from GNSS-SDR class to RTKLIB structure
|
// convert observation from GNSS-SDR class to RTKLIB structure
|
||||||
obsd_t newobs = {{0, 0}, '0', '0', {}, {}, {}, {}, {}, {}};
|
obsd_t newobs = {{0, 0}, '0', '0', {}, {}, {}, {}, {}, {}};
|
||||||
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs,
|
||||||
gnss_observables_iter->second,
|
gnss_observables_iter->second,
|
||||||
glonass_gnav_ephemeris_iter->second.d_WN,
|
glonass_gnav_ephemeris_iter->second.d_WN,
|
||||||
1); //Band 1 (L2)
|
1); // Band 1 (L2)
|
||||||
glo_valid_obs++;
|
glo_valid_obs++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -481,20 +481,19 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
|
|
||||||
this->set_valid_position(true);
|
this->set_valid_position(true);
|
||||||
arma::vec rx_position_and_time(4);
|
arma::vec rx_position_and_time(4);
|
||||||
rx_position_and_time(0) = pvt_sol.rr[0]; //[m]
|
rx_position_and_time(0) = pvt_sol.rr[0]; // [m]
|
||||||
rx_position_and_time(1) = pvt_sol.rr[1]; //[m]
|
rx_position_and_time(1) = pvt_sol.rr[1]; // [m]
|
||||||
rx_position_and_time(2) = pvt_sol.rr[2]; //[m]
|
rx_position_and_time(2) = pvt_sol.rr[2]; // [m]
|
||||||
|
|
||||||
//todo: fix this ambiguity in the RTKLIB units in receiver clock offset!
|
//todo: fix this ambiguity in the RTKLIB units in receiver clock offset!
|
||||||
if (rtk_.opt.mode == PMODE_SINGLE)
|
if (rtk_.opt.mode == PMODE_SINGLE)
|
||||||
{
|
{
|
||||||
rx_position_and_time(3) = pvt_sol.dtr[0]; //if the RTKLIB solver is set to SINGLE, the dtr is already expressed in [s]
|
rx_position_and_time(3) = pvt_sol.dtr[0]; // if the RTKLIB solver is set to SINGLE, the dtr is already expressed in [s]
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rx_position_and_time(3) = pvt_sol.dtr[0] / GPS_C_m_s; // the receiver clock offset is expressed in [meters]
|
rx_position_and_time(3) = pvt_sol.dtr[0] / GPS_C_m_s; // the receiver clock offset is expressed in [meters], so we convert it into [s]
|
||||||
}
|
}
|
||||||
//[s]
|
|
||||||
this->set_rx_pos(rx_position_and_time.rows(0, 2)); // save ECEF position for the next iteration
|
this->set_rx_pos(rx_position_and_time.rows(0, 2)); // save ECEF position for the next iteration
|
||||||
//observable fix:
|
//observable fix:
|
||||||
//double offset_s = this->get_time_offset_s();
|
//double offset_s = this->get_time_offset_s();
|
||||||
@ -505,7 +504,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
<< " in ECEF (X,Y,Z,t[meters]) = " << rx_position_and_time;
|
<< " in ECEF (X,Y,Z,t[meters]) = " << rx_position_and_time;
|
||||||
|
|
||||||
boost::posix_time::ptime p_time;
|
boost::posix_time::ptime p_time;
|
||||||
//gtime_t rtklib_utc_time = gpst2utc(pvt_sol.time);
|
// gtime_t rtklib_utc_time = gpst2utc(pvt_sol.time);
|
||||||
|
|
||||||
gtime_t rtklib_utc_time = gpst2time(adjgpsweek(nav_data.eph[0].week), gnss_observables_map.begin()->second.RX_time);
|
gtime_t rtklib_utc_time = gpst2time(adjgpsweek(nav_data.eph[0].week), gnss_observables_map.begin()->second.RX_time);
|
||||||
p_time = boost::posix_time::from_time_t(rtklib_utc_time.time);
|
p_time = boost::posix_time::from_time_t(rtklib_utc_time.time);
|
||||||
@ -525,7 +524,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
double tmp_double;
|
double tmp_double;
|
||||||
// PVT GPS time
|
// PVT GPS time
|
||||||
tmp_double = gnss_observables_map.begin()->second.RX_time;
|
tmp_double = gnss_observables_map.begin()->second.RX_time;
|
||||||
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
||||||
// ECEF User Position East [m]
|
// ECEF User Position East [m]
|
||||||
|
@ -63,7 +63,6 @@
|
|||||||
#define SQRT_SOL(x) ((x) < 0.0 ? 0.0 : sqrt(x))
|
#define SQRT_SOL(x) ((x) < 0.0 ? 0.0 : sqrt(x))
|
||||||
|
|
||||||
const int MAXFIELD = 64; /* max number of fields in a record */
|
const int MAXFIELD = 64; /* max number of fields in a record */
|
||||||
const int MAXNMEA = 256; /* max length of nmea sentence */
|
|
||||||
|
|
||||||
const double KNOT2M = 0.514444444; /* m/knot */
|
const double KNOT2M = 0.514444444; /* m/knot */
|
||||||
|
|
||||||
|
@ -310,10 +310,10 @@ bool hybrid_observables_cc::interpolate_data(Gnss_Synchro &out, const unsigned i
|
|||||||
}
|
}
|
||||||
find_interp_elements(ch, ti);
|
find_interp_elements(ch, ti);
|
||||||
|
|
||||||
//1st: copy the nearest gnss_synchro data for that channel
|
// 1st: copy the nearest gnss_synchro data for that channel
|
||||||
out = d_gnss_synchro_history->at(ch, 0);
|
out = d_gnss_synchro_history->at(ch, 0);
|
||||||
|
|
||||||
//2nd: Linear interpolation: y(t) = y(t1) + (y(t2) - y(t1)) * (t - t1) / (t2 - t1)
|
// 2nd: Linear interpolation: y(t) = y(t1) + (y(t2) - y(t1)) * (t - t1) / (t2 - t1)
|
||||||
|
|
||||||
// CARRIER PHASE INTERPOLATION
|
// CARRIER PHASE INTERPOLATION
|
||||||
out.Carrier_phase_rads = d_gnss_synchro_history->at(ch, 0).Carrier_phase_rads + (d_gnss_synchro_history->at(ch, 1).Carrier_phase_rads - d_gnss_synchro_history->at(ch, 0).Carrier_phase_rads) * (ti - d_gnss_synchro_history->at(ch, 0).RX_time) / (d_gnss_synchro_history->at(ch, 1).RX_time - d_gnss_synchro_history->at(ch, 0).RX_time);
|
out.Carrier_phase_rads = d_gnss_synchro_history->at(ch, 0).Carrier_phase_rads + (d_gnss_synchro_history->at(ch, 1).Carrier_phase_rads - d_gnss_synchro_history->at(ch, 0).Carrier_phase_rads) * (ti - d_gnss_synchro_history->at(ch, 0).RX_time) / (d_gnss_synchro_history->at(ch, 1).RX_time - d_gnss_synchro_history->at(ch, 0).RX_time);
|
||||||
@ -324,11 +324,6 @@ bool hybrid_observables_cc::interpolate_data(Gnss_Synchro &out, const unsigned i
|
|||||||
// TOW INTERPOLATION
|
// TOW INTERPOLATION
|
||||||
out.interp_TOW_ms = static_cast<double>(d_gnss_synchro_history->at(ch, 0).TOW_at_current_symbol_ms) + (static_cast<double>(d_gnss_synchro_history->at(ch, 1).TOW_at_current_symbol_ms) - static_cast<double>(d_gnss_synchro_history->at(ch, 0).TOW_at_current_symbol_ms)) * (ti - d_gnss_synchro_history->at(ch, 0).RX_time) / (d_gnss_synchro_history->at(ch, 1).RX_time - d_gnss_synchro_history->at(ch, 0).RX_time);
|
out.interp_TOW_ms = static_cast<double>(d_gnss_synchro_history->at(ch, 0).TOW_at_current_symbol_ms) + (static_cast<double>(d_gnss_synchro_history->at(ch, 1).TOW_at_current_symbol_ms) - static_cast<double>(d_gnss_synchro_history->at(ch, 0).TOW_at_current_symbol_ms)) * (ti - d_gnss_synchro_history->at(ch, 0).RX_time) / (d_gnss_synchro_history->at(ch, 1).RX_time - d_gnss_synchro_history->at(ch, 0).RX_time);
|
||||||
|
|
||||||
|
|
||||||
//std::cout.precision(17);
|
|
||||||
//std::cout << "Diff TOW_at_current_symbol_ms(1) - out.interp_TOW_ms: " << static_cast<double>(d_gnss_synchro_history->at(ch, 1).TOW_at_current_symbol_ms) - out.interp_TOW_ms << std::endl;
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,6 +340,7 @@ double hybrid_observables_cc::compute_T_rx_s(const Gnss_Synchro &a)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void hybrid_observables_cc::find_interp_elements(const unsigned int &ch, const double &ti)
|
void hybrid_observables_cc::find_interp_elements(const unsigned int &ch, const double &ti)
|
||||||
{
|
{
|
||||||
unsigned int closest = 0;
|
unsigned int closest = 0;
|
||||||
@ -412,10 +408,10 @@ void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector<Gnss_Sync
|
|||||||
{
|
{
|
||||||
std::vector<Gnss_Synchro>::iterator it;
|
std::vector<Gnss_Synchro>::iterator it;
|
||||||
|
|
||||||
/////////////////////// DEBUG //////////////////////////
|
/////////////////////// DEBUG //////////////////////////
|
||||||
// Logs if there is a pseudorange difference between
|
// Logs if there is a pseudorange difference between
|
||||||
// signals of the same satellite higher than a threshold
|
// signals of the same satellite higher than a threshold
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
std::vector<Gnss_Synchro>::iterator it2;
|
std::vector<Gnss_Synchro>::iterator it2;
|
||||||
double thr_ = 250.0 / SPEED_OF_LIGHT; // Maximum pseudorange difference = 250 meters
|
double thr_ = 250.0 / SPEED_OF_LIGHT; // Maximum pseudorange difference = 250 meters
|
||||||
@ -442,8 +438,6 @@ void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector<Gnss_Sync
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
if (!T_rx_TOW_set)
|
if (!T_rx_TOW_set)
|
||||||
{
|
{
|
||||||
unsigned int TOW_ref = std::numeric_limits<unsigned int>::lowest();
|
unsigned int TOW_ref = std::numeric_limits<unsigned int>::lowest();
|
||||||
@ -532,6 +526,7 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < d_nchannels; i++)
|
for (i = 0; i < d_nchannels; i++)
|
||||||
{
|
{
|
||||||
if (d_gnss_synchro_history->size(i) > 2)
|
if (d_gnss_synchro_history->size(i) > 2)
|
||||||
@ -544,6 +539,7 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
d_num_valid_channels = valid_channels.count();
|
d_num_valid_channels = valid_channels.count();
|
||||||
|
|
||||||
// Check if there is any valid channel after reading the new incoming Gnss_Synchro data
|
// Check if there is any valid channel after reading the new incoming Gnss_Synchro data
|
||||||
if (d_num_valid_channels == 0)
|
if (d_num_valid_channels == 0)
|
||||||
{
|
{
|
||||||
@ -551,7 +547,7 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused)
|
|||||||
return returned_elements;
|
return returned_elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < d_nchannels; i++) //Discard observables with T_rx higher than the threshold
|
for (i = 0; i < d_nchannels; i++) // Discard observables with T_rx higher than the threshold
|
||||||
{
|
{
|
||||||
if (valid_channels[i])
|
if (valid_channels[i])
|
||||||
{
|
{
|
||||||
@ -589,11 +585,13 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
d_num_valid_channels = valid_channels.count();
|
d_num_valid_channels = valid_channels.count();
|
||||||
|
|
||||||
if (d_num_valid_channels == 0)
|
if (d_num_valid_channels == 0)
|
||||||
{
|
{
|
||||||
consume(d_nchannels, epoch + 1);
|
consume(d_nchannels, epoch + 1);
|
||||||
return returned_elements;
|
return returned_elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
correct_TOW_and_compute_prange(epoch_data);
|
correct_TOW_and_compute_prange(epoch_data);
|
||||||
std::vector<Gnss_Synchro>::iterator it = epoch_data.begin();
|
std::vector<Gnss_Synchro>::iterator it = epoch_data.begin();
|
||||||
for (i = 0; i < d_nchannels; i++)
|
for (i = 0; i < d_nchannels; i++)
|
||||||
@ -610,6 +608,7 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused)
|
|||||||
out[i][epoch].Flag_valid_pseudorange = false;
|
out[i][epoch].Flag_valid_pseudorange = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d_dump)
|
if (d_dump)
|
||||||
{
|
{
|
||||||
// MULTIPLEXED FILE RECORDING - Record results to file
|
// MULTIPLEXED FILE RECORDING - Record results to file
|
||||||
@ -640,6 +639,7 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused)
|
|||||||
d_dump = false;
|
d_dump = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
returned_elements++;
|
returned_elements++;
|
||||||
}
|
}
|
||||||
consume(d_nchannels, ninput_items[d_nchannels]);
|
consume(d_nchannels, ninput_items[d_nchannels]);
|
||||||
|
@ -61,7 +61,7 @@ glonass_l1_ca_telemetry_decoder_cc::glonass_l1_ca_telemetry_decoder_cc(
|
|||||||
d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
|
d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
|
||||||
LOG(INFO) << "Initializing GLONASS L1 CA TELEMETRY DECODING";
|
LOG(INFO) << "Initializing GLONASS L1 CA TELEMETRY DECODING";
|
||||||
// Define the number of sampes per symbol. Notice that GLONASS has 2 rates,
|
// Define the number of sampes per symbol. Notice that GLONASS has 2 rates,
|
||||||
//one for the navigation data and the other for the preamble information
|
// one for the navigation data and the other for the preamble information
|
||||||
d_samples_per_symbol = (GLONASS_L1_CA_CODE_RATE_HZ / GLONASS_L1_CA_CODE_LENGTH_CHIPS) / GLONASS_L1_CA_SYMBOL_RATE_BPS;
|
d_samples_per_symbol = (GLONASS_L1_CA_CODE_RATE_HZ / GLONASS_L1_CA_CODE_LENGTH_CHIPS) / GLONASS_L1_CA_SYMBOL_RATE_BPS;
|
||||||
|
|
||||||
// Set the preamble information
|
// Set the preamble information
|
||||||
@ -268,11 +268,11 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
Gnss_Synchro **out = reinterpret_cast<Gnss_Synchro **>(&output_items[0]); // Get the output buffer pointer
|
Gnss_Synchro **out = reinterpret_cast<Gnss_Synchro **>(&output_items[0]); // Get the output buffer pointer
|
||||||
const Gnss_Synchro **in = reinterpret_cast<const Gnss_Synchro **>(&input_items[0]); // Get the input buffer pointer
|
const Gnss_Synchro **in = reinterpret_cast<const Gnss_Synchro **>(&input_items[0]); // Get the input buffer pointer
|
||||||
|
|
||||||
Gnss_Synchro current_symbol; //structure to save the synchronization information and send the output object to the next block
|
Gnss_Synchro current_symbol; // structure to save the synchronization information and send the output object to the next block
|
||||||
//1. Copy the current tracking output
|
// 1. Copy the current tracking output
|
||||||
current_symbol = in[0][0];
|
current_symbol = in[0][0];
|
||||||
d_symbol_history.push_back(current_symbol); //add new symbol to the symbol queue
|
d_symbol_history.push_back(current_symbol); // add new symbol to the symbol queue
|
||||||
d_sample_counter++; //count for the processed samples
|
d_sample_counter++; // count for the processed samples
|
||||||
consume_each(1);
|
consume_each(1);
|
||||||
|
|
||||||
d_flag_preamble = false;
|
d_flag_preamble = false;
|
||||||
@ -280,7 +280,7 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
|
|
||||||
if (d_symbol_history.size() > required_symbols)
|
if (d_symbol_history.size() > required_symbols)
|
||||||
{
|
{
|
||||||
//******* preamble correlation ********
|
// ******* preamble correlation ********
|
||||||
for (int i = 0; i < d_symbols_per_preamble; i++)
|
for (int i = 0; i < d_symbols_per_preamble; i++)
|
||||||
{
|
{
|
||||||
if (d_symbol_history.at(i).Prompt_I < 0) // symbols clipping
|
if (d_symbol_history.at(i).Prompt_I < 0) // symbols clipping
|
||||||
@ -294,8 +294,8 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//******* frame sync ******************
|
// ******* frame sync ******************
|
||||||
if (d_stat == 0) //no preamble information
|
if (d_stat == 0) // no preamble information
|
||||||
{
|
{
|
||||||
if (abs(corr_value) >= d_symbols_per_preamble)
|
if (abs(corr_value) >= d_symbols_per_preamble)
|
||||||
{
|
{
|
||||||
@ -311,15 +311,15 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
{
|
{
|
||||||
if (abs(corr_value) >= d_symbols_per_preamble)
|
if (abs(corr_value) >= d_symbols_per_preamble)
|
||||||
{
|
{
|
||||||
//check preamble separation
|
// check preamble separation
|
||||||
preamble_diff = d_sample_counter - d_preamble_index;
|
preamble_diff = d_sample_counter - d_preamble_index;
|
||||||
// Record the PRN start sample index associated to the preamble
|
// Record the PRN start sample index associated to the preamble
|
||||||
d_preamble_time_samples = d_symbol_history.at(0).Tracking_sample_counter;
|
d_preamble_time_samples = d_symbol_history.at(0).Tracking_sample_counter;
|
||||||
if (abs(preamble_diff - GLONASS_GNAV_PREAMBLE_PERIOD_SYMBOLS) == 0)
|
if (abs(preamble_diff - GLONASS_GNAV_PREAMBLE_PERIOD_SYMBOLS) == 0)
|
||||||
{
|
{
|
||||||
//try to decode frame
|
// try to decode frame
|
||||||
LOG(INFO) << "Starting string decoder for GLONASS L1 C/A SAT " << this->d_satellite;
|
LOG(INFO) << "Starting string decoder for GLONASS L1 C/A SAT " << this->d_satellite;
|
||||||
d_preamble_index = d_sample_counter; //record the preamble sample stamp
|
d_preamble_index = d_sample_counter; // record the preamble sample stamp
|
||||||
d_stat = 2;
|
d_stat = 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -342,7 +342,7 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
int string_length = GLONASS_GNAV_STRING_SYMBOLS - d_symbols_per_preamble;
|
int string_length = GLONASS_GNAV_STRING_SYMBOLS - d_symbols_per_preamble;
|
||||||
double string_symbols[GLONASS_GNAV_DATA_SYMBOLS] = {0};
|
double string_symbols[GLONASS_GNAV_DATA_SYMBOLS] = {0};
|
||||||
|
|
||||||
//******* SYMBOL TO BIT *******
|
// ******* SYMBOL TO BIT *******
|
||||||
for (int i = 0; i < string_length; i++)
|
for (int i = 0; i < string_length; i++)
|
||||||
{
|
{
|
||||||
if (corr_value > 0)
|
if (corr_value > 0)
|
||||||
@ -355,13 +355,13 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//call the decoder
|
// call the decoder
|
||||||
decode_string(string_symbols, string_length);
|
decode_string(string_symbols, string_length);
|
||||||
if (d_nav.flag_CRC_test == true)
|
if (d_nav.flag_CRC_test == true)
|
||||||
{
|
{
|
||||||
d_CRC_error_counter = 0;
|
d_CRC_error_counter = 0;
|
||||||
d_flag_preamble = true; //valid preamble indicator (initialized to false every work())
|
d_flag_preamble = true; // valid preamble indicator (initialized to false every work())
|
||||||
d_preamble_index = d_sample_counter; //record the preamble sample stamp (t_P)
|
d_preamble_index = d_sample_counter; // record the preamble sample stamp (t_P)
|
||||||
if (!d_flag_frame_sync)
|
if (!d_flag_frame_sync)
|
||||||
{
|
{
|
||||||
d_flag_frame_sync = true;
|
d_flag_frame_sync = true;
|
||||||
@ -372,7 +372,7 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
d_CRC_error_counter++;
|
d_CRC_error_counter++;
|
||||||
d_preamble_index = d_sample_counter; //record the preamble sample stamp
|
d_preamble_index = d_sample_counter; // record the preamble sample stamp
|
||||||
if (d_CRC_error_counter > CRC_ERROR_LIMIT)
|
if (d_CRC_error_counter > CRC_ERROR_LIMIT)
|
||||||
{
|
{
|
||||||
LOG(INFO) << "Lost of frame sync SAT " << this->d_satellite;
|
LOG(INFO) << "Lost of frame sync SAT " << this->d_satellite;
|
||||||
@ -384,21 +384,21 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UPDATE GNSS SYNCHRO DATA
|
// UPDATE GNSS SYNCHRO DATA
|
||||||
//2. Add the telemetry decoder information
|
// 2. Add the telemetry decoder information
|
||||||
if (this->d_flag_preamble == true and d_nav.flag_TOW_new == true)
|
if (this->d_flag_preamble == true and d_nav.flag_TOW_new == true)
|
||||||
//update TOW at the preamble instant
|
// update TOW at the preamble instant
|
||||||
{
|
{
|
||||||
d_TOW_at_current_symbol = floor((d_nav.gnav_ephemeris.d_TOW - GLONASS_GNAV_PREAMBLE_DURATION_S) * 1000) / 1000;
|
d_TOW_at_current_symbol = floor((d_nav.gnav_ephemeris.d_TOW - GLONASS_GNAV_PREAMBLE_DURATION_S) * 1000) / 1000;
|
||||||
d_nav.flag_TOW_new = false;
|
d_nav.flag_TOW_new = false;
|
||||||
}
|
}
|
||||||
else //if there is not a new preamble, we define the TOW of the current symbol
|
else // if there is not a new preamble, we define the TOW of the current symbol
|
||||||
{
|
{
|
||||||
d_TOW_at_current_symbol = d_TOW_at_current_symbol + GLONASS_L1_CA_CODE_PERIOD;
|
d_TOW_at_current_symbol = d_TOW_at_current_symbol + GLONASS_L1_CA_CODE_PERIOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (d_flag_frame_sync == true and d_nav.flag_TOW_set==true and d_nav.flag_CRC_test == true)
|
// if (d_flag_frame_sync == true and d_nav.flag_TOW_set==true and d_nav.flag_CRC_test == true)
|
||||||
|
|
||||||
// if(d_nav.flag_GGTO_1 == true and d_nav.flag_GGTO_2 == true and d_nav.flag_GGTO_3 == true and d_nav.flag_GGTO_4 == true) //all GGTO parameters arrived
|
// if(d_nav.flag_GGTO_1 == true and d_nav.flag_GGTO_2 == true and d_nav.flag_GGTO_3 == true and d_nav.flag_GGTO_4 == true) // all GGTO parameters arrived
|
||||||
// {
|
// {
|
||||||
// delta_t = d_nav.A_0G_10 + d_nav.A_1G_10 * (d_TOW_at_current_symbol - d_nav.t_0G_10 + 604800.0 * (fmod((d_nav.WN_0 - d_nav.WN_0G_10), 64)));
|
// delta_t = d_nav.A_0G_10 + d_nav.A_1G_10 * (d_TOW_at_current_symbol - d_nav.t_0G_10 + 604800.0 * (fmod((d_nav.WN_0 - d_nav.WN_0G_10), 64)));
|
||||||
// }
|
// }
|
||||||
@ -414,8 +414,8 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
|
|
||||||
current_symbol.PRN = this->d_satellite.get_PRN();
|
current_symbol.PRN = this->d_satellite.get_PRN();
|
||||||
current_symbol.TOW_at_current_symbol_ms = round(d_TOW_at_current_symbol * 1000.0);
|
current_symbol.TOW_at_current_symbol_ms = round(d_TOW_at_current_symbol * 1000.0);
|
||||||
//todo: glonass time to gps time should be done in observables block
|
// todo: glonass time to gps time should be done in observables block
|
||||||
//current_symbol.TOW_at_current_symbol_s -= delta_t; // Galileo to GPS TOW
|
// current_symbol.TOW_at_current_symbol_ms -= -= static_cast<unsigned int>(delta_t) * 1000; // Galileo to GPS TOW
|
||||||
|
|
||||||
if (d_dump == true)
|
if (d_dump == true)
|
||||||
{
|
{
|
||||||
@ -442,7 +442,7 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
{
|
{
|
||||||
d_symbol_history.pop_front();
|
d_symbol_history.pop_front();
|
||||||
}
|
}
|
||||||
//3. Make the output (copy the object contents to the GNURadio reserved memory)
|
// 3. Make the output (copy the object contents to the GNURadio reserved memory)
|
||||||
*out[0] = current_symbol;
|
*out[0] = current_symbol;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -61,7 +61,7 @@ glonass_l2_ca_telemetry_decoder_cc::glonass_l2_ca_telemetry_decoder_cc(
|
|||||||
d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
|
d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
|
||||||
LOG(INFO) << "Initializing GLONASS L2 CA TELEMETRY DECODING";
|
LOG(INFO) << "Initializing GLONASS L2 CA TELEMETRY DECODING";
|
||||||
// Define the number of sampes per symbol. Notice that GLONASS has 2 rates,
|
// Define the number of sampes per symbol. Notice that GLONASS has 2 rates,
|
||||||
//one for the navigation data and the other for the preamble information
|
// one for the navigation data and the other for the preamble information
|
||||||
d_samples_per_symbol = (GLONASS_L2_CA_CODE_RATE_HZ / GLONASS_L2_CA_CODE_LENGTH_CHIPS) / GLONASS_L2_CA_SYMBOL_RATE_BPS;
|
d_samples_per_symbol = (GLONASS_L2_CA_CODE_RATE_HZ / GLONASS_L2_CA_CODE_LENGTH_CHIPS) / GLONASS_L2_CA_SYMBOL_RATE_BPS;
|
||||||
|
|
||||||
// Set the preamble information
|
// Set the preamble information
|
||||||
@ -268,11 +268,11 @@ int glonass_l2_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
Gnss_Synchro **out = reinterpret_cast<Gnss_Synchro **>(&output_items[0]); // Get the output buffer pointer
|
Gnss_Synchro **out = reinterpret_cast<Gnss_Synchro **>(&output_items[0]); // Get the output buffer pointer
|
||||||
const Gnss_Synchro **in = reinterpret_cast<const Gnss_Synchro **>(&input_items[0]); // Get the input buffer pointer
|
const Gnss_Synchro **in = reinterpret_cast<const Gnss_Synchro **>(&input_items[0]); // Get the input buffer pointer
|
||||||
|
|
||||||
Gnss_Synchro current_symbol; //structure to save the synchronization information and send the output object to the next block
|
Gnss_Synchro current_symbol; // structure to save the synchronization information and send the output object to the next block
|
||||||
//1. Copy the current tracking output
|
// 1. Copy the current tracking output
|
||||||
current_symbol = in[0][0];
|
current_symbol = in[0][0];
|
||||||
d_symbol_history.push_back(current_symbol); //add new symbol to the symbol queue
|
d_symbol_history.push_back(current_symbol); // add new symbol to the symbol queue
|
||||||
d_sample_counter++; //count for the processed samples
|
d_sample_counter++; // count for the processed samples
|
||||||
consume_each(1);
|
consume_each(1);
|
||||||
|
|
||||||
d_flag_preamble = false;
|
d_flag_preamble = false;
|
||||||
@ -280,7 +280,7 @@ int glonass_l2_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
|
|
||||||
if (d_symbol_history.size() > required_symbols)
|
if (d_symbol_history.size() > required_symbols)
|
||||||
{
|
{
|
||||||
//******* preamble correlation ********
|
// ******* preamble correlation ********
|
||||||
for (int i = 0; i < d_symbols_per_preamble; i++)
|
for (int i = 0; i < d_symbols_per_preamble; i++)
|
||||||
{
|
{
|
||||||
if (d_symbol_history.at(i).Prompt_I < 0) // symbols clipping
|
if (d_symbol_history.at(i).Prompt_I < 0) // symbols clipping
|
||||||
@ -294,8 +294,8 @@ int glonass_l2_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//******* frame sync ******************
|
// ******* frame sync ******************
|
||||||
if (d_stat == 0) //no preamble information
|
if (d_stat == 0) // no preamble information
|
||||||
{
|
{
|
||||||
if (abs(corr_value) >= d_symbols_per_preamble)
|
if (abs(corr_value) >= d_symbols_per_preamble)
|
||||||
{
|
{
|
||||||
@ -311,15 +311,15 @@ int glonass_l2_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
{
|
{
|
||||||
if (abs(corr_value) >= d_symbols_per_preamble)
|
if (abs(corr_value) >= d_symbols_per_preamble)
|
||||||
{
|
{
|
||||||
//check preamble separation
|
// check preamble separation
|
||||||
preamble_diff = d_sample_counter - d_preamble_index;
|
preamble_diff = d_sample_counter - d_preamble_index;
|
||||||
// Record the PRN start sample index associated to the preamble
|
// Record the PRN start sample index associated to the preamble
|
||||||
d_preamble_time_samples = d_symbol_history.at(0).Tracking_sample_counter;
|
d_preamble_time_samples = d_symbol_history.at(0).Tracking_sample_counter;
|
||||||
if (abs(preamble_diff - GLONASS_GNAV_PREAMBLE_PERIOD_SYMBOLS) == 0)
|
if (abs(preamble_diff - GLONASS_GNAV_PREAMBLE_PERIOD_SYMBOLS) == 0)
|
||||||
{
|
{
|
||||||
//try to decode frame
|
// try to decode frame
|
||||||
LOG(INFO) << "Starting string decoder for GLONASS L2 C/A SAT " << this->d_satellite;
|
LOG(INFO) << "Starting string decoder for GLONASS L2 C/A SAT " << this->d_satellite;
|
||||||
d_preamble_index = d_sample_counter; //record the preamble sample stamp
|
d_preamble_index = d_sample_counter; // record the preamble sample stamp
|
||||||
d_stat = 2;
|
d_stat = 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -342,7 +342,7 @@ int glonass_l2_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
int string_length = GLONASS_GNAV_STRING_SYMBOLS - d_symbols_per_preamble;
|
int string_length = GLONASS_GNAV_STRING_SYMBOLS - d_symbols_per_preamble;
|
||||||
double string_symbols[GLONASS_GNAV_DATA_SYMBOLS] = {0};
|
double string_symbols[GLONASS_GNAV_DATA_SYMBOLS] = {0};
|
||||||
|
|
||||||
//******* SYMBOL TO BIT *******
|
// ******* SYMBOL TO BIT *******
|
||||||
for (int i = 0; i < string_length; i++)
|
for (int i = 0; i < string_length; i++)
|
||||||
{
|
{
|
||||||
if (corr_value > 0)
|
if (corr_value > 0)
|
||||||
@ -355,13 +355,13 @@ int glonass_l2_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//call the decoder
|
// call the decoder
|
||||||
decode_string(string_symbols, string_length);
|
decode_string(string_symbols, string_length);
|
||||||
if (d_nav.flag_CRC_test == true)
|
if (d_nav.flag_CRC_test == true)
|
||||||
{
|
{
|
||||||
d_CRC_error_counter = 0;
|
d_CRC_error_counter = 0;
|
||||||
d_flag_preamble = true; //valid preamble indicator (initialized to false every work())
|
d_flag_preamble = true; // valid preamble indicator (initialized to false every work())
|
||||||
d_preamble_index = d_sample_counter; //record the preamble sample stamp (t_P)
|
d_preamble_index = d_sample_counter; // record the preamble sample stamp (t_P)
|
||||||
if (!d_flag_frame_sync)
|
if (!d_flag_frame_sync)
|
||||||
{
|
{
|
||||||
d_flag_frame_sync = true;
|
d_flag_frame_sync = true;
|
||||||
@ -372,7 +372,7 @@ int glonass_l2_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
d_CRC_error_counter++;
|
d_CRC_error_counter++;
|
||||||
d_preamble_index = d_sample_counter; //record the preamble sample stamp
|
d_preamble_index = d_sample_counter; // record the preamble sample stamp
|
||||||
if (d_CRC_error_counter > CRC_ERROR_LIMIT)
|
if (d_CRC_error_counter > CRC_ERROR_LIMIT)
|
||||||
{
|
{
|
||||||
LOG(INFO) << "Lost of frame sync SAT " << this->d_satellite;
|
LOG(INFO) << "Lost of frame sync SAT " << this->d_satellite;
|
||||||
@ -384,21 +384,21 @@ int glonass_l2_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UPDATE GNSS SYNCHRO DATA
|
// UPDATE GNSS SYNCHRO DATA
|
||||||
//2. Add the telemetry decoder information
|
// 2. Add the telemetry decoder information
|
||||||
if (this->d_flag_preamble == true and d_nav.flag_TOW_new == true)
|
if (this->d_flag_preamble == true and d_nav.flag_TOW_new == true)
|
||||||
//update TOW at the preamble instant
|
// update TOW at the preamble instant
|
||||||
{
|
{
|
||||||
d_TOW_at_current_symbol = floor((d_nav.gnav_ephemeris.d_TOW - GLONASS_GNAV_PREAMBLE_DURATION_S) * 1000) / 1000;
|
d_TOW_at_current_symbol = floor((d_nav.gnav_ephemeris.d_TOW - GLONASS_GNAV_PREAMBLE_DURATION_S) * 1000) / 1000;
|
||||||
d_nav.flag_TOW_new = false;
|
d_nav.flag_TOW_new = false;
|
||||||
}
|
}
|
||||||
else //if there is not a new preamble, we define the TOW of the current symbol
|
else // if there is not a new preamble, we define the TOW of the current symbol
|
||||||
{
|
{
|
||||||
d_TOW_at_current_symbol = d_TOW_at_current_symbol + GLONASS_L2_CA_CODE_PERIOD;
|
d_TOW_at_current_symbol = d_TOW_at_current_symbol + GLONASS_L2_CA_CODE_PERIOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (d_flag_frame_sync == true and d_nav.flag_TOW_set==true and d_nav.flag_CRC_test == true)
|
// if (d_flag_frame_sync == true and d_nav.flag_TOW_set==true and d_nav.flag_CRC_test == true)
|
||||||
|
|
||||||
// if(d_nav.flag_GGTO_1 == true and d_nav.flag_GGTO_2 == true and d_nav.flag_GGTO_3 == true and d_nav.flag_GGTO_4 == true) //all GGTO parameters arrived
|
// if(d_nav.flag_GGTO_1 == true and d_nav.flag_GGTO_2 == true and d_nav.flag_GGTO_3 == true and d_nav.flag_GGTO_4 == true) // all GGTO parameters arrived
|
||||||
// {
|
// {
|
||||||
// delta_t = d_nav.A_0G_10 + d_nav.A_1G_10 * (d_TOW_at_current_symbol - d_nav.t_0G_10 + 604800.0 * (fmod((d_nav.WN_0 - d_nav.WN_0G_10), 64)));
|
// delta_t = d_nav.A_0G_10 + d_nav.A_1G_10 * (d_TOW_at_current_symbol - d_nav.t_0G_10 + 604800.0 * (fmod((d_nav.WN_0 - d_nav.WN_0G_10), 64)));
|
||||||
// }
|
// }
|
||||||
@ -414,8 +414,8 @@ int glonass_l2_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
|
|
||||||
current_symbol.PRN = this->d_satellite.get_PRN();
|
current_symbol.PRN = this->d_satellite.get_PRN();
|
||||||
current_symbol.TOW_at_current_symbol_ms = round(d_TOW_at_current_symbol * 1000.0);
|
current_symbol.TOW_at_current_symbol_ms = round(d_TOW_at_current_symbol * 1000.0);
|
||||||
//todo: glonass time to gps time should be done in observables block
|
// todo: glonass time to gps time should be done in observables block
|
||||||
//current_symbol.TOW_at_current_symbol_s -= delta_t;
|
// current_symbol.TOW_at_current_symbol_ms -= static_cast<unsigned int>(delta_t) * 1000;
|
||||||
|
|
||||||
if (d_dump == true)
|
if (d_dump == true)
|
||||||
{
|
{
|
||||||
@ -442,7 +442,7 @@ int glonass_l2_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu
|
|||||||
{
|
{
|
||||||
d_symbol_history.pop_front();
|
d_symbol_history.pop_front();
|
||||||
}
|
}
|
||||||
//3. Make the output (copy the object contents to the GNURadio reserved memory)
|
// 3. Make the output (copy the object contents to the GNURadio reserved memory)
|
||||||
*out[0] = current_symbol;
|
*out[0] = current_symbol;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -255,7 +255,6 @@ int StaticPositionSystemTest::configure_receiver()
|
|||||||
const float band1_error = 1.0;
|
const float band1_error = 1.0;
|
||||||
const float band2_error = 1.0;
|
const float band2_error = 1.0;
|
||||||
const int grid_density = 16;
|
const int grid_density = 16;
|
||||||
const int decimation_factor = 1;
|
|
||||||
|
|
||||||
const float zero = 0.0;
|
const float zero = 0.0;
|
||||||
const int number_of_channels = 8;
|
const int number_of_channels = 8;
|
||||||
|
@ -79,7 +79,7 @@ else
|
|||||||
% {
|
% {
|
||||||
% tmp_double = current_gnss_synchro[i].RX_time;
|
% tmp_double = current_gnss_synchro[i].RX_time;
|
||||||
% d_dump_file.write((char*)&tmp_double, sizeof(double));
|
% d_dump_file.write((char*)&tmp_double, sizeof(double));
|
||||||
% tmp_double = current_gnss_synchro[i].TOW_at_current_symbol_s;
|
% tmp_double = current_gnss_synchro[i].TOW_at_current_symbol_ms;
|
||||||
% d_dump_file.write((char*)&tmp_double, sizeof(double));
|
% d_dump_file.write((char*)&tmp_double, sizeof(double));
|
||||||
% tmp_double = current_gnss_synchro[i].Carrier_Doppler_hz;
|
% tmp_double = current_gnss_synchro[i].Carrier_Doppler_hz;
|
||||||
% d_dump_file.write((char*)&tmp_double, sizeof(double));
|
% d_dump_file.write((char*)&tmp_double, sizeof(double));
|
||||||
|
Loading…
Reference in New Issue
Block a user