[hamradio-commits] [gnss-sdr] 91/126: fixing order in MSM signal data
Carles Fernandez
carles_fernandez-guest at moszumanska.debian.org
Sat Dec 26 18:38:05 UTC 2015
This is an automated email from the git hooks/post-receive script.
carles_fernandez-guest pushed a commit to branch next
in repository gnss-sdr.
commit 49588742692e43842f51ec644e1231909dc2dd02
Author: Carles Fernandez <carles.fernandez at gmail.com>
Date: Sat Dec 5 11:27:15 2015 +0100
fixing order in MSM signal data
---
src/core/system_parameters/rtcm.cc | 43 ++++++----
src/tests/formats/rtcm_test.cc | 158 ++++++++++++++++++++++++++++++++++++-
2 files changed, 183 insertions(+), 18 deletions(-)
diff --git a/src/core/system_parameters/rtcm.cc b/src/core/system_parameters/rtcm.cc
index 31989a0..a088358 100644
--- a/src/core/system_parameters/rtcm.cc
+++ b/src/core/system_parameters/rtcm.cc
@@ -74,7 +74,7 @@ std::string Rtcm::add_CRC (const std::string& message_without_crc)
boost::dynamic_bitset<unsigned char> frame_bits(message_without_crc);
std::vector<unsigned char> bytes;
boost::to_block_range(frame_bits, std::back_inserter(bytes));
- std::reverse(bytes.begin(),bytes.end());
+ std::reverse(bytes.begin(), bytes.end());
// 2) Computes CRC
CRC_RTCM.process_bytes(bytes.data(), bytes.size());
@@ -99,7 +99,7 @@ bool Rtcm::check_CRC(const std::string & message)
boost::dynamic_bitset<unsigned char> frame_bits(msg_without_crc);
std::vector<unsigned char> bytes;
boost::to_block_range(frame_bits, std::back_inserter(bytes));
- std::reverse(bytes.begin(),bytes.end());
+ std::reverse(bytes.begin(), bytes.end());
CRC_RTCM_CHECK.process_bytes(bytes.data(), bytes.size());
std::bitset<24> computed_crc = std::bitset<24>(CRC_RTCM_CHECK.checksum());
@@ -1144,18 +1144,18 @@ std::string Rtcm::get_MSM_1_content_signal_data(const std::map<int, Gnss_Synchro
unsigned int Ncells = pseudoranges.size();
std::vector<std::pair<int, Gnss_Synchro> > pseudoranges_vector;
- std::map<int, Gnss_Synchro>::const_iterator gnss_synchro_iter;
+ std::map<int, Gnss_Synchro>::const_iterator map_iter;
- for(gnss_synchro_iter = pseudoranges.begin();
- gnss_synchro_iter != pseudoranges.end();
- gnss_synchro_iter++)
+ for(map_iter = pseudoranges.begin();
+ map_iter != pseudoranges.end();
+ map_iter++)
{
- pseudoranges_vector.push_back(*gnss_synchro_iter);
+ pseudoranges_vector.push_back(*map_iter);
}
- std::vector<std::pair<int, Gnss_Synchro> > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(pseudoranges_vector);
-
- std::vector<std::pair<int, Gnss_Synchro> > ordered_by_signal = Rtcm::sort_by_signal(ordered_by_PRN_pos);
+ std::vector<std::pair<int, Gnss_Synchro> > ordered_by_signal = Rtcm::sort_by_signal(pseudoranges_vector);
+ std::reverse(ordered_by_signal.begin(), ordered_by_signal.end());
+ std::vector<std::pair<int, Gnss_Synchro> > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(ordered_by_signal);
for(unsigned int cell = 0; cell < Ncells ; cell++)
{
@@ -1944,6 +1944,7 @@ int Rtcm::set_DF292(const Galileo_Ephemeris & gal_eph)
return 0;
}
+
int Rtcm::set_DF293(const Galileo_Ephemeris & gal_eph)
{
@@ -2012,6 +2013,7 @@ int Rtcm::set_DF300(const Galileo_Ephemeris & gal_eph)
return 0;
}
+
int Rtcm::set_DF301(const Galileo_Ephemeris & gal_eph)
{
unsigned long int ecc = static_cast<unsigned long int>(std::round(gal_eph.e_1 / FNAV_e_2_LSB));
@@ -2410,7 +2412,6 @@ int Rtcm::set_DF399(const Gnss_Synchro & gnss_synchro)
{
lambda = GPS_C_m_s / GPS_L2_FREQ_HZ;
}
-
if (sig.compare("5X") == 0 )
{
lambda = GPS_C_m_s / Galileo_E5a_FREQ_HZ;
@@ -2419,6 +2420,10 @@ int Rtcm::set_DF399(const Gnss_Synchro & gnss_synchro)
{
lambda = GPS_C_m_s / Galileo_E1_FREQ_HZ;
}
+ if (sig.compare("7X") == 0 )
+ {
+ lambda = GPS_C_m_s / 1.207140e9; // Galileo_E1b_FREQ_HZ;
+ }
double rough_phase_range_ms = std::round(- gnss_synchro.Carrier_Doppler_hz / lambda);
DF399 = std::bitset<14>(static_cast<int>(rough_phase_range_ms));
@@ -2472,7 +2477,6 @@ int Rtcm::set_DF401(const Gnss_Synchro & gnss_synchro)
{
lambda = GPS_C_m_s / GPS_L2_FREQ_HZ;
}
-
if (sig.compare("5X") == 0 )
{
lambda = GPS_C_m_s / Galileo_E5a_FREQ_HZ;
@@ -2481,6 +2485,10 @@ int Rtcm::set_DF401(const Gnss_Synchro & gnss_synchro)
{
lambda = GPS_C_m_s / Galileo_E1_FREQ_HZ;
}
+ if (sig.compare("7X") == 0 )
+ {
+ lambda = GPS_C_m_s / 1.207140e9; // Galileo_E1b_FREQ_HZ;
+ }
phrng_m = (gnss_synchro.Carrier_phase_rads / GPS_TWO_PI ) * lambda - rough_range_m;
@@ -2526,7 +2534,6 @@ int Rtcm::set_DF404(const Gnss_Synchro & gnss_synchro)
{
lambda = GPS_C_m_s / GPS_L2_FREQ_HZ;
}
-
if (sig.compare("5X") == 0 )
{
lambda = GPS_C_m_s / Galileo_E5a_FREQ_HZ;
@@ -2535,6 +2542,10 @@ int Rtcm::set_DF404(const Gnss_Synchro & gnss_synchro)
{
lambda = GPS_C_m_s / Galileo_E1_FREQ_HZ;
}
+ if (sig.compare("7X") == 0 )
+ {
+ lambda = GPS_C_m_s / 1.207140e9; // Galileo_E1b_FREQ_HZ;
+ }
double phrr = std::round(- gnss_synchro.Carrier_Doppler_hz / lambda);
@@ -2601,7 +2612,6 @@ int Rtcm::set_DF406(const Gnss_Synchro & gnss_synchro)
{
lambda = GPS_C_m_s / GPS_L2_FREQ_HZ;
}
-
if (sig.compare("5X") == 0 )
{
lambda = GPS_C_m_s / Galileo_E5a_FREQ_HZ;
@@ -2610,6 +2620,11 @@ int Rtcm::set_DF406(const Gnss_Synchro & gnss_synchro)
{
lambda = GPS_C_m_s / Galileo_E1_FREQ_HZ;
}
+ if (sig.compare("7X") == 0 )
+ {
+ lambda = GPS_C_m_s / 1.207140e9; // Galileo_E1b_FREQ_HZ;
+ }
+
phrng_m = (gnss_synchro.Carrier_phase_rads / GPS_TWO_PI ) * lambda - rough_range_m;
if(phrng_m == 0.0)
{
diff --git a/src/tests/formats/rtcm_test.cc b/src/tests/formats/rtcm_test.cc
index 0639db1..d8d0fa2 100644
--- a/src/tests/formats/rtcm_test.cc
+++ b/src/tests/formats/rtcm_test.cc
@@ -269,6 +269,135 @@ TEST(Rtcm_Test, MT1001)
}
+TEST(Rtcm_Test, MSMCell)
+{
+ auto rtcm = std::make_shared<Rtcm>();
+ Gps_Ephemeris gps_eph = Gps_Ephemeris();
+ Galileo_Ephemeris gal_eph = Galileo_Ephemeris();
+ std::map<int, Gnss_Synchro> pseudoranges;
+
+ Gnss_Synchro gnss_synchro;
+ Gnss_Synchro gnss_synchro2;
+ Gnss_Synchro gnss_synchro3;
+ Gnss_Synchro gnss_synchro4;
+ Gnss_Synchro gnss_synchro5;
+
+ gnss_synchro.PRN = 4;
+ gnss_synchro2.PRN = 8;
+ gnss_synchro3.PRN = 32;
+ gnss_synchro4.PRN = 10;
+ gnss_synchro5.PRN = 10;
+
+ std::string gps = "G";
+ std::string gal = "E";
+
+ std::string c1 = "1C";
+ std::string s2 = "2S";
+ std::string x5 = "5X";
+
+ gnss_synchro.System = *gal.c_str();
+ gnss_synchro2.System = *gps.c_str();
+ gnss_synchro3.System = *gps.c_str();
+ gnss_synchro4.System = *gal.c_str();
+ gnss_synchro5.System = *gps.c_str();
+
+ std::memcpy((void*)gnss_synchro.Signal, x5.c_str(), 3);
+ std::memcpy((void*)gnss_synchro2.Signal, s2.c_str(), 3);
+ std::memcpy((void*)gnss_synchro3.Signal, c1.c_str(), 3);
+ std::memcpy((void*)gnss_synchro4.Signal, x5.c_str(), 3);
+ std::memcpy((void*)gnss_synchro5.Signal, c1.c_str(), 3);
+
+ gnss_synchro.Pseudorange_m = 20000000.0;
+ gnss_synchro2.Pseudorange_m = 20001010.0;
+ gnss_synchro3.Pseudorange_m = 24002020.0;
+ gnss_synchro4.Pseudorange_m = 20003010.1;
+ gnss_synchro5.Pseudorange_m = 22003010.1;
+
+ pseudoranges.insert(std::pair<int, Gnss_Synchro>(1, gnss_synchro));
+ pseudoranges.insert(std::pair<int, Gnss_Synchro>(2, gnss_synchro2));
+ pseudoranges.insert(std::pair<int, Gnss_Synchro>(3, gnss_synchro3));
+ pseudoranges.insert(std::pair<int, Gnss_Synchro>(4, gnss_synchro4));
+ pseudoranges.insert(std::pair<int, Gnss_Synchro>(5, gnss_synchro5));
+
+ unsigned int ref_id = 1234;
+ unsigned int clock_steering_indicator = 0;
+ unsigned int external_clock_indicator = 0;
+ int smooth_int = 0;
+ bool sync_flag = false;
+ bool divergence_free = false;
+ bool more_messages = false;
+ double obs_time = 25.0;
+
+ gps_eph.i_satellite_PRN = gnss_synchro.PRN;
+
+ std::string MSM1 = rtcm->print_MSM_1(gps_eph,
+ gal_eph,
+ obs_time,
+ pseudoranges,
+ ref_id,
+ clock_steering_indicator,
+ external_clock_indicator,
+ smooth_int,
+ sync_flag,
+ divergence_free,
+ more_messages);
+
+ std::string MSM1_bin = rtcm->hex_to_bin(MSM1);
+ unsigned int Nsat = 4;
+ unsigned int Nsig = 3;
+ unsigned int size_header = 14;
+ unsigned int size_msg_length = 10;
+ EXPECT_EQ(0, MSM1_bin.substr(size_header + size_msg_length + 169, Nsat * Nsig).compare("001010101100")); // check cell mask
+
+ std::map<int, Gnss_Synchro> pseudoranges2;
+ pseudoranges2.insert(std::pair<int, Gnss_Synchro>(1, gnss_synchro5));
+ pseudoranges2.insert(std::pair<int, Gnss_Synchro>(2, gnss_synchro4));
+ pseudoranges2.insert(std::pair<int, Gnss_Synchro>(3, gnss_synchro3));
+ pseudoranges2.insert(std::pair<int, Gnss_Synchro>(4, gnss_synchro2));
+ pseudoranges2.insert(std::pair<int, Gnss_Synchro>(5, gnss_synchro));
+ std::string MSM1_2 = rtcm->print_MSM_1(gps_eph,
+ gal_eph,
+ obs_time,
+ pseudoranges2,
+ ref_id,
+ clock_steering_indicator,
+ external_clock_indicator,
+ smooth_int,
+ sync_flag,
+ divergence_free,
+ more_messages);
+ std::string MSM1_bin_2 = rtcm->hex_to_bin(MSM1_2);
+ EXPECT_EQ(0, MSM1_bin_2.substr(size_header + size_msg_length + 169, Nsat * Nsig).compare("001010101100")); // check cell mask
+
+ Gnss_Synchro gnss_synchro6;
+ gnss_synchro6.PRN = 10;
+ gnss_synchro6.System = *gps.c_str();
+ std::memcpy((void*)gnss_synchro6.Signal, s2.c_str(), 3);
+ gnss_synchro6.Pseudorange_m = 24000000.0;
+
+ std::map<int, Gnss_Synchro> pseudoranges3;
+ pseudoranges3.insert(std::pair<int, Gnss_Synchro>(1, gnss_synchro));
+ pseudoranges3.insert(std::pair<int, Gnss_Synchro>(2, gnss_synchro2));
+ pseudoranges3.insert(std::pair<int, Gnss_Synchro>(3, gnss_synchro6));
+ pseudoranges3.insert(std::pair<int, Gnss_Synchro>(4, gnss_synchro4));
+ pseudoranges3.insert(std::pair<int, Gnss_Synchro>(5, gnss_synchro5));
+
+ std::string MSM1_3 = rtcm->print_MSM_1(gps_eph,
+ gal_eph,
+ obs_time,
+ pseudoranges3,
+ ref_id,
+ clock_steering_indicator,
+ external_clock_indicator,
+ smooth_int,
+ sync_flag,
+ divergence_free,
+ more_messages);
+ std::string MSM1_bin_3 = rtcm->hex_to_bin(MSM1_3);
+ EXPECT_EQ(0, MSM1_bin_3.substr(size_header + size_msg_length + 169, (Nsat-1) * Nsig).compare("001010111")); // check cell mask
+}
+
+
TEST(Rtcm_Test, MSM1)
{
auto rtcm = std::make_shared<Rtcm>();
@@ -353,16 +482,37 @@ TEST(Rtcm_Test, MSM1)
unsigned int rough_range_1 = static_cast<unsigned int>(std::floor(std::round(gnss_synchro.Pseudorange_m / meters_to_miliseconds / TWO_N10)) + 0.5) & 0x3FFu;
unsigned int rough_range_2 = static_cast<unsigned int>(std::floor(std::round(gnss_synchro2.Pseudorange_m / meters_to_miliseconds / TWO_N10)) + 0.5) & 0x3FFu;
unsigned int rough_range_4 = static_cast<unsigned int>(std::floor(std::round(gnss_synchro3.Pseudorange_m / meters_to_miliseconds / TWO_N10)) + 0.5) & 0x3FFu;
- unsigned int read_pseudorange_1 = rtcm->bin_to_uint( MSM1_bin.substr(size_header + size_msg_length + 169 + Nsat * Nsig , 10));
- unsigned int read_pseudorange_2 = rtcm->bin_to_uint( MSM1_bin.substr(size_header + size_msg_length + 169 + Nsat * Nsig + 10, 10));
- unsigned int read_pseudorange_4 = rtcm->bin_to_uint( MSM1_bin.substr(size_header + size_msg_length + 169 + Nsat * Nsig + 20, 10));
+ unsigned int read_pseudorange_1 = rtcm->bin_to_uint( MSM1_bin.substr(size_header + size_msg_length + 169 + Nsat * Nsig , 10));
+ unsigned int read_pseudorange_2 = rtcm->bin_to_uint( MSM1_bin.substr(size_header + size_msg_length + 169 + Nsat * Nsig + 10, 10));
+ unsigned int read_pseudorange_4 = rtcm->bin_to_uint( MSM1_bin.substr(size_header + size_msg_length + 169 + Nsat * Nsig + 20, 10));
EXPECT_EQ(rough_range_1, read_pseudorange_1);
EXPECT_EQ(rough_range_2, read_pseudorange_2);
EXPECT_EQ(rough_range_4, read_pseudorange_4);
int psrng4_s = static_cast<int>(std::round( (gnss_synchro3.Pseudorange_m - std::round(gnss_synchro3.Pseudorange_m / meters_to_miliseconds / TWO_N10) * meters_to_miliseconds * TWO_N10)/ meters_to_miliseconds / TWO_N24));
- int read_psrng4_s = rtcm->bin_to_int( MSM1_bin.substr(size_header + size_msg_length + 169 + (Nsat * Nsig) + 30 + 15 * 3, 15));
+ int read_psrng4_s = rtcm->bin_to_int( MSM1_bin.substr(size_header + size_msg_length + 169 + (Nsat * Nsig) + 30 + 15 * 3, 15));
EXPECT_EQ(psrng4_s, read_psrng4_s);
+
+
+ std::map<int, Gnss_Synchro> pseudoranges2;
+ pseudoranges2.insert(std::pair<int, Gnss_Synchro>(1, gnss_synchro4));
+ pseudoranges2.insert(std::pair<int, Gnss_Synchro>(2, gnss_synchro3));
+ pseudoranges2.insert(std::pair<int, Gnss_Synchro>(3, gnss_synchro2));
+ pseudoranges2.insert(std::pair<int, Gnss_Synchro>(4, gnss_synchro));
+ std::string MSM1_2 = rtcm->print_MSM_1(gps_eph,
+ gal_eph,
+ obs_time,
+ pseudoranges2,
+ ref_id,
+ clock_steering_indicator,
+ external_clock_indicator,
+ smooth_int,
+ sync_flag,
+ divergence_free,
+ more_messages);
+ std::string MSM1_bin2 = rtcm->hex_to_bin(MSM1_2);
+ int read_psrng4_s_2 = rtcm->bin_to_int( MSM1_bin2.substr(size_header + size_msg_length + 169 + (Nsat * Nsig) + 30 + 15 * 3, 15));
+ EXPECT_EQ(psrng4_s, read_psrng4_s_2);
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/gnss-sdr.git
More information about the pkg-hamradio-commits
mailing list