diff --git a/conf/gnss-sdr_GLONASS_L1_CA_ibyte.conf b/conf/gnss-sdr_GLONASS_L1_CA_ibyte.conf index af8929c2d..3b08957b4 100644 --- a/conf/gnss-sdr_GLONASS_L1_CA_ibyte.conf +++ b/conf/gnss-sdr_GLONASS_L1_CA_ibyte.conf @@ -5,7 +5,7 @@ GNSS-SDR.internal_fs_sps=6625000 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=File_Signal_Source -SignalSource.filename=/archive/NT1065_GLONASS_L1_20160831_fs6625e6_if0e3_schar_1m.bin ; <- PUT YOUR FILE HERE +SignalSource.filename=/archive/NT1065_GLONASS_L1_20160923_fs6625e6_if0e3_schar.bin ; <- PUT YOUR FILE HERE SignalSource.item_type=ibyte SignalSource.sampling_frequency=6625000 ;SignalSource.freq=0 @@ -25,20 +25,15 @@ Resampler.sample_freq_out=6625000 Resampler.item_type=gr_complex ;######### CHANNELS GLOBAL CONFIG ############ +Channel.signal=1G +Channels.in_acquisition=1 Channels_1G.count=5 -Channels.in_acquisition=5 -Channel0.signal=1G -Channel1.signal=1G -Channel2.signal=1G -Channel3.signal=1G -Channel4.signal=1G -Channel0.satellite=11 -Channel1.satellite=2 -Channel2.satellite=18 -Channel3.satellite=12 -Channel4.satellite=21 -; Possible list includes 2, 12, 21, 22 +Channel0.satellite=24 ; k= +Channel1.satellite=1 ; k=1 +Channel2.satellite=2 ; k=-4 +Channel3.satellite=20 ; k=-5 +Channel4.satellite=21 ; k=4 ;######### ACQUISITION GLOBAL CONFIG ############ Acquisition_1G.implementation=GLONASS_L1_CA_PCPS_Acquisition @@ -53,9 +48,9 @@ Acquisition_1G.dump_filename=/archive/glo_acquisition.dat ;Acquisition_1G.coherent_integration_time_ms=10 ;######### TRACKING GLOBAL CONFIG ############ -Tracking_1G.implementation=GLONASS_L1_CA_DLL_PLL_C_Aid_Tracking +Tracking_1G.implementation=GLONASS_L1_CA_DLL_PLL_Tracking Tracking_1G.item_type=gr_complex -Tracking_1G.if=1 +Tracking_1G.if=0 Tracking_1G.early_late_space_chips=0.5 Tracking_1G.pll_bw_hz=25.0; Tracking_1G.dll_bw_hz=3.0; @@ -63,10 +58,12 @@ Tracking_1G.dump=true; Tracking_1G.dump_filename=/archive/glo_tracking_ch_ ;######### TELEMETRY DECODER GPS CONFIG ############ -TelemetryDecoder_1G.implementation=GPS_L1_CA_Telemetry_Decoder +TelemetryDecoder_1G.implementation=GLONASS_L1_CA_Telemetry_Decoder ;######### OBSERVABLES CONFIG ############ Observables.implementation=Hybrid_Observables +Observables.dump=true; +Observables.dump_filename=/archive/glo_observables.dat ;######### PVT CONFIG ############ PVT.implementation=RTKLIB_PVT diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc index f5bf5e503..85e6bba5e 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc @@ -191,7 +191,8 @@ void rtklib_pvt_cc::msg_handler_telemetry(pmt::pmt_t msg) // insert new ephemeris record DLOG(INFO) << "GLONASS GNAV New Ephemeris record inserted in global map with TOW =" << glonass_gnav_eph->d_TOW << ", GLONASS GNAV Week Number =" << glonass_gnav_eph->d_WN - << " and Ephemeris IOD = " << glonass_gnav_eph->compute_GLONASS_time(glonass_gnav_eph->d_t_b); + << " and Ephemeris IOD = " << glonass_gnav_eph->compute_GLONASS_time(glonass_gnav_eph->d_t_b) + << " from SV = " << glonass_gnav_eph->i_satellite_slot_number; // update/insert new ephemeris record to the global ephemeris map d_ls_pvt->glonass_gnav_ephemeris_map[glonass_gnav_eph->i_satellite_PRN] = *glonass_gnav_eph; } @@ -209,7 +210,8 @@ void rtklib_pvt_cc::msg_handler_telemetry(pmt::pmt_t msg) std::shared_ptr glonass_gnav_almanac; glonass_gnav_almanac = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->glonass_gnav_almanac = *glonass_gnav_almanac; - DLOG(INFO) << "New GLONASS GNAV Almanac has arrived "; + DLOG(INFO) << "New GLONASS GNAV Almanac has arrived " + << ", GLONASS GNAV Slot Number =" << glonass_gnav_almanac->d_n_A; } else { diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_cc.cc index f80748f80..1e3f86622 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_cc.cc @@ -139,6 +139,8 @@ void glonass_l1_ca_telemetry_decoder_cc::decode_string(double *frame_symbols,int // 1. Transform from symbols to bits std::string bi_binary_code; std::string relative_code; + std::string data_bits; + // Group samples into bi-binary code for(int i = 0; i < (frame_length); i++) { @@ -173,9 +175,15 @@ void glonass_l1_ca_telemetry_decoder_cc::decode_string(double *frame_symbols,int relative_code.push_back('0'); } } + // Convert from relative code to data bits + data_bits.push_back('0'); + for(int i = 1; i < (GLONASS_GNAV_STRING_BITS); i++) + { + data_bits.push_back(((relative_code[i-1]-'0') ^ (relative_code[i]-'0')) + '0'); + } // 2. Call the GLONASS GNAV string decoder - d_nav.string_decoder(relative_code); + d_nav.string_decoder(data_bits); // 3. Check operation executed correctly if(d_nav.flag_CRC_test == true) @@ -186,13 +194,13 @@ void glonass_l1_ca_telemetry_decoder_cc::decode_string(double *frame_symbols,int { LOG(INFO) << "GLONASS GNAV CRC error on channel " << d_channel << " from satellite " << d_satellite; } - // 4. Push the new navigation data to the queues if (d_nav.have_new_ephemeris() == true) { // get object for this SV (mandatory) std::shared_ptr tmp_obj = std::make_shared(d_nav.get_ephemeris()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); + LOG(INFO) << "GLONASS GNAV Ephemeris have been received on channel" << d_channel << " from satellite " << d_satellite; } if (d_nav.have_new_utc_model() == true) @@ -200,12 +208,21 @@ void glonass_l1_ca_telemetry_decoder_cc::decode_string(double *frame_symbols,int // get object for this SV (mandatory) std::shared_ptr tmp_obj = std::make_shared(d_nav.get_utc_model()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); + LOG(INFO) << "GLONASS GNAV UTC Model have been received on channel" << d_channel << " from satellite " << d_satellite; } if (d_nav.have_new_almanac() == true) { - unsigned int slot_nbr = d_nav.get_ephemeris().i_satellite_slot_number; + unsigned int slot_nbr = d_nav.i_alm_satellite_slot_number; std::shared_ptr tmp_obj= std::make_shared(d_nav.get_almanac(slot_nbr)); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); + LOG(INFO) << "GLONASS GNAV Almanac have been received on channel" << d_channel << " in slot number " << slot_nbr; + } + // 5. Update satellite information on system + if(d_nav.flag_update_slot_number == true) + { + LOG(INFO) << "GLONASS GNAV Slot Number Identified on channel " << d_channel; + d_satellite.what_block(d_satellite.get_system(), d_nav.get_ephemeris().d_n); + d_nav.flag_update_slot_number = false; } } @@ -334,10 +351,11 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work (int noutput_items __attrib // UPDATE GNSS SYNCHRO DATA //2. Add the telemetry decoder information - if (this->d_flag_preamble == true and d_nav.flag_TOW_set == true) + if (this->d_flag_preamble == true and d_nav.flag_TOW_new == true) //update TOW at the preamble instant { - d_TOW_at_current_symbol = floor((d_nav.d_TOW + 2*GLONASS_L1_CA_CODE_PERIOD + GLONASS_GNAV_PREAMBLE_DURATION_S)*1000.0)/1000.0; + d_TOW_at_current_symbol = floor((d_nav.d_TOW - GLONASS_GNAV_PREAMBLE_DURATION_S)*1000.0)/1000.0; + d_nav.flag_TOW_new = false; } else //if there is not a new preamble, we define the TOW of the current symbol diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc index ac8e1bffe..3fa066e5f 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc @@ -58,7 +58,7 @@ /*! * \todo Include in definition header file */ -#define CN0_ESTIMATION_SAMPLES 20 +#define CN0_ESTIMATION_SAMPLES 10 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 50 #define CARRIER_LOCK_THRESHOLD 0.85 diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc index c4eff7003..147a5642c 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc @@ -59,7 +59,7 @@ /*! * \todo Include in definition header file */ -#define CN0_ESTIMATION_SAMPLES 20 +#define CN0_ESTIMATION_SAMPLES 10 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 50 #define CARRIER_LOCK_THRESHOLD 0.85 diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc index 0c1a0b724..a4e158ae8 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc @@ -56,7 +56,7 @@ /*! * \todo Include in definition header file */ -#define CN0_ESTIMATION_SAMPLES 20 +#define CN0_ESTIMATION_SAMPLES 10 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 50 #define CARRIER_LOCK_THRESHOLD 0.85 diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index c83bf1e92..388eb5dce 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -598,7 +598,7 @@ void GNSSFlowgraph::set_signals_list() 29, 30, 31, 32, 33, 34, 35, 36}; // Removing satellites sharing same frequency number(1 and 5, 2 and 6, 3 and 7, 4 and 6, 11 and 15, 12 and 16, 14 and 18, 17 and 21 - std::set available_glonass_prn = { 1, 2, 3, 4, 9, 10, 11, 12, 18, 19, 20, 21 }; + std::set available_glonass_prn = { 1, 2, 3, 4, 9, 10, 11, 12, 18, 19, 20, 21, 24 }; std::string sv_list = configuration_->property("Galileo.prns", std::string("") ); diff --git a/src/core/system_parameters/GLONASS_L1_CA.h b/src/core/system_parameters/GLONASS_L1_CA.h index ca71ccd08..83a768c93 100644 --- a/src/core/system_parameters/GLONASS_L1_CA.h +++ b/src/core/system_parameters/GLONASS_L1_CA.h @@ -87,6 +87,7 @@ const double GLONASS_L1_CA_CODE_LENGTH_CHIPS = 511.0; //!< GLONASS L1 C/ const double GLONASS_L1_CA_CODE_PERIOD = 0.001; //!< GLONASS L1 C/A code period [seconds] const double GLONASS_L1_CA_CHIP_PERIOD = 1.9569e-06; //!< GLONASS L1 C/A chip period [seconds] const double GLONASS_L1_CA_SYMBOL_RATE_BPS = 1000; +const int GLONASS_L1_CA_NBR_SATS = 24; // STRING DATA WITHOUT PREAMBLE //FIXME Probably should use leap seconds definitions of rtklib const double GLONASS_LEAP_SECONDS[21][7] = { /* leap seconds (y,m,d,h,m,s,utc-gpst) */ @@ -135,7 +136,7 @@ const std::map GLONASS_PRN = {17, 4,}, //Plane 3 {18,-3,}, //Plane 3 {19, 3,}, //Plane 3 - {20, 2,}, //Plane 3 + {20, -5,}, //Plane 3 {21, 4,}, //Plane 3 {22,-3,}, //Plane 3 {23, 3,}, //Plane 3 @@ -164,9 +165,9 @@ const int GLONASS_GNAV_DATA_SYMBOLS = 1700; // STRING DATA WITHOUT PREAMBLE const std::vector GLONASS_GNAV_CRC_I_INDEX {9, 10, 12, 13, 15, 17, 19, 20, 22, 24, 26, 28, 30, 32, 34, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84}; const std::vector GLONASS_GNAV_CRC_J_INDEX {9, 11, 12, 14, 15, 18, 19, 21, 22, 25, 26, 29, 30, 33, 34, 36, 37, 40, 41, 44, 45, 48, 49, 52, 53, 56, 57, 60, 61, 64, 65, 67, 68, 71, 72, 75, 76, 79, 80, 83, 84}; const std::vector GLONASS_GNAV_CRC_K_INDEX {10, 11, 12, 16, 17, 18, 19, 23, 24, 25, 26, 31, 32, 33, 34, 38, 39, 40, 41, 46, 47, 48, 49, 54, 55, 56, 57, 62, 63, 64, 65, 69, 70, 71, 72, 77, 78, 79, 80, 85}; -const std::vector GLONASS_GNAV_CRC_L_INDEX {9, 11, 12, 14, 15, 18, 19, 21, 22, 25, 26, 29, 30, 33, 34, 36, 37, 40, 41, 44, 45, 48, 49, 52, 53, 56, 57, 60, 61, 64, 65, 67, 68, 71, 72, 75, 76, 79, 80, 83, 84}; +const std::vector GLONASS_GNAV_CRC_L_INDEX {13, 14, 15, 16, 17, 18, 19, 27, 28, 29, 30, 31, 32, 33, 34, 42, 43, 44, 45, 46, 47, 48, 49, 58, 59, 60, 61, 62, 63, 64, 65, 73, 74, 75, 76, 77, 78, 79, 80}; const std::vector GLONASS_GNAV_CRC_M_INDEX {20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 81, 82, 83, 84, 85}; -const std::vector GLONASS_GNAV_CRC_N_INDEX {35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85}; +const std::vector GLONASS_GNAV_CRC_N_INDEX {35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65}; const std::vector GLONASS_GNAV_CRC_P_INDEX {66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85}; const std::vector GLONASS_GNAV_CRC_Q_INDEX {9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85}; diff --git a/src/core/system_parameters/glonass_gnav_almanac.cc b/src/core/system_parameters/glonass_gnav_almanac.cc index 049d3a4c0..3b5ca7014 100644 --- a/src/core/system_parameters/glonass_gnav_almanac.cc +++ b/src/core/system_parameters/glonass_gnav_almanac.cc @@ -54,124 +54,5 @@ Glonass_Gnav_Almanac::Glonass_Gnav_Almanac() d_tau_n_A = 0.0; d_C_n = false; d_l_n = false; -} - -void Glonass_Gnav_Almanac::satellite_position(double N_A, double N_i, double t_i) -{ - double T_nom = 43200; // [seconds] - double i_nom = D2R*63.0; // [rad] - - double Delta_t = 0.0; - double i = 0.0; - double T = 0.0; - double n = 0.0; - double a = 0.0; - double lambda_dot = 0.0; - double omega_dot = 0.0; - double lambda = 0.0; - double omega = 0.0; - double E_P = 0.0; - double Delta_T = 0.0; - double M = 0.0; - double E = 0.0; - double E_old = 0.0; - double dE = 0.0; - - double e1_x = 0.0; - double e1_y = 0.0; - double e1_z = 0.0; - - double e2_x = 0.0; - double e2_y = 0.0; - double e2_z = 0.0; - // Compute time difference to reference time - Delta_t = (N_i - N_A) * 86400 + (t_i + d_t_lambda_n_A); - - // Compute the actual inclination - i = i_nom + d_Delta_i_n_A; - - // Compute the actual orbital period: - T = T_nom + d_Delta_T_n_A; - - // Compute the mean motion - n = 2*GLONASS_PI/T; - - // Compute the semi-major axis: - a = cbrt(GLONASS_GM/(n*n)); - - // Compute correction to longitude of ascending node - lambda_dot = -10*pow(GLONASS_SEMI_MAJOR_AXIS / a, 7/2)*D2R*cos(i)/86400; - - // Compute correction to argument of perigee - omega_dot = 5*pow(GLONASS_SEMI_MAJOR_AXIS / a, 7/2)*D2R*(5*cos(i)*cos(i) - 1)/86400; - - // Compute corrected longitude of ascending node: - lambda = d_lambda_n_A + (lambda_dot - GLONASS_OMEGA_EARTH_DOT)*Delta_t; - - // Compute corrected argument of perigee: - omega = d_omega_n_A + omega_dot*Delta_t; - - // Compute eccentric anomaly at point P: Note: P is that point of the orbit the true anomaly of which is identical to the argument of perigee. - E_P = 2*atan(tan((omega/2)*(sqrt((1 - d_epsilon_n_A)*(1 + d_epsilon_n_A))))); - - // Compute time difference to perigee passing - if (omega < GLONASS_PI) - { - Delta_T = (E_P - d_epsilon_n_A*sin(E_P))/n; - } - else - { - Delta_T = (E_P - d_epsilon_n_A*sin(E_P))/n + T; - } - - // Compute mean anomaly at epoch t_i: - M = n * (Delta_t - Delta_T); - - // Compute eccentric anomaly at epoch t_i. Note: Kepler’s equation has to be solved iteratively - - // Initial guess of eccentric anomaly - E = M; - - // --- Iteratively compute eccentric anomaly ---------------------------- - for (int ii = 1; ii < 20; ii++) - { - E_old = E; - E = M + d_epsilon_n_A * sin(E); - dE = fmod(E - E_old, 2.0 * GLONASS_PI); - if (fabs(dE) < 1e-12) - { - //Necessary precision is reached, exit from the loop - break; - } - } - - // Compute position in orbital coordinate system - d_satpos_Xo = a*cos(E) - d_epsilon_n_A; - d_satpos_Yo = a*sqrt(1 - d_epsilon_n_A*d_epsilon_n_A)*sin(E); - d_satpos_Zo = a*0; - - // Compute velocity in orbital coordinate system - d_satvel_Xo = a/(1-d_epsilon_n_A*cos(E))*(-n*sin(E)); - d_satvel_Yo = a/(1-d_epsilon_n_A*cos(E))*(n*sqrt(1 - d_epsilon_n_A*d_epsilon_n_A)*cos(E)); - d_satvel_Zo = a/(1-d_epsilon_n_A*cos(E))*(0); - - // Determine orientation vectors of orbital coordinate system in ECEF system - e1_x = cos(omega)*cos(lambda) - sin(omega)*sin(lambda); - e1_y = cos(omega)*sin(lambda) + sin(omega)*cos(lambda)*cos(i); - e1_z = sin(omega)*sin(i); - - e2_x = -sin(omega)*cos(lambda) - sin(omega)*sin(lambda)*cos(i); - e2_y = -sin(omega)*sin(lambda) + cos(omega)*cos(lambda)*cos(i); - e2_z = cos(omega)*sin(i); - - // Convert position from orbital to ECEF system - d_satpos_X = d_satpos_Xo*e1_x + d_satpos_Xo*e2_x; - d_satpos_Y = d_satpos_Yo*e1_z + d_satpos_Yo*e2_y; - d_satpos_Z = d_satpos_Zo*e1_z + d_satpos_Zo*e2_z; - - // Convert position from orbital to ECEF system - d_satvel_X = d_satvel_Xo*e1_x + d_satvel_Xo*e2_x + GLONASS_OMEGA_EARTH_DOT*d_satpos_Y; - d_satvel_Y = d_satvel_Yo*e1_z + d_satvel_Yo*e2_y - GLONASS_OMEGA_EARTH_DOT*d_satpos_X; - d_satvel_Z = d_satvel_Zo*e1_z + d_satvel_Zo*e2_z; } diff --git a/src/core/system_parameters/glonass_gnav_almanac.h b/src/core/system_parameters/glonass_gnav_almanac.h index 3012708dd..3fc255118 100644 --- a/src/core/system_parameters/glonass_gnav_almanac.h +++ b/src/core/system_parameters/glonass_gnav_almanac.h @@ -49,13 +49,13 @@ class Glonass_Gnav_Almanac public: double d_n_A; //!< Conventional number of satellite within GLONASS space segment [dimensionless] double d_H_n_A; //!< Carrier frequency number of navigation RF signal transmitted by d_nA satellite as table 4.10 (0-31) [dimensionless] - double d_lambda_n_A; //!< Longitude of the first (within the d_NA day) ascending node of d_nA [semi-circles] + double d_lambda_n_A; //!< Longitude of the first (within the d_NA day) ascending node of d_nA [radians] double d_t_lambda_n_A; //!< Time of first ascending node passage [s] - double d_Delta_i_n_A; //!< Correction of the mean value of inclination of d_n_A satellite at instant t_lambda_n_A [semi-circles] - double d_Delta_T_n_A; //!< Correction to the mean value of Draconian period of d_n_A satellite at instant t_lambda_n_A[s / orbital period] + double d_Delta_i_n_A; //!< Correction of the mean value of inclination of d_n_A satellite at instant t_lambda_n_A [radians] + double d_Delta_T_n_A; //!< Correction to the mean value of Draconian period of d_n_A satellite at instant t_lambda_n_A [s / orbital period] double d_Delta_T_n_A_dot; //!< Rate of change of Draconian period of d_n_A satellite at instant t_lambda_n_A [s / orbital period^2] double d_epsilon_n_A; //!< Eccentricity of d_n_A satellite at instant t_lambda_n_A [dimensionless] - double d_omega_n_A; //!< Argument of preigree of d_n_A satellite at instant t_lambdan_A [semi-circles] + double d_omega_n_A; //!< Argument of perigee of d_n_A satellite at instant t_lambdan_A [radians] 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] @@ -67,24 +67,6 @@ public: 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 - // satellite positions - double d_satpos_Xo; //!< Earth-fixed coordinate x of the satellite in PZ-90.02 coordinate system [km]. - double d_satpos_Yo; //!< Earth-fixed coordinate y of the satellite in PZ-90.02 coordinate system [km] - double d_satpos_Zo; //!< Earth-fixed coordinate z of the satellite in PZ-90.02 coordinate system [km] - // Satellite velocity - double d_satvel_Xo; //!< Earth-fixed velocity coordinate x of the satellite in PZ-90.02 coordinate system [km/s] - double d_satvel_Yo; //!< Earth-fixed velocity coordinate y of the satellite in PZ-90.02 coordinate system [km/s] - double d_satvel_Zo; //!< Earth-fixed velocity coordinate z of the satellite in PZ-90.02 coordinate system [km/s] - - // satellite positions - double d_satpos_X; //!< Earth-fixed coordinate x of the satellite in PZ-90.02 coordinate system [km]. - double d_satpos_Y; //!< Earth-fixed coordinate y of the satellite in PZ-90.02 coordinate system [km] - double d_satpos_Z; //!< Earth-fixed coordinate z of the satellite in PZ-90.02 coordinate system [km] - // Satellite velocity - double d_satvel_X; //!< Earth-fixed velocity coordinate x of the satellite in PZ-90.02 coordinate system [km/s] - double d_satvel_Y; //!< Earth-fixed velocity coordinate y of the satellite in PZ-90.02 coordinate system [km/s] - double d_satvel_Z; //!< Earth-fixed velocity coordinate z of the satellite in PZ-90.02 coordinate system [km/s] - template /*! * \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the almanac data on disk file. @@ -113,7 +95,6 @@ public: archive & make_nvp("d_l_n", d_l_n); } - void satellite_position(double N_A, double N_i, double t_i); /*! * Default constructor */ diff --git a/src/core/system_parameters/glonass_gnav_navigation_message.cc b/src/core/system_parameters/glonass_gnav_navigation_message.cc index 7555324ef..1f3b5291d 100644 --- a/src/core/system_parameters/glonass_gnav_navigation_message.cc +++ b/src/core/system_parameters/glonass_gnav_navigation_message.cc @@ -43,9 +43,8 @@ void Glonass_Gnav_Navigation_Message::reset() { //!< Satellite Identification - i_channel_ID = 0; //!< Channel ID assigned by the receiver - i_satellite_freq_channel = 0; //!< SV Frequency Slot Number - i_satellite_slot_number = 0; //!< SV Orbit Slot Number + i_alm_satellite_slot_number = 0; //!< SV Orbit Slot Number + flag_update_slot_number = false; //!< Ephmeris Flags flag_all_ephemeris = false; @@ -74,12 +73,8 @@ void Glonass_Gnav_Navigation_Message::reset() //broadcast orbit 1 flag_TOW_set = false; + flag_TOW_new = false; d_TOW = 0.0; //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s] - d_TOW_F1 = 0.0; //!< Time of GPS Week from HOW word of Subframe 1 [s] - d_TOW_F2 = 0.0; //!< Time of GPS Week from HOW word of Subframe 2 [s] - d_TOW_F3 = 0.0; //!< Time of GPS Week from HOW word of Subframe 3 [s] - d_TOW_F4 = 0.0; //!< Time of GPS Week from HOW word of Subframe 4 [s] - d_TOW_F5 = 0.0; //!< Time of GPS Week from HOW word of Subframe 5 [s] flag_CRC_test = false; d_frame_ID = 0; @@ -90,6 +85,11 @@ void Glonass_Gnav_Navigation_Message::reset() d_dtr = 0.0; d_satClkDrift = 0.0; + // 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; + std::map satelliteBlock; //!< Map that stores to which block the PRN belongs http://www.navcen.uscg.gov/?Do=constellationStatus @@ -134,7 +134,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset(GLONASS_GNAV_CRC_I_INDEX.size()); i++) { - sum_bits += string_bits[GLONASS_GNAV_CRC_I_INDEX[i]]; + sum_bits += string_bits[GLONASS_GNAV_CRC_I_INDEX[i]-1]; } C1 = string_bits[0]^(sum_bits%2); @@ -142,7 +142,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset(GLONASS_GNAV_CRC_J_INDEX.size()); j++) { - sum_bits += string_bits[GLONASS_GNAV_CRC_J_INDEX[j]]; + sum_bits += string_bits[GLONASS_GNAV_CRC_J_INDEX[j]-1]; } C2 = (string_bits[1])^(sum_bits%2); @@ -150,7 +150,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset(GLONASS_GNAV_CRC_K_INDEX.size()); k++) { - sum_bits += string_bits[GLONASS_GNAV_CRC_K_INDEX[k]]; + sum_bits += string_bits[GLONASS_GNAV_CRC_K_INDEX[k]-1]; } C3 = string_bits[2]^(sum_bits%2); @@ -158,7 +158,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset(GLONASS_GNAV_CRC_L_INDEX.size()); l++) { - sum_bits += string_bits[GLONASS_GNAV_CRC_L_INDEX[l]]; + sum_bits += string_bits[GLONASS_GNAV_CRC_L_INDEX[l]-1]; } C4 = string_bits[3]^(sum_bits%2); @@ -166,7 +166,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset(GLONASS_GNAV_CRC_M_INDEX.size()); m++) { - sum_bits += string_bits[GLONASS_GNAV_CRC_M_INDEX[m]]; + sum_bits += string_bits[GLONASS_GNAV_CRC_M_INDEX[m]-1]; } C5 = string_bits[4]^(sum_bits%2); @@ -174,7 +174,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset(GLONASS_GNAV_CRC_N_INDEX.size()); n++) { - sum_bits += string_bits[GLONASS_GNAV_CRC_N_INDEX[n]]; + sum_bits += string_bits[GLONASS_GNAV_CRC_N_INDEX[n]-1]; } C6 = string_bits[5]^(sum_bits%2); @@ -182,7 +182,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset(GLONASS_GNAV_CRC_P_INDEX.size()); p++) { - sum_bits += string_bits[GLONASS_GNAV_CRC_P_INDEX[p]]; + sum_bits += string_bits[GLONASS_GNAV_CRC_P_INDEX[p]-1]; } C7 = string_bits[6]^(sum_bits%2); @@ -191,7 +191,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset(GLONASS_GNAV_CRC_Q_INDEX.size()); q++) { - sum_bits += string_bits[GLONASS_GNAV_CRC_Q_INDEX[q]]; + sum_bits += string_bits[GLONASS_GNAV_CRC_Q_INDEX[q]-1]; } for(int q = 0; q < 8; q++) { @@ -200,17 +200,18 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset((utc_date - gps_epoch).days()); + total_sec = days*86400; + + for (i = 0; GLONASS_LEAP_SECONDS[i][0]>0; i++) + { + if (GLONASS_LEAP_SECONDS[i][0] == gnav_ephemeris.d_yr) + { + // We add the leap second when going from utc to gpst + total_sec += GLONASS_LEAP_SECONDS[i][6]; + } + } + + + WN = floor(total_sec/604800); + + return WN; +} + double Glonass_Gnav_Navigation_Message::get_TOW() { + double TOD = 0.0; double TOW = 0.0; + double dayofweek = 0.0; double utcsu2utc = 3*3600; double glot2utcsu = 3*3600; int i = 0; - TOW = gnav_ephemeris.d_t_k + glot2utcsu + utcsu2utc + gnav_utc_model.d_tau_c + gnav_utc_model.d_tau_gps; + // 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 = (gnav_ephemeris.d_t_k + 10) - glot2utcsu - utcsu2utc + gnav_utc_model.d_tau_c + gnav_utc_model.d_tau_gps; + + + boost::gregorian::date glo_date(gnav_ephemeris.d_yr, 1, 1); + boost::gregorian::days d2(gnav_ephemeris.d_N_T); + glo_date = glo_date + d2; + + dayofweek = static_cast(glo_date.day_of_week()); + TOW = TOD + dayofweek*86400; for (i = 0; GLONASS_LEAP_SECONDS[i][0]>0; i++) { if (GLONASS_LEAP_SECONDS[i][0] == gnav_ephemeris.d_yr) { - TOW -= GLONASS_LEAP_SECONDS[i][6]; + // We add the leap second when going from utc to gpst + TOW += GLONASS_LEAP_SECONDS[i][6]; } } + // Compute the arithmetic modules to wrap around range + TOW = TOW - 604800*floor(TOW/604800); + return TOW; } @@ -341,21 +394,24 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string) d_string_ID = 0; d_frame_ID = 0; - // UNPACK BYTES TO BITS AND REMOVE THE CRC REDUNDANCE - std::bitset string_bits = std::bitset((frame_string)); - d_string_ID = static_cast(read_navigation_unsigned(string_bits, STRING_ID)); + // Unpack bytes to bits + std::bitset string_bits (frame_string); + // Perform data verification and exit code if error in bit sequence flag_CRC_test = CRC_test(string_bits); + if(flag_CRC_test == false) + return 0; + // Decode all 15 string messages - switch (d_string_ID) - { + d_string_ID = static_cast(read_navigation_unsigned(string_bits, STRING_ID)); + switch (d_string_ID) { case 1: //--- It is string 1 ----------------------------------------------- - gnav_ephemeris.d_P_1 = (static_cast(read_navigation_unsigned(string_bits, P1)) + 1)*15; - gnav_ephemeris.d_t_k = static_cast(read_navigation_unsigned(string_bits, T_K_HR)) * 3600 + - static_cast(read_navigation_unsigned(string_bits, T_K_MIN)) * 60 + - static_cast(read_navigation_unsigned(string_bits, T_K_SEC)) * 30; + gnav_ephemeris.d_P_1 = (static_cast(read_navigation_unsigned(string_bits, P1)) + 1) * 15; + gnav_ephemeris.d_t_k = static_cast(read_navigation_unsigned(string_bits, T_K_HR)) * 3600 + + static_cast(read_navigation_unsigned(string_bits, T_K_MIN)) * 60 + + static_cast(read_navigation_unsigned(string_bits, T_K_SEC)) * 30; gnav_ephemeris.d_VXn = static_cast(read_navigation_signed(string_bits, X_N_DOT)) * TWO_N20; gnav_ephemeris.d_AXn = static_cast(read_navigation_signed(string_bits, X_N_DOT_DOT)) * TWO_N30; gnav_ephemeris.d_Xn = static_cast(read_navigation_signed(string_bits, X_N)) * TWO_N11; @@ -370,12 +426,12 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string) { gnav_ephemeris.d_B_n = static_cast(read_navigation_unsigned(string_bits, B_N)); gnav_ephemeris.d_P_2 = static_cast(read_navigation_bool(string_bits, P2)); - gnav_ephemeris.d_t_b = static_cast(read_navigation_unsigned(string_bits, T_B))*gnav_ephemeris.d_P_1*60; - gnav_ephemeris.d_VYn = static_cast(read_navigation_signed(string_bits, Y_N_DOT))* TWO_N20; + gnav_ephemeris.d_t_b = static_cast(read_navigation_unsigned(string_bits, T_B)) * gnav_ephemeris.d_P_1 * 60; + gnav_ephemeris.d_VYn = static_cast(read_navigation_signed(string_bits, Y_N_DOT)) * TWO_N20; gnav_ephemeris.d_AYn = static_cast(read_navigation_signed(string_bits, Y_N_DOT_DOT)) * TWO_N30; gnav_ephemeris.d_Yn = static_cast(read_navigation_signed(string_bits, Y_N)) * TWO_N11; - gnav_ephemeris.d_iode = read_navigation_unsigned(string_bits, T_B); + gnav_ephemeris.d_iode = read_navigation_unsigned(string_bits, T_B); flag_ephemeris_str_2 = true; } @@ -383,92 +439,108 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string) case 3: // --- It is string 3 ---------------------------------------------- - gnav_ephemeris.d_P_3 = static_cast(read_navigation_bool(string_bits, P3)); - gnav_ephemeris.d_gamma_n = static_cast(read_navigation_signed(string_bits, GAMMA_N)) * TWO_N40; - gnav_ephemeris.d_P = static_cast(read_navigation_unsigned(string_bits, P)); - gnav_ephemeris.d_l3rd_n = static_cast(read_navigation_bool(string_bits, EPH_L_N)); - gnav_ephemeris.d_VZn = static_cast(read_navigation_signed(string_bits, Z_N_DOT)) * TWO_N20; - gnav_ephemeris.d_AZn = static_cast(read_navigation_signed(string_bits, Z_N_DOT_DOT)) * TWO_N30; - gnav_ephemeris.d_Zn = static_cast(read_navigation_signed(string_bits, Z_N)) * TWO_N11; + if (flag_ephemeris_str_2 == true) + { + gnav_ephemeris.d_P_3 = static_cast(read_navigation_bool(string_bits, P3)); + gnav_ephemeris.d_gamma_n = static_cast(read_navigation_signed(string_bits, GAMMA_N)) * TWO_N40; + gnav_ephemeris.d_P = static_cast(read_navigation_unsigned(string_bits, P)); + gnav_ephemeris.d_l3rd_n = static_cast(read_navigation_bool(string_bits, EPH_L_N)); + gnav_ephemeris.d_VZn = static_cast(read_navigation_signed(string_bits, Z_N_DOT)) * TWO_N20; + gnav_ephemeris.d_AZn = static_cast(read_navigation_signed(string_bits, Z_N_DOT_DOT)) * TWO_N30; + gnav_ephemeris.d_Zn = static_cast(read_navigation_signed(string_bits, Z_N)) * TWO_N11; - flag_ephemeris_str_3 = true; + flag_ephemeris_str_3 = true; + } break; case 4: // --- It is string 4 ---------------------------------------------- - gnav_ephemeris.d_tau_n = static_cast(read_navigation_signed(string_bits, TAU_N)) * TWO_N30; - gnav_ephemeris.d_Delta_tau_n = static_cast(read_navigation_signed(string_bits, DELTA_TAU_N)) * TWO_N30; - gnav_ephemeris.d_E_n = static_cast(read_navigation_unsigned(string_bits, E_N)); - gnav_ephemeris.d_P_4 = static_cast(read_navigation_bool(string_bits, P4)); - gnav_ephemeris.d_F_T = static_cast(read_navigation_unsigned(string_bits, F_T)); - gnav_ephemeris.d_N_T = static_cast(read_navigation_unsigned(string_bits, N_T)); - gnav_ephemeris.d_n = static_cast(read_navigation_unsigned(string_bits, N)); - gnav_ephemeris.d_M = static_cast(read_navigation_unsigned(string_bits, M)); + if (flag_ephemeris_str_3 == true) + { + gnav_ephemeris.d_tau_n = static_cast(read_navigation_signed(string_bits, TAU_N)) * TWO_N30; + gnav_ephemeris.d_Delta_tau_n = static_cast(read_navigation_signed(string_bits, DELTA_TAU_N)) * TWO_N30; + gnav_ephemeris.d_E_n = static_cast(read_navigation_unsigned(string_bits, E_N)); + gnav_ephemeris.d_P_4 = static_cast(read_navigation_bool(string_bits, P4)); + gnav_ephemeris.d_F_T = static_cast(read_navigation_unsigned(string_bits, F_T)); + gnav_ephemeris.d_N_T = static_cast(read_navigation_unsigned(string_bits, N_T)); + gnav_ephemeris.d_n = static_cast(read_navigation_unsigned(string_bits, N)); + gnav_ephemeris.d_M = static_cast(read_navigation_unsigned(string_bits, M)); - // Fill in ephemeris deliverables in the code - gnav_ephemeris.i_satellite_slot_number = gnav_ephemeris.d_n; - gnav_ephemeris.i_satellite_PRN = gnav_ephemeris.d_n; + // Fill in ephemeris deliverables in the code + flag_update_slot_number = true; + gnav_ephemeris.i_satellite_slot_number = static_cast(gnav_ephemeris.d_n); + gnav_ephemeris.i_satellite_PRN = static_cast(gnav_ephemeris.d_n); - flag_ephemeris_str_4 = true; + flag_ephemeris_str_4 = true; + } break; case 5: // --- It is string 5 ---------------------------------------------- - gnav_utc_model.d_N_A = static_cast(read_navigation_unsigned(string_bits, N_A)); - gnav_utc_model.d_tau_c = static_cast(read_navigation_signed(string_bits, TAU_C)) * TWO_N31; - gnav_utc_model.d_N_4 = static_cast(read_navigation_unsigned(string_bits, N_4)); - gnav_utc_model.d_tau_gps = static_cast(read_navigation_signed(string_bits, TAU_GPS)) * TWO_N30; - gnav_ephemeris.d_l5th_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); - - flag_utc_model_str_5 = true; - // Compute Year and DoY based on Algorithm A3.11 of GLONASS ICD - if(flag_ephemeris_str_4 == true) + if (flag_ephemeris_str_4 == true) { - //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; - } + gnav_utc_model.d_N_A = static_cast(read_navigation_unsigned(string_bits, N_A)); + gnav_utc_model.d_tau_c = static_cast(read_navigation_signed(string_bits, TAU_C)) * TWO_N31; + gnav_utc_model.d_N_4 = static_cast(read_navigation_unsigned(string_bits, N_4)); + gnav_utc_model.d_tau_gps = static_cast(read_navigation_signed(string_bits, TAU_GPS)) * TWO_N30; + gnav_ephemeris.d_l5th_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); + + 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; - } + { + 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_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) - { - d_TOW = get_TOW(); - flag_TOW_set = true; - } + if (flag_ephemeris_str_1 == true) + { + d_TOW = get_TOW(); + gnav_ephemeris.d_TOW = d_TOW; + gnav_ephemeris.d_WN = get_WN(); + flag_TOW_set = true; + flag_TOW_new = true; + } } + + break; case 6: // --- It is string 6 ---------------------------------------------- - i_satellite_slot_number = static_cast(read_navigation_unsigned(string_bits, n_A)); - d_frame_ID = get_frame_number(i_satellite_slot_number); + i_alm_satellite_slot_number = static_cast(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_satellite_slot_number - 1].d_C_n = static_cast(read_navigation_bool(string_bits, C_N)); - gnav_almanac[i_satellite_slot_number - 1].d_M_n_A = static_cast(read_navigation_unsigned(string_bits, M_N_A)); - gnav_almanac[i_satellite_slot_number - 1].d_n_A = static_cast(read_navigation_unsigned(string_bits, n_A)); - gnav_almanac[i_satellite_slot_number - 1].d_tau_n_A = static_cast(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18; - gnav_almanac[i_satellite_slot_number - 1].d_lambda_n_A = static_cast(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_i_n_A = static_cast(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20; - gnav_almanac[i_satellite_slot_number - 1].d_epsilon_n_A = static_cast(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20; + gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast(read_navigation_bool(string_bits, C_N)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast(read_navigation_unsigned(string_bits, M_N_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast(read_navigation_unsigned(string_bits, n_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18; + gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast(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(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(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20; flag_almanac_str_6 = true; @@ -477,43 +549,46 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string) case 7: // --- It is string 7 ---------------------------------------------- if (flag_almanac_str_6 == true) - { - gnav_almanac[i_satellite_slot_number - 1].d_omega_n_A = static_cast(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15; - gnav_almanac[i_satellite_slot_number - 1].d_t_lambda_n_A = static_cast(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A = static_cast(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14; - gnav_almanac[i_satellite_slot_number - 1].d_H_n_A = static_cast(read_navigation_unsigned(string_bits, H_N_A)); - gnav_almanac[i_satellite_slot_number - 1].d_l_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); + { + gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast(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(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(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(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(read_navigation_unsigned(string_bits, H_N_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); - // Set satellite information for redundancy purposes - if(gnav_almanac[i_satellite_slot_number - 1].d_H_n_A > 24) - { - gnav_almanac[i_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_satellite_slot_number - 1].d_H_n_A - 32.0; - } - gnav_almanac[i_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_satellite_slot_number - 1].d_n_A; - gnav_almanac[i_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_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_satellite_slot_number == gnav_ephemeris.i_satellite_slot_number) - { - gnav_ephemeris.i_satellite_freq_channel = gnav_almanac[i_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; case 8: // --- It is string 8 ---------------------------------------------- - i_satellite_slot_number = static_cast(read_navigation_unsigned(string_bits, n_A)); - d_frame_ID = get_frame_number(i_satellite_slot_number); + i_alm_satellite_slot_number = static_cast(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_satellite_slot_number - 1].d_C_n = static_cast(read_navigation_bool(string_bits, C_N)); - gnav_almanac[i_satellite_slot_number - 1].d_M_n_A = static_cast(read_navigation_unsigned(string_bits, M_N_A)); - gnav_almanac[i_satellite_slot_number - 1].d_n_A = static_cast(read_navigation_unsigned(string_bits, n_A)); - gnav_almanac[i_satellite_slot_number - 1].d_tau_n_A = static_cast(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18; - gnav_almanac[i_satellite_slot_number - 1].d_lambda_n_A = static_cast(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_i_n_A = static_cast(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20; - gnav_almanac[i_satellite_slot_number - 1].d_epsilon_n_A = static_cast(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20; + gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast(read_navigation_bool(string_bits, C_N)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast(read_navigation_unsigned(string_bits, M_N_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast(read_navigation_unsigned(string_bits, n_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18; + gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast(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(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(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20; flag_almanac_str_8 = true; @@ -521,38 +596,40 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string) case 9: // --- It is string 9 ---------------------------------------------- if (flag_almanac_str_8 == true) - { - // TODO signed vs unsigned reading from datasheet - gnav_almanac[i_satellite_slot_number - 1].d_omega_n_A = static_cast(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15; - gnav_almanac[i_satellite_slot_number - 1].d_t_lambda_n_A = static_cast(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A = static_cast(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14; - gnav_almanac[i_satellite_slot_number - 1].d_H_n_A = static_cast(read_navigation_unsigned(string_bits, H_N_A)) -32.0; - gnav_almanac[i_satellite_slot_number - 1].d_l_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); + { + gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast(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(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(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(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(read_navigation_unsigned(string_bits, H_N_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); - // Set satellite information for redundancy purposes - if(gnav_almanac[i_satellite_slot_number - 1].d_H_n_A > 24) - { - gnav_almanac[i_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_satellite_slot_number - 1].d_H_n_A - 32.0; - } - gnav_almanac[i_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_satellite_slot_number - 1].d_n_A; - gnav_almanac[i_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_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; - flag_almanac_str_9 = true; - } + flag_almanac_str_9 = true; + } break; case 10: // --- It is string 10 --------------------------------------------- - i_satellite_slot_number = static_cast(read_navigation_unsigned(string_bits, n_A)); - d_frame_ID = get_frame_number(i_satellite_slot_number); + i_alm_satellite_slot_number = static_cast(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_satellite_slot_number - 1].d_C_n = static_cast(read_navigation_bool(string_bits, C_N)); - gnav_almanac[i_satellite_slot_number - 1].d_M_n_A = static_cast(read_navigation_unsigned(string_bits, M_N_A)); - gnav_almanac[i_satellite_slot_number - 1].d_n_A = static_cast(read_navigation_unsigned(string_bits, n_A)); - gnav_almanac[i_satellite_slot_number - 1].d_tau_n_A = static_cast(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18; - gnav_almanac[i_satellite_slot_number - 1].d_lambda_n_A = static_cast(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_i_n_A = static_cast(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20; - gnav_almanac[i_satellite_slot_number - 1].d_epsilon_n_A = static_cast(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20; + gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast(read_navigation_bool(string_bits, C_N)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast(read_navigation_unsigned(string_bits, M_N_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast(read_navigation_unsigned(string_bits, n_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18; + gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast(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(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(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20; flag_almanac_str_10 = true; @@ -561,37 +638,39 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string) case 11: // --- It is string 11 --------------------------------------------- if (flag_almanac_str_10 == true) - { - gnav_almanac[i_satellite_slot_number - 1].d_omega_n_A = static_cast(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15; - gnav_almanac[i_satellite_slot_number - 1].d_t_lambda_n_A = static_cast(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A = static_cast(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14; - gnav_almanac[i_satellite_slot_number - 1].d_H_n_A = static_cast(read_navigation_unsigned(string_bits, H_N_A)) - 32.0; - gnav_almanac[i_satellite_slot_number - 1].d_l_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); + { + gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast(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(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(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(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(read_navigation_unsigned(string_bits, H_N_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); - // Set satellite information for redundancy purposes - if(gnav_almanac[i_satellite_slot_number - 1].d_H_n_A > 24) - { - gnav_almanac[i_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_satellite_slot_number - 1].d_H_n_A - 32.0; - } - gnav_almanac[i_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_satellite_slot_number - 1].d_n_A; - gnav_almanac[i_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_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; - flag_almanac_str_11 = true; - } + flag_almanac_str_11 = true; + } break; case 12: // --- It is string 12 --------------------------------------------- - i_satellite_slot_number = static_cast(read_navigation_unsigned(string_bits, n_A)); - d_frame_ID = get_frame_number(i_satellite_slot_number); - - gnav_almanac[i_satellite_slot_number - 1].d_C_n = static_cast(read_navigation_bool(string_bits, C_N)); - gnav_almanac[i_satellite_slot_number - 1].d_M_n_A = static_cast(read_navigation_unsigned(string_bits, M_N_A)); - gnav_almanac[i_satellite_slot_number - 1].d_n_A = static_cast(read_navigation_unsigned(string_bits, n_A)); - gnav_almanac[i_satellite_slot_number - 1].d_tau_n_A = static_cast(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18; - gnav_almanac[i_satellite_slot_number - 1].d_lambda_n_A = static_cast(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_i_n_A = static_cast(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20; - gnav_almanac[i_satellite_slot_number - 1].d_epsilon_n_A = static_cast(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20; + i_alm_satellite_slot_number = static_cast(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(read_navigation_bool(string_bits, C_N)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast(read_navigation_unsigned(string_bits, M_N_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast(read_navigation_unsigned(string_bits, n_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18; + gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast(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(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(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20; flag_almanac_str_12 = true; @@ -600,79 +679,80 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string) case 13: // --- It is string 13 --------------------------------------------- if (flag_almanac_str_12 == true) - { - gnav_almanac[i_satellite_slot_number - 1].d_omega_n_A = static_cast(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15; - gnav_almanac[i_satellite_slot_number - 1].d_t_lambda_n_A = static_cast(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A = static_cast(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14; - gnav_almanac[i_satellite_slot_number - 1].d_H_n_A = static_cast(read_navigation_unsigned(string_bits, H_N_A)) - 32.0; - gnav_almanac[i_satellite_slot_number - 1].d_l_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); + { + gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast(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(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(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(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(read_navigation_unsigned(string_bits, H_N_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); - // Set satellite information for redundancy purposes - if(gnav_almanac[i_satellite_slot_number - 1].d_H_n_A > 24) - { - gnav_almanac[i_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_satellite_slot_number - 1].d_H_n_A - 32.0; - } - gnav_almanac[i_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_satellite_slot_number - 1].d_n_A; - gnav_almanac[i_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_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; - flag_almanac_str_13 = 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(read_navigation_unsigned(string_bits, B1)); - gnav_utc_model.d_B2 = static_cast(read_navigation_unsigned(string_bits, B2)); - } + if (d_frame_ID == 5) + { + gnav_utc_model.d_B1 = static_cast(read_navigation_unsigned(string_bits, B1)); + gnav_utc_model.d_B2 = static_cast(read_navigation_unsigned(string_bits, B2)); + } else - { - i_satellite_slot_number = static_cast(read_navigation_unsigned(string_bits, n_A)); - d_frame_ID = get_frame_number(i_satellite_slot_number); - - gnav_almanac[i_satellite_slot_number - 1].d_C_n = static_cast(read_navigation_bool(string_bits, C_N)); - gnav_almanac[i_satellite_slot_number - 1].d_M_n_A = static_cast(read_navigation_unsigned(string_bits, M_N_A)); - gnav_almanac[i_satellite_slot_number - 1].d_n_A = static_cast(read_navigation_unsigned(string_bits, n_A)); - gnav_almanac[i_satellite_slot_number - 1].d_tau_n_A = static_cast(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18; - gnav_almanac[i_satellite_slot_number - 1].d_lambda_n_A = static_cast(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_i_n_A = static_cast(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20; - gnav_almanac[i_satellite_slot_number - 1].d_epsilon_n_A = static_cast(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20; - - flag_almanac_str_14 = true; - } - + { + i_alm_satellite_slot_number = static_cast(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(read_navigation_bool(string_bits, C_N)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast(read_navigation_unsigned(string_bits, M_N_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast(read_navigation_unsigned(string_bits, n_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18; + gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast(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(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(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20; + flag_almanac_str_14 = true; + } break; case 15: - // --- It is string 9 ---------------------------------------------- - if (d_frame_ID != 5 and flag_almanac_str_14 == true ) - { - gnav_almanac[i_satellite_slot_number - 1].d_omega_n_A = static_cast(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15; - gnav_almanac[i_satellite_slot_number - 1].d_t_lambda_n_A = static_cast(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A = static_cast(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9; - gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14; - gnav_almanac[i_satellite_slot_number - 1].d_H_n_A = static_cast(read_navigation_unsigned(string_bits, H_N_A)) - 32.0; - gnav_almanac[i_satellite_slot_number - 1].d_l_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); + // --- 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(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(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(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(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(read_navigation_unsigned(string_bits, H_N_A)); + gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast(read_navigation_bool(string_bits, ALM_L_N)); // Set satellite information for redundancy purposes - if(gnav_almanac[i_satellite_slot_number - 1].d_H_n_A > 24) + if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24) { - gnav_almanac[i_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_satellite_slot_number - 1].d_H_n_A - 32.0; + 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_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_satellite_slot_number - 1].d_n_A; - gnav_almanac[i_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_satellite_slot_number - 1].d_n_A; + 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_15 = true; - } + } break; default: - LOG(INFO) << "GLONASS GNAV: Invalid String ID of received. Received " << d_string_ID << ", but acceptable range is from 1-15"; + LOG(INFO) << "GLONASS GNAV: Invalid String ID of received. Received " << d_string_ID + << ", but acceptable range is from 1-15"; break; - } // switch string ID ... + } // switch string ID ... + return d_string_ID; } @@ -707,26 +787,29 @@ Glonass_Gnav_Almanac Glonass_Gnav_Navigation_Message::get_almanac(unsigned int s bool Glonass_Gnav_Navigation_Message::have_new_ephemeris() //Check if we have a new ephemeris stored in the galileo navigation class { - if ((flag_ephemeris_str_1 == true) and (flag_ephemeris_str_2 == true) and (flag_ephemeris_str_3 == true) and (flag_ephemeris_str_4 == true)) + 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)) { - if (gnav_ephemeris.d_P_4 == 1) + if(d_previous_tb != gnav_ephemeris.d_t_b) { flag_ephemeris_str_1 = false;// clear the flag flag_ephemeris_str_2 = false;// clear the flag flag_ephemeris_str_3 = false;// clear the flag flag_ephemeris_str_4 = false;// clear the flag flag_all_ephemeris = true; - DLOG(INFO) << "Ephemeris (1, 2, 3, 4) have been received and belong to the same batch" << std::endl; + // Update the time of ephemeris information + d_previous_tb = gnav_ephemeris.d_t_b; + DLOG(INFO) << "GLONASS GNAV Ephemeris (1, 2, 3, 4) have been received and belong to the same batch" << std::endl; + new_eph = true; + } - return true; - } - else - { - return false; - } } - else - return false; + + + return new_eph; } @@ -744,26 +827,54 @@ bool Glonass_Gnav_Navigation_Message::have_new_utc_model() // Check if we have a bool Glonass_Gnav_Navigation_Message::have_new_almanac() //Check if we have a new almanac data set stored in the galileo navigation class { - if ((flag_almanac_str_6 == true) and (flag_almanac_str_7 == true) and - (flag_almanac_str_8 == true) and (flag_almanac_str_9 == true) and - (flag_almanac_str_10 == true) and (flag_almanac_str_11 == true) and - (flag_almanac_str_12 == true) and (flag_almanac_str_13 == true) and - (flag_almanac_str_14 == true) and (flag_almanac_str_15 == true)) + bool new_alm = false; + if ((flag_almanac_str_6 == true) and (flag_almanac_str_7 == true)) { - //All almanac have been received - flag_almanac_str_6 = false; - flag_almanac_str_7 = false; - flag_almanac_str_8 = false; - flag_almanac_str_9 = false; - flag_almanac_str_10 = false; - flag_almanac_str_11 = false; - flag_almanac_str_12 = false; - flag_almanac_str_13 = false; - flag_almanac_str_14 = false; - flag_almanac_str_15 = false; - flag_all_almanac = true; - return true; + if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A) + { + //All almanac have been received for this satellite + flag_almanac_str_6 = false; + flag_almanac_str_7 = false; + new_alm = true; + } + } - else - return false; + if ((flag_almanac_str_8 == true) and (flag_almanac_str_9 == true)) + { + if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A) + { + flag_almanac_str_8 = false; + flag_almanac_str_9 = false; + new_alm = true; + } + } + if((flag_almanac_str_10 == true) and (flag_almanac_str_11 == true)) + { + if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A) + { + flag_almanac_str_10 = false; + flag_almanac_str_11 = false; + new_alm = true; + } + } + if((flag_almanac_str_12 == true) and (flag_almanac_str_13 == true)) + { + if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A) + { + flag_almanac_str_12 = false; + flag_almanac_str_13 = false; + new_alm = true; + } + } + if((flag_almanac_str_14 == true) and (flag_almanac_str_15 == true)) + { + if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A) + { + flag_almanac_str_14 = false; + flag_almanac_str_15 = false; + new_alm = true; + } + } + + return new_alm; } diff --git a/src/core/system_parameters/glonass_gnav_navigation_message.h b/src/core/system_parameters/glonass_gnav_navigation_message.h index 04836fc62..743f4cefa 100644 --- a/src/core/system_parameters/glonass_gnav_navigation_message.h +++ b/src/core/system_parameters/glonass_gnav_navigation_message.h @@ -63,17 +63,13 @@ public: bool flag_CRC_test; unsigned int d_frame_ID; unsigned int d_string_ID; + bool flag_update_slot_number; Glonass_Gnav_Ephemeris gnav_ephemeris; //!< Ephemeris information decoded Glonass_Gnav_Utc_Model gnav_utc_model; //!< UTC model information - Glonass_Gnav_Almanac gnav_almanac[24]; //!< Almanac information for all 24 satellites + Glonass_Gnav_Almanac gnav_almanac[GLONASS_L1_CA_NBR_SATS]; //!< Almanac information for all 24 satellites - //!< Satellite Identification - int i_channel_ID; //!< Channel ID assigned by the receiver - unsigned int i_satellite_freq_channel; //!< SV Frequency Slot Number - unsigned int i_satellite_slot_number; //!< SV Orbit Slot Number - - //!< Ephmeris Flags + //!< Ephmeris 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 @@ -92,25 +88,26 @@ 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 //!< 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; + 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_TOW; //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s] - double d_TOW_F1; //!< Time of GPS Week from HOW word of Subframe 1 [s] - double d_TOW_F2; //!< Time of GPS Week from HOW word of Subframe 2 [s] - double d_TOW_F3; //!< Time of GPS Week from HOW word of Subframe 3 [s] - double d_TOW_F4; //!< Time of GPS Week from HOW word of Subframe 4 [s] - double d_TOW_F5; //!< Time of GPS Week from HOW word of Subframe 5 [s] // Clock terms double d_satClkCorr; // Satellite clock error double d_dtr; // Relativistic clock correction term double d_satClkDrift; // Satellite clock drift + // Data update parameters + double d_previous_tb; + double d_previous_Na[GLONASS_L1_CA_NBR_SATS]; + bool CRC_test(std::bitset bits); unsigned int get_frame_number(unsigned int satellite_slot_number); @@ -162,6 +159,8 @@ public: */ double get_TOW(); + double get_WN(); + /*! * \brief Computes the Coordinated Universal Time (UTC) and returns it in [s] */ diff --git a/src/tests/test_main.cc b/src/tests/test_main.cc index 548b2d4e9..d0a8e0c1c 100644 --- a/src/tests/test_main.cc +++ b/src/tests/test_main.cc @@ -145,7 +145,6 @@ DECLARE_string(log_dir); #endif #include "unit-tests/system-parameters/glonass_gnav_ephemeris_test.cc" -#include "unit-tests/system-parameters/glonass_gnav_almanac_test.cc" #include "unit-tests/system-parameters/glonass_gnav_nav_message_test.cc" // For GPS NAVIGATION (L1) diff --git a/src/tests/unit-tests/system-parameters/glonass_gnav_almanac_test.cc b/src/tests/unit-tests/system-parameters/glonass_gnav_almanac_test.cc deleted file mode 100644 index 2c36f03cb..000000000 --- a/src/tests/unit-tests/system-parameters/glonass_gnav_almanac_test.cc +++ /dev/null @@ -1,76 +0,0 @@ -/*! - * \file code_generation_test.cc - * \note Code added as part of GSoC 2017 program - * \author Damian Miralles, 2017. dmiralles2009(at)gmail.com - * \see GLONASS ICD - * - * - * ------------------------------------------------------------------------- - * - * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) - * - * GNSS-SDR is a software defined Global Navigation - * Satellite Systems receiver - * - * This file is part of GNSS-SDR. - * - * GNSS-SDR is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GNSS-SDR is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNSS-SDR. If not, see . - * - * ------------------------------------------------------------------------- - */ - - -#include -#include -#include "gps_sdr_signal_processing.h" -#include "gnss_signal_processing.h" - -#include -#include -#include "gnss_signal_processing.h" -#include "glonass_gnav_almanac.h" - -// See A 3.2.3 -TEST(GlonassGnavAlmanacTest, SatellitePosition) -{ - double N_i = 615; // [days] - double t_i = 33300.0; // [seconds] - double Xoi = 10947.021572; // [km] - double Yoi = 13078.978287; // [km] - double Zoi = 18922.063362; // [km] - double Vxoi = -3.375497; // [m/s] - double Vyoi = -0.161453; // [Кm/s] - double Vzoi = 2.060844; // [Кm/s] - double N_A = 615; // [days] - - Glonass_Gnav_Almanac gnav_almanac; - - - gnav_almanac.d_lambda_n_A = -0.189986229; // [half cycles] - gnav_almanac.d_t_lambda_n_A = 27122.09375; // [second] - gnav_almanac.d_Delta_i_n_A = 0.011929512; // [half cycle] - gnav_almanac.d_Delta_T_n_A = -2655.76171875; // [seconds] - gnav_almanac.d_Delta_T_n_A_dot = 0.000549316; // [Secjnds/cycle2] - gnav_almanac.d_epsilon_n_A = 0.001482010; // [unitless] - gnav_almanac.d_omega_n_A = 0.440277100; // [Half cycle] - - gnav_almanac.satellite_position(N_A, N_i, t_i); - - ASSERT_TRUE(gnav_almanac.d_satpos_Xo - Xoi < DBL_EPSILON ); - ASSERT_TRUE(gnav_almanac.d_satpos_Yo - Yoi < DBL_EPSILON ); - ASSERT_TRUE(gnav_almanac.d_satpos_Zo - Zoi < DBL_EPSILON ); - ASSERT_TRUE(gnav_almanac.d_satvel_Xo - Vxoi < DBL_EPSILON ); - ASSERT_TRUE(gnav_almanac.d_satvel_Yo - Vyoi < DBL_EPSILON ); - ASSERT_TRUE(gnav_almanac.d_satvel_Zo - Vzoi < DBL_EPSILON ); -} diff --git a/src/tests/unit-tests/system-parameters/glonass_gnav_nav_message_test.cc b/src/tests/unit-tests/system-parameters/glonass_gnav_nav_message_test.cc index de814391f..5fabb4676 100644 --- a/src/tests/unit-tests/system-parameters/glonass_gnav_nav_message_test.cc +++ b/src/tests/unit-tests/system-parameters/glonass_gnav_nav_message_test.cc @@ -44,7 +44,7 @@ * \test The provided string was generated with a version of MATLAB GNSS-SDR that * the author coded to perform proper decoding of GLONASS GNAV signals. */ -TEST(GlonassGnavNavigationMessageTest, CRCTest) +TEST(GlonassGnavNavigationMessageTest, CRCTestSuccess) { // Variables declarations in code bool test_result; @@ -59,6 +59,27 @@ TEST(GlonassGnavNavigationMessageTest, CRCTest) ASSERT_TRUE(test_result); } +/*! + * \brief Testing CRC computation for GLONASS GNAV data bits of a string + * \test The provided string was generated with a version of MATLAB GNSS-SDR that + * the author coded to perform proper decoding of GLONASS GNAV signals. + */ +TEST(GlonassGnavNavigationMessageTest, CRCTestFailure) +{ + // Variables declarations in code + bool test_result; + // Constructor of string to bitset will flip the order of the bits. Needed for CRC computation + std::bitset string_bits (std::string ("0111100100001100000000000000000000000000110011110001100000000000000001100100011000000")); + Glonass_Gnav_Navigation_Message gnav_nav_message; + gnav_nav_message.reset(); + + // Call function to test + test_result = gnav_nav_message.CRC_test(string_bits); + + // Check results in unit test assetions + ASSERT_FALSE(test_result); +} + /*! * \brief Testing string decoding for GLONASS GNAV messages * \test The provided string (str1.....str15) was generated with a version of diff --git a/src/utils/matlab/hybrid_observables_plot_sample.m b/src/utils/matlab/hybrid_observables_plot_sample.m index 8857da352..538575bee 100644 --- a/src/utils/matlab/hybrid_observables_plot_sample.m +++ b/src/utils/matlab/hybrid_observables_plot_sample.m @@ -4,19 +4,20 @@ clearvars; close all; addpath('./libs'); -samplingFreq = 2600000; %[Hz] -channels=2; -path='/home/javier/git/gnss-sdr/build/'; -observables_log_path=[path 'observables.dat']; +samplingFreq = 6625000; %[Hz] +channels=5; +path='/archive/'; +observables_log_path=[path 'glo_observables.dat']; GNSS_observables= read_hybrid_observables_dump(channels,observables_log_path); +%% %optional: %search all channels having good satellite simultaneously min_idx=1; for n=1:1:channels idx=find(GNSS_observables.valid(n,:)>0,1,'first'); if min_idx. -% * -% * ------------------------------------------------------------------------- -% */ -function [GNSS_tracking] = glonass_l1_ca_dll_pll_read_tracking_dump (filename, count) - - %% usage: glonass_l1_ca_dll_pll_read_tracking_dump_64bits (filename, [count]) - %% - %% open GNSS-SDR tracking binary log file .dat and return the contents - %% - - m = nargchk (1,2,nargin); - num_float_vars=5; - num_unsigned_long_int_vars=1; - num_double_vars=11; - num_unsigned_int_vars=1; - double_size_bytes=8; - unsigned_long_int_size_bytes=8; - float_size_bytes=4; - long_int_size_bytes=4; - - skip_bytes_each_read=float_size_bytes*num_float_vars+unsigned_long_int_size_bytes*num_unsigned_long_int_vars+double_size_bytes*num_double_vars+long_int_size_bytes*num_unsigned_int_vars; - bytes_shift=0; - if (m) - usage (m); - end - - if (nargin < 2) - %count = Inf; - file_stats = dir(filename); - %round num bytes to read to integer number of samples (to protect the script from binary - %dump end file transitory) - count = (file_stats.bytes - mod(file_stats.bytes,skip_bytes_each_read))/skip_bytes_each_read; - end - %loops_counter = fread (f, count, 'uint32',4*12); - f = fopen (filename, 'rb'); - if (f < 0) - else - v1 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v2 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v3 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v4 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v5 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved unsigned_long_int - v6 = fread (f, count, 'uint64',skip_bytes_each_read-unsigned_long_int_size_bytes); - bytes_shift=bytes_shift+unsigned_long_int_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v7 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v8 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v9 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v10 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v11 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v12 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v13 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v14 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v15 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v16 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v17 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v18 = fread (f, count, 'uint32',skip_bytes_each_read-double_size_bytes); - fclose (f); - - %%%%%%%% output vars %%%%%%%% - -% // EPR -% d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); -% d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); -% d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); -% // PROMPT I and Q (to analyze navigation symbols) -% d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); -% d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); -% // PRN start sample stamp -% //tmp_float=(float)d_sample_counter; -% d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); -% // accumulated carrier phase -% d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_rad), sizeof(double)); -% -% // carrier and code frequency -% d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); -% -% //PLL commands -% d_dump_file.write(reinterpret_cast(&carr_phase_error_secs_Ti), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); -% -% //DLL commands -% d_dump_file.write(reinterpret_cast(&code_error_chips_Ti), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(double)); -% -% // CN0 and carrier lock test -% d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); -% -% // AUX vars (for debug purposes) -% tmp_double = d_rem_code_phase_samples; -% d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -% tmp_double = static_cast(d_sample_counter + d_current_prn_length_samples); -% d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -% // PRN -% unsigned int prn_ = d_acquisition_gnss_synchro->PRN; -% d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); - E=v1; - P=v2; - L=v3; - prompt_I=v4; - prompt_Q=v5; - PRN_start_sample=v6; - acc_carrier_phase_rad=v7; - carrier_doppler_hz=v8; - code_freq_hz=v9; - carr_error=v10; - carr_nco=v11; - code_error=v12; - code_nco=v13; - CN0_SNV_dB_Hz=v14; - carrier_lock_test=v15; - var1=v16; - var2=v17; - PRN=v18; - - GNSS_tracking.E=E; - GNSS_tracking.P=P; - GNSS_tracking.L=L; - GNSS_tracking.prompt_I=prompt_I; - GNSS_tracking.prompt_Q=prompt_Q; - GNSS_tracking.PRN_start_sample=PRN_start_sample; - GNSS_tracking.acc_carrier_phase_rad=acc_carrier_phase_rad; - GNSS_tracking.carrier_doppler_hz=carrier_doppler_hz; - GNSS_tracking.code_freq_hz=code_freq_hz; - GNSS_tracking.carr_error=carr_error; - GNSS_tracking.carr_nco=carr_nco; - GNSS_tracking.code_error=code_error - GNSS_tracking.code_nco=code_nco; - GNSS_tracking.CN0_SNV_dB_Hz=CN0_SNV_dB_Hz; - GNSS_tracking.carrier_lock_test=carrier_lock_test; - GNSS_tracking.d_rem_code_phase_samples=var1; - GNSS_tracking.var2=var2; - GNSS_tracking.PRN=PRN; - end diff --git a/src/utils/matlab/libs/plotTracking.m b/src/utils/matlab/libs/plotTracking.m index ec0c418d3..9abe9c729 100644 --- a/src/utils/matlab/libs/plotTracking.m +++ b/src/utils/matlab/libs/plotTracking.m @@ -166,18 +166,19 @@ for channelNr = channelList title (handles(4, 1), 'Carrier to Noise Ratio'); %----- Carrier Frequency -------------------------------- - plot (handles(4, 2), timeAxisInSeconds, ... - trackResults(channelNr).carrFreq(1:settings.msToProcess), 'Color',[0.42 0.25 0.39]); + plot (handles(4, 2), timeAxisInSeconds(2:end), ... + trackResults(channelNr).carrFreq(2:settings.msToProcess), 'Color',[0.42 0.25 0.39]); grid (handles(4, 2)); - axis (handles(4, 2), 'tight'); + axis (handles(4, 2)); xlabel(handles(4, 2), 'Time (s)'); ylabel(handles(4, 2), 'Freq (hz)'); title (handles(4, 2), 'Carrier Freq'); %----- Code Frequency---------------------------------- - plot (handles(4, 3), timeAxisInSeconds, ... - trackResults(channelNr).codeFreq(1:settings.msToProcess), 'Color',[0.2 0.3 0.49]); + %--- Skip sample 0 to help with results display + plot (handles(4, 3), timeAxisInSeconds(2:end), ... + trackResults(channelNr).codeFreq(2:settings.msToProcess), 'Color',[0.2 0.3 0.49]); grid (handles(4, 3)); axis (handles(4, 3), 'tight');