diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_cc.cc index 452f74107..067a99b41 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_cc.cc @@ -136,6 +136,8 @@ beidou_b1i_telemetry_decoder_cc::beidou_b1i_telemetry_decoder_cc( d_channel = 0; flag_SOW_set = false; + + } @@ -265,6 +267,7 @@ void beidou_b1i_telemetry_decoder_cc::decode_subframe(double *frame_symbols, int if (d_nav.have_new_ephemeris() == true) { // get object for this SV (mandatory) + d_nav.i_satellite_PRN = d_satellite.get_PRN(); 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) << "BEIDOU DNAV Ephemeris have been received in channel" << d_channel << " from satellite " << d_satellite; diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc index caefee8f7..055355ba7 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc @@ -98,7 +98,7 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) : gr::bl d_code_chip_rate = 0.0; d_secondary_code_length = 0U; d_secondary_code_string = nullptr; - d_gps_l1ca_preambles_symbols = nullptr; + d_preambles_symbols = nullptr; signal_type = std::string(trk_parameters.signal); std::map map_signal_pretty_name; @@ -134,7 +134,8 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) : gr::bl uint16_t preambles_bits[GPS_CA_PREAMBLE_LENGTH_BITS] = GPS_PREAMBLE; // preamble bits to sampled symbols - d_gps_l1ca_preambles_symbols = static_cast(volk_gnsssdr_malloc(GPS_CA_PREAMBLE_LENGTH_SYMBOLS * sizeof(int32_t), volk_gnsssdr_get_alignment())); + d_preamble_length_symbols = GPS_CA_PREAMBLE_LENGTH_SYMBOLS; + d_preambles_symbols = static_cast(volk_gnsssdr_malloc(GPS_CA_PREAMBLE_LENGTH_SYMBOLS * sizeof(int32_t), volk_gnsssdr_get_alignment())); int32_t n = 0; for (uint16_t preambles_bit : preambles_bits) { @@ -142,11 +143,11 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) : gr::bl { if (preambles_bit == 1) { - d_gps_l1ca_preambles_symbols[n] = 1; + d_preambles_symbols[n] = 1; } else { - d_gps_l1ca_preambles_symbols[n] = -1; + d_preambles_symbols[n] = -1; } n++; } @@ -278,19 +279,19 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) : gr::bl systemName = "Beidou"; if (signal_type == "B1") { - d_signal_carrier_freq = BEIDOU_B1I_FREQ_HZ; - d_code_period = BEIDOU_B1I_CODE_PERIOD; - d_code_chip_rate = BEIDOU_B1I_CODE_RATE_HZ; - d_code_length_chips = static_cast(BEIDOU_B1I_CODE_LENGTH_CHIPS); - d_symbols_per_bit = BEIDOU_B1I_TELEMETRY_SYMBOLS_PER_BIT; - d_correlation_length_ms = 1; - d_code_samples_per_chip = 1; - d_secondary = true; - trk_parameters.track_pilot = false; - interchange_iq = false; - d_secondary_code_length = static_cast(BEIDOU_B1I_SECONDARY_CODE_LENGTH); - d_secondary_code_string = const_cast(&BEIDOU_B1I_SECONDARY_CODE_STR); - + // GEO Satellites use different secondary code + d_signal_carrier_freq = BEIDOU_B1I_FREQ_HZ; + d_code_period = BEIDOU_B1I_CODE_PERIOD; + d_code_chip_rate = BEIDOU_B1I_CODE_RATE_HZ; + d_code_length_chips = static_cast(BEIDOU_B1I_CODE_LENGTH_CHIPS); + d_symbols_per_bit = BEIDOU_B1I_TELEMETRY_SYMBOLS_PER_BIT; + d_correlation_length_ms = 1; + d_code_samples_per_chip = 1; + d_secondary = true; + trk_parameters.track_pilot = false; + interchange_iq = false; + d_secondary_code_length = static_cast(BEIDOU_B1I_SECONDARY_CODE_LENGTH); + d_secondary_code_string = const_cast(&BEIDOU_B1I_SECONDARY_CODE_STR); } else { @@ -573,6 +574,42 @@ void dll_pll_veml_tracking::start_tracking() else if (systemName == "Beidou" and signal_type == "B1") { beidou_b1i_code_gen_float(d_tracking_code, d_acquisition_gnss_synchro->PRN, 0); + // Update secondary code settings for geo satellites + if(d_acquisition_gnss_synchro->PRN > 0 and d_acquisition_gnss_synchro->PRN < 6) + { + d_symbols_per_bit = 2; + d_correlation_length_ms = 1; + d_code_samples_per_chip = 1; + d_secondary = false; + trk_parameters.track_pilot = false; + interchange_iq = false; + d_secondary_code_length = 0; + d_secondary_code_string = const_cast(&BEIDOU_B1I_D2_SECONDARY_CODE_STR); + + // preamble bits to sampled symbols + d_preamble_length_symbols = 22; + d_preambles_symbols = static_cast(volk_gnsssdr_malloc(22 * sizeof(int32_t), volk_gnsssdr_get_alignment())); + int32_t n = 0; + uint16_t preambles_bits[BEIDOU_B1I_PREAMBLE_LENGTH_BITS] = {1,1,1,0,0,0,1,0,0,1,0}; + for (uint16_t preambles_bit : preambles_bits) + { + for (uint32_t j = 0; j < d_symbols_per_bit; j++) + { + if (preambles_bit == 1) + { + d_preambles_symbols[n] = 1; + } + else + { + d_preambles_symbols[n] = -1; + } + n++; + } + } + d_symbol_history.resize(22); // Change fixed buffer size + d_symbol_history.clear(); + } + } multicorrelator_cpu.set_local_code_and_taps(d_code_samples_per_chip * d_code_length_chips, d_tracking_code, d_local_code_shift_chips); @@ -621,7 +658,7 @@ dll_pll_veml_tracking::~dll_pll_veml_tracking() { if (signal_type == "1C") { - volk_gnsssdr_free(d_gps_l1ca_preambles_symbols); + volk_gnsssdr_free(d_preambles_symbols); } if (d_dump_file.is_open()) @@ -1470,21 +1507,21 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused) d_symbol_history.push_back(d_Prompt->real()); //******* preamble correlation ******** int32_t corr_value = 0; - if ((d_symbol_history.size() == GPS_CA_PREAMBLE_LENGTH_SYMBOLS)) // and (d_make_correlation or !d_flag_frame_sync)) + if ((d_symbol_history.size() == d_preamble_length_symbols)) // and (d_make_correlation or !d_flag_frame_sync)) { - for (uint32_t i = 0; i < GPS_CA_PREAMBLE_LENGTH_SYMBOLS; i++) + for (uint32_t i = 0; i < d_preamble_length_symbols; i++) { if (d_symbol_history.at(i) < 0) // symbols clipping { - corr_value -= d_gps_l1ca_preambles_symbols[i]; + corr_value -= d_preambles_symbols[i]; } else { - corr_value += d_gps_l1ca_preambles_symbols[i]; + corr_value += d_preambles_symbols[i]; } } } - if (corr_value == GPS_CA_PREAMBLE_LENGTH_SYMBOLS) + if (corr_value == d_preamble_length_symbols) { //std::cout << "Preamble detected at tracking!" << std::endl; next_state = true; @@ -1533,6 +1570,7 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused) current_synchro_data.Prompt_Q = static_cast((*d_Prompt).imag()); } } + current_synchro_data.Code_phase_samples = d_rem_code_phase_samples; current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h index a79c7ffc3..bce6e9048 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h @@ -107,7 +107,8 @@ private: std::string *d_secondary_code_string; std::string signal_pretty_name; - int32_t *d_gps_l1ca_preambles_symbols; + int32_t *d_preambles_symbols; + int32_t d_preamble_length_symbols; boost::circular_buffer d_symbol_history; //tracking state machine diff --git a/src/core/system_parameters/Beidou_B1I.h b/src/core/system_parameters/Beidou_B1I.h index 5f9bbd270..ca9d4b989 100644 --- a/src/core/system_parameters/Beidou_B1I.h +++ b/src/core/system_parameters/Beidou_B1I.h @@ -56,6 +56,7 @@ const double BEIDOU_B1I_CHIP_PERIOD = 4.8875e-07; //!< beidou b1I c const int BEIDOU_B1I_SECONDARY_CODE_LENGTH = 20; const std::string BEIDOU_B1I_SECONDARY_CODE = "00000100110101001110"; const std::string BEIDOU_B1I_SECONDARY_CODE_STR = "00000100110101001110"; +const std::string BEIDOU_B1I_D2_SECONDARY_CODE_STR = "00"; /*! * \brief Maximum Time-Of-Arrival (TOA) difference between satellites for a receiver operated on Earth surface is 20 ms