diff --git a/docs/changelog b/docs/changelog index 3b8c0438e..97af773b1 100644 --- a/docs/changelog +++ b/docs/changelog @@ -56,6 +56,7 @@ ### Improvements in Reliability +- Included the Guidelines Support Library. General improvement of memory management, replacement of raw pointers by containers or smart pointers. - Applied clang-tidy checks and fixes related to High Integrity C++: performance-move-const-arg, modernize-use-auto, modernize-use-equals-default, modernize-use-equals-delete, modernize-use-noexcept, modernize-use-nullptr, cert-dcl21-cpp, misc-new-delete-overloads, cert-dcl58-cpp, cert-err52-cpp, cert-err60-cpp. diff --git a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc index baa85692d..0e962207b 100644 --- a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc +++ b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc @@ -35,7 +35,7 @@ #include -Monitor_Pvt_Udp_Sink::Monitor_Pvt_Udp_Sink(std::vector addresses, const uint16_t& port, bool protobuf_enabled) : socket{io_context} +Monitor_Pvt_Udp_Sink::Monitor_Pvt_Udp_Sink(const std::vector& addresses, const uint16_t& port, bool protobuf_enabled) : socket{io_context} { for (const auto& address : addresses) { diff --git a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h index c8c363942..85a612358 100644 --- a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h +++ b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h @@ -45,7 +45,7 @@ using b_io_context = boost::asio::io_service; class Monitor_Pvt_Udp_Sink { public: - Monitor_Pvt_Udp_Sink(std::vector addresses, const uint16_t &port, bool protobuf_enabled); + Monitor_Pvt_Udp_Sink(const std::vector& addresses, const uint16_t &port, bool protobuf_enabled); bool write_monitor_pvt(const Monitor_Pvt &monitor_pvt); private: diff --git a/src/algorithms/PVT/libs/nmea_printer.cc b/src/algorithms/PVT/libs/nmea_printer.cc index ecc92b914..913a23e39 100644 --- a/src/algorithms/PVT/libs/nmea_printer.cc +++ b/src/algorithms/PVT/libs/nmea_printer.cc @@ -283,7 +283,7 @@ bool Nmea_Printer::Print_Nmea_Line(const std::shared_ptr& pvt_dat } -char Nmea_Printer::checkSum(std::string sentence) +char Nmea_Printer::checkSum(const std::string& sentence) { char check = 0; // iterate over the string, XOR each byte with the total sum: diff --git a/src/algorithms/PVT/libs/nmea_printer.h b/src/algorithms/PVT/libs/nmea_printer.h index f821ad94b..d9822c6c5 100644 --- a/src/algorithms/PVT/libs/nmea_printer.h +++ b/src/algorithms/PVT/libs/nmea_printer.h @@ -83,7 +83,7 @@ private: std::string get_UTC_NMEA_time(boost::posix_time::ptime d_position_UTC_time); std::string longitude_to_hm(double longitude); std::string latitude_to_hm(double lat); - char checkSum(std::string sentence); + char checkSum(const std::string& sentence); bool print_avg_pos; bool d_flag_nmea_output_file; }; diff --git a/src/algorithms/PVT/libs/rtcm.cc b/src/algorithms/PVT/libs/rtcm.cc index deb7a997b..0cad7ec65 100644 --- a/src/algorithms/PVT/libs/rtcm.cc +++ b/src/algorithms/PVT/libs/rtcm.cc @@ -140,7 +140,7 @@ bool Rtcm::is_server_running() const std::string Rtcm::add_CRC(const std::string& message_without_crc) const { // ****** Computes Qualcomm CRC-24Q ****** - boost::crc_optimal<24, 0x1864CFBu, 0x0, 0x0, false, false> CRC_RTCM; + boost::crc_optimal<24, 0x1864CFBU, 0x0, 0x0, false, false> CRC_RTCM; // 1) Converts the string to a vector of uint8_t: boost::dynamic_bitset frame_bits(message_without_crc); std::vector bytes; @@ -159,7 +159,7 @@ std::string Rtcm::add_CRC(const std::string& message_without_crc) const bool Rtcm::check_CRC(const std::string& message) const { - boost::crc_optimal<24, 0x1864CFBu, 0x0, 0x0, false, false> CRC_RTCM_CHECK; + boost::crc_optimal<24, 0x1864CFBU, 0x0, 0x0, false, false> CRC_RTCM_CHECK; // Convert message to binary std::string message_bin = Rtcm::binary_data_to_bin(message); // Check CRC @@ -2419,7 +2419,7 @@ std::string Rtcm::get_MSM_1_content_sat_data(const std::mapsecond.PRN); - observables_vector.push_back(*gnss_synchro_iter); + observables_vector.emplace_back(*gnss_synchro_iter); } } @@ -2448,7 +2448,7 @@ std::string Rtcm::get_MSM_1_content_signal_data(const std::map > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); @@ -2556,7 +2556,7 @@ std::string Rtcm::get_MSM_2_content_signal_data(const Gps_Ephemeris& ephNAV, map_iter != observables.cend(); map_iter++) { - observables_vector.push_back(*map_iter); + observables_vector.emplace_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); @@ -2670,7 +2670,7 @@ std::string Rtcm::get_MSM_3_content_signal_data(const Gps_Ephemeris& ephNAV, map_iter != observables.cend(); map_iter++) { - observables_vector.push_back(*map_iter); + observables_vector.emplace_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); @@ -2786,7 +2786,7 @@ std::string Rtcm::get_MSM_4_content_sat_data(const std::mapsecond.PRN); - observables_vector.push_back(*gnss_synchro_iter); + observables_vector.emplace_back(*gnss_synchro_iter); } } @@ -2827,7 +2827,7 @@ std::string Rtcm::get_MSM_4_content_signal_data(const Gps_Ephemeris& ephNAV, map_iter != observables.cend(); map_iter++) { - observables_vector.push_back(*map_iter); + observables_vector.emplace_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); @@ -2947,7 +2947,7 @@ std::string Rtcm::get_MSM_5_content_sat_data(const std::mapsecond.PRN); - observables_vector.push_back(*gnss_synchro_iter); + observables_vector.emplace_back(*gnss_synchro_iter); } } @@ -2993,7 +2993,7 @@ std::string Rtcm::get_MSM_5_content_signal_data(const Gps_Ephemeris& ephNAV, map_iter != observables.cend(); map_iter++) { - observables_vector.push_back(*map_iter); + observables_vector.emplace_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); @@ -3114,7 +3114,7 @@ std::string Rtcm::get_MSM_6_content_signal_data(const Gps_Ephemeris& ephNAV, map_iter != observables.cend(); map_iter++) { - observables_vector.push_back(*map_iter); + observables_vector.emplace_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); @@ -3234,7 +3234,7 @@ std::string Rtcm::get_MSM_7_content_signal_data(const Gps_Ephemeris& ephNAV, map_iter != observables.cend(); map_iter++) { - observables_vector.push_back(*map_iter); + observables_vector.emplace_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); @@ -3685,7 +3685,7 @@ uint32_t Rtcm::msm_extended_lock_time_indicator(uint32_t lock_time_period_s) if( 16777216 <= lock_time_period_s && lock_time_period_s < 33554432 ) return (640 + (lock_time_period_s - 16777216) / 524288 ); if( 33554432 <= lock_time_period_s && lock_time_period_s < 67108864 ) return (672 + (lock_time_period_s - 33554432) / 1048576); if( 67108864 <= lock_time_period_s ) return (704 ); - return 1023; // will never happen + return 1023; // will never happen } // clang-format on @@ -5330,7 +5330,7 @@ int32_t Rtcm::set_DF398(const Gnss_Synchro& gnss_synchro) } else { - rr_mod_ms = static_cast(std::floor(rough_range_m / meters_to_miliseconds / TWO_N10) + 0.5) & 0x3FFu; + rr_mod_ms = static_cast(std::floor(rough_range_m / meters_to_miliseconds / TWO_N10) + 0.5) & 0x3FFU; } DF398 = std::bitset<10>(rr_mod_ms); return 0; diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index 79d52b467..ebb359b0f 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -64,6 +64,7 @@ #include #include #include +#include Rtklib_Solver::Rtklib_Solver(int nchannels, std::string dump_filename, bool flag_dump_to_file, bool flag_dump_to_mat, const rtk_t &rtk) @@ -172,34 +173,34 @@ bool Rtklib_Solver::save_matfile() return false; } - auto *TOW_at_current_symbol_ms = new uint32_t[num_epoch]; - auto *week = new uint32_t[num_epoch]; - auto *RX_time = new double[num_epoch]; - auto *user_clk_offset = new double[num_epoch]; - auto *pos_x = new double[num_epoch]; - auto *pos_y = new double[num_epoch]; - auto *pos_z = new double[num_epoch]; - auto *vel_x = new double[num_epoch]; - auto *vel_y = new double[num_epoch]; - auto *vel_z = new double[num_epoch]; - auto *cov_xx = new double[num_epoch]; - auto *cov_yy = new double[num_epoch]; - auto *cov_zz = new double[num_epoch]; - auto *cov_xy = new double[num_epoch]; - auto *cov_yz = new double[num_epoch]; - auto *cov_zx = new double[num_epoch]; - auto *latitude = new double[num_epoch]; - auto *longitude = new double[num_epoch]; - auto *height = new double[num_epoch]; - auto *valid_sats = new uint8_t[num_epoch]; - auto *solution_status = new uint8_t[num_epoch]; - auto *solution_type = new uint8_t[num_epoch]; - auto *AR_ratio_factor = new float[num_epoch]; - auto *AR_ratio_threshold = new float[num_epoch]; - auto *gdop = new double[num_epoch]; - auto *pdop = new double[num_epoch]; - auto *hdop = new double[num_epoch]; - auto *vdop = new double[num_epoch]; + auto TOW_at_current_symbol_ms = std::vector(num_epoch); + auto week = std::vector(num_epoch); + auto RX_time = std::vector(num_epoch); + auto user_clk_offset = std::vector(num_epoch); + auto pos_x = std::vector(num_epoch); + auto pos_y = std::vector(num_epoch); + auto pos_z = std::vector(num_epoch); + auto vel_x = std::vector(num_epoch); + auto vel_y = std::vector(num_epoch); + auto vel_z = std::vector(num_epoch); + auto cov_xx = std::vector(num_epoch); + auto cov_yy = std::vector(num_epoch); + auto cov_zz = std::vector(num_epoch); + auto cov_xy = std::vector(num_epoch); + auto cov_yz = std::vector(num_epoch); + auto cov_zx = std::vector(num_epoch); + auto latitude = std::vector(num_epoch); + auto longitude = std::vector(num_epoch); + auto height = std::vector(num_epoch); + auto valid_sats = std::vector(num_epoch); + auto solution_status = std::vector(num_epoch); + auto solution_type = std::vector(num_epoch); + auto AR_ratio_factor = std::vector(num_epoch); + auto AR_ratio_threshold = std::vector(num_epoch); + auto gdop = std::vector(num_epoch); + auto pdop = std::vector(num_epoch); + auto hdop = std::vector(num_epoch); + auto vdop = std::vector(num_epoch); try { @@ -242,35 +243,6 @@ bool Rtklib_Solver::save_matfile() catch (const std::ifstream::failure &e) { std::cerr << "Problem reading dump file:" << e.what() << std::endl; - delete[] TOW_at_current_symbol_ms; - delete[] week; - delete[] RX_time; - delete[] user_clk_offset; - delete[] pos_x; - delete[] pos_y; - delete[] pos_z; - delete[] vel_x; - delete[] vel_y; - delete[] vel_z; - delete[] cov_xx; - delete[] cov_yy; - delete[] cov_zz; - delete[] cov_xy; - delete[] cov_yz; - delete[] cov_zx; - delete[] latitude; - delete[] longitude; - delete[] height; - delete[] valid_sats; - delete[] solution_status; - delete[] solution_type; - delete[] AR_ratio_factor; - delete[] AR_ratio_threshold; - delete[] gdop; - delete[] pdop; - delete[] hdop; - delete[] vdop; - return false; } @@ -284,149 +256,120 @@ bool Rtklib_Solver::save_matfile() if (reinterpret_cast(matfp) != nullptr) { size_t dims[2] = {1, static_cast(num_epoch)}; - matvar = Mat_VarCreate("TOW_at_current_symbol_ms", MAT_C_UINT32, MAT_T_UINT32, 2, dims, TOW_at_current_symbol_ms, 0); + matvar = Mat_VarCreate("TOW_at_current_symbol_ms", MAT_C_UINT32, MAT_T_UINT32, 2, dims, TOW_at_current_symbol_ms.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("week", MAT_C_UINT32, MAT_T_UINT32, 2, dims, week, 0); + matvar = Mat_VarCreate("week", MAT_C_UINT32, MAT_T_UINT32, 2, dims, week.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("RX_time", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, RX_time, 0); + matvar = Mat_VarCreate("RX_time", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, RX_time.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("user_clk_offset", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, user_clk_offset, 0); + matvar = Mat_VarCreate("user_clk_offset", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, user_clk_offset.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("pos_x", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pos_x, 0); + matvar = Mat_VarCreate("pos_x", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pos_x.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("pos_y", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pos_y, 0); + matvar = Mat_VarCreate("pos_y", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pos_y.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("pos_z", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pos_z, 0); + matvar = Mat_VarCreate("pos_z", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pos_z.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("vel_x", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vel_x, 0); + matvar = Mat_VarCreate("vel_x", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vel_x.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("vel_y", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vel_y, 0); + matvar = Mat_VarCreate("vel_y", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vel_y.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("vel_z", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vel_z, 0); + matvar = Mat_VarCreate("vel_z", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vel_z.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("cov_xx", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_xx, 0); + matvar = Mat_VarCreate("cov_xx", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_xx.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("cov_yy", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_yy, 0); + matvar = Mat_VarCreate("cov_yy", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_yy.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("cov_zz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_zz, 0); + matvar = Mat_VarCreate("cov_zz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_zz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("cov_xy", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_xy, 0); + matvar = Mat_VarCreate("cov_xy", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_xy.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("cov_yz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_yz, 0); + matvar = Mat_VarCreate("cov_yz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_yz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("cov_zx", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_zx, 0); + matvar = Mat_VarCreate("cov_zx", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_zx.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("latitude", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, latitude, 0); + matvar = Mat_VarCreate("latitude", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, latitude.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("longitude", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, longitude, 0); + matvar = Mat_VarCreate("longitude", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, longitude.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("height", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, height, 0); + matvar = Mat_VarCreate("height", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, height.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("valid_sats", MAT_C_UINT8, MAT_T_UINT8, 2, dims, valid_sats, 0); + matvar = Mat_VarCreate("valid_sats", MAT_C_UINT8, MAT_T_UINT8, 2, dims, valid_sats.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("solution_status", MAT_C_UINT8, MAT_T_UINT8, 2, dims, solution_status, 0); + matvar = Mat_VarCreate("solution_status", MAT_C_UINT8, MAT_T_UINT8, 2, dims, solution_status.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("solution_type", MAT_C_UINT8, MAT_T_UINT8, 2, dims, solution_type, 0); + matvar = Mat_VarCreate("solution_type", MAT_C_UINT8, MAT_T_UINT8, 2, dims, solution_type.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("AR_ratio_factor", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, AR_ratio_factor, 0); + matvar = Mat_VarCreate("AR_ratio_factor", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, AR_ratio_factor.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("AR_ratio_threshold", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, AR_ratio_threshold, 0); + matvar = Mat_VarCreate("AR_ratio_threshold", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, AR_ratio_threshold.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("gdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, gdop, 0); + matvar = Mat_VarCreate("gdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, gdop.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("pdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pdop, 0); + matvar = Mat_VarCreate("pdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pdop.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("hdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, hdop, 0); + matvar = Mat_VarCreate("hdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, hdop.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("vdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vdop, 0); + matvar = Mat_VarCreate("vdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vdop.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); } Mat_Close(matfp); - delete[] TOW_at_current_symbol_ms; - delete[] week; - delete[] RX_time; - delete[] user_clk_offset; - delete[] pos_x; - delete[] pos_y; - delete[] pos_z; - delete[] vel_x; - delete[] vel_y; - delete[] vel_z; - delete[] cov_xx; - delete[] cov_yy; - delete[] cov_zz; - delete[] cov_xy; - delete[] cov_yz; - delete[] cov_zx; - delete[] latitude; - delete[] longitude; - delete[] height; - delete[] valid_sats; - delete[] solution_status; - delete[] solution_type; - delete[] AR_ratio_factor; - delete[] AR_ratio_threshold; - delete[] gdop; - delete[] pdop; - delete[] hdop; - delete[] vdop; - return true; } diff --git a/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc index 7317dbc0b..1c266882b 100644 --- a/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc @@ -39,6 +39,8 @@ #include "gnss_sdr_flags.h" #include #include +#include +#include BeidouB1iPcpsAcquisition::BeidouB1iPcpsAcquisition( @@ -90,7 +92,7 @@ BeidouB1iPcpsAcquisition::BeidouB1iPcpsAcquisition( vector_length_ *= 2; } - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "cshort") { @@ -123,7 +125,7 @@ BeidouB1iPcpsAcquisition::BeidouB1iPcpsAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -135,10 +137,7 @@ BeidouB1iPcpsAcquisition::BeidouB1iPcpsAcquisition( } -BeidouB1iPcpsAcquisition::~BeidouB1iPcpsAcquisition() -{ - delete[] code_; -} +BeidouB1iPcpsAcquisition::~BeidouB1iPcpsAcquisition() = default; void BeidouB1iPcpsAcquisition::stop_acquisition() @@ -204,18 +203,17 @@ void BeidouB1iPcpsAcquisition::init() void BeidouB1iPcpsAcquisition::set_local_code() { - auto* code = new std::complex[code_length_]; + std::unique_ptr> code{new std::complex[code_length_]}; - beidou_b1i_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0); + beidou_b1i_code_gen_complex_sampled(gsl::span>(code, code_length_), gnss_synchro_->PRN, fs_in_, 0); - for (uint32_t i = 0; i < sampled_ms_; i++) + gsl::span code_span(code_.data(), vector_length_); + for (unsigned int i = 0; i < sampled_ms_; i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_->set_local_code(code_); - delete[] code; + acquisition_->set_local_code(code_.data()); } @@ -331,6 +329,7 @@ gr::basic_block_sptr BeidouB1iPcpsAcquisition::get_right_block() return acquisition_; } + void BeidouB1iPcpsAcquisition::set_resampler_latency(uint32_t latency_samples) { acquisition_->set_resampler_latency(latency_samples); diff --git a/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.h b/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.h index f274d3ee6..503b6409e 100644 --- a/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.h @@ -42,7 +42,9 @@ #include #include #include +#include #include +#include class ConfigurationInterface; @@ -100,15 +102,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_->set_channel_fsm(channel_fsm); } - /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -159,7 +160,6 @@ public: */ void set_resampler_latency(uint32_t latency_samples) override; - private: ConfigurationInterface* configuration_; pcps_acquisition_sptr acquisition_; @@ -183,12 +183,11 @@ private: bool dump_; bool blocking_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; uint32_t in_streams_; uint32_t out_streams_; - float calculate_threshold(float pfa); }; diff --git a/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.cc index 6855d11fb..3a51a2a77 100644 --- a/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.cc @@ -37,7 +37,7 @@ #include "gnss_sdr_flags.h" #include #include - +#include using google::LogMessage; @@ -66,7 +66,10 @@ BeidouB3iPcpsAcquisition::BeidouB3iPcpsAcquisition( blocking_ = configuration_->property(role + ".blocking", true); acq_parameters.blocking = blocking_; doppler_max_ = configuration_->property(role + ".doppler_max", 5000); - if (FLAGS_doppler_max != 0) doppler_max_ = FLAGS_doppler_max; + if (FLAGS_doppler_max != 0) + { + doppler_max_ = FLAGS_doppler_max; + } acq_parameters.doppler_max = doppler_max_; sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 1); acq_parameters.sampled_ms = sampled_ms_; @@ -88,7 +91,7 @@ BeidouB3iPcpsAcquisition::BeidouB3iPcpsAcquisition( vector_length_ *= 2; } - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "cshort") { @@ -121,7 +124,7 @@ BeidouB3iPcpsAcquisition::BeidouB3iPcpsAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -133,16 +136,14 @@ BeidouB3iPcpsAcquisition::BeidouB3iPcpsAcquisition( } -BeidouB3iPcpsAcquisition::~BeidouB3iPcpsAcquisition() -{ - delete[] code_; -} +BeidouB3iPcpsAcquisition::~BeidouB3iPcpsAcquisition() = default; void BeidouB3iPcpsAcquisition::stop_acquisition() { } + void BeidouB3iPcpsAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + ".pfa", 0.0); @@ -201,18 +202,17 @@ void BeidouB3iPcpsAcquisition::init() void BeidouB3iPcpsAcquisition::set_local_code() { - auto* code = new std::complex[code_length_]; + std::unique_ptr> code{new std::complex[code_length_]}; - beidou_b3i_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0); + beidou_b3i_code_gen_complex_sampled(gsl::span>(code, code_length_), gnss_synchro_->PRN, fs_in_, 0); + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < sampled_ms_; i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_->set_local_code(code_); - delete[] code; + acquisition_->set_local_code(code_.data()); } diff --git a/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.h b/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.h index d824c132a..db2c6fbaa 100644 --- a/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.h @@ -41,7 +41,9 @@ #include #include #include +#include #include +#include class ConfigurationInterface; @@ -99,15 +101,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_->set_channel_fsm(channel_fsm); } - /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -158,7 +159,6 @@ public: */ void set_resampler_latency(uint32_t latency_samples) override; - private: ConfigurationInterface* configuration_; pcps_acquisition_sptr acquisition_; @@ -182,12 +182,11 @@ private: bool dump_; bool blocking_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; - float calculate_threshold(float pfa); }; diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.cc index 6c0f61c30..431a8142c 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.cc @@ -36,6 +36,7 @@ #include "gnss_sdr_flags.h" #include #include +#include GalileoE1Pcps8msAmbiguousAcquisition::GalileoE1Pcps8msAmbiguousAcquisition( @@ -86,7 +87,7 @@ GalileoE1Pcps8msAmbiguousAcquisition::GalileoE1Pcps8msAmbiguousAcquisition( int samples_per_ms = code_length_ / 4; - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "gr_complex") { @@ -110,7 +111,7 @@ GalileoE1Pcps8msAmbiguousAcquisition::GalileoE1Pcps8msAmbiguousAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -122,10 +123,7 @@ GalileoE1Pcps8msAmbiguousAcquisition::GalileoE1Pcps8msAmbiguousAcquisition( } -GalileoE1Pcps8msAmbiguousAcquisition::~GalileoE1Pcps8msAmbiguousAcquisition() -{ - delete[] code_; -} +GalileoE1Pcps8msAmbiguousAcquisition::~GalileoE1Pcps8msAmbiguousAcquisition() = default; void GalileoE1Pcps8msAmbiguousAcquisition::stop_acquisition() @@ -216,20 +214,20 @@ void GalileoE1Pcps8msAmbiguousAcquisition::set_local_code() bool cboc = configuration_->property( "Acquisition" + std::to_string(channel_) + ".cboc", false); - auto* code = new std::complex[code_length_]; + std::unique_ptr> code{new std::complex[code_length_]}; + std::array Signal_; + std::memcpy(Signal_.data(), gnss_synchro_->Signal, 3); - galileo_e1_code_gen_complex_sampled(code, gnss_synchro_->Signal, + galileo_e1_code_gen_complex_sampled(gsl::span>(code, code_length_), Signal_, cboc, gnss_synchro_->PRN, fs_in_, 0, false); + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < sampled_ms_ / 4; i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_cc_->set_local_code(code_); - - delete[] code; + acquisition_cc_->set_local_code(code_.data()); } } @@ -242,6 +240,7 @@ void GalileoE1Pcps8msAmbiguousAcquisition::reset() } } + float GalileoE1Pcps8msAmbiguousAcquisition::calculate_threshold(float pfa) { unsigned int frequency_bins = 0; diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.h index 27e9049de..a3be14fce 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.h @@ -36,7 +36,9 @@ #include "galileo_pcps_8ms_acquisition_cc.h" #include "gnss_synchro.h" #include +#include #include +#include class ConfigurationInterface; @@ -165,7 +167,7 @@ private: int64_t fs_in_; bool dump_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc index ea1b9ea73..60082fc4c 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc @@ -37,6 +37,7 @@ #include "gnss_sdr_flags.h" #include #include +#include GalileoE1PcpsAmbiguousAcquisition::GalileoE1PcpsAmbiguousAcquisition( @@ -126,7 +127,7 @@ GalileoE1PcpsAmbiguousAcquisition::GalileoE1PcpsAmbiguousAcquisition( vector_length_ *= 2; } - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "cshort") { @@ -154,7 +155,7 @@ GalileoE1PcpsAmbiguousAcquisition::GalileoE1PcpsAmbiguousAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -166,16 +167,14 @@ GalileoE1PcpsAmbiguousAcquisition::GalileoE1PcpsAmbiguousAcquisition( } -GalileoE1PcpsAmbiguousAcquisition::~GalileoE1PcpsAmbiguousAcquisition() -{ - delete[] code_; -} +GalileoE1PcpsAmbiguousAcquisition::~GalileoE1PcpsAmbiguousAcquisition() = default; void GalileoE1PcpsAmbiguousAcquisition::stop_acquisition() { } + void GalileoE1PcpsAmbiguousAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + std::to_string(channel_) + ".pfa", 0.0); @@ -242,45 +241,47 @@ void GalileoE1PcpsAmbiguousAcquisition::set_local_code() bool cboc = configuration_->property( "Acquisition" + std::to_string(channel_) + ".cboc", false); - auto* code = new std::complex[code_length_]; + std::unique_ptr> code{new std::complex[code_length_]}; + gsl::span> code_span(code.get(), code_length_); if (acquire_pilot_ == true) { //set local signal generator to Galileo E1 pilot component (1C) - char pilot_signal[3] = "1C"; + std::array pilot_signal = {{'1', 'C', '\0'}}; if (acq_parameters_.use_automatic_resampler) { - galileo_e1_code_gen_complex_sampled(code, pilot_signal, + galileo_e1_code_gen_complex_sampled(code_span, pilot_signal, cboc, gnss_synchro_->PRN, acq_parameters_.resampled_fs, 0, false); } else { - galileo_e1_code_gen_complex_sampled(code, pilot_signal, + galileo_e1_code_gen_complex_sampled(code_span, pilot_signal, cboc, gnss_synchro_->PRN, fs_in_, 0, false); } } else { + std::array Signal_; + std::memcpy(Signal_.data(), gnss_synchro_->Signal, 3); if (acq_parameters_.use_automatic_resampler) { - galileo_e1_code_gen_complex_sampled(code, gnss_synchro_->Signal, + galileo_e1_code_gen_complex_sampled(code_span, Signal_, cboc, gnss_synchro_->PRN, acq_parameters_.resampled_fs, 0, false); } else { - galileo_e1_code_gen_complex_sampled(code, gnss_synchro_->Signal, + galileo_e1_code_gen_complex_sampled(code_span, Signal_, cboc, gnss_synchro_->PRN, fs_in_, 0, false); } } - + gsl::span code__span(code_.data(), vector_length_); for (unsigned int i = 0; i < sampled_ms_ / 4; i++) { - memcpy(&(code_[i * code_length_]), code, sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code__span.subspan(i * code_length_, code_length_).data()); } - acquisition_->set_local_code(code_); - delete[] code; + acquisition_->set_local_code(code_.data()); } diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h index 12aebab73..92c25724b 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h @@ -39,7 +39,9 @@ #include "pcps_acquisition.h" #include #include +#include #include +#include class ConfigurationInterface; @@ -98,13 +100,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -153,10 +156,8 @@ public: /*! * \brief Sets the resampler latency to account it in the acquisition code delay estimation */ - void set_resampler_latency(uint32_t latency_samples) override; - private: ConfigurationInterface* configuration_; Acq_Conf acq_parameters_; @@ -181,7 +182,7 @@ private: bool dump_; bool blocking_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.cc index e7a45bfe7..e1021b6b7 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.cc @@ -40,9 +40,9 @@ #include // for gr_complex #include // for volk_32fc_conjugate_32fc #include -#include // for abs, pow, floor -#include // for complex -#include // for memcpy +#include // for copy_n +#include // for abs, pow, floor +#include // for complex // the following flags are FPGA-specific and they are using arrange the values of the fft of the local code in the way the FPGA // expects. This arrangement is done in the initialisation to avoid consuming unnecessary clock cycles during tracking. @@ -108,11 +108,12 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( // compute all the GALILEO E1 PRN Codes (this is done only once in the class constructor in order to avoid re-computing the PRN codes every time // a channel is assigned) - auto* fft_if = new gr::fft::fft_complex(nsamples_total, true); // Direct FFT - auto* code = new std::complex[nsamples_total]; // buffer for the local code + auto fft_if = std::unique_ptr(new gr::fft::fft_complex(nsamples_total, true)); // Direct FFT + std::vector> code(nsamples_total); // buffer for the local code auto* fft_codes_padded = static_cast(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_all_fft_codes_ = new uint32_t[(nsamples_total * GALILEO_E1_NUMBER_OF_CODES)]; // memory containing all the possible fft codes for PRN 0 to 32 - float max; // temporary maxima search + d_all_fft_codes_ = std::vector(nsamples_total * GALILEO_E1_NUMBER_OF_CODES); // memory containing all the possible fft codes for PRN 0 to 32 + + float max; // temporary maxima search int32_t tmp, tmp2, local_code, fft_data; for (uint32_t PRN = 1; PRN <= GALILEO_E1_NUMBER_OF_CODES; PRN++) @@ -122,14 +123,14 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( if (acquire_pilot_ == true) { //set local signal generator to Galileo E1 pilot component (1C) - char pilot_signal[3] = "1C"; - galileo_e1_code_gen_complex_sampled(code, pilot_signal, + std::array pilot_signal = {{'1', 'C', '\0'}}; + galileo_e1_code_gen_complex_sampled(gsl::span>(code.data(), nsamples_total), pilot_signal, cboc, PRN, fs_in, 0, false); } else { - char data_signal[3] = "1B"; - galileo_e1_code_gen_complex_sampled(code, data_signal, + std::array data_signal = {{'1', 'B', '\0'}}; + galileo_e1_code_gen_complex_sampled(gsl::span>(code.data(), nsamples_total), data_signal, cboc, PRN, fs_in, 0, false); } @@ -144,7 +145,7 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( code[s] = std::complex(0.0, 0.0); } - memcpy(fft_if->get_inbuf(), code, sizeof(gr_complex) * nsamples_total); // copy to FFT buffer + std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer fft_if->execute(); // Run the FFT of local code volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total); // conjugate values @@ -173,7 +174,7 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( } } - acq_parameters.all_fft_codes = d_all_fft_codes_; + acq_parameters.all_fft_codes = d_all_fft_codes_.data(); acq_parameters.num_doppler_bins_step2 = configuration_->property(role + ".second_nbins", 4); acq_parameters.doppler_step2 = configuration_->property(role + ".second_doppler_step", 125.0); @@ -188,17 +189,12 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( doppler_step_ = 0; gnss_synchro_ = nullptr; - // temporary buffers that we can delete - delete[] code; - delete fft_if; - delete[] fft_codes_padded; + // temporary buffers that we can release + volk_gnsssdr_free(fft_codes_padded); } -GalileoE1PcpsAmbiguousAcquisitionFpga::~GalileoE1PcpsAmbiguousAcquisitionFpga() -{ - delete[] d_all_fft_codes_; -} +GalileoE1PcpsAmbiguousAcquisitionFpga::~GalileoE1PcpsAmbiguousAcquisitionFpga() = default; void GalileoE1PcpsAmbiguousAcquisitionFpga::stop_acquisition() diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.h index 83c3f66f5..a92b65e31 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.h @@ -37,7 +37,9 @@ #include // for basic_block_sptr, top_block_sptr #include // for lv_16sc_t #include // for size_t +#include #include +#include class Gnss_Synchro; class ConfigurationInterface; @@ -97,8 +99,8 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; @@ -165,8 +167,7 @@ private: std::string role_; unsigned int in_streams_; unsigned int out_streams_; - - uint32_t* d_all_fft_codes_; // memory that contains all the code ffts + std::vector d_all_fft_codes_; // memory that contains all the code ffts }; #endif /* GNSS_SDR_GALILEO_E1_PCPS_AMBIGUOUS_ACQUISITION_FPGA_H_ */ diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.cc index 1375a22a8..f16c6e5da 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.cc @@ -86,8 +86,8 @@ GalileoE1PcpsCccwsrAmbiguousAcquisition::GalileoE1PcpsCccwsrAmbiguousAcquisition int samples_per_ms = code_length_ / 4; - code_data_ = new gr_complex[vector_length_]; - code_pilot_ = new gr_complex[vector_length_]; + code_data_ = std::vector>(vector_length_); + code_pilot_ = std::vector>(vector_length_); if (item_type_ == "gr_complex") { @@ -111,7 +111,7 @@ GalileoE1PcpsCccwsrAmbiguousAcquisition::GalileoE1PcpsCccwsrAmbiguousAcquisition threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -123,11 +123,7 @@ GalileoE1PcpsCccwsrAmbiguousAcquisition::GalileoE1PcpsCccwsrAmbiguousAcquisition } -GalileoE1PcpsCccwsrAmbiguousAcquisition::~GalileoE1PcpsCccwsrAmbiguousAcquisition() -{ - delete[] code_data_; - delete[] code_pilot_; -} +GalileoE1PcpsCccwsrAmbiguousAcquisition::~GalileoE1PcpsCccwsrAmbiguousAcquisition() = default; void GalileoE1PcpsCccwsrAmbiguousAcquisition::stop_acquisition() @@ -168,6 +164,7 @@ void GalileoE1PcpsCccwsrAmbiguousAcquisition::set_doppler_step(unsigned int dopp } } + void GalileoE1PcpsCccwsrAmbiguousAcquisition::set_gnss_synchro( Gnss_Synchro* gnss_synchro) { @@ -203,19 +200,17 @@ void GalileoE1PcpsCccwsrAmbiguousAcquisition::set_local_code() bool cboc = configuration_->property( "Acquisition" + std::to_string(channel_) + ".cboc", false); - char signal[3]; + std::array signal = {{'1', 'B', '\0'}}; - strcpy(signal, "1B"); - - galileo_e1_code_gen_complex_sampled(code_data_, signal, + galileo_e1_code_gen_complex_sampled(gsl::span(code_data_.data(), vector_length_), signal, cboc, gnss_synchro_->PRN, fs_in_, 0, false); - strcpy(signal, "1C"); + std::array signal_C = {{'1', 'C', '\0'}}; - galileo_e1_code_gen_complex_sampled(code_pilot_, signal, + galileo_e1_code_gen_complex_sampled(gsl::span(code_pilot_.data(), vector_length_), signal_C, cboc, gnss_synchro_->PRN, fs_in_, 0, false); - acquisition_cc_->set_local_code(code_data_, code_pilot_); + acquisition_cc_->set_local_code(code_data_.data(), code_pilot_.data()); } } @@ -228,6 +223,7 @@ void GalileoE1PcpsCccwsrAmbiguousAcquisition::reset() } } + void GalileoE1PcpsCccwsrAmbiguousAcquisition::set_state(int state) { acquisition_cc_->set_state(state); diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.h index b79fe2d33..eac80983c 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.h @@ -36,7 +36,9 @@ #include "gnss_synchro.h" #include "pcps_cccwsr_acquisition_cc.h" #include +#include #include +#include class ConfigurationInterface; @@ -94,13 +96,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_cc_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of CCCWSR algorithm */ @@ -153,7 +156,6 @@ private: std::string item_type_; unsigned int vector_length_; unsigned int code_length_; - //unsigned int satellite_; unsigned int channel_; std::weak_ptr channel_fsm_; float threshold_; @@ -164,8 +166,8 @@ private: int64_t fs_in_; bool dump_; std::string dump_filename_; - std::complex* code_data_; - std::complex* code_pilot_; + std::vector> code_data_; + std::vector> code_pilot_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.cc index a64b3abda..9a3462407 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.cc @@ -36,6 +36,7 @@ #include "gnss_sdr_flags.h" #include #include +#include GalileoE1PcpsQuickSyncAmbiguousAcquisition::GalileoE1PcpsQuickSyncAmbiguousAcquisition( @@ -114,7 +115,7 @@ GalileoE1PcpsQuickSyncAmbiguousAcquisition::GalileoE1PcpsQuickSyncAmbiguousAcqui dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); - code_ = new gr_complex[code_length_]; + code_ = std::vector>(code_length_); LOG(INFO) << "Vector Length: " << vector_length_ << ", Samples per ms: " << samples_per_ms << ", Folding factor: " << folding_factor_ @@ -144,7 +145,7 @@ GalileoE1PcpsQuickSyncAmbiguousAcquisition::GalileoE1PcpsQuickSyncAmbiguousAcqui threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -156,10 +157,7 @@ GalileoE1PcpsQuickSyncAmbiguousAcquisition::GalileoE1PcpsQuickSyncAmbiguousAcqui } -GalileoE1PcpsQuickSyncAmbiguousAcquisition::~GalileoE1PcpsQuickSyncAmbiguousAcquisition() -{ - delete[] code_; -} +GalileoE1PcpsQuickSyncAmbiguousAcquisition::~GalileoE1PcpsQuickSyncAmbiguousAcquisition() = default; void GalileoE1PcpsQuickSyncAmbiguousAcquisition::stop_acquisition() @@ -250,23 +248,20 @@ void GalileoE1PcpsQuickSyncAmbiguousAcquisition::set_local_code() bool cboc = configuration_->property( "Acquisition" + std::to_string(channel_) + ".cboc", false); - auto* code = new std::complex[code_length_]; + std::unique_ptr> code{new std::complex[code_length_]}; + std::array Signal_; + std::memcpy(Signal_.data(), gnss_synchro_->Signal, 3); - galileo_e1_code_gen_complex_sampled(code, gnss_synchro_->Signal, + galileo_e1_code_gen_complex_sampled(gsl::span>(code.get(), code_length_), Signal_, cboc, gnss_synchro_->PRN, fs_in_, 0, false); - + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < (sampled_ms_ / (folding_factor_ * 4)); i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - // memcpy(code_, code,sizeof(gr_complex)*code_length_); - acquisition_cc_->set_local_code(code_); - - delete[] code; - code = nullptr; + acquisition_cc_->set_local_code(code_.data()); } } @@ -279,6 +274,7 @@ void GalileoE1PcpsQuickSyncAmbiguousAcquisition::reset() } } + void GalileoE1PcpsQuickSyncAmbiguousAcquisition::set_state(int state) { if (item_type_ == "gr_complex") diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.h index c717c4ed7..ecbac95b6 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.h @@ -36,7 +36,9 @@ #include "gnss_synchro.h" #include "pcps_quicksync_acquisition_cc.h" #include +#include #include +#include class ConfigurationInterface; @@ -169,7 +171,7 @@ private: int64_t fs_in_; bool dump_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.cc index 6bc6b8ad3..3bb75b971 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.cc @@ -36,6 +36,7 @@ #include "gnss_sdr_flags.h" #include #include +#include GalileoE1PcpsTongAmbiguousAcquisition::GalileoE1PcpsTongAmbiguousAcquisition( @@ -89,7 +90,7 @@ GalileoE1PcpsTongAmbiguousAcquisition::GalileoE1PcpsTongAmbiguousAcquisition( int samples_per_ms = code_length_ / 4; - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "gr_complex") { @@ -114,7 +115,7 @@ GalileoE1PcpsTongAmbiguousAcquisition::GalileoE1PcpsTongAmbiguousAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -126,10 +127,7 @@ GalileoE1PcpsTongAmbiguousAcquisition::GalileoE1PcpsTongAmbiguousAcquisition( } -GalileoE1PcpsTongAmbiguousAcquisition::~GalileoE1PcpsTongAmbiguousAcquisition() -{ - delete[] code_; -} +GalileoE1PcpsTongAmbiguousAcquisition::~GalileoE1PcpsTongAmbiguousAcquisition() = default; void GalileoE1PcpsTongAmbiguousAcquisition::stop_acquisition() @@ -220,20 +218,19 @@ void GalileoE1PcpsTongAmbiguousAcquisition::set_local_code() bool cboc = configuration_->property( "Acquisition" + std::to_string(channel_) + ".cboc", false); - auto* code = new std::complex[code_length_]; - - galileo_e1_code_gen_complex_sampled(code, gnss_synchro_->Signal, + std::unique_ptr> code{new std::complex[code_length_]}; + std::array Signal_; + std::memcpy(Signal_.data(), gnss_synchro_->Signal, 3); + galileo_e1_code_gen_complex_sampled(gsl::span>(code.get(), code_length_), Signal_, cboc, gnss_synchro_->PRN, fs_in_, 0, false); + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < sampled_ms_ / 4; i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_cc_->set_local_code(code_); - - delete[] code; + acquisition_cc_->set_local_code(code_.data()); } } @@ -246,6 +243,7 @@ void GalileoE1PcpsTongAmbiguousAcquisition::reset() } } + void GalileoE1PcpsTongAmbiguousAcquisition::set_state(int state) { acquisition_cc_->set_state(state); diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.h index 2cb201866..402383fcb 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.h @@ -36,7 +36,9 @@ #include "gnss_synchro.h" #include "pcps_tong_acquisition_cc.h" #include +#include #include +#include class ConfigurationInterface; @@ -168,7 +170,7 @@ private: int64_t fs_in_; bool dump_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.cc b/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.cc index 3828c58e6..e02e6b97f 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.cc +++ b/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.cc @@ -42,6 +42,7 @@ #include "gnss_sdr_flags.h" #include #include +#include GalileoE5aNoncoherentIQAcquisitionCaf::GalileoE5aNoncoherentIQAcquisitionCaf( @@ -93,8 +94,8 @@ GalileoE5aNoncoherentIQAcquisitionCaf::GalileoE5aNoncoherentIQAcquisitionCaf( vector_length_ = code_length_ * sampled_ms_; - codeI_ = new gr_complex[vector_length_]; - codeQ_ = new gr_complex[vector_length_]; + codeI_ = std::vector>(vector_length_); + codeQ_ = std::vector>(vector_length_); both_signal_components = false; std::string sig_ = configuration_->property("Channel.signal", std::string("5X")); @@ -119,7 +120,7 @@ GalileoE5aNoncoherentIQAcquisitionCaf::GalileoE5aNoncoherentIQAcquisitionCaf( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -131,11 +132,7 @@ GalileoE5aNoncoherentIQAcquisitionCaf::GalileoE5aNoncoherentIQAcquisitionCaf( } -GalileoE5aNoncoherentIQAcquisitionCaf::~GalileoE5aNoncoherentIQAcquisitionCaf() -{ - delete[] codeI_; - delete[] codeQ_; -} +GalileoE5aNoncoherentIQAcquisitionCaf::~GalileoE5aNoncoherentIQAcquisitionCaf() = default; void GalileoE5aNoncoherentIQAcquisitionCaf::stop_acquisition() @@ -223,55 +220,51 @@ void GalileoE5aNoncoherentIQAcquisitionCaf::set_local_code() { if (item_type_ == "gr_complex") { - auto* codeI = new std::complex[code_length_]; - auto* codeQ = new std::complex[code_length_]; + std::vector> codeI(code_length_); + std::vector> codeQ(code_length_); if (gnss_synchro_->Signal[0] == '5' && gnss_synchro_->Signal[1] == 'X') { - char a[3]; - strcpy(a, "5I"); - galileo_e5_a_code_gen_complex_sampled(codeI, a, + std::array a = {{'5', 'I', '\0'}}; + galileo_e5_a_code_gen_complex_sampled(gsl::span>(codeI.data(), code_length_), a, gnss_synchro_->PRN, fs_in_, 0); - strcpy(a, "5Q"); - galileo_e5_a_code_gen_complex_sampled(codeQ, a, + std::array b = {{'5', 'Q', '\0'}}; + galileo_e5_a_code_gen_complex_sampled(gsl::span>(codeQ.data(), code_length_), b, gnss_synchro_->PRN, fs_in_, 0); } else { - galileo_e5_a_code_gen_complex_sampled(codeI, gnss_synchro_->Signal, + std::array signal_type_ = {{'5', 'X', '\0'}}; + galileo_e5_a_code_gen_complex_sampled(gsl::span>(codeI.data(), code_length_), signal_type_, gnss_synchro_->PRN, fs_in_, 0); } // WARNING: 3ms are coherently integrated. Secondary sequence (1,1,1) // is generated, and modulated in the 'block'. + gsl::span codeQ_span(codeQ_.data(), vector_length_); + gsl::span codeI_span(codeI_.data(), vector_length_); if (Zero_padding == 0) // if no zero_padding { for (unsigned int i = 0; i < sampled_ms_; i++) { - memcpy(&(codeI_[i * code_length_]), codeI, - sizeof(gr_complex) * code_length_); + std::copy_n(codeI.data(), code_length_, codeI_span.subspan(i * code_length_, code_length_).data()); if (gnss_synchro_->Signal[0] == '5' && gnss_synchro_->Signal[1] == 'X') { - memcpy(&(codeQ_[i * code_length_]), codeQ, - sizeof(gr_complex) * code_length_); + std::copy_n(codeQ.data(), code_length_, codeQ_span.subspan(i * code_length_, code_length_).data()); } } } else { // 1ms code + 1ms zero padding - memcpy(&(codeI_[0]), codeI, - sizeof(gr_complex) * code_length_); + std::copy_n(codeI.data(), code_length_, codeI_.data()); if (gnss_synchro_->Signal[0] == '5' && gnss_synchro_->Signal[1] == 'X') { - memcpy(&(codeQ_[0]), codeQ, - sizeof(gr_complex) * code_length_); + std::copy_n(codeQ.data(), code_length_, codeQ_.data()); } } - acquisition_cc_->set_local_code(codeI_, codeQ_); - delete[] codeI; - delete[] codeQ; + acquisition_cc_->set_local_code(codeI_.data(), codeQ_.data()); } } diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.h b/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.h index aefcd7a23..7064c0aa9 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.h +++ b/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.h @@ -41,7 +41,9 @@ #include "channel_fsm.h" #include "galileo_e5a_noncoherent_iq_acquisition_caf_cc.h" #include "gnss_synchro.h" +#include #include +#include class ConfigurationInterface; @@ -95,13 +97,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_cc_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -171,8 +174,8 @@ private: std::string dump_filename_; int Zero_padding; int CAF_window_hz_; - std::complex* codeI_; - std::complex* codeQ_; + std::vector> codeI_; + std::vector> codeQ_; bool both_signal_components; Gnss_Synchro* gnss_synchro_; std::string role_; diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc index 20880ba15..7f8d72196 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc @@ -37,6 +37,7 @@ #include #include #include +#include GalileoE5aPcpsAcquisition::GalileoE5aPcpsAcquisition(ConfigurationInterface* configuration, @@ -123,7 +124,7 @@ GalileoE5aPcpsAcquisition::GalileoE5aPcpsAcquisition(ConfigurationInterface* con code_length_ = static_cast(std::round(static_cast(fs_in_) / GALILEO_E5A_CODE_CHIP_RATE_HZ * static_cast(GALILEO_E5A_CODE_LENGTH_CHIPS))); vector_length_ = code_length_ * sampled_ms_; - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "gr_complex") { @@ -152,7 +153,7 @@ GalileoE5aPcpsAcquisition::GalileoE5aPcpsAcquisition(ConfigurationInterface* con threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -164,10 +165,7 @@ GalileoE5aPcpsAcquisition::GalileoE5aPcpsAcquisition(ConfigurationInterface* con } -GalileoE5aPcpsAcquisition::~GalileoE5aPcpsAcquisition() -{ - delete[] code_; -} +GalileoE5aPcpsAcquisition::~GalileoE5aPcpsAcquisition() = default; void GalileoE5aPcpsAcquisition::stop_acquisition() @@ -235,38 +233,39 @@ void GalileoE5aPcpsAcquisition::init() void GalileoE5aPcpsAcquisition::set_local_code() { - auto* code = new gr_complex[code_length_]; - char signal_[3]; + std::unique_ptr> code{new std::complex[code_length_]}; + std::array signal_; + signal_[0] = '5'; + signal_[2] = '\0'; if (acq_iq_) { - strcpy(signal_, "5X"); + signal_[1] = 'X'; } else if (acq_pilot_) { - strcpy(signal_, "5Q"); + signal_[1] = 'Q'; } else { - strcpy(signal_, "5I"); + signal_[1] = 'I'; } if (acq_parameters_.use_automatic_resampler) { - galileo_e5_a_code_gen_complex_sampled(code, signal_, gnss_synchro_->PRN, acq_parameters_.resampled_fs, 0); + galileo_e5_a_code_gen_complex_sampled(gsl::span(code.get(), code_length_), signal_, gnss_synchro_->PRN, acq_parameters_.resampled_fs, 0); } else { - galileo_e5_a_code_gen_complex_sampled(code, signal_, gnss_synchro_->PRN, fs_in_, 0); + galileo_e5_a_code_gen_complex_sampled(gsl::span(code.get(), code_length_), signal_, gnss_synchro_->PRN, fs_in_, 0); } - + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < sampled_ms_; i++) { - memcpy(code_ + (i * code_length_), code, sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_->set_local_code(code_); - delete[] code; + acquisition_->set_local_code(code_.data()); } diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h index 832f3223a..f6b694a67 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h @@ -35,7 +35,9 @@ #include "channel_fsm.h" #include "gnss_synchro.h" #include "pcps_acquisition.h" +#include #include +#include class ConfigurationInterface; @@ -86,13 +88,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -143,29 +146,23 @@ public: /*! * \brief Sets the resampler latency to account it in the acquisition code delay estimation */ - void set_resampler_latency(uint32_t latency_samples) override; private: float calculate_threshold(float pfa); - ConfigurationInterface* configuration_; - pcps_acquisition_sptr acquisition_; Acq_Conf acq_parameters_; size_t item_size_; - std::string item_type_; std::string dump_filename_; std::string role_; - bool bit_transition_flag_; bool dump_; bool acq_pilot_; bool use_CFAR_; bool blocking_; bool acq_iq_; - unsigned int vector_length_; unsigned int code_length_; unsigned int channel_; @@ -176,18 +173,10 @@ private: unsigned int max_dwells_; unsigned int in_streams_; unsigned int out_streams_; - int64_t fs_in_; - float threshold_; - - /* - std::complex* codeI_; - std::complex* codeQ_; - */ - - gr_complex* code_; - + std::vector> code_; Gnss_Synchro* gnss_synchro_; }; + #endif /* GALILEO_E5A_PCPS_ACQUISITION_H_ */ diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.cc b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.cc index 70b8ac1dc..a0bd49ba0 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.cc @@ -40,9 +40,9 @@ #include // for gr_complex #include // for volk_32fc_conjugate_32fc #include -#include // for abs, pow, floor -#include // for complex -#include // for strcpy, memcpy +#include // for copy_n +#include // for abs, pow, floor +#include // for complex // the following flags are FPGA-specific and they are using arrange the values of the fft of the local code in the way the FPGA // expects. This arrangement is done in the initialisation to avoid consuming unnecessary clock cycles during tracking. @@ -109,32 +109,34 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf // compute all the GALILEO E5 PRN Codes (this is done only once in the class constructor in order to avoid re-computing the PRN codes every time // a channel is assigned) - auto* fft_if = new gr::fft::fft_complex(nsamples_total, true); // Direct FFT - auto* code = new std::complex[nsamples_total]; // buffer for the local code + auto fft_if = std::unique_ptr(new gr::fft::fft_complex(nsamples_total, true)); // Direct FFT + std::vector> code(nsamples_total); // buffer for the local code auto* fft_codes_padded = static_cast(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_all_fft_codes_ = new uint32_t[(nsamples_total * GALILEO_E5A_NUMBER_OF_CODES)]; // memory containing all the possible fft codes for PRN 0 to 32 + d_all_fft_codes_ = std::vector(nsamples_total * GALILEO_E5A_NUMBER_OF_CODES); // memory containing all the possible fft codes for PRN 0 to 32 float max; // temporary maxima search int32_t tmp, tmp2, local_code, fft_data; for (uint32_t PRN = 1; PRN <= GALILEO_E5A_NUMBER_OF_CODES; PRN++) { - char signal_[3]; + std::array signal_; + signal_[0] = '5'; + signal_[2] = '\0'; if (acq_iq_) { - strcpy(signal_, "5X"); + signal_[1] = 'X'; } else if (acq_pilot_) { - strcpy(signal_, "5Q"); + signal_[1] = 'Q'; } else { - strcpy(signal_, "5I"); + signal_[1] = 'I'; } - galileo_e5_a_code_gen_complex_sampled(code, signal_, PRN, fs_in, 0); + galileo_e5_a_code_gen_complex_sampled(gsl::span>(code.data(), nsamples_total), signal_, PRN, fs_in, 0); for (uint32_t s = code_length; s < 2 * code_length; s++) { @@ -147,7 +149,7 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf code[s] = std::complex(0.0, 0.0); } - memcpy(fft_if->get_inbuf(), code, sizeof(gr_complex) * nsamples_total); // copy to FFT buffer + std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer fft_if->execute(); // Run the FFT of local code volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total); // conjugate values @@ -175,7 +177,7 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf } } - acq_parameters.all_fft_codes = d_all_fft_codes_; + acq_parameters.all_fft_codes = d_all_fft_codes_.data(); // reference for the FPGA FFT-IFFT attenuation factor acq_parameters.total_block_exp = configuration_->property(role + ".total_block_exp", 13); @@ -190,17 +192,12 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf doppler_step_ = 0; gnss_synchro_ = nullptr; - // temporary buffers that we can delete - delete[] code; - delete fft_if; - delete[] fft_codes_padded; + // temporary buffers that we can release + volk_gnsssdr_free(fft_codes_padded); } -GalileoE5aPcpsAcquisitionFpga::~GalileoE5aPcpsAcquisitionFpga() -{ - delete[] d_all_fft_codes_; -} +GalileoE5aPcpsAcquisitionFpga::~GalileoE5aPcpsAcquisitionFpga() = default; void GalileoE5aPcpsAcquisitionFpga::stop_acquisition() diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.h b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.h index d30868547..37e0bf9dd 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.h @@ -39,7 +39,9 @@ #include // for lv_16sc_t #include // for size_t #include +#include #include +#include class Gnss_Synchro; class ConfigurationInterface; @@ -99,8 +101,8 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; @@ -167,24 +169,19 @@ public: private: ConfigurationInterface* configuration_; pcps_acquisition_fpga_sptr acquisition_fpga_; - std::string item_type_; std::string dump_filename_; std::string role_; - bool acq_pilot_; bool acq_iq_; - uint32_t channel_; std::weak_ptr channel_fsm_; uint32_t doppler_max_; uint32_t doppler_step_; unsigned int in_streams_; unsigned int out_streams_; - Gnss_Synchro* gnss_synchro_; - - uint32_t* d_all_fft_codes_; // memory that contains all the code ffts + std::vector d_all_fft_codes_; // memory that contains all the code ffts }; #endif /* GNSS_SDR_GALILEO_E5A_PCPS_ACQUISITION_FPGA_H_ */ diff --git a/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.cc index c12ec73c2..bdac10535 100644 --- a/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.cc @@ -39,6 +39,7 @@ #include "gnss_sdr_flags.h" #include #include +#include GlonassL1CaPcpsAcquisition::GlonassL1CaPcpsAcquisition( @@ -93,7 +94,7 @@ GlonassL1CaPcpsAcquisition::GlonassL1CaPcpsAcquisition( vector_length_ *= 2; } - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "cshort") { @@ -125,7 +126,7 @@ GlonassL1CaPcpsAcquisition::GlonassL1CaPcpsAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -137,16 +138,14 @@ GlonassL1CaPcpsAcquisition::GlonassL1CaPcpsAcquisition( } -GlonassL1CaPcpsAcquisition::~GlonassL1CaPcpsAcquisition() -{ - delete[] code_; -} +GlonassL1CaPcpsAcquisition::~GlonassL1CaPcpsAcquisition() = default; void GlonassL1CaPcpsAcquisition::stop_acquisition() { } + void GlonassL1CaPcpsAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + ".pfa", 0.0); @@ -206,18 +205,17 @@ void GlonassL1CaPcpsAcquisition::init() void GlonassL1CaPcpsAcquisition::set_local_code() { - auto* code = new std::complex[code_length_]; + std::unique_ptr> code{new std::complex[code_length_]}; - glonass_l1_ca_code_gen_complex_sampled(code, /* gnss_synchro_->PRN,*/ fs_in_, 0); + glonass_l1_ca_code_gen_complex_sampled(gsl::span>(code, code_length_), /* gnss_synchro_->PRN,*/ fs_in_, 0); + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < sampled_ms_; i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_->set_local_code(code_); - delete[] code; + acquisition_->set_local_code(code_.data()); } diff --git a/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.h b/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.h index a9a6fd18a..1768c3bb4 100644 --- a/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.h @@ -39,7 +39,9 @@ #include "gnss_synchro.h" #include "pcps_acquisition.h" #include +#include #include +#include class ConfigurationInterface; @@ -86,6 +88,7 @@ public: * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) override; + /*! * \brief Set acquisition channel unique ID */ @@ -96,13 +99,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -172,12 +176,11 @@ private: bool dump_; bool blocking_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; - float calculate_threshold(float pfa); }; diff --git a/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.cc index 0b7056da3..2210eebbf 100644 --- a/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.cc @@ -38,6 +38,7 @@ #include "gnss_sdr_flags.h" #include #include +#include GlonassL2CaPcpsAcquisition::GlonassL2CaPcpsAcquisition( @@ -92,7 +93,7 @@ GlonassL2CaPcpsAcquisition::GlonassL2CaPcpsAcquisition( vector_length_ *= 2; } - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "cshort") { @@ -124,7 +125,7 @@ GlonassL2CaPcpsAcquisition::GlonassL2CaPcpsAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -136,10 +137,7 @@ GlonassL2CaPcpsAcquisition::GlonassL2CaPcpsAcquisition( } -GlonassL2CaPcpsAcquisition::~GlonassL2CaPcpsAcquisition() -{ - delete[] code_; -} +GlonassL2CaPcpsAcquisition::~GlonassL2CaPcpsAcquisition() = default; void GlonassL2CaPcpsAcquisition::stop_acquisition() @@ -206,18 +204,17 @@ void GlonassL2CaPcpsAcquisition::init() void GlonassL2CaPcpsAcquisition::set_local_code() { - auto* code = new std::complex[code_length_]; + std::unique_ptr> code{new std::complex[code_length_]}; - glonass_l2_ca_code_gen_complex_sampled(code, /* gnss_synchro_->PRN,*/ fs_in_, 0); + glonass_l2_ca_code_gen_complex_sampled(gsl::span>(code, code_length_), /* gnss_synchro_->PRN,*/ fs_in_, 0); + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < sampled_ms_; i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_->set_local_code(code_); - delete[] code; + acquisition_->set_local_code(code_.data()); } diff --git a/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.h b/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.h index 09b66fbe7..efe36e7ea 100644 --- a/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.h @@ -38,7 +38,9 @@ #include "gnss_synchro.h" #include "pcps_acquisition.h" #include +#include #include +#include class ConfigurationInterface; @@ -96,13 +98,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -172,12 +175,11 @@ private: bool dump_; bool blocking_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; - float calculate_threshold(float pfa); }; diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc index 0c6b9b2d5..9c50bb3c1 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc @@ -41,6 +41,8 @@ #include "gps_sdr_signal_processing.h" #include #include +#include +#include GpsL1CaPcpsAcquisition::GpsL1CaPcpsAcquisition( @@ -121,7 +123,7 @@ GpsL1CaPcpsAcquisition::GpsL1CaPcpsAcquisition( acq_parameters_.samples_per_code = acq_parameters_.samples_per_ms * static_cast(GPS_L1_CA_CODE_PERIOD * 1000.0); vector_length_ = std::floor(acq_parameters_.sampled_ms * acq_parameters_.samples_per_ms) * (acq_parameters_.bit_transition_flag ? 2 : 1); - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "cshort") { @@ -147,7 +149,7 @@ GpsL1CaPcpsAcquisition::GpsL1CaPcpsAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -159,16 +161,14 @@ GpsL1CaPcpsAcquisition::GpsL1CaPcpsAcquisition( } -GpsL1CaPcpsAcquisition::~GpsL1CaPcpsAcquisition() -{ - delete[] code_; -} +GpsL1CaPcpsAcquisition::~GpsL1CaPcpsAcquisition() = default; void GpsL1CaPcpsAcquisition::stop_acquisition() { } + void GpsL1CaPcpsAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + ".pfa", 0.0); @@ -226,24 +226,23 @@ void GpsL1CaPcpsAcquisition::init() void GpsL1CaPcpsAcquisition::set_local_code() { - auto* code = new std::complex[code_length_]; + std::unique_ptr> code{new std::complex[code_length_]}; if (acq_parameters_.use_automatic_resampler) { - gps_l1_ca_code_gen_complex_sampled(code, gnss_synchro_->PRN, acq_parameters_.resampled_fs, 0); + gps_l1_ca_code_gen_complex_sampled(gsl::span>(code, code_length_), gnss_synchro_->PRN, acq_parameters_.resampled_fs, 0); } else { - gps_l1_ca_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0); + gps_l1_ca_code_gen_complex_sampled(gsl::span>(code, code_length_), gnss_synchro_->PRN, fs_in_, 0); } + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < sampled_ms_; i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_->set_local_code(code_); - delete[] code; + acquisition_->set_local_code(code_.data()); } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h index 8d3f0fb64..bef0202bc 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h @@ -43,7 +43,9 @@ #include "pcps_acquisition.h" #include #include +#include #include +#include class ConfigurationInterface; @@ -102,13 +104,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -157,10 +160,8 @@ public: /*! * \brief Sets the resampler latency to account it in the acquisition code delay estimation */ - void set_resampler_latency(uint32_t latency_samples) override; - private: ConfigurationInterface* configuration_; pcps_acquisition_sptr acquisition_; @@ -184,12 +185,11 @@ private: bool dump_; bool blocking_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; - float calculate_threshold(float pfa); }; diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.cc index 6dfcd6452..1c67657b8 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.cc @@ -80,7 +80,7 @@ GpsL1CaPcpsAcquisitionFineDoppler::GpsL1CaPcpsAcquisitionFineDoppler( //--- Find number of samples per spreading code ------------------------- vector_length_ = round(fs_in_ / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); acq_parameters.samples_per_ms = vector_length_; - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "gr_complex") { @@ -97,7 +97,7 @@ GpsL1CaPcpsAcquisitionFineDoppler::GpsL1CaPcpsAcquisitionFineDoppler( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -109,10 +109,7 @@ GpsL1CaPcpsAcquisitionFineDoppler::GpsL1CaPcpsAcquisitionFineDoppler( } -GpsL1CaPcpsAcquisitionFineDoppler::~GpsL1CaPcpsAcquisitionFineDoppler() -{ - delete[] code_; -} +GpsL1CaPcpsAcquisitionFineDoppler::~GpsL1CaPcpsAcquisitionFineDoppler() = default; void GpsL1CaPcpsAcquisitionFineDoppler::stop_acquisition() @@ -163,8 +160,8 @@ void GpsL1CaPcpsAcquisitionFineDoppler::init() void GpsL1CaPcpsAcquisitionFineDoppler::set_local_code() { - gps_l1_ca_code_gen_complex_sampled(code_, gnss_synchro_->PRN, fs_in_, 0); - acquisition_cc_->set_local_code(code_); + gps_l1_ca_code_gen_complex_sampled(gsl::span>(code_.data(), vector_length_), gnss_synchro_->PRN, fs_in_, 0); + acquisition_cc_->set_local_code(code_.data()); } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.h index d310bcfbb..80fc080b6 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.h @@ -37,7 +37,9 @@ #include "channel_fsm.h" #include "gnss_synchro.h" #include "pcps_acquisition_fine_doppler_cc.h" +#include #include +#include class ConfigurationInterface; @@ -95,13 +97,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_cc_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -161,7 +164,7 @@ private: int64_t fs_in_; bool dump_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.cc index 7f0458300..7216d09d5 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.cc @@ -43,9 +43,9 @@ #include // for gr_complex #include // for volk_32fc_conjugate_32fc #include -#include // for abs, pow, floor -#include // for complex -#include // for memcpy +#include // for copy_n +#include // for abs, pow, floor +#include // for complex #define NUM_PRNs 32 @@ -103,17 +103,17 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga( // compute all the GPS L1 PRN Codes (this is done only once upon the class constructor in order to avoid re-computing the PRN codes every time // a channel is assigned) - auto* fft_if = new gr::fft::fft_complex(nsamples_total, true); // Direct FFT + auto fft_if = std::unique_ptr(new gr::fft::fft_complex(nsamples_total, true)); // allocate memory to compute all the PRNs and compute all the possible codes - auto* code = new std::complex[nsamples_total]; // buffer for the local code + std::vector> code(nsamples_total); // buffer for the local code auto* fft_codes_padded = static_cast(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_all_fft_codes_ = new uint32_t[(nsamples_total * NUM_PRNs)]; // memory containing all the possible fft codes for PRN 0 to 32 + d_all_fft_codes_ = std::vector(nsamples_total * NUM_PRNs); // memory containing all the possible fft codes for PRN 0 to 32 float max; int32_t tmp, tmp2, local_code, fft_data; // temporary maxima search for (uint32_t PRN = 1; PRN <= NUM_PRNs; PRN++) { - gps_l1_ca_code_gen_complex_sampled(code, PRN, fs_in, 0); // generate PRN code + gps_l1_ca_code_gen_complex_sampled(gsl::span>(code.data(), nsamples_total), PRN, fs_in, 0); // generate PRN code for (uint32_t s = code_length; s < 2 * code_length; s++) { @@ -126,7 +126,7 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga( code[s] = std::complex(0.0, 0.0); } - memcpy(fft_if->get_inbuf(), code, sizeof(gr_complex) * nsamples_total); // copy to FFT buffer + std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer fft_if->execute(); // Run the FFT of local code volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total); // conjugate values @@ -154,8 +154,8 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga( } } - //acq_parameters - acq_parameters.all_fft_codes = d_all_fft_codes_; + // acq_parameters + acq_parameters.all_fft_codes = d_all_fft_codes_.data(); // reference for the FPGA FFT-IFFT attenuation factor acq_parameters.total_block_exp = configuration_->property(role + ".total_block_exp", 10); @@ -169,18 +169,13 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga( channel_ = 0; doppler_step_ = 0; gnss_synchro_ = nullptr; - - // temporary buffers that we can delete - delete[] code; - delete fft_if; - delete[] fft_codes_padded; + + // temporary buffers that we can release + volk_gnsssdr_free(fft_codes_padded); } -GpsL1CaPcpsAcquisitionFpga::~GpsL1CaPcpsAcquisitionFpga() -{ - delete[] d_all_fft_codes_; -} +GpsL1CaPcpsAcquisitionFpga::~GpsL1CaPcpsAcquisitionFpga() = default; void GpsL1CaPcpsAcquisitionFpga::stop_acquisition() diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.h index f0f652a99..39b8d2e1f 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.h @@ -41,7 +41,9 @@ #include // for basic_block_sptr, top_block_sptr #include // for lv_16sc_t #include // for size_t -#include // for string +#include +#include +#include class Gnss_Synchro; class ConfigurationInterface; @@ -167,7 +169,7 @@ private: std::string role_; unsigned int in_streams_; unsigned int out_streams_; - uint32_t* d_all_fft_codes_; // memory that contains all the code ffts + std::vector d_all_fft_codes_; // memory that contains all the code ffts }; #endif /* GNSS_SDR_GPS_L1_CA_PCPS_ACQUISITION_FPGA_H_ */ diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.cc index efe1dcb1a..592648bd6 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.cc @@ -70,7 +70,7 @@ GpsL1CaPcpsAssistedAcquisition::GpsL1CaPcpsAssistedAcquisition( //--- Find number of samples per spreading code ------------------------- vector_length_ = round(fs_in_ / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); - code_ = new gr_complex[vector_length_]; + code_ = std::make_shared>(vector_length_); if (item_type_ == "gr_complex") { @@ -89,7 +89,7 @@ GpsL1CaPcpsAssistedAcquisition::GpsL1CaPcpsAssistedAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -101,10 +101,7 @@ GpsL1CaPcpsAssistedAcquisition::GpsL1CaPcpsAssistedAcquisition( } -GpsL1CaPcpsAssistedAcquisition::~GpsL1CaPcpsAssistedAcquisition() -{ - delete[] code_; -} +GpsL1CaPcpsAssistedAcquisition::~GpsL1CaPcpsAssistedAcquisition() = default; void GpsL1CaPcpsAssistedAcquisition::stop_acquisition() @@ -154,8 +151,8 @@ void GpsL1CaPcpsAssistedAcquisition::init() void GpsL1CaPcpsAssistedAcquisition::set_local_code() { - gps_l1_ca_code_gen_complex_sampled(code_, gnss_synchro_->PRN, fs_in_, 0); - acquisition_cc_->set_local_code(code_); + gps_l1_ca_code_gen_complex_sampled(gsl::span(code_.get(), vector_length_), gnss_synchro_->PRN, fs_in_, 0); + acquisition_cc_->set_local_code(code_.get()); } void GpsL1CaPcpsAssistedAcquisition::reset() diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.h index 222bfafe8..9b38e6608 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.h @@ -37,7 +37,9 @@ #include "channel_fsm.h" #include "gnss_synchro.h" #include "pcps_assisted_acquisition_cc.h" +#include #include +#include class ConfigurationInterface; @@ -95,13 +97,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_cc_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -147,7 +150,6 @@ private: size_t item_size_; std::string item_type_; unsigned int vector_length_; - //unsigned int satellite_; unsigned int channel_; std::weak_ptr channel_fsm_; float threshold_; @@ -159,7 +161,7 @@ private: int64_t fs_in_; bool dump_; std::string dump_filename_; - std::complex* code_; + std::shared_ptr> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.cc index 90abee071..de5832cf1 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.cc @@ -36,6 +36,7 @@ #include "gps_sdr_signal_processing.h" #include #include +#include GpsL1CaPcpsOpenClAcquisition::GpsL1CaPcpsOpenClAcquisition( @@ -59,7 +60,10 @@ GpsL1CaPcpsOpenClAcquisition::GpsL1CaPcpsOpenClAcquisition( fs_in_ = configuration_->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration->property(role + ".doppler_max", 5000); - if (FLAGS_doppler_max != 0) doppler_max_ = FLAGS_doppler_max; + if (FLAGS_doppler_max != 0) + { + doppler_max_ = FLAGS_doppler_max; + } sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 1); bit_transition_flag_ = configuration_->property("Acquisition.bit_transition_flag", false); @@ -81,7 +85,7 @@ GpsL1CaPcpsOpenClAcquisition::GpsL1CaPcpsOpenClAcquisition( vector_length_ = code_length_ * sampled_ms_; - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "gr_complex") { @@ -105,7 +109,7 @@ GpsL1CaPcpsOpenClAcquisition::GpsL1CaPcpsOpenClAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -117,16 +121,14 @@ GpsL1CaPcpsOpenClAcquisition::GpsL1CaPcpsOpenClAcquisition( } -GpsL1CaPcpsOpenClAcquisition::~GpsL1CaPcpsOpenClAcquisition() -{ - delete[] code_; -} +GpsL1CaPcpsOpenClAcquisition::~GpsL1CaPcpsOpenClAcquisition() = default; void GpsL1CaPcpsOpenClAcquisition::stop_acquisition() { } + void GpsL1CaPcpsOpenClAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + std::to_string(channel_) + ".pfa", 0.0); @@ -207,19 +209,17 @@ void GpsL1CaPcpsOpenClAcquisition::set_local_code() { if (item_type_ == "gr_complex") { - auto* code = new std::complex[code_length_]; + std::unique_ptr> code{new std::complex[code_length_]}; - gps_l1_ca_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0); + gps_l1_ca_code_gen_complex_sampled(gsl::span>(code, code_length_), gnss_synchro_->PRN, fs_in_, 0); + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < sampled_ms_; i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_cc_->set_local_code(code_); - - delete[] code; + acquisition_cc_->set_local_code(code_.data()); } } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.h index 350589f17..c70d77a54 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.h @@ -36,7 +36,9 @@ #include "gnss_synchro.h" #include "pcps_opencl_acquisition_cc.h" #include +#include #include +#include class ConfigurationInterface; @@ -94,13 +96,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_cc_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -169,12 +172,11 @@ private: int64_t fs_in_; bool dump_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; - float calculate_threshold(float pfa); }; diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.cc index 37a91768d..251216eab 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.cc @@ -37,6 +37,7 @@ #include "gps_sdr_signal_processing.h" #include #include +#include GpsL1CaPcpsQuickSyncAcquisition::GpsL1CaPcpsQuickSyncAcquisition( @@ -104,7 +105,7 @@ GpsL1CaPcpsQuickSyncAcquisition::GpsL1CaPcpsQuickSyncAcquisition( dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); int samples_per_ms = round(code_length_); - code_ = new gr_complex[code_length_](); + code_ = std::vector>(code_length_); /*Object relevant information for debugging*/ LOG(INFO) << "Implementation: " << this->implementation() << ", Vector Length: " << vector_length_ @@ -137,7 +138,7 @@ GpsL1CaPcpsQuickSyncAcquisition::GpsL1CaPcpsQuickSyncAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -149,16 +150,14 @@ GpsL1CaPcpsQuickSyncAcquisition::GpsL1CaPcpsQuickSyncAcquisition( } -GpsL1CaPcpsQuickSyncAcquisition::~GpsL1CaPcpsQuickSyncAcquisition() -{ - delete[] code_; -} +GpsL1CaPcpsQuickSyncAcquisition::~GpsL1CaPcpsQuickSyncAcquisition() = default; void GpsL1CaPcpsQuickSyncAcquisition::stop_acquisition() { } + void GpsL1CaPcpsQuickSyncAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + std::to_string(channel_) + ".pfa", 0.0); @@ -236,20 +235,17 @@ void GpsL1CaPcpsQuickSyncAcquisition::set_local_code() { if (item_type_ == "gr_complex") { - auto* code = new std::complex[code_length_](); + std::unique_ptr> code{new std::complex[code_length_]}; - gps_l1_ca_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0); + gps_l1_ca_code_gen_complex_sampled(gsl::span>(code, code_length_), gnss_synchro_->PRN, fs_in_, 0); + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < (sampled_ms_ / folding_factor_); i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - //memcpy(code_, code,sizeof(gr_complex)*code_length_); - acquisition_cc_->set_local_code(code_); - - delete[] code; + acquisition_cc_->set_local_code(code_.data()); } } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.h index 110589952..7f5390782 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.h @@ -38,7 +38,9 @@ #include "gnss_synchro.h" #include "pcps_quicksync_acquisition_cc.h" #include +#include #include +#include class ConfigurationInterface; @@ -96,13 +98,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_cc_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -170,12 +173,11 @@ private: int64_t fs_in_; bool dump_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; - float calculate_threshold(float pfa); }; diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.cc index b81877010..c670cc0bb 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.cc @@ -36,6 +36,7 @@ #include "gps_sdr_signal_processing.h" #include #include +#include GpsL1CaPcpsTongAcquisition::GpsL1CaPcpsTongAcquisition( @@ -75,7 +76,7 @@ GpsL1CaPcpsTongAcquisition::GpsL1CaPcpsTongAcquisition( vector_length_ = code_length_ * sampled_ms_; - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "gr_complex") { @@ -99,7 +100,7 @@ GpsL1CaPcpsTongAcquisition::GpsL1CaPcpsTongAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -111,16 +112,14 @@ GpsL1CaPcpsTongAcquisition::GpsL1CaPcpsTongAcquisition( } -GpsL1CaPcpsTongAcquisition::~GpsL1CaPcpsTongAcquisition() -{ - delete[] code_; -} +GpsL1CaPcpsTongAcquisition::~GpsL1CaPcpsTongAcquisition() = default; void GpsL1CaPcpsTongAcquisition::stop_acquisition() { } + void GpsL1CaPcpsTongAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + std::to_string(channel_) + ".pfa", 0.0); @@ -193,23 +192,22 @@ void GpsL1CaPcpsTongAcquisition::init() //set_local_code(); } + void GpsL1CaPcpsTongAcquisition::set_local_code() { if (item_type_ == "gr_complex") { - auto* code = new std::complex[code_length_]; + std::unique_ptr> code{new std::complex[code_length_]}; - gps_l1_ca_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0); + gps_l1_ca_code_gen_complex_sampled(gsl::span>(code, code_length_), gnss_synchro_->PRN, fs_in_, 0); + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < sampled_ms_; i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_cc_->set_local_code(code_); - - delete[] code; + acquisition_cc_->set_local_code(code_.data()); } } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.h index 856b1c603..7193e5466 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.h @@ -37,7 +37,9 @@ #include "gnss_synchro.h" #include "pcps_tong_acquisition_cc.h" #include +#include #include +#include class ConfigurationInterface; @@ -95,13 +97,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_cc_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of TONG algorithm */ @@ -169,12 +172,11 @@ private: int64_t fs_in_; bool dump_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; - float calculate_threshold(float pfa); }; diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc index 6e529684c..d424bdb5f 100644 --- a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc @@ -39,6 +39,7 @@ #include "gps_l2c_signal.h" #include #include +#include GpsL2MPcpsAcquisition::GpsL2MPcpsAcquisition( @@ -126,7 +127,7 @@ GpsL2MPcpsAcquisition::GpsL2MPcpsAcquisition( acq_parameters_.samples_per_code = acq_parameters_.samples_per_ms * static_cast(GPS_L2_M_PERIOD * 1000.0); vector_length_ = acq_parameters_.sampled_ms * acq_parameters_.samples_per_ms * (acq_parameters_.bit_transition_flag ? 2 : 1); - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); if (item_type_ == "cshort") { @@ -151,7 +152,7 @@ GpsL2MPcpsAcquisition::GpsL2MPcpsAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + num_codes_ = acq_parameters_.sampled_ms / acq_parameters_.ms_per_code; if (in_streams_ > 1) { @@ -164,10 +165,7 @@ GpsL2MPcpsAcquisition::GpsL2MPcpsAcquisition( } -GpsL2MPcpsAcquisition::~GpsL2MPcpsAcquisition() -{ - delete[] code_; -} +GpsL2MPcpsAcquisition::~GpsL2MPcpsAcquisition() = default; void GpsL2MPcpsAcquisition::stop_acquisition() @@ -239,27 +237,24 @@ void GpsL2MPcpsAcquisition::init() void GpsL2MPcpsAcquisition::set_local_code() { - auto* code = new std::complex[code_length_]; - + std::unique_ptr> code{new std::complex[code_length_]}; if (acq_parameters_.use_automatic_resampler) { - gps_l2c_m_code_gen_complex_sampled(code, gnss_synchro_->PRN, acq_parameters_.resampled_fs); + gps_l2c_m_code_gen_complex_sampled(gsl::span>(code.get(), code_length_), gnss_synchro_->PRN, acq_parameters_.resampled_fs); } else { - gps_l2c_m_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_); + gps_l2c_m_code_gen_complex_sampled(gsl::span>(code.get(), code_length_), gnss_synchro_->PRN, fs_in_); } - + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < num_codes_; i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_->set_local_code(code_); - delete[] code; + acquisition_->set_local_code(code_.data()); } @@ -268,6 +263,7 @@ void GpsL2MPcpsAcquisition::reset() acquisition_->set_active(true); } + void GpsL2MPcpsAcquisition::set_state(int state) { acquisition_->set_state(state); diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h index d189a3032..25a792d69 100644 --- a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h @@ -40,7 +40,9 @@ #include "pcps_acquisition.h" #include #include +#include #include +#include class ConfigurationInterface; @@ -99,13 +101,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -154,10 +157,8 @@ public: /*! * \brief Sets the resampler latency to account it in the acquisition code delay estimation */ - void set_resampler_latency(uint32_t latency_samples) override; - private: ConfigurationInterface* configuration_; pcps_acquisition_sptr acquisition_; @@ -180,13 +181,12 @@ private: bool dump_; bool blocking_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; unsigned int num_codes_; - float calculate_threshold(float pfa); }; diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.cc b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.cc index ac9517db2..17d98fc25 100644 --- a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.cc @@ -42,9 +42,9 @@ #include // for gr_complex #include // for volk_32fc_conjugate_32fc #include -#include // for abs, pow, floor -#include // for complex -#include // for memcpy +#include // for copy_n +#include // for abs, pow, floor +#include // for complex #define NUM_PRNs 32 #define QUANT_BITS_LOCAL_CODE 16 @@ -102,24 +102,24 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga( // compute all the GPS L2C PRN Codes (this is done only once upon the class constructor in order to avoid re-computing the PRN codes every time // a channel is assigned) - auto* fft_if = new gr::fft::fft_complex(vector_length, true); // Direct FFT + auto fft_if = std::unique_ptr(new gr::fft::fft_complex(nsamples_total, true)); // Direct FFT // allocate memory to compute all the PRNs and compute all the possible codes - auto* code = new std::complex[nsamples_total]; // buffer for the local code + std::vector> code(nsamples_total); // buffer for the local code auto* fft_codes_padded = static_cast(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - //d_all_fft_codes_ = new lv_16sc_t[nsamples_total * NUM_PRNs]; // memory containing all the possible fft codes for PRN 0 to 32 - d_all_fft_codes_ = new uint32_t[(nsamples_total * NUM_PRNs)]; // memory containing all the possible fft codes for PRN 0 to 32 - float max; // temporary maxima search + d_all_fft_codes_ = std::vector(nsamples_total * NUM_PRNs); // memory containing all the possible fft codes for PRN 0 to 32 + + float max; // temporary maxima search int32_t tmp, tmp2, local_code, fft_data; for (unsigned int PRN = 1; PRN <= NUM_PRNs; PRN++) { - gps_l2c_m_code_gen_complex_sampled(code, PRN, fs_in_); + gps_l2c_m_code_gen_complex_sampled(gsl::span>(code.data(), nsamples_total), PRN, fs_in_); // fill in zero padding for (unsigned int s = code_length; s < nsamples_total; s++) { code[s] = std::complex(0.0, 0.0); } - memcpy(fft_if->get_inbuf(), code, sizeof(gr_complex) * nsamples_total); // copy to FFT buffer + std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer fft_if->execute(); // Run the FFT of local code volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total); // conjugate values max = 0; // initialize maximum value @@ -149,28 +149,22 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga( } } - acq_parameters.all_fft_codes = d_all_fft_codes_; - - // temporary buffers that we can delete - delete[] code; - delete fft_if; - delete[] fft_codes_padded; + acq_parameters.all_fft_codes = d_all_fft_codes_.data(); acquisition_fpga_ = pcps_make_acquisition_fpga(acq_parameters); channel_ = 0; doppler_step_ = 0; gnss_synchro_ = nullptr; - threshold_ = 0.0; + + // temporary buffers that we can release + volk_gnsssdr_free(fft_codes_padded); } -GpsL2MPcpsAcquisitionFpga::~GpsL2MPcpsAcquisitionFpga() -{ - delete[] d_all_fft_codes_; -} +GpsL2MPcpsAcquisitionFpga::~GpsL2MPcpsAcquisitionFpga() = default; void GpsL2MPcpsAcquisitionFpga::stop_acquisition() diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.h b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.h index 7c30efb85..9507abffd 100644 --- a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.h @@ -39,7 +39,9 @@ #include // for basic_block_sptr, top_block_sptr #include // for lv_16sc_t #include // for size_t +#include // for weak_ptr #include // for string +#include class Gnss_Synchro; class ConfigurationInterface; @@ -98,8 +100,8 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; @@ -168,10 +170,7 @@ private: std::string role_; unsigned int in_streams_; unsigned int out_streams_; - - uint32_t* d_all_fft_codes_; // memory that contains all the code ffts - - //float calculate_threshold(float pfa); + std::vector d_all_fft_codes_; // memory that contains all the code ffts }; #endif /* GNSS_SDR_GPS_L2_M_PCPS_ACQUISITION_FPGA_H_ */ diff --git a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc index 7a587598a..8b0a6e793 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc @@ -39,6 +39,7 @@ #include "gps_l5_signal.h" #include #include +#include GpsL5iPcpsAcquisition::GpsL5iPcpsAcquisition( @@ -133,7 +134,7 @@ GpsL5iPcpsAcquisition::GpsL5iPcpsAcquisition( acq_parameters_.samples_per_code = acq_parameters_.samples_per_ms * static_cast(GPS_L5I_PERIOD * 1000.0); vector_length_ = std::floor(acq_parameters_.sampled_ms * acq_parameters_.samples_per_ms) * (acq_parameters_.bit_transition_flag ? 2 : 1); - code_ = new gr_complex[vector_length_]; + code_ = std::vector>(vector_length_); acquisition_ = pcps_make_acquisition(acq_parameters_); DLOG(INFO) << "acquisition(" << acquisition_->unique_id() << ")"; @@ -147,7 +148,7 @@ GpsL5iPcpsAcquisition::GpsL5iPcpsAcquisition( threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = nullptr; - + if (in_streams_ > 1) { LOG(ERROR) << "This implementation only supports one input stream"; @@ -159,10 +160,7 @@ GpsL5iPcpsAcquisition::GpsL5iPcpsAcquisition( } -GpsL5iPcpsAcquisition::~GpsL5iPcpsAcquisition() -{ - delete[] code_; -} +GpsL5iPcpsAcquisition::~GpsL5iPcpsAcquisition() = default; void GpsL5iPcpsAcquisition::stop_acquisition() @@ -230,28 +228,27 @@ void GpsL5iPcpsAcquisition::init() acquisition_->init(); } + void GpsL5iPcpsAcquisition::set_local_code() { - auto* code = new std::complex[code_length_]; - + std::unique_ptr> code{new std::complex[code_length_]}; if (acq_parameters_.use_automatic_resampler) { - gps_l5i_code_gen_complex_sampled(code, gnss_synchro_->PRN, acq_parameters_.resampled_fs); + gps_l5i_code_gen_complex_sampled(gsl::span>(code.get(), code_length_), gnss_synchro_->PRN, acq_parameters_.resampled_fs); } else { - gps_l5i_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_); + gps_l5i_code_gen_complex_sampled(gsl::span>(code.get(), code_length_), gnss_synchro_->PRN, fs_in_); } + gsl::span code_span(code_.data(), vector_length_); for (unsigned int i = 0; i < num_codes_; i++) { - memcpy(&(code_[i * code_length_]), code, - sizeof(gr_complex) * code_length_); + std::copy_n(code.get(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); } - acquisition_->set_local_code(code_); - delete[] code; + acquisition_->set_local_code(code_.data()); } @@ -260,6 +257,7 @@ void GpsL5iPcpsAcquisition::reset() acquisition_->set_active(true); } + void GpsL5iPcpsAcquisition::set_state(int state) { acquisition_->set_state(state); @@ -359,6 +357,7 @@ gr::basic_block_sptr GpsL5iPcpsAcquisition::get_right_block() return acquisition_; } + void GpsL5iPcpsAcquisition::set_resampler_latency(uint32_t latency_samples) { acquisition_->set_resampler_latency(latency_samples); diff --git a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h index 576c86e33..17a1b634c 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h @@ -31,8 +31,8 @@ * ------------------------------------------------------------------------- */ -#ifndef GNSS_SDR_GPS_L5i_PCPS_ACQUISITION_H_ -#define GNSS_SDR_GPS_L5i_PCPS_ACQUISITION_H_ +#ifndef GNSS_SDR_GPS_L5I_PCPS_ACQUISITION_H_ +#define GNSS_SDR_GPS_L5I_PCPS_ACQUISITION_H_ #include "channel_fsm.h" #include "complex_byte_to_float_x2.h" @@ -40,7 +40,9 @@ #include "pcps_acquisition.h" #include #include +#include #include +#include class ConfigurationInterface; @@ -99,13 +101,14 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; acquisition_->set_channel_fsm(channel_fsm); } + /*! * \brief Set statistics threshold of PCPS algorithm */ @@ -154,7 +157,6 @@ public: /*! * \brief Sets the resampler latency to account it in the acquisition code delay estimation */ - void set_resampler_latency(uint32_t latency_samples) override; private: @@ -179,14 +181,13 @@ private: bool dump_; bool blocking_; std::string dump_filename_; - std::complex* code_; + std::vector> code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int num_codes_; unsigned int in_streams_; unsigned int out_streams_; - float calculate_threshold(float pfa); }; -#endif /* GNSS_SDR_GPS_L5i_PCPS_ACQUISITION_H_ */ +#endif /* GNSS_SDR_GPS_L5I_PCPS_ACQUISITION_H_ */ diff --git a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.cc b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.cc index 1a8f37ba2..30bd9d407 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.cc @@ -43,9 +43,9 @@ #include // for gr_complex #include // for volk_32fc_conjugate_32fc #include -#include // for abs, pow, floor -#include // for complex -#include // for memcpy +#include // for copy_n +#include // for abs, pow, floor +#include // for complex #define NUM_PRNs 32 @@ -108,17 +108,17 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga( // compute all the GPS L5 PRN Codes (this is done only once upon the class constructor in order to avoid re-computing the PRN codes every time // a channel is assigned) - auto* fft_if = new gr::fft::fft_complex(nsamples_total, true); // Direct FFT - auto* code = new gr_complex[nsamples_total]; + auto fft_if = std::unique_ptr(new gr::fft::fft_complex(nsamples_total, true)); // Direct FFT + std::vector> code(nsamples_total); auto* fft_codes_padded = static_cast(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_all_fft_codes_ = new uint32_t[(nsamples_total * NUM_PRNs)]; // memory containing all the possible fft codes for PRN 0 to 32 + d_all_fft_codes_ = std::vector(nsamples_total * NUM_PRNs); // memory containing all the possible fft codes for PRN 0 to 32 float max; // temporary maxima search int32_t tmp, tmp2, local_code, fft_data; for (uint32_t PRN = 1; PRN <= NUM_PRNs; PRN++) { - gps_l5i_code_gen_complex_sampled(code, PRN, fs_in); + gps_l5i_code_gen_complex_sampled(gsl::span(code.data(), nsamples_total), PRN, fs_in); for (uint32_t s = code_length; s < 2 * code_length; s++) { @@ -130,7 +130,7 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga( // fill in zero padding code[s] = std::complex(0.0, 0.0); } - memcpy(fft_if->get_inbuf(), code, sizeof(gr_complex) * nsamples_total); // copy to FFT buffer + std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer fft_if->execute(); // Run the FFT of local code volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total); // conjugate values @@ -158,7 +158,7 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga( } } - acq_parameters.all_fft_codes = d_all_fft_codes_; + acq_parameters.all_fft_codes = d_all_fft_codes_.data(); // reference for the FPGA FFT-IFFT attenuation factor acq_parameters.total_block_exp = configuration_->property(role + ".total_block_exp", 13); @@ -173,18 +173,12 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga( doppler_step_ = 0; gnss_synchro_ = nullptr; - // temporary buffers that we can delete - delete[] code; - delete fft_if; - delete[] fft_codes_padded; + // temporary buffers that we can release + volk_gnsssdr_free(fft_codes_padded); } -GpsL5iPcpsAcquisitionFpga::~GpsL5iPcpsAcquisitionFpga() -{ - //delete[] code_; - delete[] d_all_fft_codes_; -} +GpsL5iPcpsAcquisitionFpga::~GpsL5iPcpsAcquisitionFpga() = default; void GpsL5iPcpsAcquisitionFpga::stop_acquisition() diff --git a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.h b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.h index ebcbe5f31..1d5c8e922 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.h @@ -40,7 +40,9 @@ #include // for basic_block_sptr, top_block_sptr #include // for lv_16sc_t #include // for size_t +#include #include +#include class Gnss_Synchro; class ConfigurationInterface; @@ -99,8 +101,8 @@ public: } /*! - * \brief Set channel fsm associated to this acquisition instance - */ + * \brief Set channel fsm associated to this acquisition instance + */ inline void set_channel_fsm(std::weak_ptr channel_fsm) override { channel_fsm_ = channel_fsm; @@ -167,9 +169,7 @@ private: std::string role_; unsigned int in_streams_; unsigned int out_streams_; - - uint32_t* d_all_fft_codes_; // memory that contains all the code ffts - + std::vector d_all_fft_codes_; // memory that contains all the code ffts float calculate_threshold(float pfa); }; diff --git a/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc index 3c5a7e76a..41a5ab093 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc @@ -145,10 +145,10 @@ galileo_e5a_noncoherentIQ_acquisition_caf_cc::galileo_e5a_noncoherentIQ_acquisit } // Direct FFT - d_fft_if = new gr::fft::fft_complex(d_fft_size, true); + d_fft_if = std::make_shared(d_fft_size, true); // Inverse FFT - d_ifft = new gr::fft::fft_complex(d_fft_size, false); + d_ifft = std::make_shared(d_fft_size, false); // For dumping samples into a file d_dump = dump; @@ -210,9 +210,6 @@ galileo_e5a_noncoherentIQ_acquisition_caf_cc::~galileo_e5a_noncoherentIQ_acquisi } } - delete d_fft_if; - delete d_ifft; - try { if (d_dump) diff --git a/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.h b/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.h index adecd3a87..7b6b9925f 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.h @@ -44,6 +44,7 @@ #include #include #include +#include #include #include @@ -122,8 +123,8 @@ private: gr_complex* d_fft_code_Q_A; gr_complex* d_fft_code_Q_B; gr_complex* d_inbuffer; - gr::fft::fft_complex* d_fft_if; - gr::fft::fft_complex* d_ifft; + std::shared_ptr d_fft_if; + std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; diff --git a/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.cc index 4d94413db..2fcdc7afe 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.cc @@ -87,10 +87,10 @@ galileo_pcps_8ms_acquisition_cc::galileo_pcps_8ms_acquisition_cc( d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); // Direct FFT - d_fft_if = new gr::fft::fft_complex(d_fft_size, true); + d_fft_if = std::make_shared(d_fft_size, true); // Inverse FFT - d_ifft = new gr::fft::fft_complex(d_fft_size, false); + d_ifft = std::make_shared(d_fft_size, false); // For dumping samples into a file d_dump = dump; @@ -123,9 +123,6 @@ galileo_pcps_8ms_acquisition_cc::~galileo_pcps_8ms_acquisition_cc() volk_gnsssdr_free(d_fft_code_B); volk_gnsssdr_free(d_magnitude); - delete d_ifft; - delete d_fft_if; - try { if (d_dump) diff --git a/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.h index b080c1ef4..1dd5b5e78 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.h @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -105,8 +106,8 @@ private: uint32_t d_num_doppler_bins; gr_complex* d_fft_code_A; gr_complex* d_fft_code_B; - gr::fft::fft_complex* d_fft_if; - gr::fft::fft_complex* d_ifft; + std::shared_ptr d_fft_if; + std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; uint32_t d_code_phase; float d_doppler_freq; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc index 3cf3564d5..39270efe3 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc @@ -140,10 +140,10 @@ pcps_acquisition::pcps_acquisition(const Acq_Conf& conf_) : gr::block("pcps_acqu d_input_signal = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // Direct FFT - d_fft_if = new gr::fft::fft_complex(d_fft_size, true); + d_fft_if = std::make_shared(d_fft_size, true); // Inverse FFT - d_ifft = new gr::fft::fft_complex(d_fft_size, false); + d_ifft = std::make_shared(d_fft_size, false); d_gnss_synchro = nullptr; d_grid_doppler_wipeoffs = nullptr; @@ -237,8 +237,6 @@ pcps_acquisition::~pcps_acquisition() volk_gnsssdr_free(d_magnitude); volk_gnsssdr_free(d_tmp_buffer); volk_gnsssdr_free(d_input_signal); - delete d_ifft; - delete d_fft_if; volk_gnsssdr_free(d_data_buffer); if (d_cshort) { @@ -450,7 +448,7 @@ void pcps_acquisition::send_positive_acquisition() if (!d_channel_fsm.expired()) { - //the channel FSM is set, so, notify it directly the positive acquisition to minimize delays + // the channel FSM is set, so, notify it directly the positive acquisition to minimize delays d_channel_fsm.lock()->Event_valid_acquisition(); } else @@ -510,11 +508,11 @@ void pcps_acquisition::dump_results(int32_t effective_fft_size) dims[0] = static_cast(1); dims[1] = static_cast(1); - matvar = Mat_VarCreate("doppler_max", MAT_C_UINT32, MAT_T_UINT32, 1, dims, &acq_parameters.doppler_max, 0); + matvar = Mat_VarCreate("doppler_max", MAT_C_INT32, MAT_T_INT32, 1, dims, &acq_parameters.doppler_max, 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("doppler_step", MAT_C_UINT32, MAT_T_UINT32, 1, dims, &d_doppler_step, 0); + matvar = Mat_VarCreate("doppler_step", MAT_C_INT32, MAT_T_INT32, 1, dims, &d_doppler_step, 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); @@ -552,7 +550,7 @@ void pcps_acquisition::dump_results(int32_t effective_fft_size) Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("num_dwells", MAT_C_UINT32, MAT_T_UINT32, 1, dims, &d_num_noncoherent_integrations_counter, 0); + matvar = Mat_VarCreate("num_dwells", MAT_C_INT32, MAT_T_INT32, 1, dims, &d_num_noncoherent_integrations_counter, 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); @@ -774,7 +772,7 @@ void pcps_acquisition::acquisition_core(uint64_t samp_count) } if (acq_parameters.use_automatic_resampler) { - //take into account the acquisition resampler ratio + // take into account the acquisition resampler ratio d_gnss_synchro->Acq_delay_samples = static_cast(std::fmod(static_cast(indext), acq_parameters.samples_per_code)) * acq_parameters.resampler_ratio; d_gnss_synchro->Acq_delay_samples -= static_cast(acq_parameters.resampler_latency_samples); //account the resampler filter latency d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); @@ -832,7 +830,7 @@ void pcps_acquisition::acquisition_core(uint64_t samp_count) if (acq_parameters.use_automatic_resampler) { - //take into account the acquisition resampler ratio + // take into account the acquisition resampler ratio d_gnss_synchro->Acq_delay_samples = static_cast(std::fmod(static_cast(indext), acq_parameters.samples_per_code)) * acq_parameters.resampler_ratio; d_gnss_synchro->Acq_delay_samples -= static_cast(acq_parameters.resampler_latency_samples); //account the resampler filter latency d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h index 42e2df1bc..b7b27c70c 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h @@ -62,6 +62,7 @@ #include // for gr_vector_const_void_star #include // for lv_16sc_t #include +#include #include #include @@ -138,8 +139,8 @@ private: gr_complex* d_fft_codes; gr_complex* d_data_buffer; lv_16sc_t* d_data_buffer_sc; - gr::fft::fft_complex* d_fft_if; - gr::fft::fft_complex* d_ifft; + std::shared_ptr d_fft_if; + std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; arma::fmat grid_; arma::fmat narrow_grid_; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc index aa5af66c9..1a3642af9 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc @@ -93,10 +93,10 @@ pcps_acquisition_fine_doppler_cc::pcps_acquisition_fine_doppler_cc(const Acq_Con d_10_ms_buffer = static_cast(volk_gnsssdr_malloc(50 * d_samples_per_ms * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // Direct FFT - d_fft_if = new gr::fft::fft_complex(d_fft_size, true); + d_fft_if = std::make_shared(d_fft_size, true); // Inverse FFT - d_ifft = new gr::fft::fft_complex(d_fft_size, false); + d_ifft = std::make_shared(d_fft_size, false); // For dumping samples into a file d_dump = conf_.dump; @@ -168,6 +168,7 @@ unsigned int pcps_acquisition_fine_doppler_cc::nextPowerOf2(unsigned int n) return n; } + void pcps_acquisition_fine_doppler_cc::set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; @@ -208,8 +209,6 @@ pcps_acquisition_fine_doppler_cc::~pcps_acquisition_fine_doppler_cc() volk_gnsssdr_free(d_fft_codes); volk_gnsssdr_free(d_magnitude); volk_gnsssdr_free(d_10_ms_buffer); - delete d_ifft; - delete d_fft_if; free_grid_memory(); } @@ -430,7 +429,7 @@ int pcps_acquisition_fine_doppler_cc::estimate_Doppler() //1. generate local code aligned with the acquisition code phase estimation auto *code_replica = static_cast(volk_gnsssdr_malloc(signal_samples * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - gps_l1_ca_code_gen_complex_sampled(code_replica, d_gnss_synchro->PRN, d_fs_in, 0); + gps_l1_ca_code_gen_complex_sampled(gsl::span(code_replica, signal_samples * sizeof(gr_complex)), d_gnss_synchro->PRN, d_fs_in, 0); int shift_index = static_cast(d_gnss_synchro->Acq_delay_samples); @@ -705,11 +704,11 @@ void pcps_acquisition_fine_doppler_cc::dump_results(int effective_fft_size) dims[0] = static_cast(1); dims[1] = static_cast(1); - matvar = Mat_VarCreate("doppler_max", MAT_C_UINT32, MAT_T_UINT32, 1, dims, &d_config_doppler_max, 0); + matvar = Mat_VarCreate("doppler_max", MAT_C_INT32, MAT_T_INT32, 1, dims, &d_config_doppler_max, 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("doppler_step", MAT_C_UINT32, MAT_T_UINT32, 1, dims, &d_doppler_step, 0); + matvar = Mat_VarCreate("doppler_step", MAT_C_INT32, MAT_T_INT32, 1, dims, &d_doppler_step, 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.h index 2f992c1fc..6da3e51e8 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.h @@ -58,6 +58,7 @@ #include #include #include +#include #include #include @@ -109,8 +110,8 @@ private: float** d_grid_data; gr_complex** d_grid_doppler_wipeoffs; - gr::fft::fft_complex* d_fft_if; - gr::fft::fft_complex* d_ifft; + std::shared_ptr d_fft_if; + std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc index 37690b1b6..20221f51b 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc @@ -82,10 +82,10 @@ pcps_assisted_acquisition_cc::pcps_assisted_acquisition_cc( d_carrier = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // Direct FFT - d_fft_if = new gr::fft::fft_complex(d_fft_size, true); + d_fft_if = std::make_shared(d_fft_size, true); // Inverse FFT - d_ifft = new gr::fft::fft_complex(d_fft_size, false); + d_ifft = std::make_shared(d_fft_size, false); // For dumping samples into a file d_dump = dump; @@ -129,8 +129,6 @@ pcps_assisted_acquisition_cc::~pcps_assisted_acquisition_cc() { volk_gnsssdr_free(d_carrier); volk_gnsssdr_free(d_fft_codes); - delete d_ifft; - delete d_fft_if; try { if (d_dump) diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.h index e05aa2266..208725b1f 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.h @@ -54,6 +54,7 @@ #include #include #include +#include #include #include @@ -125,8 +126,8 @@ private: float** d_grid_data; gr_complex** d_grid_doppler_wipeoffs; - gr::fft::fft_complex* d_fft_if; - gr::fft::fft_complex* d_ifft; + std::shared_ptr d_fft_if; + std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; uint32_t d_code_phase; float d_doppler_freq; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc index 07a208be8..646885ee7 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc @@ -97,10 +97,10 @@ pcps_cccwsr_acquisition_cc::pcps_cccwsr_acquisition_cc( d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); // Direct FFT - d_fft_if = new gr::fft::fft_complex(d_fft_size, true); + d_fft_if = std::make_shared(d_fft_size, true); // Inverse FFT - d_ifft = new gr::fft::fft_complex(d_fft_size, false); + d_ifft = std::make_shared(d_fft_size, false); // For dumping samples into a file d_dump = dump; @@ -137,9 +137,6 @@ pcps_cccwsr_acquisition_cc::~pcps_cccwsr_acquisition_cc() volk_gnsssdr_free(d_correlation_minus); volk_gnsssdr_free(d_magnitude); - delete d_ifft; - delete d_fft_if; - try { if (d_dump) diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.h index 3c53c54cc..7d5bc3b0e 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.h @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -100,8 +101,8 @@ private: uint32_t d_num_doppler_bins; gr_complex* d_fft_code_data; gr_complex* d_fft_code_pilot; - gr::fft::fft_complex* d_fft_if; - gr::fft::fft_complex* d_ifft; + std::shared_ptr d_fft_if; + std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; uint32_t d_code_phase; float d_doppler_freq; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc index 1e8eef7c5..1516791c4 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc @@ -131,10 +131,10 @@ pcps_opencl_acquisition_cc::pcps_opencl_acquisition_cc( if (d_opencl != 0) { // Direct FFT - d_fft_if = new gr::fft::fft_complex(d_fft_size, true); + d_fft_if = std::make_shared(d_fft_size, true); // Inverse FFT - d_ifft = new gr::fft::fft_complex(d_fft_size, false); + d_ifft = std::make_shared(d_fft_size, false); } // For dumping samples into a file @@ -179,11 +179,6 @@ pcps_opencl_acquisition_cc::~pcps_opencl_acquisition_cc() clFFT_DestroyPlan(d_cl_fft_plan); } - else - { - delete d_ifft; - delete d_fft_if; - } try { diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.h index 919881c92..bab96e123 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.h @@ -123,8 +123,8 @@ private: gr_complex** d_grid_doppler_wipeoffs; uint32_t d_num_doppler_bins; gr_complex* d_fft_codes; - gr::fft::fft_complex* d_fft_if; - gr::fft::fft_complex* d_ifft; + std::shared_ptr d_fft_if; + std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; uint32_t d_code_phase; float d_doppler_freq; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc index 8c88d614b..fe14f7aa6 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc @@ -106,9 +106,9 @@ pcps_quicksync_acquisition_cc::pcps_quicksync_acquisition_cc( d_code = new gr_complex[d_samples_per_code](); // Direct FFT - d_fft_if = new gr::fft::fft_complex(d_fft_size, true); + d_fft_if = std::make_shared(d_fft_size, true); // Inverse FFT - d_ifft = new gr::fft::fft_complex(d_fft_size, false); + d_ifft = std::make_shared(d_fft_size, false); // For dumping samples into a file d_dump = dump; @@ -122,7 +122,6 @@ pcps_quicksync_acquisition_cc::pcps_quicksync_acquisition_cc( d_threshold = 0; d_doppler_step = 0; d_grid_doppler_wipeoffs = nullptr; - d_fft_if2 = nullptr; d_gnss_synchro = nullptr; d_code_phase = 0; d_doppler_freq = 0; @@ -150,8 +149,6 @@ pcps_quicksync_acquisition_cc::~pcps_quicksync_acquisition_cc() volk_gnsssdr_free(d_magnitude); volk_gnsssdr_free(d_magnitude_folded); - delete d_ifft; - delete d_fft_if; delete d_code; delete d_possible_delay; delete d_corr_output_f; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.h index c03c0e916..17e80aa95 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.h @@ -136,9 +136,8 @@ private: gr_complex** d_grid_doppler_wipeoffs; uint32_t d_num_doppler_bins; gr_complex* d_fft_codes; - gr::fft::fft_complex* d_fft_if; - gr::fft::fft_complex* d_fft_if2; - gr::fft::fft_complex* d_ifft; + std::shared_ptr d_fft_if; + std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; uint32_t d_code_phase; float d_doppler_freq; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc index 60b326d8d..3238161bd 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc @@ -113,10 +113,10 @@ pcps_tong_acquisition_cc::pcps_tong_acquisition_cc( d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); // Direct FFT - d_fft_if = new gr::fft::fft_complex(d_fft_size, true); + d_fft_if = std::make_shared(d_fft_size, true); // Inverse FFT - d_ifft = new gr::fft::fft_complex(d_fft_size, false); + d_ifft = std::make_shared(d_fft_size, false); // For dumping samples into a file d_dump = dump; @@ -134,6 +134,7 @@ pcps_tong_acquisition_cc::pcps_tong_acquisition_cc( d_channel = 0; } + pcps_tong_acquisition_cc::~pcps_tong_acquisition_cc() { if (d_num_doppler_bins > 0) @@ -150,9 +151,6 @@ pcps_tong_acquisition_cc::~pcps_tong_acquisition_cc() volk_gnsssdr_free(d_fft_codes); volk_gnsssdr_free(d_magnitude); - delete d_ifft; - delete d_fft_if; - try { if (d_dump) diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.h index a88c488b2..5c8f4c81c 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.h @@ -121,8 +121,8 @@ private: uint32_t d_num_doppler_bins; gr_complex* d_fft_codes; float** d_grid_data; - gr::fft::fft_complex* d_fft_if; - gr::fft::fft_complex* d_ifft; + std::shared_ptr d_fft_if; + std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; uint32_t d_code_phase; float d_doppler_freq; diff --git a/src/algorithms/libs/CMakeLists.txt b/src/algorithms/libs/CMakeLists.txt index ca41943fb..4978a3d78 100644 --- a/src/algorithms/libs/CMakeLists.txt +++ b/src/algorithms/libs/CMakeLists.txt @@ -92,6 +92,23 @@ else() target_link_libraries(algorithms_libs PRIVATE Boost::filesystem Boost::system) endif() +include(CheckCXXSourceCompiles) +check_cxx_source_compiles(" + #include + int main() + { std::span sv; }" + has_span +) + +if(${has_span}) + target_compile_definitions(algorithms_libs PUBLIC -DHAS_SPAN=1) +else() + target_include_directories(algorithms_libs + PUBLIC + ${CMAKE_SOURCE_DIR}/src/algorithms/libs/gsl/include + ) +endif() + target_link_libraries(algorithms_libs PUBLIC Armadillo::armadillo diff --git a/src/algorithms/libs/beidou_b1i_signal_processing.cc b/src/algorithms/libs/beidou_b1i_signal_processing.cc index 61e1ffa47..5b848e6e7 100644 --- a/src/algorithms/libs/beidou_b1i_signal_processing.cc +++ b/src/algorithms/libs/beidou_b1i_signal_processing.cc @@ -34,7 +34,7 @@ auto auxCeil = [](float x) { return static_cast(static_cast((x) + 1)); }; -void beidou_b1i_code_gen_int(int32_t* _dest, int32_t _prn, uint32_t _chip_shift) +void beidou_b1i_code_gen_int(gsl::span _dest, int32_t _prn, uint32_t _chip_shift) { const uint32_t _code_length = 2046; bool G1[_code_length]; @@ -112,12 +112,12 @@ void beidou_b1i_code_gen_int(int32_t* _dest, int32_t _prn, uint32_t _chip_shift) } -void beidou_b1i_code_gen_float(float* _dest, int32_t _prn, uint32_t _chip_shift) +void beidou_b1i_code_gen_float(gsl::span _dest, int32_t _prn, uint32_t _chip_shift) { uint32_t _code_length = 2046; int32_t b1i_code_int[_code_length]; - beidou_b1i_code_gen_int(b1i_code_int, _prn, _chip_shift); + beidou_b1i_code_gen_int(gsl::span(b1i_code_int, _code_length), _prn, _chip_shift); for (uint32_t ii = 0; ii < _code_length; ++ii) { @@ -126,16 +126,16 @@ void beidou_b1i_code_gen_float(float* _dest, int32_t _prn, uint32_t _chip_shift) } -void beidou_b1i_code_gen_complex(std::complex* _dest, int32_t _prn, uint32_t _chip_shift) +void beidou_b1i_code_gen_complex(gsl::span> _dest, int32_t _prn, uint32_t _chip_shift) { uint32_t _code_length = 2046; int32_t b1i_code_int[_code_length]; - beidou_b1i_code_gen_int(b1i_code_int, _prn, _chip_shift); + beidou_b1i_code_gen_int(gsl::span(b1i_code_int, _code_length), _prn, _chip_shift); for (uint32_t ii = 0; ii < _code_length; ++ii) { - _dest[ii] = std::complex(static_cast(b1i_code_int[ii]), 0.0f); + _dest[ii] = std::complex(static_cast(b1i_code_int[ii]), 0.0F); } } @@ -143,7 +143,7 @@ void beidou_b1i_code_gen_complex(std::complex* _dest, int32_t _prn, uint3 /* * Generates complex GPS L1 C/A code for the desired SV ID and sampled to specific sampling frequency */ -void beidou_b1i_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift) +void beidou_b1i_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift) { // This function is based on the GNU software GPS for MATLAB in the Kay Borre book std::complex _code[2046]; diff --git a/src/algorithms/libs/beidou_b1i_signal_processing.h b/src/algorithms/libs/beidou_b1i_signal_processing.h index e653dc3cf..367a6d7b1 100644 --- a/src/algorithms/libs/beidou_b1i_signal_processing.h +++ b/src/algorithms/libs/beidou_b1i_signal_processing.h @@ -36,20 +36,27 @@ #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif + //! Generates int32_t GPS L1 C/A code for the desired SV ID and code shift -void beidou_b1i_code_gen_int(int32_t* _dest, int32_t _prn, uint32_t _chip_shift); +void beidou_b1i_code_gen_int(gsl::span _dest, int32_t _prn, uint32_t _chip_shift); //! Generates float GPS L1 C/A code for the desired SV ID and code shift -void beidou_b1i_code_gen_float(float* _dest, int32_t _prn, uint32_t _chip_shift); +void beidou_b1i_code_gen_float(gsl::span _dest, int32_t _prn, uint32_t _chip_shift); //! Generates complex GPS L1 C/A code for the desired SV ID and code shift, and sampled to specific sampling frequency -void beidou_b1i_code_gen_complex(std::complex* _dest, int32_t _prn, uint32_t _chip_shift); +void beidou_b1i_code_gen_complex(gsl::span> _dest, int32_t _prn, uint32_t _chip_shift); //! Generates N complex GPS L1 C/A codes for the desired SV ID and code shift -void beidou_b1i_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift, uint32_t _ncodes); +void beidou_b1i_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift, uint32_t _ncodes); //! Generates complex GPS L1 C/A code for the desired SV ID and code shift -void beidou_b1i_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift); +void beidou_b1i_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift); #endif /* BEIDOU_B1I_SDR_SIGNAL_PROCESSING_H_ */ diff --git a/src/algorithms/libs/beidou_b3i_signal_processing.cc b/src/algorithms/libs/beidou_b3i_signal_processing.cc index 9b29f8090..ed12c4b30 100644 --- a/src/algorithms/libs/beidou_b3i_signal_processing.cc +++ b/src/algorithms/libs/beidou_b3i_signal_processing.cc @@ -34,7 +34,7 @@ auto auxCeil = [](float x) { return static_cast(static_cast((x) + 1)); }; -void beidou_b3i_code_gen_int(int* _dest, signed int _prn, unsigned int _chip_shift) +void beidou_b3i_code_gen_int(gsl::span _dest, signed int _prn, unsigned int _chip_shift) { const unsigned int _code_length = 10230; bool G1[_code_length]; @@ -113,7 +113,9 @@ void beidou_b3i_code_gen_int(int* _dest, signed int _prn, unsigned int _chip_shi // A simple error check if ((prn_idx < 0) || (prn_idx > 63)) - return; + { + return; + } // Assign shifted G2 register based on prn number G2_register = G2_register_shifted[prn_idx]; @@ -170,7 +172,7 @@ void beidou_b3i_code_gen_int(int* _dest, signed int _prn, unsigned int _chip_shi } -void beidou_b3i_code_gen_float(float* _dest, signed int _prn, unsigned int _chip_shift) +void beidou_b3i_code_gen_float(gsl::span _dest, signed int _prn, unsigned int _chip_shift) { unsigned int _code_length = 10230; int b3i_code_int[10230]; @@ -184,7 +186,7 @@ void beidou_b3i_code_gen_float(float* _dest, signed int _prn, unsigned int _chip } -void beidou_b3i_code_gen_complex(std::complex* _dest, signed int _prn, unsigned int _chip_shift) +void beidou_b3i_code_gen_complex(gsl::span> _dest, signed int _prn, unsigned int _chip_shift) { unsigned int _code_length = 10230; int b3i_code_int[10230]; @@ -193,12 +195,12 @@ void beidou_b3i_code_gen_complex(std::complex* _dest, signed int _prn, un for (unsigned int ii = 0; ii < _code_length; ++ii) { - _dest[ii] = std::complex(static_cast(b3i_code_int[ii]), 0.0f); + _dest[ii] = std::complex(static_cast(b3i_code_int[ii]), 0.0F); } } -void beidou_b3i_code_gen_complex_sampled(std::complex* _dest, unsigned int _prn, int _fs, unsigned int _chip_shift) +void beidou_b3i_code_gen_complex_sampled(gsl::span> _dest, unsigned int _prn, int _fs, unsigned int _chip_shift) { // This function is based on the GNU software GPS for MATLAB in the Kay Borre book std::complex _code[10230]; diff --git a/src/algorithms/libs/beidou_b3i_signal_processing.h b/src/algorithms/libs/beidou_b3i_signal_processing.h index 1bfab5519..7093407ce 100644 --- a/src/algorithms/libs/beidou_b3i_signal_processing.h +++ b/src/algorithms/libs/beidou_b3i_signal_processing.h @@ -39,19 +39,26 @@ #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif + //! Generates int BeiDou B3I code for the desired SV ID and code shift -void beidou_b3i_code_gen_int(int* _dest, signed int _prn, unsigned int _chip_shift); +void beidou_b3i_code_gen_int(gsl::span _dest, signed int _prn, unsigned int _chip_shift); //! Generates float BeiDou B3I code for the desired SV ID and code shift -void beidou_b3i_code_gen_float(float* _dest, signed int _prn, unsigned int _chip_shift); +void beidou_b3i_code_gen_float(gsl::span _dest, signed int _prn, unsigned int _chip_shift); //! Generates complex BeiDou B3I code for the desired SV ID and code shift, and sampled to specific sampling frequency -void beidou_b3i_code_gen_complex(std::complex* _dest, signed int _prn, unsigned int _chip_shift); +void beidou_b3i_code_gen_complex(gsl::span> _dest, signed int _prn, unsigned int _chip_shift); //! Generates N complex BeiDou B3I codes for the desired SV ID and code shift -void beidou_b3i_code_gen_complex_sampled(std::complex* _dest, unsigned int _prn, int _fs, unsigned int _chip_shift, unsigned int _ncodes); +void beidou_b3i_code_gen_complex_sampled(gsl::span> _dest, unsigned int _prn, int _fs, unsigned int _chip_shift, unsigned int _ncodes); //! Generates complex BeiDou B3I code for the desired SV ID and code shift -void beidou_b3i_code_gen_complex_sampled(std::complex* _dest, unsigned int _prn, int _fs, unsigned int _chip_shift); +void beidou_b3i_code_gen_complex_sampled(gsl::span> _dest, unsigned int _prn, int _fs, unsigned int _chip_shift); #endif /* GNSS_SDR_BEIDOU_B3I_SIGNAL_PROCESSING_H_ */ diff --git a/src/algorithms/libs/galileo_e1_signal_processing.cc b/src/algorithms/libs/galileo_e1_signal_processing.cc index d3e92c804..5bed837ee 100644 --- a/src/algorithms/libs/galileo_e1_signal_processing.cc +++ b/src/algorithms/libs/galileo_e1_signal_processing.cc @@ -34,12 +34,13 @@ #include "Galileo_E1.h" #include "gnss_signal_processing.h" #include +#include #include -void galileo_e1_code_gen_int(int* _dest, char _Signal[3], int32_t _prn) +void galileo_e1_code_gen_int(gsl::span _dest, const std::array& _Signal, int32_t _prn) { - std::string _galileo_signal = _Signal; + std::string _galileo_signal = _Signal.data(); int32_t prn = _prn - 1; int32_t index = 0; @@ -53,7 +54,7 @@ void galileo_e1_code_gen_int(int* _dest, char _Signal[3], int32_t _prn) { for (char i : GALILEO_E1_B_PRIMARY_CODE[prn]) { - hex_to_binary_converter(&_dest[index], i); + hex_to_binary_converter(_dest.subspan(index, 4), i); index += 4; } } @@ -61,17 +62,17 @@ void galileo_e1_code_gen_int(int* _dest, char _Signal[3], int32_t _prn) { for (char i : GALILEO_E1_C_PRIMARY_CODE[prn]) { - hex_to_binary_converter(&_dest[index], i); + hex_to_binary_converter(_dest.subspan(index, 4), i); index += 4; } } } -void galileo_e1_sinboc_11_gen_int(int* _dest, const int* _prn, uint32_t _length_out) +void galileo_e1_sinboc_11_gen_int(gsl::span _dest, gsl::span _prn) { const uint32_t _length_in = GALILEO_E1_B_CODE_LENGTH_CHIPS; - auto _period = static_cast(_length_out / _length_in); + auto _period = static_cast(_dest.size() / _length_in); for (uint32_t i = 0; i < _length_in; i++) { for (uint32_t j = 0; j < (_period / 2); j++) @@ -86,10 +87,10 @@ void galileo_e1_sinboc_11_gen_int(int* _dest, const int* _prn, uint32_t _length_ } -void galileo_e1_sinboc_61_gen_int(int* _dest, const int* _prn, uint32_t _length_out) +void galileo_e1_sinboc_61_gen_int(gsl::span _dest, gsl::span _prn) { const uint32_t _length_in = GALILEO_E1_B_CODE_LENGTH_CHIPS; - auto _period = static_cast(_length_out / _length_in); + auto _period = static_cast(_dest.size() / _length_in); for (uint32_t i = 0; i < _length_in; i++) { @@ -105,9 +106,9 @@ void galileo_e1_sinboc_61_gen_int(int* _dest, const int* _prn, uint32_t _length_ } -void galileo_e1_code_gen_sinboc11_float(float* _dest, char _Signal[3], uint32_t _prn) +void galileo_e1_code_gen_sinboc11_float(gsl::span _dest, const std::array& _Signal, uint32_t _prn) { - std::string _galileo_signal = _Signal; + std::string _galileo_signal = _Signal.data(); const auto _codeLength = static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS); int32_t primary_code_E1_chips[4092]; // _codeLength not accepted by Clang galileo_e1_code_gen_int(primary_code_E1_chips, _Signal, _prn); //generate Galileo E1 code, 1 sample per chip @@ -119,18 +120,20 @@ void galileo_e1_code_gen_sinboc11_float(float* _dest, char _Signal[3], uint32_t } -void galileo_e1_gen_float(float* _dest, int* _prn, char _Signal[3]) +void galileo_e1_gen_float(gsl::span _dest, gsl::span _prn, const std::array& _Signal) { - std::string _galileo_signal = _Signal; + std::string _galileo_signal = _Signal.data(); const uint32_t _codeLength = 12 * GALILEO_E1_B_CODE_LENGTH_CHIPS; const float alpha = sqrt(10.0 / 11.0); const float beta = sqrt(1.0 / 11.0); int32_t sinboc_11[12 * 4092] = {0}; // _codeLength not accepted by Clang int32_t sinboc_61[12 * 4092] = {0}; + gsl::span sinboc_11_(sinboc_11, _codeLength); + gsl::span sinboc_61_(sinboc_61, _codeLength); - galileo_e1_sinboc_11_gen_int(sinboc_11, _prn, _codeLength); //generate sinboc(1,1) 12 samples per chip - galileo_e1_sinboc_61_gen_int(sinboc_61, _prn, _codeLength); //generate sinboc(6,1) 12 samples per chip + galileo_e1_sinboc_11_gen_int(sinboc_11_, _prn); //generate sinboc(1,1) 12 samples per chip + galileo_e1_sinboc_61_gen_int(sinboc_61_, _prn); //generate sinboc(6,1) 12 samples per chip if (_galileo_signal.rfind("1B") != std::string::npos && _galileo_signal.length() >= 2) { @@ -151,12 +154,12 @@ void galileo_e1_gen_float(float* _dest, int* _prn, char _Signal[3]) } -void galileo_e1_code_gen_float_sampled(float* _dest, char _Signal[3], +void galileo_e1_code_gen_float_sampled(gsl::span _dest, const std::array& _Signal, bool _cboc, uint32_t _prn, int32_t _fs, uint32_t _chip_shift, bool _secondary_flag) { // This function is based on the GNU software GPS for MATLAB in Kay Borre's book - std::string _galileo_signal = _Signal; + std::string _galileo_signal = _Signal.data(); uint32_t _samplesPerCode; const int32_t _codeFreqBasis = GALILEO_E1_CODE_CHIP_RATE_HZ; // Hz auto _codeLength = static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS); @@ -167,73 +170,78 @@ void galileo_e1_code_gen_float_sampled(float* _dest, char _Signal[3], const uint32_t delay = ((static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS) - _chip_shift) % static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS)) * _samplesPerCode / GALILEO_E1_B_CODE_LENGTH_CHIPS; - galileo_e1_code_gen_int(primary_code_E1_chips, _Signal, _prn); // generate Galileo E1 code, 1 sample per chip - - float* _signal_E1; + galileo_e1_code_gen_int(gsl::span(primary_code_E1_chips, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS)), _Signal, _prn); // generate Galileo E1 code, 1 sample per chip _codeLength = _samplesPerChip * GALILEO_E1_B_CODE_LENGTH_CHIPS; - _signal_E1 = new float[_codeLength]; + std::unique_ptr _signal_E1{new float[_codeLength]}; + gsl::span _signal_E1_span(_signal_E1, _codeLength); if (_cboc == true) { - galileo_e1_gen_float(_signal_E1, primary_code_E1_chips, _Signal); // generate cboc 12 samples per chip + galileo_e1_gen_float(_signal_E1_span, gsl::span(primary_code_E1_chips, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS)), _Signal); // generate cboc 12 samples per chip } else { auto* _signal_E1_int = static_cast(volk_gnsssdr_malloc(_codeLength * sizeof(int32_t), volk_gnsssdr_get_alignment())); - galileo_e1_sinboc_11_gen_int(_signal_E1_int, primary_code_E1_chips, _codeLength); // generate sinboc(1,1) 2 samples per chip + gsl::span _signal_E1_int_span(_signal_E1_int, _codeLength); + galileo_e1_sinboc_11_gen_int(_signal_E1_int_span, gsl::span(primary_code_E1_chips, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS))); // generate sinboc(1,1) 2 samples per chip for (uint32_t ii = 0; ii < _codeLength; ++ii) { - _signal_E1[ii] = static_cast(_signal_E1_int[ii]); + _signal_E1_span[ii] = static_cast(_signal_E1_int_span[ii]); } volk_gnsssdr_free(_signal_E1_int); } if (_fs != _samplesPerChip * _codeFreqBasis) { - auto* _resampled_signal = new float[_samplesPerCode]; + std::unique_ptr _resampled_signal{new float[_samplesPerCode]}; - resampler(_signal_E1, _resampled_signal, _samplesPerChip * _codeFreqBasis, _fs, - _codeLength, _samplesPerCode); // resamples code to fs + resampler(gsl::span(_signal_E1, _codeLength), gsl::span(_resampled_signal, _samplesPerCode), _samplesPerChip * _codeFreqBasis, _fs); // resamples code to fs - delete[] _signal_E1; - _signal_E1 = _resampled_signal; + _signal_E1 = std::move(_resampled_signal); } - + uint32_t size_signal_E1 = _codeLength; + if (_fs != _samplesPerChip * _codeFreqBasis) + { + size_signal_E1 = _samplesPerCode; + } + gsl::span _signal_E1_span_aux(_signal_E1, size_signal_E1); if (_galileo_signal.rfind("1C") != std::string::npos && _galileo_signal.length() >= 2 && _secondary_flag) { - auto* _signal_E1C_secondary = new float[static_cast(GALILEO_E1_C_SECONDARY_CODE_LENGTH) * _samplesPerCode]; - + std::unique_ptr _signal_E1C_secondary{new float[static_cast(GALILEO_E1_C_SECONDARY_CODE_LENGTH) * _samplesPerCode]}; + gsl::span _signal_E1C_secondary_span(_signal_E1C_secondary, static_cast(GALILEO_E1_C_SECONDARY_CODE_LENGTH) * _samplesPerCode); for (uint32_t i = 0; i < static_cast(GALILEO_E1_C_SECONDARY_CODE_LENGTH); i++) { for (unsigned k = 0; k < _samplesPerCode; k++) { - _signal_E1C_secondary[i * _samplesPerCode + k] = _signal_E1[k] * (GALILEO_E1_C_SECONDARY_CODE.at(i) == '0' ? 1.0f : -1.0f); + _signal_E1C_secondary_span[i * _samplesPerCode + k] = _signal_E1_span_aux[k] * (GALILEO_E1_C_SECONDARY_CODE.at(i) == '0' ? 1.0F : -1.0F); } } _samplesPerCode *= static_cast(GALILEO_E1_C_SECONDARY_CODE_LENGTH); - delete[] _signal_E1; - _signal_E1 = _signal_E1C_secondary; + _signal_E1 = std::move(_signal_E1C_secondary); } - + if (_galileo_signal.rfind("1C") != std::string::npos && _galileo_signal.length() >= 2 && _secondary_flag) + { + size_signal_E1 = static_cast(GALILEO_E1_C_SECONDARY_CODE_LENGTH) * _samplesPerCode; + } + gsl::span _signal_E1_span_aux2(_signal_E1, size_signal_E1); for (uint32_t i = 0; i < _samplesPerCode; i++) { - _dest[(i + delay) % _samplesPerCode] = _signal_E1[i]; + _dest[(i + delay) % _samplesPerCode] = _signal_E1_span_aux2[i]; } - delete[] _signal_E1; volk_gnsssdr_free(primary_code_E1_chips); } -void galileo_e1_code_gen_complex_sampled(std::complex* _dest, char _Signal[3], +void galileo_e1_code_gen_complex_sampled(gsl::span> _dest, const std::array& _Signal, bool _cboc, uint32_t _prn, int32_t _fs, uint32_t _chip_shift, bool _secondary_flag) { - std::string _galileo_signal = _Signal; + std::string _galileo_signal = _Signal.data(); const int32_t _codeFreqBasis = GALILEO_E1_CODE_CHIP_RATE_HZ; // Hz auto _samplesPerCode = static_cast(static_cast(_fs) / (static_cast(_codeFreqBasis) / static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS))); @@ -244,25 +252,25 @@ void galileo_e1_code_gen_complex_sampled(std::complex* _dest, char _Signa } auto* real_code = static_cast(volk_gnsssdr_malloc(_samplesPerCode * sizeof(float), volk_gnsssdr_get_alignment())); - - galileo_e1_code_gen_float_sampled(real_code, _Signal, _cboc, _prn, _fs, _chip_shift, _secondary_flag); + gsl::span real_code_span(real_code, _samplesPerCode); + galileo_e1_code_gen_float_sampled(real_code_span, _Signal, _cboc, _prn, _fs, _chip_shift, _secondary_flag); for (uint32_t ii = 0; ii < _samplesPerCode; ++ii) { - _dest[ii] = std::complex(real_code[ii], 0.0f); + _dest[ii] = std::complex(real_code_span[ii], 0.0F); } volk_gnsssdr_free(real_code); } -void galileo_e1_code_gen_float_sampled(float* _dest, char _Signal[3], +void galileo_e1_code_gen_float_sampled(gsl::span _dest, const std::array& _Signal, bool _cboc, uint32_t _prn, int32_t _fs, uint32_t _chip_shift) { galileo_e1_code_gen_float_sampled(_dest, _Signal, _cboc, _prn, _fs, _chip_shift, false); } -void galileo_e1_code_gen_complex_sampled(std::complex* _dest, char _Signal[3], +void galileo_e1_code_gen_complex_sampled(gsl::span> _dest, const std::array& _Signal, bool _cboc, uint32_t _prn, int32_t _fs, uint32_t _chip_shift) { galileo_e1_code_gen_complex_sampled(_dest, _Signal, _cboc, _prn, _fs, _chip_shift, false); diff --git a/src/algorithms/libs/galileo_e1_signal_processing.h b/src/algorithms/libs/galileo_e1_signal_processing.h index 6784e6f22..161d104cb 100644 --- a/src/algorithms/libs/galileo_e1_signal_processing.h +++ b/src/algorithms/libs/galileo_e1_signal_processing.h @@ -32,21 +32,29 @@ #ifndef GNSS_SDR_GALILEO_E1_SIGNAL_PROCESSING_H_ #define GNSS_SDR_GALILEO_E1_SIGNAL_PROCESSING_H_ +#include #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif + /*! * \brief This function generates Galileo E1 code (can select E1B or E1C sinboc). * */ -void galileo_e1_code_gen_sinboc11_float(float* _dest, char _Signal[3], uint32_t _prn); +void galileo_e1_code_gen_sinboc11_float(gsl::span _dest, const std::array& _Signal, uint32_t _prn); /*! * \brief This function generates Galileo E1 code (can select E1B or E1C, cboc or sinboc * and the sample frequency _fs). * */ -void galileo_e1_code_gen_float_sampled(float* _dest, char _Signal[3], +void galileo_e1_code_gen_float_sampled(gsl::span _dest, const std::array& _Signal, bool _cboc, uint32_t _prn, int32_t _fs, uint32_t _chip_shift, bool _secondary_flag); @@ -55,7 +63,7 @@ void galileo_e1_code_gen_float_sampled(float* _dest, char _Signal[3], * and the sample frequency _fs). * */ -void galileo_e1_code_gen_float_sampled(float* _dest, char _Signal[3], +void galileo_e1_code_gen_float_sampled(gsl::span _dest, const std::array& _Signal, bool _cboc, uint32_t _prn, int32_t _fs, uint32_t _chip_shift); /*! @@ -63,14 +71,14 @@ void galileo_e1_code_gen_float_sampled(float* _dest, char _Signal[3], * and the sample frequency _fs). * */ -void galileo_e1_code_gen_complex_sampled(std::complex* _dest, char _Signal[3], +void galileo_e1_code_gen_complex_sampled(gsl::span> _dest, const std::array& _Signal, bool _cboc, uint32_t _prn, int32_t _fs, uint32_t _chip_shift, bool _secondary_flag); /*! * \brief galileo_e1_code_gen_complex_sampled without _secondary_flag for backward compatibility. */ -void galileo_e1_code_gen_complex_sampled(std::complex* _dest, char _Signal[3], +void galileo_e1_code_gen_complex_sampled(gsl::span> _dest, const std::array& _Signal, bool _cboc, uint32_t _prn, int32_t _fs, uint32_t _chip_shift); #endif /* GNSS_SDR_GALILEO_E1_SIGNAL_PROCESSING_H_ */ diff --git a/src/algorithms/libs/galileo_e5_signal_processing.cc b/src/algorithms/libs/galileo_e5_signal_processing.cc index d02508f50..070e8c756 100644 --- a/src/algorithms/libs/galileo_e5_signal_processing.cc +++ b/src/algorithms/libs/galileo_e5_signal_processing.cc @@ -35,9 +35,10 @@ #include "Galileo_E5a.h" #include "gnss_signal_processing.h" #include +#include -void galileo_e5_a_code_gen_complex_primary(std::complex* _dest, int32_t _prn, const char _Signal[3]) +void galileo_e5_a_code_gen_complex_primary(gsl::span> _dest, int32_t _prn, const std::array& _Signal) { uint32_t prn = _prn - 1; uint32_t index = 0; @@ -100,7 +101,7 @@ void galileo_e5_a_code_gen_complex_primary(std::complex* _dest, int32_t _ } -void galileo_e5_a_code_gen_complex_sampled(std::complex* _dest, char _Signal[3], +void galileo_e5_a_code_gen_complex_sampled(gsl::span> _dest, const std::array& _Signal, uint32_t _prn, int32_t _fs, uint32_t _chip_shift) { uint32_t _samplesPerCode; @@ -108,9 +109,9 @@ void galileo_e5_a_code_gen_complex_sampled(std::complex* _dest, char _Sig const uint32_t _codeLength = GALILEO_E5A_CODE_LENGTH_CHIPS; const int32_t _codeFreqBasis = GALILEO_E5A_CODE_CHIP_RATE_HZ; - auto* _code = new std::complex[_codeLength](); - - galileo_e5_a_code_gen_complex_primary(_code, _prn, _Signal); + std::unique_ptr> _code{new std::complex[_codeLength]}; + gsl::span> _code_span(_code, _codeLength); + galileo_e5_a_code_gen_complex_primary(_code_span, _prn, _Signal); _samplesPerCode = static_cast(static_cast(_fs) / (static_cast(_codeFreqBasis) / static_cast(_codeLength))); @@ -118,25 +119,18 @@ void galileo_e5_a_code_gen_complex_sampled(std::complex* _dest, char _Sig if (_fs != _codeFreqBasis) { - std::complex* _resampled_signal; - if (posix_memalign(reinterpret_cast(&_resampled_signal), 16, _samplesPerCode * sizeof(gr_complex)) == 0) - { - }; - resampler(_code, _resampled_signal, _codeFreqBasis, _fs, _codeLength, _samplesPerCode); // resamples code to fs - delete[] _code; - _code = _resampled_signal; - } - - for (uint32_t i = 0; i < _samplesPerCode; i++) - { - _dest[(i + delay) % _samplesPerCode] = _code[i]; + std::unique_ptr> _resampled_signal{new std::complex[_samplesPerCode]}; + resampler(_code_span, gsl::span>(_resampled_signal, _samplesPerCode), _codeFreqBasis, _fs); // resamples code to fs + _code = std::move(_resampled_signal); } + uint32_t size_code = _codeLength; if (_fs != _codeFreqBasis) { - free(_code); + size_code = _samplesPerCode; } - else + gsl::span> _code_span_aux(_code, size_code); + for (uint32_t i = 0; i < _samplesPerCode; i++) { - delete[] _code; + _dest[(i + delay) % _samplesPerCode] = _code_span_aux[i]; } } diff --git a/src/algorithms/libs/galileo_e5_signal_processing.h b/src/algorithms/libs/galileo_e5_signal_processing.h index d9b6f5b9f..90d6abc5e 100644 --- a/src/algorithms/libs/galileo_e5_signal_processing.h +++ b/src/algorithms/libs/galileo_e5_signal_processing.h @@ -36,22 +36,27 @@ #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif + /*! * \brief Generates Galileo E5a code at 1 sample/chip * bool _pilot generates E5aQ code if true and E5aI (data signal) if false. */ -void galileo_e5_a_code_gen_complex_primary(std::complex* _dest, int32_t _prn, const char _Signal[3]); - -void galileo_e5_a_code_gen_tiered(std::complex* _dest, std::complex* _primary, uint32_t _prn, char _Signal[3]); +void galileo_e5_a_code_gen_complex_primary(gsl::span> _dest, int32_t _prn, const std::array& _Signal); /*! * \brief Generates Galileo E5a complex code, shifted to the desired chip and sampled at a frequency fs * bool _pilot generates E5aQ code if true and E5aI (data signal) if false. */ -void galileo_e5_a_code_gen_complex_sampled(std::complex* _dest, - char _Signal[3], uint32_t _prn, int32_t _fs, uint32_t _chip_shift); +void galileo_e5_a_code_gen_complex_sampled(gsl::span> _dest, + const std::array& _Signal, uint32_t _prn, int32_t _fs, uint32_t _chip_shift); #endif /* GNSS_SDR_GALILEO_E5_SIGNAL_PROCESSING_H_ */ diff --git a/src/algorithms/libs/glonass_l1_signal_processing.cc b/src/algorithms/libs/glonass_l1_signal_processing.cc index 8707985b4..bda5cdf02 100644 --- a/src/algorithms/libs/glonass_l1_signal_processing.cc +++ b/src/algorithms/libs/glonass_l1_signal_processing.cc @@ -34,7 +34,7 @@ auto auxCeil = [](float x) { return static_cast(static_cast((x) + 1)); }; -void glonass_l1_ca_code_gen_complex(std::complex* _dest, /* int32_t _prn,*/ uint32_t _chip_shift) +void glonass_l1_ca_code_gen_complex(gsl::span> _dest, /* int32_t _prn,*/ uint32_t _chip_shift) { const uint32_t _code_length = 511; bool G1[_code_length]; @@ -104,7 +104,7 @@ void glonass_l1_ca_code_gen_complex(std::complex* _dest, /* int32_t _prn /* * Generates complex GLONASS L1 C/A code for the desired SV ID and sampled to specific sampling frequency */ -void glonass_l1_ca_code_gen_complex_sampled(std::complex* _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift) +void glonass_l1_ca_code_gen_complex_sampled(gsl::span> _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift) { // This function is based on the GNU software GPS for MATLAB in the Kay Borre book std::complex _code[511]; @@ -119,9 +119,9 @@ void glonass_l1_ca_code_gen_complex_sampled(std::complex* _dest, /* uint3 _samplesPerCode = static_cast(static_cast(_fs) / static_cast(_codeFreqBasis / _codeLength)); //--- Find time constants -------------------------------------------------- - _ts = 1.0 / static_cast(_fs); // Sampling period in sec - _tc = 1.0 / static_cast(_codeFreqBasis); // C/A chip period in sec - glonass_l1_ca_code_gen_complex(_code, _chip_shift); //generate C/A code 1 sample per chip + _ts = 1.0 / static_cast(_fs); // Sampling period in sec + _tc = 1.0 / static_cast(_codeFreqBasis); // C/A chip period in sec + glonass_l1_ca_code_gen_complex(gsl::span>(_code, 511), _chip_shift); //generate C/A code 1 sample per chip for (int32_t i = 0; i < _samplesPerCode; i++) { diff --git a/src/algorithms/libs/glonass_l1_signal_processing.h b/src/algorithms/libs/glonass_l1_signal_processing.h index 0b1a26cfc..854befe82 100644 --- a/src/algorithms/libs/glonass_l1_signal_processing.h +++ b/src/algorithms/libs/glonass_l1_signal_processing.h @@ -36,13 +36,20 @@ #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif + //!Generates complex GLONASS L1 C/A code for the desired SV ID and code shift, and sampled to specific sampling frequency -void glonass_l1_ca_code_gen_complex(std::complex* _dest, /*int32_t _prn,*/ uint32_t _chip_shift); +void glonass_l1_ca_code_gen_complex(gsl::span> _dest, /*int32_t _prn,*/ uint32_t _chip_shift); //! Generates N complex GLONASS L1 C/A codes for the desired SV ID and code shift -void glonass_l1_ca_code_gen_complex_sampled(std::complex* _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift, uint32_t _ncodes); +void glonass_l1_ca_code_gen_complex_sampled(gsl::span> _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift, uint32_t _ncodes); //! Generates complex GLONASS L1 C/A code for the desired SV ID and code shift -void glonass_l1_ca_code_gen_complex_sampled(std::complex* _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift); +void glonass_l1_ca_code_gen_complex_sampled(gsl::span> _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift); #endif /* GNSS_SDR_GLONASS_SDR_SIGNAL_PROCESSING_H_ */ diff --git a/src/algorithms/libs/glonass_l2_signal_processing.cc b/src/algorithms/libs/glonass_l2_signal_processing.cc index 491b0e735..987e43d01 100644 --- a/src/algorithms/libs/glonass_l2_signal_processing.cc +++ b/src/algorithms/libs/glonass_l2_signal_processing.cc @@ -34,7 +34,7 @@ auto auxCeil = [](float x) { return static_cast(static_cast((x) + 1)); }; -void glonass_l2_ca_code_gen_complex(std::complex* _dest, /* int32_t _prn,*/ uint32_t _chip_shift) +void glonass_l2_ca_code_gen_complex(gsl::span> _dest, /* int32_t _prn,*/ uint32_t _chip_shift) { const uint32_t _code_length = 511; bool G1[_code_length]; @@ -104,7 +104,7 @@ void glonass_l2_ca_code_gen_complex(std::complex* _dest, /* int32_t _prn, /* * Generates complex GLONASS L2 C/A code for the desired SV ID and sampled to specific sampling frequency */ -void glonass_l2_ca_code_gen_complex_sampled(std::complex* _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift) +void glonass_l2_ca_code_gen_complex_sampled(gsl::span> _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift) { // This function is based on the GNU software GPS for MATLAB in the Kay Borre book std::complex _code[511]; @@ -119,9 +119,9 @@ void glonass_l2_ca_code_gen_complex_sampled(std::complex* _dest, /* uint3 _samplesPerCode = static_cast(static_cast(_fs) / static_cast(_codeFreqBasis / _codeLength)); //--- Find time constants -------------------------------------------------- - _ts = 1.0 / static_cast(_fs); // Sampling period in sec - _tc = 1.0 / static_cast(_codeFreqBasis); // C/A chip period in sec - glonass_l2_ca_code_gen_complex(_code, _chip_shift); //generate C/A code 1 sample per chip + _ts = 1.0 / static_cast(_fs); // Sampling period in sec + _tc = 1.0 / static_cast(_codeFreqBasis); // C/A chip period in sec + glonass_l2_ca_code_gen_complex(gsl::span>(_code, 511), _chip_shift); //generate C/A code 1 sample per chip for (int32_t i = 0; i < _samplesPerCode; i++) { diff --git a/src/algorithms/libs/glonass_l2_signal_processing.h b/src/algorithms/libs/glonass_l2_signal_processing.h index 7c798f45a..0f46d3e9d 100644 --- a/src/algorithms/libs/glonass_l2_signal_processing.h +++ b/src/algorithms/libs/glonass_l2_signal_processing.h @@ -36,13 +36,20 @@ #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif + //!Generates complex GLONASS L2 C/A code for the desired SV ID and code shift, and sampled to specific sampling frequency -void glonass_l2_ca_code_gen_complex(std::complex* _dest, /*int32_t _prn,*/ uint32_t _chip_shift); +void glonass_l2_ca_code_gen_complex(gsl::span> _dest, /*int32_t _prn,*/ uint32_t _chip_shift); //! Generates N complex GLONASS L2 C/A codes for the desired SV ID and code shift -void glonass_l2_ca_code_gen_complex_sampled(std::complex* _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift, uint32_t _ncodes); +void glonass_l2_ca_code_gen_complex_sampled(gsl::span> _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift, uint32_t _ncodes); //! Generates complex GLONASS L2 C/A code for the desired SV ID and code shift -void glonass_l2_ca_code_gen_complex_sampled(std::complex* _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift); +void glonass_l2_ca_code_gen_complex_sampled(gsl::span> _dest, /* uint32_t _prn,*/ int32_t _fs, uint32_t _chip_shift); #endif /* GNSS_SDR_GLONASS_L2_SIGNAL_PROCESSING_H_ */ diff --git a/src/algorithms/libs/gnss_signal_processing.cc b/src/algorithms/libs/gnss_signal_processing.cc index 0dea461e7..71e61e159 100644 --- a/src/algorithms/libs/gnss_signal_processing.cc +++ b/src/algorithms/libs/gnss_signal_processing.cc @@ -38,135 +38,135 @@ auto auxCeil2 = [](float x) { return static_cast(static_cast((x) + 1)); }; -void complex_exp_gen(std::complex* _dest, double _f, double _fs, uint32_t _samps) +void complex_exp_gen(gsl::span> _dest, double _f, double _fs) { gr::fxpt_nco d_nco; d_nco.set_freq((GPS_TWO_PI * _f) / _fs); - d_nco.sincos(_dest, _samps, 1); + d_nco.sincos(_dest.data(), _dest.size(), 1); } -void complex_exp_gen_conj(std::complex* _dest, double _f, double _fs, uint32_t _samps) +void complex_exp_gen_conj(gsl::span> _dest, double _f, double _fs) { gr::fxpt_nco d_nco; d_nco.set_freq(-(GPS_TWO_PI * _f) / _fs); - d_nco.sincos(_dest, _samps, 1); + d_nco.sincos(_dest.data(), _dest.size(), 1); } -void hex_to_binary_converter(int32_t* _dest, char _from) +void hex_to_binary_converter(gsl::span _dest, char _from) { switch (_from) { case '0': - *(_dest) = 1; - *(_dest + 1) = 1; - *(_dest + 2) = 1; - *(_dest + 3) = 1; + _dest[0] = 1; + _dest[1] = 1; + _dest[2] = 1; + _dest[3] = 1; break; case '1': - *(_dest) = 1; - *(_dest + 1) = 1; - *(_dest + 2) = 1; - *(_dest + 3) = -1; + _dest[0] = 1; + _dest[1] = 1; + _dest[2] = 1; + _dest[3] = -1; break; case '2': - *(_dest) = 1; - *(_dest + 1) = 1; - *(_dest + 2) = -1; - *(_dest + 3) = 1; + _dest[0] = 1; + _dest[1] = 1; + _dest[2] = -1; + _dest[3] = 1; break; case '3': - *(_dest) = 1; - *(_dest + 1) = 1; - *(_dest + 2) = -1; - *(_dest + 3) = -1; + _dest[0] = 1; + _dest[1] = 1; + _dest[2] = -1; + _dest[3] = -1; break; case '4': - *(_dest) = 1; - *(_dest + 1) = -1; - *(_dest + 2) = 1; - *(_dest + 3) = 1; + _dest[0] = 1; + _dest[1] = -1; + _dest[2] = 1; + _dest[3] = 1; break; case '5': - *(_dest) = 1; - *(_dest + 1) = -1; - *(_dest + 2) = 1; - *(_dest + 3) = -1; + _dest[0] = 1; + _dest[1] = -1; + _dest[2] = 1; + _dest[3] = -1; break; case '6': - *(_dest) = 1; - *(_dest + 1) = -1; - *(_dest + 2) = -1; - *(_dest + 3) = 1; + _dest[0] = 1; + _dest[1] = -1; + _dest[2] = -1; + _dest[3] = 1; break; case '7': - *(_dest) = 1; - *(_dest + 1) = -1; - *(_dest + 2) = -1; - *(_dest + 3) = -1; + _dest[0] = 1; + _dest[1] = -1; + _dest[2] = -1; + _dest[3] = -1; break; case '8': - *(_dest) = -1; - *(_dest + 1) = 1; - *(_dest + 2) = 1; - *(_dest + 3) = 1; + _dest[0] = -1; + _dest[1] = 1; + _dest[2] = 1; + _dest[3] = 1; break; case '9': - *(_dest) = -1; - *(_dest + 1) = 1; - *(_dest + 2) = 1; - *(_dest + 3) = -1; + _dest[0] = -1; + _dest[1] = 1; + _dest[2] = 1; + _dest[3] = -1; break; case 'A': - *(_dest) = -1; - *(_dest + 1) = 1; - *(_dest + 2) = -1; - *(_dest + 3) = 1; + _dest[0] = -1; + _dest[1] = 1; + _dest[2] = -1; + _dest[3] = 1; break; case 'B': - *(_dest) = -1; - *(_dest + 1) = 1; - *(_dest + 2) = -1; - *(_dest + 3) = -1; + _dest[0] = -1; + _dest[1] = 1; + _dest[2] = -1; + _dest[3] = -1; break; case 'C': - *(_dest) = -1; - *(_dest + 1) = -1; - *(_dest + 2) = 1; - *(_dest + 3) = 1; + _dest[0] = -1; + _dest[1] = -1; + _dest[2] = 1; + _dest[3] = 1; break; case 'D': - *(_dest) = -1; - *(_dest + 1) = -1; - *(_dest + 2) = 1; - *(_dest + 3) = -1; + _dest[0] = -1; + _dest[1] = -1; + _dest[2] = 1; + _dest[3] = -1; break; case 'E': - *(_dest) = -1; - *(_dest + 1) = -1; - *(_dest + 2) = -1; - *(_dest + 3) = 1; + _dest[0] = -1; + _dest[1] = -1; + _dest[2] = -1; + _dest[3] = 1; break; case 'F': - *(_dest) = -1; - *(_dest + 1) = -1; - *(_dest + 2) = -1; - *(_dest + 3) = -1; + _dest[0] = -1; + _dest[1] = -1; + _dest[2] = -1; + _dest[3] = -1; break; } } -void resampler(const float* _from, float* _dest, float _fs_in, - float _fs_out, uint32_t _length_in, uint32_t _length_out) +void resampler(const gsl::span _from, gsl::span _dest, float _fs_in, + float _fs_out) { uint32_t _codeValueIndex; float aux; //--- Find time constants -------------------------------------------------- const float _t_in = 1 / _fs_in; // Incoming sampling period in sec const float _t_out = 1 / _fs_out; // Out sampling period in sec - for (uint32_t i = 0; i < _length_out - 1; i++) + for (uint32_t i = 0; i < _dest.size() - 1; i++) { //=== Digitizing ======================================================= //--- compute index array to read sampled values ------------------------- @@ -178,19 +178,19 @@ void resampler(const float* _from, float* _dest, float _fs_in, _dest[i] = _from[_codeValueIndex]; } //--- Correct the last index (due to number rounding issues) ----------- - _dest[_length_out - 1] = _from[_length_in - 1]; + _dest[_dest.size() - 1] = _from[_from.size() - 1]; } -void resampler(const std::complex* _from, std::complex* _dest, float _fs_in, - float _fs_out, uint32_t _length_in, uint32_t _length_out) +void resampler(gsl::span> _from, gsl::span> _dest, float _fs_in, + float _fs_out) { uint32_t _codeValueIndex; float aux; //--- Find time constants -------------------------------------------------- const float _t_in = 1 / _fs_in; // Incoming sampling period in sec const float _t_out = 1 / _fs_out; // Out sampling period in sec - for (uint32_t i = 0; i < _length_out - 1; i++) + for (uint32_t i = 0; i < _dest.size() - 1; i++) { //=== Digitizing ======================================================= //--- compute index array to read sampled values ------------------------- @@ -202,5 +202,5 @@ void resampler(const std::complex* _from, std::complex* _dest, flo _dest[i] = _from[_codeValueIndex]; } //--- Correct the last index (due to number rounding issues) ----------- - _dest[_length_out - 1] = _from[_length_in - 1]; + _dest[_dest.size() - 1] = _from[_from.size() - 1]; } diff --git a/src/algorithms/libs/gnss_signal_processing.h b/src/algorithms/libs/gnss_signal_processing.h index 3ed363e3e..29d00c00e 100644 --- a/src/algorithms/libs/gnss_signal_processing.h +++ b/src/algorithms/libs/gnss_signal_processing.h @@ -38,42 +38,45 @@ #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif + /*! * \brief This function generates a complex exponential in _dest. * */ -void complex_exp_gen(std::complex* _dest, double _f, double _fs, - uint32_t _samps); +void complex_exp_gen(gsl::span> _dest, double _f, double _fs); /*! * \brief This function generates a conjugate complex exponential in _dest. * */ -void complex_exp_gen_conj(std::complex* _dest, double _f, double _fs, - uint32_t _samps); - +void complex_exp_gen_conj(gsl::span> _dest, double _f, double _fs); /*! * \brief This function makes a conversion from hex (the input is a char) * to binary (the output are 4 ints with +1 or -1 values). * */ -void hex_to_binary_converter(int32_t* _dest, char _from); +void hex_to_binary_converter(gsl::span _dest, char _from); /*! * \brief This function resamples a sequence of float values. * */ -void resampler(const float* _from, float* _dest, - float _fs_in, float _fs_out, uint32_t _length_in, - uint32_t _length_out); +void resampler(const gsl::span _from, gsl::span _dest, + float _fs_in, float _fs_out); + /*! * \brief This function resamples a sequence of complex values. * */ -void resampler(const std::complex* _from, std::complex* _dest, - float _fs_in, float _fs_out, uint32_t _length_in, - uint32_t _length_out); +void resampler(gsl::span> _from, gsl::span> _dest, + float _fs_in, float _fs_out); #endif /* GNSS_SDR_GNSS_SIGNAL_PROCESSING_H_ */ diff --git a/src/algorithms/libs/gps_l2c_signal.cc b/src/algorithms/libs/gps_l2c_signal.cc index d8995a1f2..cfb49082e 100644 --- a/src/algorithms/libs/gps_l2c_signal.cc +++ b/src/algorithms/libs/gps_l2c_signal.cc @@ -33,6 +33,7 @@ #include "gps_l2c_signal.h" #include "GPS_L2C.h" #include +#include int32_t gps_l2c_m_shift(int32_t x) @@ -41,7 +42,7 @@ int32_t gps_l2c_m_shift(int32_t x) } -void gps_l2c_m_code(int32_t* _dest, uint32_t _prn) +void gps_l2c_m_code(gsl::span _dest, uint32_t _prn) { int32_t x; x = GPS_L2C_M_INIT_REG[_prn - 1]; @@ -53,51 +54,48 @@ void gps_l2c_m_code(int32_t* _dest, uint32_t _prn) } -void gps_l2c_m_code_gen_complex(std::complex* _dest, uint32_t _prn) +void gps_l2c_m_code_gen_complex(gsl::span> _dest, uint32_t _prn) { - auto* _code = new int32_t[GPS_L2_M_CODE_LENGTH_CHIPS]; - + std::unique_ptr _code{new int32_t[GPS_L2_M_CODE_LENGTH_CHIPS]}; + gsl::span _code_span(_code, GPS_L2_M_CODE_LENGTH_CHIPS); if (_prn > 0 and _prn < 51) { - gps_l2c_m_code(_code, _prn); + gps_l2c_m_code(_code_span, _prn); } for (int32_t i = 0; i < GPS_L2_M_CODE_LENGTH_CHIPS; i++) { - _dest[i] = std::complex(1.0 - 2.0 * _code[i], 0.0); + _dest[i] = std::complex(1.0 - 2.0 * _code_span[i], 0.0); } - - delete[] _code; } -void gps_l2c_m_code_gen_float(float* _dest, uint32_t _prn) +void gps_l2c_m_code_gen_float(gsl::span _dest, uint32_t _prn) { - auto* _code = new int32_t[GPS_L2_M_CODE_LENGTH_CHIPS]; - + std::unique_ptr _code{new int32_t[GPS_L2_M_CODE_LENGTH_CHIPS]}; + gsl::span _code_span(_code, GPS_L2_M_CODE_LENGTH_CHIPS); if (_prn > 0 and _prn < 51) { - gps_l2c_m_code(_code, _prn); + gps_l2c_m_code(_code_span, _prn); } for (int32_t i = 0; i < GPS_L2_M_CODE_LENGTH_CHIPS; i++) { - _dest[i] = 1.0 - 2.0 * static_cast(_code[i]); + _dest[i] = 1.0 - 2.0 * static_cast(_code_span[i]); } - - delete[] _code; } /* * Generates complex GPS L2C M code for the desired SV ID and sampled to specific sampling frequency */ -void gps_l2c_m_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs) +void gps_l2c_m_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs) { - auto* _code = new int32_t[GPS_L2_M_CODE_LENGTH_CHIPS]; + std::unique_ptr _code{new int32_t[GPS_L2_M_CODE_LENGTH_CHIPS]}; + gsl::span _code_span(_code, GPS_L2_M_CODE_LENGTH_CHIPS); if (_prn > 0 and _prn < 51) { - gps_l2c_m_code(_code, _prn); + gps_l2c_m_code(_code_span, _prn); } int32_t _samplesPerCode, _codeValueIndex; @@ -112,27 +110,22 @@ void gps_l2c_m_code_gen_complex_sampled(std::complex* _dest, uint32_t _pr _ts = 1.0 / static_cast(_fs); // Sampling period in sec _tc = 1.0 / static_cast(GPS_L2_M_CODE_RATE_HZ); // C/A chip period in sec - //float aux; for (int32_t i = 0; i < _samplesPerCode; i++) { //=== Digitizing ======================================================= //--- Make index array to read L2C code values ------------------------- - //TODO: Check this formula! Seems to start with an extra sample _codeValueIndex = std::ceil((_ts * (static_cast(i) + 1)) / _tc) - 1; - //aux = (_ts * (i + 1)) / _tc; - //_codeValueIndex = static_cast(static_cast(aux)) - 1; //--- Make the digitized version of the L2C code ----------------------- if (i == _samplesPerCode - 1) { //--- Correct the last index (due to number rounding issues) ----------- - _dest[i] = std::complex(1.0 - 2.0 * _code[_codeLength - 1], 0); + _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeLength - 1], 0); } else { - _dest[i] = std::complex(1.0 - 2.0 * _code[_codeValueIndex], 0); //repeat the chip -> upsample + _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeValueIndex], 0); //repeat the chip -> upsample } } - delete[] _code; } diff --git a/src/algorithms/libs/gps_l2c_signal.h b/src/algorithms/libs/gps_l2c_signal.h index 84d51e485..af1aec8e6 100644 --- a/src/algorithms/libs/gps_l2c_signal.h +++ b/src/algorithms/libs/gps_l2c_signal.h @@ -36,12 +36,19 @@ #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif + //! Generates complex GPS L2C M code for the desired SV ID -void gps_l2c_m_code_gen_complex(std::complex* _dest, uint32_t _prn); -void gps_l2c_m_code_gen_float(float* _dest, uint32_t _prn); +void gps_l2c_m_code_gen_complex(gsl::span> _dest, uint32_t _prn); +void gps_l2c_m_code_gen_float(gsl::span _dest, uint32_t _prn); //! Generates complex GPS L2C M code for the desired SV ID, and sampled to specific sampling frequency -void gps_l2c_m_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs); +void gps_l2c_m_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs); #endif /* GNSS_GPS_L2C_SIGNAL_H_ */ diff --git a/src/algorithms/libs/gps_l5_signal.cc b/src/algorithms/libs/gps_l5_signal.cc index c5fc6e13c..8fa132b63 100644 --- a/src/algorithms/libs/gps_l5_signal.cc +++ b/src/algorithms/libs/gps_l5_signal.cc @@ -131,7 +131,7 @@ std::deque make_l5q_xb() } -void make_l5i(int32_t* _dest, int32_t prn) +void make_l5i(gsl::span _dest, int32_t prn) { int32_t xb_offset = GPS_L5I_INIT_REG[prn]; @@ -151,7 +151,7 @@ void make_l5i(int32_t* _dest, int32_t prn) } -void make_l5q(int32_t* _dest, int32_t prn) +void make_l5q(gsl::span _dest, int32_t prn) { int32_t xb_offset = GPS_L5Q_INIT_REG[prn]; @@ -171,51 +171,48 @@ void make_l5q(int32_t* _dest, int32_t prn) } -void gps_l5i_code_gen_complex(std::complex* _dest, uint32_t _prn) +void gps_l5i_code_gen_complex(gsl::span> _dest, uint32_t _prn) { - auto* _code = new int32_t[GPS_L5I_CODE_LENGTH_CHIPS]; - + std::unique_ptr _code{new int32_t[GPS_L5I_CODE_LENGTH_CHIPS]}; + gsl::span _code_span(_code, GPS_L5I_CODE_LENGTH_CHIPS); if (_prn > 0 and _prn < 51) { - make_l5i(_code, _prn - 1); + make_l5i(_code_span, _prn - 1); } for (int32_t i = 0; i < GPS_L5I_CODE_LENGTH_CHIPS; i++) { - _dest[i] = std::complex(1.0 - 2.0 * _code[i], 0.0); + _dest[i] = std::complex(1.0 - 2.0 * _code_span[i], 0.0); } - - delete[] _code; } -void gps_l5i_code_gen_float(float* _dest, uint32_t _prn) +void gps_l5i_code_gen_float(gsl::span _dest, uint32_t _prn) { - auto* _code = new int32_t[GPS_L5I_CODE_LENGTH_CHIPS]; - + std::unique_ptr _code{new int32_t[GPS_L5I_CODE_LENGTH_CHIPS]}; + gsl::span _code_span(_code, GPS_L5I_CODE_LENGTH_CHIPS); if (_prn > 0 and _prn < 51) { - make_l5i(_code, _prn - 1); + make_l5i(_code_span, _prn - 1); } for (int32_t i = 0; i < GPS_L5I_CODE_LENGTH_CHIPS; i++) { - _dest[i] = 1.0 - 2.0 * static_cast(_code[i]); + _dest[i] = 1.0 - 2.0 * static_cast(_code_span[i]); } - - delete[] _code; } /* * Generates complex GPS L5i code for the desired SV ID and sampled to specific sampling frequency */ -void gps_l5i_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs) +void gps_l5i_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs) { - auto* _code = new int32_t[GPS_L5I_CODE_LENGTH_CHIPS]; + std::unique_ptr _code{new int32_t[GPS_L5I_CODE_LENGTH_CHIPS]}; + gsl::span _code_span(_code, GPS_L5I_CODE_LENGTH_CHIPS); if (_prn > 0 and _prn < 51) { - make_l5i(_code, _prn - 1); + make_l5i(_code_span, _prn - 1); } int32_t _samplesPerCode, _codeValueIndex; @@ -241,62 +238,58 @@ void gps_l5i_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, if (i == _samplesPerCode - 1) { //--- Correct the last index (due to number rounding issues) ----------- - _dest[i] = std::complex(1.0 - 2.0 * _code[_codeLength - 1], 0.0); + _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeLength - 1], 0.0); } else { - _dest[i] = std::complex(1.0 - 2.0 * _code[_codeValueIndex], 0.0); // repeat the chip -> upsample + _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeValueIndex], 0.0); // repeat the chip -> upsample } } - delete[] _code; } -void gps_l5q_code_gen_complex(std::complex* _dest, uint32_t _prn) +void gps_l5q_code_gen_complex(gsl::span> _dest, uint32_t _prn) { - auto* _code = new int32_t[GPS_L5Q_CODE_LENGTH_CHIPS]; - + std::unique_ptr _code{new int32_t[GPS_L5Q_CODE_LENGTH_CHIPS]}; + gsl::span _code_span(_code, GPS_L5Q_CODE_LENGTH_CHIPS); if (_prn > 0 and _prn < 51) { - make_l5q(_code, _prn - 1); + make_l5q(_code_span, _prn - 1); } for (int32_t i = 0; i < GPS_L5Q_CODE_LENGTH_CHIPS; i++) { - _dest[i] = std::complex(1.0 - 2.0 * _code[i], 0.0); + _dest[i] = std::complex(1.0 - 2.0 * _code_span[i], 0.0); } - - delete[] _code; } -void gps_l5q_code_gen_float(float* _dest, uint32_t _prn) +void gps_l5q_code_gen_float(gsl::span _dest, uint32_t _prn) { - auto* _code = new int32_t[GPS_L5Q_CODE_LENGTH_CHIPS]; - + std::unique_ptr _code{new int32_t[GPS_L5Q_CODE_LENGTH_CHIPS]}; + gsl::span _code_span(_code, GPS_L5Q_CODE_LENGTH_CHIPS); if (_prn > 0 and _prn < 51) { - make_l5q(_code, _prn - 1); + make_l5q(_code_span, _prn - 1); } for (int32_t i = 0; i < GPS_L5Q_CODE_LENGTH_CHIPS; i++) { - _dest[i] = 1.0 - 2.0 * static_cast(_code[i]); + _dest[i] = 1.0 - 2.0 * static_cast(_code_span[i]); } - - delete[] _code; } /* * Generates complex GPS L5Q code for the desired SV ID and sampled to specific sampling frequency */ -void gps_l5q_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs) +void gps_l5q_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs) { - auto* _code = new int32_t[GPS_L5Q_CODE_LENGTH_CHIPS]; + std::unique_ptr _code{new int32_t[GPS_L5Q_CODE_LENGTH_CHIPS]}; + gsl::span _code_span(_code, GPS_L5Q_CODE_LENGTH_CHIPS); if (_prn > 0 and _prn < 51) { - make_l5q(_code, _prn - 1); + make_l5q(_code_span, _prn - 1); } int32_t _samplesPerCode, _codeValueIndex; @@ -323,12 +316,11 @@ void gps_l5q_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, if (i == _samplesPerCode - 1) { //--- Correct the last index (due to number rounding issues) ----------- - _dest[i] = std::complex(1.0 - 2.0 * _code[_codeLength - 1], 0); + _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeLength - 1], 0); } else { - _dest[i] = std::complex(1.0 - 2.0 * _code[_codeValueIndex], 0); // repeat the chip -> upsample + _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeValueIndex], 0); // repeat the chip -> upsample } } - delete[] _code; } diff --git a/src/algorithms/libs/gps_l5_signal.h b/src/algorithms/libs/gps_l5_signal.h index de8e44c0d..e3b653797 100644 --- a/src/algorithms/libs/gps_l5_signal.h +++ b/src/algorithms/libs/gps_l5_signal.h @@ -36,23 +36,30 @@ #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif + //! Generates complex GPS L5I code for the desired SV ID -void gps_l5i_code_gen_complex(std::complex* _dest, uint32_t _prn); +void gps_l5i_code_gen_complex(gsl::span> _dest, uint32_t _prn); //! Generates real GPS L5I code for the desired SV ID -void gps_l5i_code_gen_float(float* _dest, uint32_t _prn); +void gps_l5i_code_gen_float(gsl::span _dest, uint32_t _prn); //! Generates complex GPS L5Q code for the desired SV ID -void gps_l5q_code_gen_complex(std::complex* _dest, uint32_t _prn); +void gps_l5q_code_gen_complex(gsl::span> _dest, uint32_t _prn); //! Generates real GPS L5Q code for the desired SV ID -void gps_l5q_code_gen_float(float* _dest, uint32_t _prn); +void gps_l5q_code_gen_float(gsl::span _dest, uint32_t _prn); //! Generates complex GPS L5I code for the desired SV ID, and sampled to specific sampling frequency -void gps_l5i_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs); +void gps_l5i_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs); //! Generates complex GPS L5Q code for the desired SV ID, and sampled to specific sampling frequency -void gps_l5q_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs); +void gps_l5q_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs); #endif /* GNSS_SDR_GPS_L5_SIGNAL_H_ */ diff --git a/src/algorithms/libs/gps_sdr_signal_processing.cc b/src/algorithms/libs/gps_sdr_signal_processing.cc index 945be5607..4f7411dc6 100644 --- a/src/algorithms/libs/gps_sdr_signal_processing.cc +++ b/src/algorithms/libs/gps_sdr_signal_processing.cc @@ -34,7 +34,7 @@ auto auxCeil = [](float x) { return static_cast(static_cast((x) + 1)); }; -void gps_l1_ca_code_gen_int(int32_t* _dest, int32_t _prn, uint32_t _chip_shift) +void gps_l1_ca_code_gen_int(gsl::span _dest, int32_t _prn, uint32_t _chip_shift) { const uint32_t _code_length = 1023; bool G1[_code_length]; @@ -116,7 +116,7 @@ void gps_l1_ca_code_gen_int(int32_t* _dest, int32_t _prn, uint32_t _chip_shift) } -void gps_l1_ca_code_gen_float(float* _dest, int32_t _prn, uint32_t _chip_shift) +void gps_l1_ca_code_gen_float(gsl::span _dest, int32_t _prn, uint32_t _chip_shift) { const uint32_t _code_length = 1023; int32_t ca_code_int[_code_length]; @@ -130,7 +130,7 @@ void gps_l1_ca_code_gen_float(float* _dest, int32_t _prn, uint32_t _chip_shift) } -void gps_l1_ca_code_gen_complex(std::complex* _dest, int32_t _prn, uint32_t _chip_shift) +void gps_l1_ca_code_gen_complex(gsl::span> _dest, int32_t _prn, uint32_t _chip_shift) { const uint32_t _code_length = 1023; int32_t ca_code_int[_code_length] = {0}; @@ -139,7 +139,7 @@ void gps_l1_ca_code_gen_complex(std::complex* _dest, int32_t _prn, uint32 for (uint32_t ii = 0; ii < _code_length; ++ii) { - _dest[ii] = std::complex(static_cast(ca_code_int[ii]), 0.0f); + _dest[ii] = std::complex(static_cast(ca_code_int[ii]), 0.0F); } } @@ -148,7 +148,7 @@ void gps_l1_ca_code_gen_complex(std::complex* _dest, int32_t _prn, uint32 * Generates complex GPS L1 C/A code for the desired SV ID and sampled to specific sampling frequency * NOTICE: the number of samples is rounded towards zero (integer truncation) */ -void gps_l1_ca_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift) +void gps_l1_ca_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift) { // This function is based on the GNU software GPS for MATLAB in the Kay Borre book std::complex _code[1023]; diff --git a/src/algorithms/libs/gps_sdr_signal_processing.h b/src/algorithms/libs/gps_sdr_signal_processing.h index 44bb815dd..27a5f7eee 100644 --- a/src/algorithms/libs/gps_sdr_signal_processing.h +++ b/src/algorithms/libs/gps_sdr_signal_processing.h @@ -36,19 +36,26 @@ #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif + //! Generates int GPS L1 C/A code for the desired SV ID and code shift -void gps_l1_ca_code_gen_int(int32_t* _dest, int32_t _prn, uint32_t _chip_shift); +void gps_l1_ca_code_gen_int(gsl::span _dest, int32_t _prn, uint32_t _chip_shift); //! Generates float GPS L1 C/A code for the desired SV ID and code shift -void gps_l1_ca_code_gen_float(float* _dest, int32_t _prn, uint32_t _chip_shift); +void gps_l1_ca_code_gen_float(gsl::span _dest, int32_t _prn, uint32_t _chip_shift); //! Generates complex GPS L1 C/A code for the desired SV ID and code shift, and sampled to specific sampling frequency -void gps_l1_ca_code_gen_complex(std::complex* _dest, int32_t _prn, uint32_t _chip_shift); +void gps_l1_ca_code_gen_complex(gsl::span> _dest, int32_t _prn, uint32_t _chip_shift); //! Generates N complex GPS L1 C/A codes for the desired SV ID and code shift -void gps_l1_ca_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift, uint32_t _ncodes); +void gps_l1_ca_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift, uint32_t _ncodes); //! Generates complex GPS L1 C/A code for the desired SV ID and code shift -void gps_l1_ca_code_gen_complex_sampled(std::complex* _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift); +void gps_l1_ca_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift); #endif /* GNSS_SDR_GPS_SDR_SIGNAL_PROCESSING_H_ */ diff --git a/src/algorithms/libs/gsl/include/gsl/gsl b/src/algorithms/libs/gsl/include/gsl/gsl new file mode 100644 index 000000000..d4c466632 --- /dev/null +++ b/src/algorithms/libs/gsl/include/gsl/gsl @@ -0,0 +1,27 @@ +// +// gsl-lite is based on GSL: Guidelines Support Library. +// For more information see https://github.com/martinmoene/gsl-lite +// +// Copyright (c) 2015 Martin Moene +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// mimic MS include hierarchy + +#pragma once + +#ifndef GSL_GSL_H_INCLUDED +#define GSL_GSL_H_INCLUDED + +#include "gsl-lite.hpp" + +#endif // GSL_GSL_H_INCLUDED diff --git a/src/algorithms/libs/gsl/include/gsl/gsl-lite.hpp b/src/algorithms/libs/gsl/include/gsl/gsl-lite.hpp new file mode 100644 index 000000000..993b167e0 --- /dev/null +++ b/src/algorithms/libs/gsl/include/gsl/gsl-lite.hpp @@ -0,0 +1,3110 @@ +// +// gsl-lite is based on GSL: Guidelines Support Library. +// For more information see https://github.com/martinmoene/gsl-lite +// +// Copyright (c) 2015-2018 Martin Moene +// Copyright (c) 2015-2018 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#pragma once + +#ifndef GSL_GSL_LITE_HPP_INCLUDED +#define GSL_GSL_LITE_HPP_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define gsl_lite_MAJOR 0 +#define gsl_lite_MINOR 34 +#define gsl_lite_PATCH 0 + +#define gsl_lite_VERSION gsl_STRINGIFY(gsl_lite_MAJOR) "." gsl_STRINGIFY(gsl_lite_MINOR) "." gsl_STRINGIFY(gsl_lite_PATCH) + +// gsl-lite backward compatibility: + +#ifdef gsl_CONFIG_ALLOWS_SPAN_CONTAINER_CTOR +#define gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR gsl_CONFIG_ALLOWS_SPAN_CONTAINER_CTOR +#pragma message("gsl_CONFIG_ALLOWS_SPAN_CONTAINER_CTOR is deprecated since gsl-lite 0.7.0; replace with gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR, or consider span(with_container, cont).") +#endif + +// M-GSL compatibility: + +#if defined(GSL_THROW_ON_CONTRACT_VIOLATION) +#define gsl_CONFIG_CONTRACT_VIOLATION_THROWS 1 +#endif + +#if defined(GSL_TERMINATE_ON_CONTRACT_VIOLATION) +#define gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES 1 +#endif + +#if defined(GSL_UNENFORCED_ON_CONTRACT_VIOLATION) +#define gsl_CONFIG_CONTRACT_LEVEL_OFF 1 +#endif + +// Configuration: Features + +#ifndef gsl_FEATURE_WITH_CONTAINER_TO_STD +#define gsl_FEATURE_WITH_CONTAINER_TO_STD 99 +#endif + +#ifndef gsl_FEATURE_MAKE_SPAN_TO_STD +#define gsl_FEATURE_MAKE_SPAN_TO_STD 99 +#endif + +#ifndef gsl_FEATURE_BYTE_SPAN_TO_STD +#define gsl_FEATURE_BYTE_SPAN_TO_STD 99 +#endif + +#ifndef gsl_FEATURE_IMPLICIT_MACRO +#define gsl_FEATURE_IMPLICIT_MACRO 0 +#endif + +#ifndef gsl_FEATURE_OWNER_MACRO +#define gsl_FEATURE_OWNER_MACRO 1 +#endif + +#ifndef gsl_FEATURE_EXPERIMENTAL_RETURN_GUARD +#define gsl_FEATURE_EXPERIMENTAL_RETURN_GUARD 0 +#endif + +// Configuration: Other + +#ifndef gsl_CONFIG_DEPRECATE_TO_LEVEL +#define gsl_CONFIG_DEPRECATE_TO_LEVEL 0 +#endif + +#ifndef gsl_CONFIG_SPAN_INDEX_TYPE +#define gsl_CONFIG_SPAN_INDEX_TYPE size_t +#endif + +#ifndef gsl_CONFIG_NOT_NULL_EXPLICIT_CTOR +#define gsl_CONFIG_NOT_NULL_EXPLICIT_CTOR 0 +#endif + +#ifndef gsl_CONFIG_NOT_NULL_GET_BY_CONST_REF +#define gsl_CONFIG_NOT_NULL_GET_BY_CONST_REF 0 +#endif + +#ifndef gsl_CONFIG_CONFIRMS_COMPILATION_ERRORS +#define gsl_CONFIG_CONFIRMS_COMPILATION_ERRORS 0 +#endif + +#ifndef gsl_CONFIG_ALLOWS_NONSTRICT_SPAN_COMPARISON +#define gsl_CONFIG_ALLOWS_NONSTRICT_SPAN_COMPARISON 1 +#endif + +#ifndef gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR +#define gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR 0 +#endif + +#if defined(gsl_CONFIG_CONTRACT_LEVEL_ON) +#define gsl_CONFIG_CONTRACT_LEVEL_MASK 0x11 +#elif defined(gsl_CONFIG_CONTRACT_LEVEL_OFF) +#define gsl_CONFIG_CONTRACT_LEVEL_MASK 0x00 +#elif defined(gsl_CONFIG_CONTRACT_LEVEL_EXPECTS_ONLY) +#define gsl_CONFIG_CONTRACT_LEVEL_MASK 0x01 +#elif defined(gsl_CONFIG_CONTRACT_LEVEL_ENSURES_ONLY) +#define gsl_CONFIG_CONTRACT_LEVEL_MASK 0x10 +#else +#define gsl_CONFIG_CONTRACT_LEVEL_MASK 0x11 +#endif + +#if 2 <= defined(gsl_CONFIG_CONTRACT_VIOLATION_THROWS) + defined(gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES) + defined(gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER) +#error only one of gsl_CONFIG_CONTRACT_VIOLATION_THROWS, gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES and gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER may be defined. +#elif defined(gsl_CONFIG_CONTRACT_VIOLATION_THROWS) +#define gsl_CONFIG_CONTRACT_VIOLATION_THROWS_V 1 +#define gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER_V 0 +#elif defined(gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES) +#define gsl_CONFIG_CONTRACT_VIOLATION_THROWS_V 0 +#define gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER_V 0 +#elif defined(gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER) +#define gsl_CONFIG_CONTRACT_VIOLATION_THROWS_V 0 +#define gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER_V 1 +#else +#define gsl_CONFIG_CONTRACT_VIOLATION_THROWS_V 0 +#define gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER_V 0 +#endif + +// C++ language version detection (C++20 is speculative): +// Note: VC14.0/1900 (VS2015) lacks too much from C++14. + +#ifndef gsl_CPLUSPLUS +#if defined(_MSVC_LANG) && !defined(__clang__) +#define gsl_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG) +#else +#define gsl_CPLUSPLUS __cplusplus +#endif +#endif + +#define gsl_CPP98_OR_GREATER (gsl_CPLUSPLUS >= 199711L) +#define gsl_CPP11_OR_GREATER (gsl_CPLUSPLUS >= 201103L) +#define gsl_CPP14_OR_GREATER (gsl_CPLUSPLUS >= 201402L) +#define gsl_CPP17_OR_GREATER (gsl_CPLUSPLUS >= 201703L) +#define gsl_CPP20_OR_GREATER (gsl_CPLUSPLUS >= 202000L) + +// C++ language version (represent 98 as 3): + +#define gsl_CPLUSPLUS_V (gsl_CPLUSPLUS / 100 - (gsl_CPLUSPLUS > 200000 ? 2000 : 1994)) + +// half-open range [lo..hi): +#define gsl_BETWEEN(v, lo, hi) ((lo) <= (v) && (v) < (hi)) + +// Compiler versions: +// +// MSVC++ 6.0 _MSC_VER == 1200 (Visual Studio 6.0) +// MSVC++ 7.0 _MSC_VER == 1300 (Visual Studio .NET 2002) +// MSVC++ 7.1 _MSC_VER == 1310 (Visual Studio .NET 2003) +// MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005) +// MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008) +// MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010) +// MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012) +// MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013) +// MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) +// MSVC++ 14.1 _MSC_VER >= 1910 (Visual Studio 2017) + +#if defined(_MSC_VER) && !defined(__clang__) +#define gsl_COMPILER_MSVC_VER (_MSC_VER) +#define gsl_COMPILER_MSVC_VERSION (_MSC_VER / 10 - 10 * (5 + (_MSC_VER < 1900))) +#else +#define gsl_COMPILER_MSVC_VER 0 +#define gsl_COMPILER_MSVC_VERSION 0 +#endif + +#define gsl_COMPILER_VERSION(major, minor, patch) (10 * (10 * (major) + (minor)) + (patch)) + +#if defined(__clang__) +#define gsl_COMPILER_CLANG_VERSION gsl_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__) +#else +#define gsl_COMPILER_CLANG_VERSION 0 +#endif + +#if defined(__GNUC__) && !defined(__clang__) +#define gsl_COMPILER_GNUC_VERSION gsl_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#else +#define gsl_COMPILER_GNUC_VERSION 0 +#endif + +// Method enabling (C++98, VC120 (VS2013) cannot use __VA_ARGS__) + +#define gsl_REQUIRES_0(VA) \ + template ::type = 0> + +#define gsl_REQUIRES_T(VA) \ + , typename = typename std::enable_if<(VA), gsl::detail::enabler>::type + +#define gsl_REQUIRES_R(R, VA) \ + typename std::enable_if::type + +#define gsl_REQUIRES_A(VA) \ + , typename std::enable_if::type = nullptr + +// Compiler non-strict aliasing: + +#if defined(__clang__) || defined(__GNUC__) +#define gsl_may_alias __attribute__((__may_alias__)) +#else +#define gsl_may_alias +#endif + +// Presence of gsl, language and library features: + +#define gsl_IN_STD(v) (((v) == 98 ? 3 : (v)) >= gsl_CPLUSPLUS_V) + +#define gsl_DEPRECATE_TO_LEVEL(level) (level <= gsl_CONFIG_DEPRECATE_TO_LEVEL) +#define gsl_FEATURE_TO_STD(feature) (gsl_IN_STD(gsl_FEATURE(feature##_TO_STD))) +#define gsl_FEATURE(feature) (gsl_FEATURE_##feature) +#define gsl_CONFIG(feature) (gsl_CONFIG_##feature) +#define gsl_HAVE(feature) (gsl_HAVE_##feature) + +// Presence of wide character support: + +#ifdef __DJGPP__ +#define gsl_HAVE_WCHAR 0 +#else +#define gsl_HAVE_WCHAR 1 +#endif + +// Presence of language & library features: + +#ifdef _HAS_CPP0X +#define gsl_HAS_CPP0X _HAS_CPP0X +#else +#define gsl_HAS_CPP0X 0 +#endif + +#define gsl_CPP11_100 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1600) +#define gsl_CPP11_110 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1700) +#define gsl_CPP11_120 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1800) +#define gsl_CPP11_140 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1900) + +#define gsl_CPP14_000 (gsl_CPP14_OR_GREATER) +#define gsl_CPP14_120 (gsl_CPP14_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1800) +#define gsl_CPP14_140 (gsl_CPP14_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1900) + +#define gsl_CPP17_000 (gsl_CPP17_OR_GREATER) +#define gsl_CPP17_140 (gsl_CPP17_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1900) + +#define gsl_CPP11_140_CPP0X_90 (gsl_CPP11_140 || (gsl_COMPILER_MSVC_VER >= 1500 && gsl_HAS_CPP0X)) +#define gsl_CPP11_140_CPP0X_100 (gsl_CPP11_140 || (gsl_COMPILER_MSVC_VER >= 1600 && gsl_HAS_CPP0X)) + +// Presence of C++11 language features: + +#define gsl_HAVE_AUTO gsl_CPP11_100 +#define gsl_HAVE_NULLPTR gsl_CPP11_100 +#define gsl_HAVE_RVALUE_REFERENCE gsl_CPP11_100 + +#define gsl_HAVE_ENUM_CLASS gsl_CPP11_110 + +#define gsl_HAVE_ALIAS_TEMPLATE gsl_CPP11_120 +#define gsl_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG gsl_CPP11_120 +#define gsl_HAVE_EXPLICIT gsl_CPP11_120 +#define gsl_HAVE_INITIALIZER_LIST gsl_CPP11_120 + +#define gsl_HAVE_CONSTEXPR_11 gsl_CPP11_140 +#define gsl_HAVE_IS_DEFAULT gsl_CPP11_140 +#define gsl_HAVE_IS_DELETE gsl_CPP11_140 +#define gsl_HAVE_NOEXCEPT gsl_CPP11_140 + +#if gsl_CPP11_OR_GREATER +// see above +#endif + +// Presence of C++14 language features: + +#define gsl_HAVE_CONSTEXPR_14 gsl_CPP14_000 +#define gsl_HAVE_DECLTYPE_AUTO gsl_CPP14_140 + +// Presence of C++17 language features: +// MSVC: template parameter deduction guides since Visual Studio 2017 v15.7 + +#define gsl_HAVE_ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE gsl_CPP17_000 +#define gsl_HAVE_DEDUCTION_GUIDES (gsl_CPP17_000 && !gsl_BETWEEN(gsl_COMPILER_MSVC_VERSION, 1, 999)) + +// Presence of C++ library features: + +#define gsl_HAVE_ADDRESSOF gsl_CPP17_000 +#define gsl_HAVE_ARRAY gsl_CPP11_110 +#define gsl_HAVE_TYPE_TRAITS gsl_CPP11_110 +#define gsl_HAVE_TR1_TYPE_TRAITS gsl_CPP11_110 + +#define gsl_HAVE_CONTAINER_DATA_METHOD gsl_CPP11_140_CPP0X_90 +#define gsl_HAVE_STD_DATA gsl_CPP17_000 + +#define gsl_HAVE_SIZED_TYPES gsl_CPP11_140 + +#define gsl_HAVE_MAKE_SHARED gsl_CPP11_140_CPP0X_100 +#define gsl_HAVE_SHARED_PTR gsl_CPP11_140_CPP0X_100 +#define gsl_HAVE_UNIQUE_PTR gsl_CPP11_140_CPP0X_100 + +#define gsl_HAVE_MAKE_UNIQUE gsl_CPP14_120 + +#define gsl_HAVE_UNCAUGHT_EXCEPTIONS gsl_CPP17_140 + +#define gsl_HAVE_ADD_CONST gsl_HAVE_TYPE_TRAITS +#define gsl_HAVE_INTEGRAL_CONSTANT gsl_HAVE_TYPE_TRAITS +#define gsl_HAVE_REMOVE_CONST gsl_HAVE_TYPE_TRAITS +#define gsl_HAVE_REMOVE_REFERENCE gsl_HAVE_TYPE_TRAITS + +#define gsl_HAVE_TR1_ADD_CONST gsl_HAVE_TR1_TYPE_TRAITS +#define gsl_HAVE_TR1_INTEGRAL_CONSTANT gsl_HAVE_TR1_TYPE_TRAITS +#define gsl_HAVE_TR1_REMOVE_CONST gsl_HAVE_TR1_TYPE_TRAITS +#define gsl_HAVE_TR1_REMOVE_REFERENCE gsl_HAVE_TR1_TYPE_TRAITS + +// C++ feature usage: + +#if gsl_HAVE(ADDRESSOF) +#define gsl_ADDRESSOF(x) std::addressof(x) +#else +#define gsl_ADDRESSOF(x) (&x) +#endif + +#if gsl_HAVE(CONSTEXPR_11) +#define gsl_constexpr constexpr +#else +#define gsl_constexpr /*constexpr*/ +#endif + +#if gsl_HAVE(CONSTEXPR_14) +#define gsl_constexpr14 constexpr +#else +#define gsl_constexpr14 /*constexpr*/ +#endif + +#if gsl_HAVE(EXPLICIT) +#define gsl_explicit explicit +#else +#define gsl_explicit /*explicit*/ +#endif + +#if gsl_FEATURE(IMPLICIT_MACRO) +#define implicit /*implicit*/ +#endif + +#if gsl_HAVE(IS_DELETE) +#define gsl_is_delete = delete +#else +#define gsl_is_delete +#endif + +#if gsl_HAVE(IS_DELETE) +#define gsl_is_delete_access public +#else +#define gsl_is_delete_access private +#endif + +#if !gsl_HAVE(NOEXCEPT) || gsl_CONFIG(CONTRACT_VIOLATION_THROWS_V) +#define gsl_noexcept /*noexcept*/ +#else +#define gsl_noexcept noexcept +#endif + +#if gsl_HAVE(NULLPTR) +#define gsl_nullptr nullptr +#else +#define gsl_nullptr NULL +#endif + +#define gsl_DIMENSION_OF(a) (sizeof(a) / sizeof(0 [a])) + +// Other features: + +#define gsl_HAVE_CONSTRAINED_SPAN_CONTAINER_CTOR \ + (gsl_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG && gsl_HAVE_CONTAINER_DATA_METHOD) + +// Note: !defined(__NVCC__) doesn't work with nvcc here: +#define gsl_HAVE_UNCONSTRAINED_SPAN_CONTAINER_CTOR \ + (gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR && (__NVCC__ == 0)) + +// GSL API (e.g. for CUDA platform): + +#ifndef gsl_api +#ifdef __CUDACC__ +#define gsl_api __host__ __device__ +#else +#define gsl_api /*gsl_api*/ +#endif +#endif + +// Additional includes: + +#if gsl_HAVE(ARRAY) +#include +#endif + +#if gsl_HAVE(INITIALIZER_LIST) +#include +#endif + +#if gsl_HAVE(TYPE_TRAITS) +#include +#elif gsl_HAVE(TR1_TYPE_TRAITS) +#include +#endif + +#if gsl_HAVE(SIZED_TYPES) +#include +#endif + +// MSVC warning suppression macros: + +#if gsl_COMPILER_MSVC_VERSION >= 140 +#define gsl_SUPPRESS_MSGSL_WARNING(expr) [[gsl::suppress(expr)]] +#define gsl_SUPPRESS_MSVC_WARNING(code, descr) __pragma(warning(suppress \ + : code)) +#define gsl_DISABLE_MSVC_WARNINGS(codes) __pragma(warning(push)) __pragma(warning(disable \ + : codes)) +#define gsl_RESTORE_MSVC_WARNINGS() __pragma(warning(pop)) +#else +#define gsl_SUPPRESS_MSGSL_WARNING(expr) +#define gsl_SUPPRESS_MSVC_WARNING(code, descr) +#define gsl_DISABLE_MSVC_WARNINGS(codes) +#define gsl_RESTORE_MSVC_WARNINGS() +#endif + +// Suppress the following MSVC GSL warnings: +// - C26410: gsl::r.32: the parameter 'ptr' is a reference to const unique pointer, use const T* or const T& instead +// - C26415: gsl::r.30: smart pointer parameter 'ptr' is used only to access contained pointer. Use T* or T& instead +// - C26418: gsl::r.36: shared pointer parameter 'ptr' is not copied or moved. Use T* or T& instead +// - C26472, gsl::t.1 : don't use a static_cast for arithmetic conversions; +// use brace initialization, gsl::narrow_cast or gsl::narow +// - C26439, gsl::f.6 : special function 'function' can be declared 'noexcept' +// - C26440, gsl::f.6 : function 'function' can be declared 'noexcept' +// - C26473: gsl::t.1 : don't cast between pointer types where the source type and the target type are the same +// - C26481: gsl::b.1 : don't use pointer arithmetic. Use span instead +// - C26482, gsl::b.2 : only index into arrays using constant expressions +// - C26490: gsl::t.1 : don't use reinterpret_cast + +gsl_DISABLE_MSVC_WARNINGS(26410 26415 26418 26472 26439 26440 26473 26481 26482 26490) + + namespace gsl +{ + // forward declare span<>: + + template + class span; + + // C++11 emulation: + + namespace std11 + { +#if gsl_HAVE(ADD_CONST) + + using std::add_const; + +#elif gsl_HAVE(TR1_ADD_CONST) + + using std::tr1::add_const; + +#else + + template + struct add_const + { + typedef const T type; + }; + +#endif // gsl_HAVE( ADD_CONST ) + +#if gsl_HAVE(REMOVE_CONST) + + using std::remove_const; + using std::remove_cv; + using std::remove_volatile; + +#elif gsl_HAVE(TR1_REMOVE_CONST) + + using std::tr1::remove_const; + using std::tr1::remove_cv; + using std::tr1::remove_volatile; + +#else + + template + struct remove_const + { + typedef T type; + }; + template + struct remove_const + { + typedef T type; + }; + + template + struct remove_volatile + { + typedef T type; + }; + template + struct remove_volatile + { + typedef T type; + }; + + template + struct remove_cv + { + typedef typename remove_volatile::type>::type type; + }; + +#endif // gsl_HAVE( REMOVE_CONST ) + +#if gsl_HAVE(INTEGRAL_CONSTANT) + + using std::false_type; + using std::integral_constant; + using std::true_type; + +#elif gsl_HAVE(TR1_INTEGRAL_CONSTANT) + + using std::tr1::false_type; + using std::tr1::integral_constant; + using std::tr1::true_type; + +#else + + template + struct integral_constant + { + enum + { + value = v + }; + }; + typedef integral_constant true_type; + typedef integral_constant false_type; + +#endif + + } // namespace std11 + + // C++17 emulation: + + namespace std17 + { + template + struct bool_constant : std11::integral_constant + { + }; + +#if gsl_CPP11_120 + + template + using void_t = void; + +#endif + +#if gsl_HAVE(STD_DATA) + + using std::data; + using std::size; + +#elif gsl_HAVE(CONSTRAINED_SPAN_CONTAINER_CTOR) + + template + inline gsl_constexpr auto size(const T (&)[N]) gsl_noexcept -> size_t + { + return N; + } + + template + inline gsl_constexpr auto size(C const &cont) -> decltype(cont.size()) + { + return cont.size(); + } + + template + inline gsl_constexpr auto data(T (&arr)[N]) gsl_noexcept -> T * + { + return &arr[0]; + } + + template + inline gsl_constexpr auto data(C &cont) -> decltype(cont.data()) + { + return cont.data(); + } + + template + inline gsl_constexpr auto data(C const &cont) -> decltype(cont.data()) + { + return cont.data(); + } + + template + inline gsl_constexpr auto data(std::initializer_list il) gsl_noexcept -> E const * + { + return il.begin(); + } + +#endif // span_HAVE( DATA ) + + } // namespace std17 + + namespace detail + { + /// for nsel_REQUIRES_T + + /*enum*/ class enabler + { + }; + +#if gsl_HAVE(TYPE_TRAITS) + + template + struct is_span_oracle : std::false_type + { + }; + + template + struct is_span_oracle > : std::true_type + { + }; + + template + struct is_span : is_span_oracle::type> + { + }; + + template + struct is_std_array_oracle : std::false_type + { + }; + +#if gsl_HAVE(ARRAY) + + template + struct is_std_array_oracle > : std::true_type + { + }; + +#endif + + template + struct is_std_array : is_std_array_oracle::type> + { + }; + + template + struct is_array : std::false_type + { + }; + + template + struct is_array : std::true_type + { + }; + + template + struct is_array : std::true_type + { + }; + +#if gsl_CPP11_140 && !gsl_BETWEEN(gsl_COMPILER_GNUC_VERSION, 1, 500) + + template + struct has_size_and_data : std::false_type + { + }; + + template + struct has_size_and_data< + C, std17::void_t< + decltype(std17::size(std::declval())), + decltype(std17::data(std::declval()))> > : std::true_type + { + }; + + template + struct is_compatible_element : std::false_type + { + }; + + template + struct is_compatible_element< + C, E, std17::void_t()))> > : std::is_convertible()))>::type (*)[], E (*)[]> + { + }; + + template + struct is_container : std17::bool_constant< + !is_span::value && !is_array::value && !is_std_array::value && has_size_and_data::value> + { + }; + + template + struct is_compatible_container : std17::bool_constant< + is_container::value && is_compatible_element::value> + { + }; + +#else // gsl_CPP11_140 + + template < + class C, class E gsl_REQUIRES_T((!is_span::value && !is_array::value && !is_std_array::value && (std::is_convertible()))>::type (*)[], E (*)[]>::value) + // && has_size_and_data< C >::value + )), + class = decltype(std17::size(std::declval())), class = decltype(std17::data(std::declval()))> + struct is_compatible_container : std::true_type + { + }; + +#endif // gsl_CPP11_140 + +#endif // gsl_HAVE( TYPE_TRAITS ) + + } // namespace detail + + // + // GSL.util: utilities + // + + // index type for all container indexes/subscripts/sizes + typedef gsl_CONFIG_SPAN_INDEX_TYPE index; // p0122r3 uses std::ptrdiff_t + +// +// GSL.owner: ownership pointers +// +#if gsl_HAVE(SHARED_PTR) + using std::make_shared; + using std::shared_ptr; + using std::unique_ptr; +#if gsl_HAVE(MAKE_UNIQUE) + using std::make_unique; +#endif +#endif + +#if gsl_HAVE(ALIAS_TEMPLATE) +#if gsl_HAVE(TYPE_TRAITS) + template ::value)> + using owner = T; +#else + template + using owner = T; +#endif +#else + template + struct owner + { + typedef T type; + }; +#endif + +#define gsl_HAVE_OWNER_TEMPLATE gsl_HAVE_ALIAS_TEMPLATE + +#if gsl_FEATURE(OWNER_MACRO) +#if gsl_HAVE(OWNER_TEMPLATE) +#define Owner(t) ::gsl::owner +#else +#define Owner(t) ::gsl::owner::type +#endif +#endif + + // + // GSL.assert: assertions + // + +#define gsl_ELIDE_CONTRACT_EXPECTS (0 == (gsl_CONFIG_CONTRACT_LEVEL_MASK & 0x01)) +#define gsl_ELIDE_CONTRACT_ENSURES (0 == (gsl_CONFIG_CONTRACT_LEVEL_MASK & 0x10)) + +#if gsl_ELIDE_CONTRACT_EXPECTS +#define Expects(x) /* Expects elided */ +#elif gsl_CONFIG(CONTRACT_VIOLATION_THROWS_V) +#define Expects(x) ::gsl::fail_fast_assert((x), "GSL: Precondition failure at " __FILE__ ":" gsl_STRINGIFY(__LINE__)) +#elif gsl_CONFIG(CONTRACT_VIOLATION_CALLS_HANDLER_V) +#define Expects(x) ::gsl::fail_fast_assert((x), #x, "GSL: Precondition failure", __FILE__, __LINE__) +#else +#define Expects(x) ::gsl::fail_fast_assert((x)) +#endif + +#if gsl_ELIDE_CONTRACT_EXPECTS +#define gsl_EXPECTS_UNUSED_PARAM(x) /* Make param unnamed if Expects elided */ +#else +#define gsl_EXPECTS_UNUSED_PARAM(x) x +#endif + +#if gsl_ELIDE_CONTRACT_ENSURES +#define Ensures(x) /* Ensures elided */ +#elif gsl_CONFIG(CONTRACT_VIOLATION_THROWS_V) +#define Ensures(x) ::gsl::fail_fast_assert((x), "GSL: Postcondition failure at " __FILE__ ":" gsl_STRINGIFY(__LINE__)) +#elif gsl_CONFIG(CONTRACT_VIOLATION_CALLS_HANDLER_V) +#define Ensures(x) ::gsl::fail_fast_assert((x), #x, "GSL: Postcondition failure", __FILE__, __LINE__) +#else +#define Ensures(x) ::gsl::fail_fast_assert((x)) +#endif + +#define gsl_STRINGIFY(x) gsl_STRINGIFY_(x) +#define gsl_STRINGIFY_(x) #x + + struct fail_fast : public std::logic_error + { + gsl_api explicit fail_fast(char const *const message) + : std::logic_error(message) {} + }; + +#if gsl_CONFIG(CONTRACT_VIOLATION_THROWS_V) + + gsl_api inline void fail_fast_assert(bool cond, char const *const message) + { + if (!cond) + throw fail_fast(message); + } + +#elif gsl_CONFIG(CONTRACT_VIOLATION_CALLS_HANDLER_V) + + // Should be defined by user + gsl_api void fail_fast_assert_handler(char const *const expression, char const *const message, char const *const file, int line); + + gsl_api inline void fail_fast_assert(bool cond, char const *const expression, char const *const message, char const *const file, int line) + { + if (!cond) + fail_fast_assert_handler(expression, message, file, line); + } + +#else + + gsl_api inline void fail_fast_assert(bool cond) gsl_noexcept + { +#ifdef __CUDA_ARCH__ + assert(cond); +#else // __CUDA_ARCH__ + if (!cond) + std::terminate(); +#endif // __CUDA_ARCH__ + } + +#endif + + // + // GSL.util: utilities + // + +#if gsl_FEATURE(EXPERIMENTAL_RETURN_GUARD) + + // Add uncaught_exceptions for pre-2017 MSVC, GCC and Clang + // Return unsigned char to save stack space, uncaught_exceptions can only increase by 1 in a scope + + namespace detail + { + inline unsigned char to_uchar(unsigned x) gsl_noexcept + { + return static_cast(x); + } + + } // namespace detail + + namespace std11 + { +#if gsl_HAVE(UNCAUGHT_EXCEPTIONS) + + inline unsigned char uncaught_exceptions() gsl_noexcept + { + return detail::to_uchar(std::uncaught_exceptions()); + } + +#elif gsl_COMPILER_MSVC_VERSION + + extern "C" char *__cdecl _getptd(); + inline unsigned char uncaught_exceptions() gsl_noexcept + { + return detail::to_uchar(*reinterpret_cast(_getptd() + (sizeof(void *) == 8 ? 0x100 : 0x90))); + } + +#elif gsl_COMPILER_CLANG_VERSION || gsl_COMPILER_GNUC_VERSION + + extern "C" char *__cxa_get_globals(); + inline unsigned char uncaught_exceptions() gsl_noexcept + { + return detail::to_uchar(*reinterpret_cast(__cxa_get_globals() + sizeof(void *))); + } +#endif + } // namespace std11 +#endif + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 110 + + template + class final_action + { + public: + gsl_api explicit final_action(F action) gsl_noexcept + : action_(std::move(action)), + invoke_(true) + { + } + + gsl_api final_action(final_action &&other) gsl_noexcept + : action_(std::move(other.action_)), + invoke_(other.invoke_) + { + other.invoke_ = false; + } + + gsl_api virtual ~final_action() gsl_noexcept + { + if (invoke_) + action_(); + } + + gsl_is_delete_access : gsl_api final_action(final_action const &) gsl_is_delete; + gsl_api final_action &operator=(final_action const &) gsl_is_delete; + gsl_api final_action &operator=(final_action &&) gsl_is_delete; + + protected: + gsl_api void dismiss() gsl_noexcept + { + invoke_ = false; + } + + private: + F action_; + bool invoke_; + }; + + template + gsl_api inline final_action finally(F const &action) gsl_noexcept + { + return final_action(action); + } + + template + gsl_api inline final_action finally(F && action) gsl_noexcept + { + return final_action(std::forward(action)); + } + +#if gsl_FEATURE(EXPERIMENTAL_RETURN_GUARD) + + template + class final_action_return : public final_action + { + public: + gsl_api explicit final_action_return(F &&action) gsl_noexcept + : final_action(std::move(action)), + exception_count(std11::uncaught_exceptions()) + { + } + + gsl_api final_action_return(final_action_return &&other) gsl_noexcept + : final_action(std::move(other)), + exception_count(std11::uncaught_exceptions()) + { + } + + gsl_api ~final_action_return() override + { + if (std11::uncaught_exceptions() != exception_count) + this->dismiss(); + } + + gsl_is_delete_access : gsl_api final_action_return(final_action_return const &) gsl_is_delete; + gsl_api final_action_return &operator=(final_action_return const &) gsl_is_delete; + + private: + unsigned char exception_count; + }; + + template + gsl_api inline final_action_return on_return(F const &action) gsl_noexcept + { + return final_action_return(action); + } + + template + gsl_api inline final_action_return on_return(F && action) gsl_noexcept + { + return final_action_return(std::forward(action)); + } + + template + class final_action_error : public final_action + { + public: + gsl_api explicit final_action_error(F &&action) gsl_noexcept + : final_action(std::move(action)), + exception_count(std11::uncaught_exceptions()) + { + } + + gsl_api final_action_error(final_action_error &&other) gsl_noexcept + : final_action(std::move(other)), + exception_count(std11::uncaught_exceptions()) + { + } + + gsl_api ~final_action_error() override + { + if (std11::uncaught_exceptions() == exception_count) + this->dismiss(); + } + + gsl_is_delete_access : gsl_api final_action_error(final_action_error const &) gsl_is_delete; + gsl_api final_action_error &operator=(final_action_error const &) gsl_is_delete; + + private: + unsigned char exception_count; + }; + + template + gsl_api inline final_action_error on_error(F const &action) gsl_noexcept + { + return final_action_error(action); + } + + template + gsl_api inline final_action_error on_error(F && action) gsl_noexcept + { + return final_action_error(std::forward(action)); + } + +#endif // gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +#else // gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 110 + + class final_action + { + public: + typedef void (*Action)(); + + gsl_api final_action(Action action) + : action_(action), invoke_(true) + { + } + + gsl_api final_action(final_action const &other) + : action_(other.action_), invoke_(other.invoke_) + { + other.invoke_ = false; + } + + gsl_api virtual ~final_action() + { + if (invoke_) + action_(); + } + + protected: + gsl_api void dismiss() + { + invoke_ = false; + } + + private: + gsl_api final_action &operator=(final_action const &); + + private: + Action action_; + mutable bool invoke_; + }; + + template + gsl_api inline final_action finally(F const &f) + { + return final_action((f)); + } + +#if gsl_FEATURE(EXPERIMENTAL_RETURN_GUARD) + + class final_action_return : public final_action + { + public: + gsl_api explicit final_action_return(Action action) + : final_action(action), exception_count(std11::uncaught_exceptions()) + { + } + + gsl_api ~final_action_return() + { + if (std11::uncaught_exceptions() != exception_count) + this->dismiss(); + } + + private: + gsl_api final_action_return &operator=(final_action_return const &); + + private: + unsigned char exception_count; + }; + + template + gsl_api inline final_action_return on_return(F const &action) + { + return final_action_return(action); + } + + class final_action_error : public final_action + { + public: + gsl_api explicit final_action_error(Action action) + : final_action(action), exception_count(std11::uncaught_exceptions()) + { + } + + gsl_api ~final_action_error() + { + if (std11::uncaught_exceptions() == exception_count) + this->dismiss(); + } + + private: + gsl_api final_action_error &operator=(final_action_error const &); + + private: + unsigned char exception_count; + }; + + template + gsl_api inline final_action_error on_error(F const &action) + { + return final_action_error(action); + } + +#endif // gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +#endif // gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION == 110 + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + + template + gsl_api inline gsl_constexpr T narrow_cast(U && u) gsl_noexcept + { + return static_cast(std::forward(u)); + } + +#else + + template + gsl_api inline T narrow_cast(U u) gsl_noexcept + { + return static_cast(u); + } + +#endif // gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + + struct narrowing_error : public std::exception + { + }; + +#if gsl_HAVE(TYPE_TRAITS) + + namespace detail + { + template + struct is_same_signedness : public std::integral_constant::value == std::is_signed::value> + { + }; + } // namespace detail +#endif + + template + gsl_api inline T narrow(U u) + { + T t = narrow_cast(u); + + if (static_cast(t) != u) + { +#if gsl_CONFIG(CONTRACT_VIOLATION_THROWS_V) + throw narrowing_error(); +#else + std::terminate(); +#endif + } + +#if gsl_HAVE(TYPE_TRAITS) +#if gsl_COMPILER_MSVC_VERSION + // Suppress MSVC level 4 warning C4127 (conditional expression is constant) + if (0, !detail::is_same_signedness::value && ((t < T()) != (u < U()))) +#else + if (!detail::is_same_signedness::value && ((t < T()) != (u < U()))) +#endif +#else + // Don't assume T() works: + if ((t < 0) != (u < 0)) +#endif + { +#if gsl_CONFIG(CONTRACT_VIOLATION_THROWS_V) + throw narrowing_error(); +#else + std::terminate(); +#endif + } + return t; + } + + // + // at() - Bounds-checked way of accessing static arrays, std::array, std::vector. + // + + template + gsl_api inline gsl_constexpr14 T &at(T(&arr)[N], size_t pos) + { + Expects(pos < N); + return arr[pos]; + } + + template + gsl_api inline gsl_constexpr14 typename Container::value_type &at(Container & cont, size_t pos) + { + Expects(pos < cont.size()); + return cont[pos]; + } + + template + gsl_api inline gsl_constexpr14 typename Container::value_type const &at(Container const &cont, size_t pos) + { + Expects(pos < cont.size()); + return cont[pos]; + } + +#if gsl_HAVE(INITIALIZER_LIST) + + template + gsl_api inline const gsl_constexpr14 T at(std::initializer_list cont, size_t pos) + { + Expects(pos < cont.size()); + return *(cont.begin() + pos); + } +#endif + + template + gsl_api inline gsl_constexpr T &at(span s, size_t pos) + { + return s.at(pos); + } + + // + // GSL.views: views + // + + // + // not_null<> - Wrap any indirection and enforce non-null. + // + template + class not_null + { +#if gsl_CONFIG(NOT_NULL_EXPLICIT_CTOR) +#define gsl_not_null_explicit explicit +#else +#define gsl_not_null_explicit /*explicit*/ +#endif + +#if gsl_CONFIG(NOT_NULL_GET_BY_CONST_REF) + typedef T const &get_result_t; +#else + typedef T get_result_t; +#endif + + public: +#if gsl_HAVE(TYPE_TRAITS) + static_assert(std::is_assignable::value, "T cannot be assigned nullptr."); +#endif + + template ::value)) +#endif + > + gsl_api gsl_constexpr14 gsl_not_null_explicit +#if gsl_HAVE(RVALUE_REFERENCE) + not_null(U &&u) + : ptr_(std::forward(u)) +#else + not_null(U const &u) + : ptr_(u) +#endif + { + Expects(ptr_ != gsl_nullptr); + } +#undef gsl_not_null_explicit + +#if gsl_HAVE(IS_DEFAULT) + gsl_api ~not_null() = default; + gsl_api gsl_constexpr not_null(not_null &&other) = default; + gsl_api gsl_constexpr not_null(not_null const &other) = default; + gsl_api not_null &operator=(not_null &&other) = default; + gsl_api not_null &operator=(not_null const &other) = default; +#else + gsl_api ~not_null(){}; + gsl_api gsl_constexpr not_null(not_null const &other) : ptr_(other.ptr_) {} + gsl_api not_null &operator=(not_null const &other) + { + ptr_ = other.ptr_; + return *this; + } +#if gsl_HAVE(RVALUE_REFERENCE) + gsl_api gsl_constexpr not_null(not_null &&other) : ptr_(std::move(other.get())) + { + } + gsl_api not_null &operator=(not_null &&other) + { + ptr_ = std::move(other.get()); + return *this; + } +#endif +#endif + + template ::value)) +#endif + > + gsl_api gsl_constexpr not_null(not_null const &other) + : ptr_(other.get()) + { + } + + gsl_api gsl_constexpr14 get_result_t get() const + { + // Without cheating and changing ptr_ from the outside, this check is superfluous: + Ensures(ptr_ != gsl_nullptr); + return ptr_; + } + + gsl_api gsl_constexpr operator get_result_t() const { return get(); } + gsl_api gsl_constexpr get_result_t operator->() const { return get(); } + +#if gsl_HAVE(DECLTYPE_AUTO) + gsl_api gsl_constexpr decltype(auto) operator*() const + { + return *get(); + } +#endif + + gsl_is_delete_access : + // prevent compilation when initialized with a nullptr or literal 0: +#if gsl_HAVE(NULLPTR) + gsl_api not_null(std::nullptr_t) gsl_is_delete; + gsl_api not_null &operator=(std::nullptr_t) gsl_is_delete; +#else + gsl_api + not_null(int) gsl_is_delete; + gsl_api not_null &operator=(int) gsl_is_delete; +#endif + + // unwanted operators...pointers only point to single objects! + gsl_api not_null &operator++() gsl_is_delete; + gsl_api not_null &operator--() gsl_is_delete; + gsl_api not_null operator++(int) gsl_is_delete; + gsl_api not_null operator--(int) gsl_is_delete; + gsl_api not_null &operator+(size_t) gsl_is_delete; + gsl_api not_null &operator+=(size_t) gsl_is_delete; + gsl_api not_null &operator-(size_t) gsl_is_delete; + gsl_api not_null &operator-=(size_t) gsl_is_delete; + gsl_api not_null &operator+=(std::ptrdiff_t) gsl_is_delete; + gsl_api not_null &operator-=(std::ptrdiff_t) gsl_is_delete; + gsl_api void operator[](std::ptrdiff_t) const gsl_is_delete; + + private: + T ptr_; + }; + + // not_null with implicit constructor, allowing copy-initialization: + + template + class not_null_ic : public not_null + { + public: + template ::value)) +#endif + > + gsl_api gsl_constexpr14 +#if gsl_HAVE(RVALUE_REFERENCE) + not_null_ic(U &&u) + : not_null(std::forward(u)) +#else + not_null_ic(U const &u) + : not_null(u) +#endif + { + } + }; + + // more not_null unwanted operators + + template + std::ptrdiff_t operator-(not_null const &, not_null const &) gsl_is_delete; + + template + not_null operator-(not_null const &, std::ptrdiff_t) gsl_is_delete; + + template + not_null operator+(not_null const &, std::ptrdiff_t) gsl_is_delete; + + template + not_null operator+(std::ptrdiff_t, not_null const &) gsl_is_delete; + + // not_null comparisons + + template + gsl_api inline gsl_constexpr bool operator==(not_null const &l, not_null const &r) + { + return l.get() == r.get(); + } + + template + gsl_api inline gsl_constexpr bool operator<(not_null const &l, not_null const &r) + { + return l.get() < r.get(); + } + + template + gsl_api inline gsl_constexpr bool operator!=(not_null const &l, not_null const &r) + { + return !(l == r); + } + + template + gsl_api inline gsl_constexpr bool operator<=(not_null const &l, not_null const &r) + { + return !(r < l); + } + + template + gsl_api inline gsl_constexpr bool operator>(not_null const &l, not_null const &r) + { + return (r < l); + } + + template + gsl_api inline gsl_constexpr bool operator>=(not_null const &l, not_null const &r) + { + return !(l < r); + } + +// +// Byte-specific type. +// +#if gsl_HAVE(ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE) + enum class gsl_may_alias byte : unsigned char + { + }; +#else + struct gsl_may_alias byte + { + typedef unsigned char type; + type v; + }; +#endif + +#if gsl_HAVE(DEFAULT_FUNCTION_TEMPLATE_ARG) +#define gsl_ENABLE_IF_INTEGRAL_T(T) \ + gsl_REQUIRES_T((std::is_integral::value)) +#else +#define gsl_ENABLE_IF_INTEGRAL_T(T) +#endif + + template + gsl_api inline gsl_constexpr byte to_byte(T v) gsl_noexcept + { +#if gsl_HAVE(ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE) + return static_cast(v); +#elif gsl_HAVE(CONSTEXPR_11) + return {static_cast(v)}; +#else + byte b = {static_cast(v)}; + return b; +#endif + } + + template + gsl_api inline gsl_constexpr IntegerType to_integer(byte b) gsl_noexcept + { +#if gsl_HAVE(ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE) + return static_cast::type>(b); +#else + return b.v; +#endif + } + + gsl_api inline gsl_constexpr unsigned char to_uchar(byte b) gsl_noexcept + { + return to_integer(b); + } + + gsl_api inline gsl_constexpr unsigned char to_uchar(int i) gsl_noexcept + { + return static_cast(i); + } + +#if !gsl_HAVE(ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE) + + gsl_api inline gsl_constexpr bool operator==(byte l, byte r) gsl_noexcept + { + return l.v == r.v; + } + + gsl_api inline gsl_constexpr bool operator!=(byte l, byte r) gsl_noexcept + { + return !(l == r); + } + + gsl_api inline gsl_constexpr bool operator<(byte l, byte r) gsl_noexcept + { + return l.v < r.v; + } + + gsl_api inline gsl_constexpr bool operator<=(byte l, byte r) gsl_noexcept + { + return !(r < l); + } + + gsl_api inline gsl_constexpr bool operator>(byte l, byte r) gsl_noexcept + { + return (r < l); + } + + gsl_api inline gsl_constexpr bool operator>=(byte l, byte r) gsl_noexcept + { + return !(l < r); + } +#endif + + template + gsl_api inline gsl_constexpr14 byte &operator<<=(byte &b, IntegerType shift) gsl_noexcept + { +#if gsl_HAVE(ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE) + return b = to_byte(to_uchar(b) << shift); +#else + b.v = to_uchar(b.v << shift); + return b; +#endif + } + + template + gsl_api inline gsl_constexpr byte operator<<(byte b, IntegerType shift) gsl_noexcept + { + return to_byte(to_uchar(b) << shift); + } + + template + gsl_api inline gsl_constexpr14 byte &operator>>=(byte &b, IntegerType shift) gsl_noexcept + { +#if gsl_HAVE(ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE) + return b = to_byte(to_uchar(b) >> shift); +#else + b.v = to_uchar(b.v >> shift); + return b; +#endif + } + + template + gsl_api inline gsl_constexpr byte operator>>(byte b, IntegerType shift) gsl_noexcept + { + return to_byte(to_uchar(b) >> shift); + } + + gsl_api inline gsl_constexpr14 byte &operator|=(byte &l, byte r) gsl_noexcept + { +#if gsl_HAVE(ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE) + return l = to_byte(to_uchar(l) | to_uchar(r)); +#else + l.v = to_uchar(l) | to_uchar(r); + return l; +#endif + } + + gsl_api inline gsl_constexpr byte operator|(byte l, byte r) gsl_noexcept + { + return to_byte(to_uchar(l) | to_uchar(r)); + } + + gsl_api inline gsl_constexpr14 byte &operator&=(byte &l, byte r) gsl_noexcept + { +#if gsl_HAVE(ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE) + return l = to_byte(to_uchar(l) & to_uchar(r)); +#else + l.v = to_uchar(l) & to_uchar(r); + return l; +#endif + } + + gsl_api inline gsl_constexpr byte operator&(byte l, byte r)gsl_noexcept + { + return to_byte(to_uchar(l) & to_uchar(r)); + } + + gsl_api inline gsl_constexpr14 byte &operator^=(byte &l, byte r) gsl_noexcept + { +#if gsl_HAVE(ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE) + return l = to_byte(to_uchar(l) ^ to_uchar(r)); +#else + l.v = to_uchar(l) ^ to_uchar(r); + return l; +#endif + } + + gsl_api inline gsl_constexpr byte operator^(byte l, byte r) gsl_noexcept + { + return to_byte(to_uchar(l) ^ to_uchar(r)); + } + + gsl_api inline gsl_constexpr byte operator~(byte b) gsl_noexcept + { + return to_byte(~to_uchar(b)); + } + +#if gsl_FEATURE_TO_STD(WITH_CONTAINER) + + // Tag to select span constructor taking a container (prevent ms-gsl warning C26426): + + struct with_container_t + { + gsl_constexpr with_container_t() gsl_noexcept {} + }; + const gsl_constexpr with_container_t with_container; + +#endif + + // + // span<> - A 1D view of contiguous T's, replace (*,len). + // + template + class span + { + template + friend class span; + + public: + typedef index index_type; + + typedef T element_type; + typedef typename std11::remove_cv::type value_type; + + typedef T &reference; + typedef T *pointer; + typedef T const *const_pointer; + typedef T const &const_reference; + + typedef pointer iterator; + typedef const_pointer const_iterator; + + typedef std::reverse_iterator reverse_iterator; + typedef std::reverse_iterator const_reverse_iterator; + + typedef typename std::iterator_traits::difference_type difference_type; + + // 26.7.3.2 Constructors, copy, and assignment [span.cons] + + gsl_api gsl_constexpr14 span() gsl_noexcept + : first_(gsl_nullptr), + last_(gsl_nullptr) + { + Expects(size() == 0); + } + +#if !gsl_DEPRECATE_TO_LEVEL(5) + +#if gsl_HAVE(NULLPTR) + gsl_api gsl_constexpr14 span(std::nullptr_t, index_type gsl_EXPECTS_UNUSED_PARAM(size_in)) + : first_(nullptr), last_(nullptr) + { + Expects(size_in == 0); + } +#endif + +#if gsl_HAVE(IS_DELETE) + gsl_api gsl_constexpr span(reference data_in) + : span(&data_in, 1) + { + } + + gsl_api gsl_constexpr span(element_type &&) = delete; +#endif + +#endif // deprecate + + gsl_api gsl_constexpr14 span(pointer data_in, index_type size_in) + : first_(data_in), last_(data_in + size_in) + { + Expects(size_in == 0 || (size_in > 0 && data_in != gsl_nullptr)); + } + + gsl_api gsl_constexpr14 span(pointer first_in, pointer last_in) + : first_(first_in), last_(last_in) + { + Expects(first_in <= last_in); + } + +#if !gsl_DEPRECATE_TO_LEVEL(5) + + template + gsl_api gsl_constexpr14 span(U *&data_in, index_type size_in) + : first_(data_in), last_(data_in + size_in) + { + Expects(size_in == 0 || (size_in > 0 && data_in != gsl_nullptr)); + } + + template + gsl_api gsl_constexpr14 span(U *const &data_in, index_type size_in) + : first_(data_in), last_(data_in + size_in) + { + Expects(size_in == 0 || (size_in > 0 && data_in != gsl_nullptr)); + } + +#endif // deprecate + +#if !gsl_DEPRECATE_TO_LEVEL(5) + template + gsl_api gsl_constexpr span(U (&arr)[N]) gsl_noexcept + : first_(gsl_ADDRESSOF(arr[0])), + last_(gsl_ADDRESSOF(arr[0]) + N) + { + } +#else + template ::value)) +#endif + > + gsl_api gsl_constexpr span(element_type (&arr)[N]) gsl_noexcept + : first_(gsl_ADDRESSOF(arr[0])), + last_(gsl_ADDRESSOF(arr[0]) + N) + { + } +#endif // deprecate + +#if gsl_HAVE(ARRAY) +#if !gsl_DEPRECATE_TO_LEVEL(5) + + template + gsl_api gsl_constexpr span(std::array &arr) + : first_(arr.data()), last_(arr.data() + N) + { + } + + template + gsl_api gsl_constexpr span(std::array const &arr) + : first_(arr.data()), last_(arr.data() + N) + { + } + +#else + + template ::value)) +#endif + > + gsl_api gsl_constexpr span(std::array &arr) + : first_(arr.data()), last_(arr.data() + N) + { + } + + template ::value)) +#endif + > + gsl_api gsl_constexpr span(std::array const &arr) + : first_(arr.data()), last_(arr.data() + N) + { + } + +#endif // deprecate +#endif // gsl_HAVE( ARRAY ) + +#if gsl_HAVE(CONSTRAINED_SPAN_CONTAINER_CTOR) + template ::value))> + gsl_api gsl_constexpr span(Container &cont) + : first_(std17::data(cont)), last_(std17::data(cont) + std17::size(cont)) + { + } + + template ::value && detail::is_compatible_container::value))> + gsl_api gsl_constexpr span(Container const &cont) + : first_(std17::data(cont)), last_(std17::data(cont) + std17::size(cont)) + { + } + +#elif gsl_HAVE(UNCONSTRAINED_SPAN_CONTAINER_CTOR) + + template + gsl_api gsl_constexpr span(Container &cont) + : first_(cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF(cont[0])), last_(cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF(cont[0]) + cont.size()) + { + } + + template + gsl_api gsl_constexpr span(Container const &cont) + : first_(cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF(cont[0])), last_(cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF(cont[0]) + cont.size()) + { + } + +#endif + +#if gsl_FEATURE_TO_STD(WITH_CONTAINER) + + template + gsl_api gsl_constexpr span(with_container_t, Container &cont) + : first_(cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF(cont[0])), last_(cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF(cont[0]) + cont.size()) + { + } + + template + gsl_api gsl_constexpr span(with_container_t, Container const &cont) + : first_(cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF(cont[0])), last_(cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF(cont[0]) + cont.size()) + { + } + +#endif + +#if !gsl_DEPRECATE_TO_LEVEL(4) + // constructor taking shared_ptr deprecated since 0.29.0 + +#if gsl_HAVE(SHARED_PTR) + gsl_api gsl_constexpr span(shared_ptr const &ptr) + : first_(ptr.get()), last_(ptr.get() ? ptr.get() + 1 : gsl_nullptr) + { + } +#endif + + // constructors taking unique_ptr deprecated since 0.29.0 + +#if gsl_HAVE(UNIQUE_PTR) +#if gsl_HAVE(DEFAULT_FUNCTION_TEMPLATE_ARG) + template ::type> +#else + template +#endif + gsl_api gsl_constexpr span(unique_ptr const &ptr, index_type count) + : first_(ptr.get()), last_(ptr.get() + count) + { + } + + gsl_api gsl_constexpr span(unique_ptr const &ptr) + : first_(ptr.get()), last_(ptr.get() ? ptr.get() + 1 : gsl_nullptr) + { + } +#endif + +#endif // deprecate shared_ptr, unique_ptr + +#if gsl_HAVE(IS_DEFAULT) && !gsl_BETWEEN(gsl_COMPILER_GNUC_VERSION, 430, 600) + gsl_api gsl_constexpr span(span &&) gsl_noexcept = default; + gsl_api gsl_constexpr span(span const &) = default; +#else + gsl_api gsl_constexpr span(span const &other) + : first_(other.begin()), last_(other.end()) + { + } +#endif + +#if gsl_HAVE(IS_DEFAULT) + ~span() = default; +#else + ~span() + { + } +#endif + +#if gsl_HAVE(IS_DEFAULT) + gsl_api gsl_constexpr14 span &operator=(span &&) gsl_noexcept = default; + gsl_api gsl_constexpr14 span &operator=(span const &) gsl_noexcept = default; +#else + gsl_api span &operator=(span other) gsl_noexcept + { + other.swap(*this); + return *this; + } +#endif + + template ::value)) +#endif + > + gsl_api gsl_constexpr span(span const &other) + : first_(other.begin()), last_(other.end()) + { + } + +#if 0 + // Converting from other span ? + template< class U > operator=(); +#endif + + // 26.7.3.3 Subviews [span.sub] + + gsl_api gsl_constexpr14 span first(index_type count) const gsl_noexcept + { + Expects(0 <= count && count <= this->size()); + return span(this->data(), count); + } + + gsl_api gsl_constexpr14 span last(index_type count) const gsl_noexcept + { + Expects(0 <= count && count <= this->size()); + return span(this->data() + this->size() - count, count); + } + + gsl_api gsl_constexpr14 span subspan(index_type offset) const gsl_noexcept + { + Expects(0 <= offset && offset <= this->size()); + return span(this->data() + offset, this->size() - offset); + } + + gsl_api gsl_constexpr14 span subspan(index_type offset, index_type count) const gsl_noexcept + { + Expects( + 0 <= offset && offset <= this->size() && + 0 <= count && count <= this->size() - offset); + return span(this->data() + offset, count); + } + + // 26.7.3.4 Observers [span.obs] + + gsl_api gsl_constexpr index_type size() const gsl_noexcept + { + return narrow_cast(last_ - first_); + } + + gsl_api gsl_constexpr std::ptrdiff_t ssize() const gsl_noexcept + { + return narrow_cast(last_ - first_); + } + + gsl_api gsl_constexpr index_type size_bytes() const gsl_noexcept + { + return size() * narrow_cast(sizeof(element_type)); + } + + gsl_api gsl_constexpr bool empty() const gsl_noexcept + { + return size() == 0; + } + + // 26.7.3.5 Element access [span.elem] + + gsl_api gsl_constexpr reference operator[](index_type pos) const + { + return at(pos); + } + + gsl_api gsl_constexpr reference operator()(index_type pos) const + { + return at(pos); + } + + gsl_api gsl_constexpr14 reference at(index_type pos) const + { + Expects(pos < size()); + return first_[pos]; + } + + gsl_api gsl_constexpr pointer data() const gsl_noexcept + { + return first_; + } + + // 26.7.3.6 Iterator support [span.iterators] + + gsl_api gsl_constexpr iterator begin() const gsl_noexcept + { + return iterator(first_); + } + + gsl_api gsl_constexpr iterator end() const gsl_noexcept + { + return iterator(last_); + } + + gsl_api gsl_constexpr const_iterator cbegin() const gsl_noexcept + { +#if gsl_CPP11_OR_GREATER + return {begin()}; +#else + return const_iterator(begin()); +#endif + } + + gsl_api gsl_constexpr const_iterator cend() const gsl_noexcept + { +#if gsl_CPP11_OR_GREATER + return {end()}; +#else + return const_iterator(end()); +#endif + } + + gsl_api gsl_constexpr reverse_iterator rbegin() const gsl_noexcept + { + return reverse_iterator(end()); + } + + gsl_api gsl_constexpr reverse_iterator rend() const gsl_noexcept + { + return reverse_iterator(begin()); + } + + gsl_api gsl_constexpr const_reverse_iterator crbegin() const gsl_noexcept + { + return const_reverse_iterator(cend()); + } + + gsl_api gsl_constexpr const_reverse_iterator crend() const gsl_noexcept + { + return const_reverse_iterator(cbegin()); + } + + gsl_api void swap(span &other) gsl_noexcept + { + using std::swap; + swap(first_, other.first_); + swap(last_, other.last_); + } + +#if !gsl_DEPRECATE_TO_LEVEL(3) + // member length() deprecated since 0.29.0 + + gsl_api gsl_constexpr index_type length() const gsl_noexcept + { + return size(); + } + + // member length_bytes() deprecated since 0.29.0 + + gsl_api gsl_constexpr index_type length_bytes() const gsl_noexcept + { + return size_bytes(); + } +#endif + +#if !gsl_DEPRECATE_TO_LEVEL(2) + // member as_bytes(), as_writeable_bytes deprecated since 0.17.0 + + gsl_api span as_bytes() const gsl_noexcept + { + return span(reinterpret_cast(data()), size_bytes()); // NOLINT + } + + gsl_api span as_writeable_bytes() const gsl_noexcept + { + return span(reinterpret_cast(data()), size_bytes()); // NOLINT + } + +#endif + + template + gsl_api span as_span() const gsl_noexcept + { + Expects((this->size_bytes() % sizeof(U)) == 0); + return span(reinterpret_cast(this->data()), this->size_bytes() / sizeof(U)); // NOLINT + } + + private: + pointer first_; + pointer last_; + }; + + // class template argument deduction guides: + +#if gsl_HAVE(DEDUCTION_GUIDES) // gsl_CPP17_OR_GREATER + + template + span(T(&)[N])->span; + + template + span(std::array &)->span; + + template + span(std::array const &)->span; + + template + span(Container &)->span; + + template + span(Container const &)->span; + +#endif // gsl_HAVE( DEDUCTION_GUIDES ) + + // 26.7.3.7 Comparison operators [span.comparison] + +#if gsl_CONFIG(ALLOWS_NONSTRICT_SPAN_COMPARISON) + + template + gsl_api inline gsl_constexpr bool operator==(span const &l, span const &r) + { + return l.size() == r.size() && (l.begin() == r.begin() || std::equal(l.begin(), l.end(), r.begin())); + } + + template + gsl_api inline gsl_constexpr bool operator<(span const &l, span const &r) + { + return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end()); + } + +#else + + template + gsl_api inline gsl_constexpr bool operator==(span const &l, span const &r) + { + return l.size() == r.size() && (l.begin() == r.begin() || std::equal(l.begin(), l.end(), r.begin())); + } + + template + gsl_api inline gsl_constexpr bool operator<(span const &l, span const &r) + { + return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end()); + } +#endif + + template + gsl_api inline gsl_constexpr bool operator!=(span const &l, span const &r) + { + return !(l == r); + } + + template + gsl_api inline gsl_constexpr bool operator<=(span const &l, span const &r) + { + return !(r < l); + } + + template + gsl_api inline gsl_constexpr bool operator>(span const &l, span const &r) + { + return (r < l); + } + + template + gsl_api inline gsl_constexpr bool operator>=(span const &l, span const &r) + { + return !(l < r); + } + + // span algorithms + + template + gsl_api inline gsl_constexpr std::size_t size(span const &spn) + { + return static_cast(spn.size()); + } + + template + gsl_api inline gsl_constexpr std::ptrdiff_t ssize(span const &spn) + { + return spn.ssize(); + } + + namespace detail + { + template + gsl_api inline OI copy_n(II first, N count, OI result) + { + if (count > 0) + { + *result++ = *first; + for (N i = 1; i < count; ++i) + { + *result++ = *++first; + } + } + return result; + } + } // namespace detail + + template + gsl_api inline void copy(span src, span dest) + { +#if gsl_CPP14_OR_GREATER // gsl_HAVE( TYPE_TRAITS ) (circumvent Travis clang 3.4) + static_assert(std::is_assignable::value, "Cannot assign elements of source span to elements of destination span"); +#endif + Expects(dest.size() >= src.size()); + detail::copy_n(src.data(), src.size(), dest.data()); + } + + // span creator functions (see ctors) + + template + gsl_api inline span as_bytes(span spn) gsl_noexcept + { + return span(reinterpret_cast(spn.data()), spn.size_bytes()); // NOLINT + } + + template + gsl_api inline span as_writeable_bytes(span spn) gsl_noexcept + { + return span(reinterpret_cast(spn.data()), spn.size_bytes()); // NOLINT + } + +#if gsl_FEATURE_TO_STD(MAKE_SPAN) + + template + gsl_api inline gsl_constexpr span + make_span(T * ptr, typename span::index_type count) + { + return span(ptr, count); + } + + template + gsl_api inline gsl_constexpr span + make_span(T * first, T * last) + { + return span(first, last); + } + + template + gsl_api inline gsl_constexpr span + make_span(T(&arr)[N]) + { + return span(gsl_ADDRESSOF(arr[0]), N); + } + +#if gsl_HAVE(ARRAY) + + template + gsl_api inline gsl_constexpr span + make_span(std::array & arr) + { + return span(arr); + } + + template + gsl_api inline gsl_constexpr span + make_span(std::array const &arr) + { + return span(arr); + } +#endif + +#if gsl_HAVE(CONSTRAINED_SPAN_CONTAINER_CTOR) && gsl_HAVE(AUTO) + + template ()))> + gsl_api inline gsl_constexpr auto + make_span(Container & cont) + ->span::type> + { + return span::type>(cont); + } + + template ()))> + gsl_api inline gsl_constexpr auto + make_span(Container const &cont) + ->span::type> + { + return span::type>(cont); + } + +#else + + template + gsl_api inline span + make_span(std::vector & cont) + { + return span(with_container, cont); + } + + template + gsl_api inline span + make_span(std::vector const &cont) + { + return span(with_container, cont); + } +#endif + +#if gsl_FEATURE_TO_STD(WITH_CONTAINER) + + template + gsl_api inline gsl_constexpr span + make_span(with_container_t, Container & cont) gsl_noexcept + { + return span(with_container, cont); + } + + template + gsl_api inline gsl_constexpr span + make_span(with_container_t, Container const &cont) gsl_noexcept + { + return span(with_container, cont); + } + +#endif // gsl_FEATURE_TO_STD( WITH_CONTAINER ) + + template + gsl_api inline span + make_span(Ptr & ptr) + { + return span(ptr); + } + + template + gsl_api inline span + make_span(Ptr & ptr, typename span::index_type count) + { + return span(ptr, count); + } + +#endif // gsl_FEATURE_TO_STD( MAKE_SPAN ) + +#if gsl_FEATURE_TO_STD(BYTE_SPAN) + + template + gsl_api inline gsl_constexpr span + byte_span(T & t) gsl_noexcept + { + return span(reinterpret_cast(&t), sizeof(T)); + } + + template + gsl_api inline gsl_constexpr span + byte_span(T const &t) gsl_noexcept + { + return span(reinterpret_cast(&t), sizeof(T)); + } + +#endif // gsl_FEATURE_TO_STD( BYTE_SPAN ) + + // + // basic_string_span: + // + + template + class basic_string_span; + + namespace detail + { + template + struct is_basic_string_span_oracle : std11::false_type + { + }; + + template + struct is_basic_string_span_oracle > : std11::true_type + { + }; + + template + struct is_basic_string_span : is_basic_string_span_oracle::type> + { + }; + + template + gsl_api inline gsl_constexpr14 std::size_t string_length(T *ptr, std::size_t max) + { + if (ptr == gsl_nullptr || max <= 0) + return 0; + + std::size_t len = 0; + while (len < max && ptr[len]) // NOLINT + ++len; + + return len; + } + + } // namespace detail + + // + // basic_string_span<> - A view of contiguous characters, replace (*,len). + // + template + class basic_string_span + { + public: + typedef T element_type; + typedef span span_type; + + typedef typename span_type::index_type index_type; + typedef typename span_type::difference_type difference_type; + + typedef typename span_type::pointer pointer; + typedef typename span_type::reference reference; + + typedef typename span_type::iterator iterator; + typedef typename span_type::const_iterator const_iterator; + typedef typename span_type::reverse_iterator reverse_iterator; + typedef typename span_type::const_reverse_iterator const_reverse_iterator; + + // construction: + +#if gsl_HAVE(IS_DEFAULT) + gsl_api gsl_constexpr basic_string_span() gsl_noexcept = default; +#else + gsl_api gsl_constexpr basic_string_span() gsl_noexcept + { + } +#endif + +#if gsl_HAVE(NULLPTR) + gsl_api gsl_constexpr basic_string_span(std::nullptr_t ptr) gsl_noexcept + : span_(ptr, index_type(0)) + { + } +#endif + + gsl_api gsl_constexpr basic_string_span(pointer ptr) + : span_(remove_z(ptr, (std::numeric_limits::max)())) + { + } + + gsl_api gsl_constexpr basic_string_span(pointer ptr, index_type count) + : span_(ptr, count) + { + } + + gsl_api gsl_constexpr basic_string_span(pointer firstElem, pointer lastElem) + : span_(firstElem, lastElem) + { + } + + template + gsl_api gsl_constexpr basic_string_span(element_type (&arr)[N]) + : span_(remove_z(gsl_ADDRESSOF(arr[0]), N)) + { + } + +#if gsl_HAVE(ARRAY) + + template + gsl_api gsl_constexpr basic_string_span(std::array::type, N> &arr) + : span_(remove_z(arr)) + { + } + + template + gsl_api gsl_constexpr basic_string_span(std::array::type, N> const &arr) + : span_(remove_z(arr)) + { + } + +#endif + +#if gsl_HAVE(CONSTRAINED_SPAN_CONTAINER_CTOR) + + // Exclude: array, [basic_string,] basic_string_span + + template ::value && !detail::is_basic_string_span::value && std::is_convertible::value && std::is_convertible().data())>::value))> + gsl_api gsl_constexpr basic_string_span(Container &cont) + : span_((cont)) + { + } + + // Exclude: array, [basic_string,] basic_string_span + + template ::value && !detail::is_basic_string_span::value && std::is_convertible::value && std::is_convertible().data())>::value))> + gsl_api gsl_constexpr basic_string_span(Container const &cont) + : span_((cont)) + { + } + +#elif gsl_HAVE(UNCONSTRAINED_SPAN_CONTAINER_CTOR) + + template + gsl_api gsl_constexpr basic_string_span(Container &cont) + : span_(cont) + { + } + + template + gsl_api gsl_constexpr basic_string_span(Container const &cont) + : span_(cont) + { + } + +#else + + template + gsl_api gsl_constexpr basic_string_span(span const &rhs) + : span_(rhs) + { + } + +#endif + +#if gsl_FEATURE_TO_STD(WITH_CONTAINER) + + template + gsl_api gsl_constexpr basic_string_span(with_container_t, Container &cont) + : span_(with_container, cont) + { + } +#endif + +#if gsl_HAVE(IS_DEFAULT) +#if gsl_BETWEEN(gsl_COMPILER_GNUC_VERSION, 440, 600) + gsl_api gsl_constexpr basic_string_span(basic_string_span const &rhs) = default; + + gsl_api gsl_constexpr basic_string_span(basic_string_span &&rhs) = default; +#else + gsl_api gsl_constexpr basic_string_span(basic_string_span const &rhs) gsl_noexcept = default; + + gsl_api gsl_constexpr basic_string_span(basic_string_span &&rhs) gsl_noexcept = default; +#endif +#endif + + template ::pointer, pointer>::value)) +#endif + > + gsl_api gsl_constexpr basic_string_span(basic_string_span const &rhs) + : span_(reinterpret_cast(rhs.data()), rhs.length()) // NOLINT + { + } + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + template ::pointer, pointer>::value))> + gsl_api gsl_constexpr basic_string_span(basic_string_span &&rhs) + : span_(reinterpret_cast(rhs.data()), rhs.length()) // NOLINT + { + } +#endif + + template + gsl_api gsl_constexpr basic_string_span( + std::basic_string::type, CharTraits, Allocator> &str) + : span_(gsl_ADDRESSOF(str[0]), str.length()) + { + } + + template + gsl_api gsl_constexpr basic_string_span( + std::basic_string::type, CharTraits, Allocator> const &str) + : span_(gsl_ADDRESSOF(str[0]), str.length()) + { + } + + // destruction, assignment: + +#if gsl_HAVE(IS_DEFAULT) + gsl_api ~basic_string_span() gsl_noexcept = default; + + gsl_api basic_string_span &operator=(basic_string_span const &rhs) gsl_noexcept = default; + + gsl_api basic_string_span &operator=(basic_string_span &&rhs) gsl_noexcept = default; +#endif + + // sub span: + + gsl_api gsl_constexpr basic_string_span first(index_type count) const + { + return span_.first(count); + } + + gsl_api gsl_constexpr basic_string_span last(index_type count) const + { + return span_.last(count); + } + + gsl_api gsl_constexpr basic_string_span subspan(index_type offset) const + { + return span_.subspan(offset); + } + + gsl_api gsl_constexpr basic_string_span subspan(index_type offset, index_type count) const + { + return span_.subspan(offset, count); + } + + // observers: + + gsl_api gsl_constexpr index_type length() const gsl_noexcept + { + return span_.size(); + } + + gsl_api gsl_constexpr index_type size() const gsl_noexcept + { + return span_.size(); + } + + gsl_api gsl_constexpr index_type length_bytes() const gsl_noexcept + { + return span_.size_bytes(); + } + + gsl_api gsl_constexpr index_type size_bytes() const gsl_noexcept + { + return span_.size_bytes(); + } + + gsl_api gsl_constexpr bool empty() const gsl_noexcept + { + return size() == 0; + } + + gsl_api gsl_constexpr reference operator[](index_type idx) const + { + return span_[idx]; + } + + gsl_api gsl_constexpr reference operator()(index_type idx) const + { + return span_[idx]; + } + + gsl_api gsl_constexpr pointer data() const gsl_noexcept + { + return span_.data(); + } + + gsl_api iterator begin() const gsl_noexcept + { + return span_.begin(); + } + + gsl_api iterator end() const gsl_noexcept + { + return span_.end(); + } + + gsl_api reverse_iterator rbegin() const gsl_noexcept + { + return span_.rbegin(); + } + + gsl_api reverse_iterator rend() const gsl_noexcept + { + return span_.rend(); + } + + // const version not in p0123r2: + + gsl_api const_iterator cbegin() const gsl_noexcept + { + return span_.cbegin(); + } + + gsl_api const_iterator cend() const gsl_noexcept + { + return span_.cend(); + } + + gsl_api const_reverse_iterator crbegin() const gsl_noexcept + { + return span_.crbegin(); + } + + gsl_api const_reverse_iterator crend() const gsl_noexcept + { + return span_.crend(); + } + + private: + gsl_api static gsl_constexpr14 span_type remove_z(pointer const &sz, std::size_t max) + { + return span_type(sz, detail::string_length(sz, max)); + } + +#if gsl_HAVE(ARRAY) + template + gsl_api static gsl_constexpr14 span_type remove_z(std::array::type, N> &arr) + { + return remove_z(gsl_ADDRESSOF(arr[0]), narrow_cast(N)); + } + + template + gsl_api static gsl_constexpr14 span_type remove_z(std::array::type, N> const &arr) + { + return remove_z(gsl_ADDRESSOF(arr[0]), narrow_cast(N)); + } +#endif + + private: + span_type span_; + }; + + // basic_string_span comparison functions: + +#if gsl_CONFIG(ALLOWS_NONSTRICT_SPAN_COMPARISON) + + template + gsl_api inline gsl_constexpr14 bool operator==(basic_string_span const &l, U const &u) gsl_noexcept + { + const basic_string_span::type> r(u); + + return l.size() == r.size() && std::equal(l.begin(), l.end(), r.begin()); + } + + template + gsl_api inline gsl_constexpr14 bool operator<(basic_string_span const &l, U const &u) gsl_noexcept + { + const basic_string_span::type> r(u); + + return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end()); + } + +#if gsl_HAVE(DEFAULT_FUNCTION_TEMPLATE_ARG) + + template ::value))> + gsl_api inline gsl_constexpr14 bool operator==(U const &u, basic_string_span const &r) gsl_noexcept + { + const basic_string_span::type> l(u); + + return l.size() == r.size() && std::equal(l.begin(), l.end(), r.begin()); + } + + template ::value))> + gsl_api inline gsl_constexpr14 bool operator<(U const &u, basic_string_span const &r) gsl_noexcept + { + const basic_string_span::type> l(u); + + return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end()); + } +#endif + +#else //gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + + template + gsl_api inline gsl_constexpr14 bool operator==(basic_string_span const &l, basic_string_span const &r) gsl_noexcept + { + return l.size() == r.size() && std::equal(l.begin(), l.end(), r.begin()); + } + + template + gsl_api inline gsl_constexpr14 bool operator<(basic_string_span const &l, basic_string_span const &r) gsl_noexcept + { + return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end()); + } + +#endif // gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + + template + gsl_api inline gsl_constexpr14 bool operator!=(basic_string_span const &l, U const &r) gsl_noexcept + { + return !(l == r); + } + + template + gsl_api inline gsl_constexpr14 bool operator<=(basic_string_span const &l, U const &r) gsl_noexcept + { +#if gsl_HAVE(DEFAULT_FUNCTION_TEMPLATE_ARG) || !gsl_CONFIG(ALLOWS_NONSTRICT_SPAN_COMPARISON) + return !(r < l); +#else + basic_string_span::type> rr(r); + return !(rr < l); +#endif + } + + template + gsl_api inline gsl_constexpr14 bool operator>(basic_string_span const &l, U const &r) gsl_noexcept + { +#if gsl_HAVE(DEFAULT_FUNCTION_TEMPLATE_ARG) || !gsl_CONFIG(ALLOWS_NONSTRICT_SPAN_COMPARISON) + return (r < l); +#else + basic_string_span::type> rr(r); + return (rr < l); +#endif + } + + template + gsl_api inline gsl_constexpr14 bool operator>=(basic_string_span const &l, U const &r) gsl_noexcept + { + return !(l < r); + } + +#if gsl_HAVE(DEFAULT_FUNCTION_TEMPLATE_ARG) + + template ::value))> + gsl_api inline gsl_constexpr14 bool operator!=(U const &l, basic_string_span const &r) gsl_noexcept + { + return !(l == r); + } + + template ::value))> + gsl_api inline gsl_constexpr14 bool operator<=(U const &l, basic_string_span const &r) gsl_noexcept + { + return !(r < l); + } + + template ::value))> + gsl_api inline gsl_constexpr14 bool operator>(U const &l, basic_string_span const &r) gsl_noexcept + { + return (r < l); + } + + template ::value))> + gsl_api inline gsl_constexpr14 bool operator>=(U const &l, basic_string_span const &r) gsl_noexcept + { + return !(l < r); + } + +#endif // gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) + + // convert basic_string_span to byte span: + + template + gsl_api inline span as_bytes(basic_string_span spn) gsl_noexcept + { + return span(reinterpret_cast(spn.data()), spn.size_bytes()); // NOLINT + } + + // + // String types: + // + + typedef char *zstring; + typedef const char *czstring; + +#if gsl_HAVE(WCHAR) + typedef wchar_t *zwstring; + typedef const wchar_t *cwzstring; +#endif + + typedef basic_string_span string_span; + typedef basic_string_span cstring_span; + +#if gsl_HAVE(WCHAR) + typedef basic_string_span wstring_span; + typedef basic_string_span cwstring_span; +#endif + + // to_string() allow (explicit) conversions from string_span to string + +#if 0 + +template< class T > +gsl_api inline std::basic_string< typename std::remove_const::type > to_string( basic_string_span spn ) +{ + std::string( spn.data(), spn.length() ); +} + +#else + + gsl_api inline std::string to_string(string_span const &spn) + { + return std::string(spn.data(), spn.length()); + } + + gsl_api inline std::string to_string(cstring_span const &spn) + { + return std::string(spn.data(), spn.length()); + } + +#if gsl_HAVE(WCHAR) + + gsl_api inline std::wstring to_string(wstring_span const &spn) + { + return std::wstring(spn.data(), spn.length()); + } + + gsl_api inline std::wstring to_string(cwstring_span const &spn) + { + return std::wstring(spn.data(), spn.length()); + } + +#endif // gsl_HAVE( WCHAR ) +#endif // to_string() + + // + // Stream output for string_span types + // + + namespace detail + { + template + gsl_api void write_padding(Stream &os, std::streamsize n) + { + for (std::streamsize i = 0; i < n; ++i) + os.rdbuf()->sputc(os.fill()); + } + + template + gsl_api Stream &write_to_stream(Stream &os, Span const &spn) + { + typename Stream::sentry sentry(os); + + if (!os) + return os; + + const std::streamsize length = narrow(spn.length()); + + // Whether, and how, to pad + const bool pad = (length < os.width()); + const bool left_pad = pad && (os.flags() & std::ios_base::adjustfield) == std::ios_base::right; + + if (left_pad) + write_padding(os, os.width() - length); + + // Write span characters + os.rdbuf()->sputn(spn.begin(), length); + + if (pad && !left_pad) + write_padding(os, os.width() - length); + + // Reset output stream width + os.width(0); + + return os; + } + + } // namespace detail + + template + gsl_api std::basic_ostream &operator<<(std::basic_ostream &os, string_span const &spn) + { + return detail::write_to_stream(os, spn); + } + + template + gsl_api std::basic_ostream &operator<<(std::basic_ostream &os, cstring_span const &spn) + { + return detail::write_to_stream(os, spn); + } + +#if gsl_HAVE(WCHAR) + + template + gsl_api std::basic_ostream &operator<<(std::basic_ostream &os, wstring_span const &spn) + { + return detail::write_to_stream(os, spn); + } + + template + gsl_api std::basic_ostream &operator<<(std::basic_ostream &os, cwstring_span const &spn) + { + return detail::write_to_stream(os, spn); + } + +#endif // gsl_HAVE( WCHAR ) + + // + // ensure_sentinel() + // + // Provides a way to obtain a span from a contiguous sequence + // that ends with a (non-inclusive) sentinel value. + // + // Will fail-fast if sentinel cannot be found before max elements are examined. + // + namespace detail + { + template + gsl_api static span ensure_sentinel(T *seq, SizeType max = (std::numeric_limits::max)()) + { + typedef T *pointer; + + gsl_SUPPRESS_MSVC_WARNING(26429, "f.23: symbol 'cur' is never tested for nullness, it can be marked as not_null") + + pointer cur = seq; + + while (static_cast(cur - seq) < max && *cur != Sentinel) + ++cur; + + Expects(*cur == Sentinel); + + return span(seq, narrow_cast::index_type>(cur - seq)); + } + } // namespace detail + + // + // ensure_z - creates a string_span for a czstring or cwzstring. + // Will fail fast if a null-terminator cannot be found before + // the limit of size_type. + // + + template + gsl_api inline span ensure_z(T *const &sz, size_t max = (std::numeric_limits::max)()) + { + return detail::ensure_sentinel(sz, max); + } + + template + gsl_api inline span ensure_z(T(&sz)[N]) + { + return ensure_z(gsl_ADDRESSOF(sz[0]), N); + } + +#if gsl_HAVE(TYPE_TRAITS) + + template + gsl_api inline span::type> + ensure_z(Container & cont) + { + return ensure_z(cont.data(), cont.length()); + } +#endif + + // + // basic_zstring_span<> - A view of contiguous null-terminated characters, replace (*,len). + // + + template + class basic_zstring_span + { + public: + typedef T element_type; + typedef span span_type; + + typedef typename span_type::index_type index_type; + typedef typename span_type::difference_type difference_type; + + typedef element_type *czstring_type; + typedef basic_string_span string_span_type; + + gsl_api gsl_constexpr14 basic_zstring_span(span_type s) + : span_(s) + { + // expects a zero-terminated span + Expects(s[s.size() - 1] == '\0'); + } + +#if gsl_HAVE(IS_DEFAULT) + gsl_api gsl_constexpr basic_zstring_span(basic_zstring_span const &other) = default; + gsl_api gsl_constexpr basic_zstring_span(basic_zstring_span &&other) = default; + gsl_api gsl_constexpr14 basic_zstring_span &operator=(basic_zstring_span const &other) = default; + gsl_api gsl_constexpr14 basic_zstring_span &operator=(basic_zstring_span &&other) = default; +#else + gsl_api gsl_constexpr basic_zstring_span(basic_zstring_span const &other) : span_(other.span_) + { + } + gsl_api gsl_constexpr basic_zstring_span &operator=(basic_zstring_span const &other) + { + span_ = other.span_; + return *this; + } +#endif + + gsl_api gsl_constexpr bool empty() const gsl_noexcept + { + return span_.size() == 0; + } + + gsl_api gsl_constexpr string_span_type as_string_span() const gsl_noexcept + { + return string_span_type(span_.data(), span_.size() > 1 ? span_.size() - 1 : 0); + } + + gsl_api gsl_constexpr string_span_type ensure_z() const + { + return gsl::ensure_z(span_.data(), span_.size()); + } + + gsl_api gsl_constexpr czstring_type assume_z() const gsl_noexcept + { + return span_.data(); + } + + private: + span_type span_; + }; + + // + // zString types: + // + + typedef basic_zstring_span zstring_span; + typedef basic_zstring_span czstring_span; + +#if gsl_HAVE(WCHAR) + typedef basic_zstring_span wzstring_span; + typedef basic_zstring_span cwzstring_span; +#endif + +} // namespace gsl + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + +namespace std +{ +template <> +struct hash +{ +public: + std::size_t operator()(gsl::byte v) const gsl_noexcept + { + return gsl::to_integer(v); + } +}; + +} // namespace std + +#endif + +gsl_RESTORE_MSVC_WARNINGS() + +#endif // GSL_GSL_LITE_HPP_INCLUDED + + // end of file diff --git a/src/algorithms/libs/rtklib/rtklib_ionex.cc b/src/algorithms/libs/rtklib/rtklib_ionex.cc index 8b8d39ade..d07740dc7 100644 --- a/src/algorithms/libs/rtklib/rtklib_ionex.cc +++ b/src/algorithms/libs/rtklib/rtklib_ionex.cc @@ -149,7 +149,7 @@ tec_t *addtec(const double *lats, const double *lons, const double *hgts, for (i = 0; i < n; i++) { p->data[i] = 0.0; - p->rms[i] = 0.0f; + p->rms[i] = 0.0F; } nav->nt++; return p; diff --git a/src/algorithms/libs/rtklib/rtklib_preceph.cc b/src/algorithms/libs/rtklib/rtklib_preceph.cc index 61217a8ae..c1b5c23e6 100644 --- a/src/algorithms/libs/rtklib/rtklib_preceph.cc +++ b/src/algorithms/libs/rtklib/rtklib_preceph.cc @@ -209,14 +209,14 @@ void readsp3b(FILE *fp, char type, int *sats __attribute__((unused)), int ns, co for (j = 0; j < 4; j++) { peph.pos[i][j] = 0.0; - peph.std[i][j] = 0.0f; + peph.std[i][j] = 0.0F; peph.vel[i][j] = 0.0; - peph.vst[i][j] = 0.0f; + peph.vst[i][j] = 0.0F; } for (j = 0; j < 3; j++) { - peph.cov[i][j] = 0.0f; - peph.vco[i][j] = 0.0f; + peph.cov[i][j] = 0.0F; + peph.vco[i][j] = 0.0F; } } for (i = pred_o = pred_c = v = 0; i < n && fgets(buff, sizeof(buff), fp); i++) diff --git a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc index 8f9e331fc..fc60a4221 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc @@ -778,7 +778,7 @@ unsigned int getbitu(const unsigned char *buff, int pos, int len) int i; for (i = pos; i < pos + len; i++) { - bits = (bits << 1) + ((buff[i / 8] >> (7 - i % 8)) & 1u); + bits = (bits << 1) + ((buff[i / 8] >> (7 - i % 8)) & 1U); } return bits; } @@ -787,11 +787,11 @@ unsigned int getbitu(const unsigned char *buff, int pos, int len) int getbits(const unsigned char *buff, int pos, int len) { unsigned int bits = getbitu(buff, pos, len); - if (len <= 0 || 32 <= len || !(bits & (1u << (len - 1)))) + if (len <= 0 || 32 <= len || !(bits & (1U << (len - 1)))) { return static_cast(bits); } - return static_cast(bits | (~0u << len)); /* extend sign */ + return static_cast(bits | (~0U << len)); /* extend sign */ } @@ -805,7 +805,7 @@ int getbits(const unsigned char *buff, int pos, int len) *-----------------------------------------------------------------------------*/ void setbitu(unsigned char *buff, int pos, int len, unsigned int data) { - unsigned int mask = 1u << (len - 1); + unsigned int mask = 1U << (len - 1); int i; if (len <= 0 || 32 < len) { @@ -815,11 +815,11 @@ void setbitu(unsigned char *buff, int pos, int len, unsigned int data) { if (data & mask) { - buff[i / 8] |= 1u << (7 - i % 8); + buff[i / 8] |= 1U << (7 - i % 8); } else { - buff[i / 8] &= ~(1u << (7 - i % 8)); + buff[i / 8] &= ~(1U << (7 - i % 8)); } } } @@ -2080,10 +2080,10 @@ unsigned int tickget(void) /* linux kernel > 2.6.28 */ if (!clock_gettime(CLOCK_MONOTONIC_RAW, &tp)) { - return tp.tv_sec * 1000u + tp.tv_nsec / 1000000u; + return tp.tv_sec * 1000U + tp.tv_nsec / 1000000U; } gettimeofday(&tv, nullptr); - return tv.tv_sec * 1000u + tv.tv_usec / 1000u; + return tv.tv_sec * 1000U + tv.tv_usec / 1000U; #else gettimeofday(&tv, NULL); diff --git a/src/algorithms/libs/rtklib/rtklib_rtkpos.cc b/src/algorithms/libs/rtklib/rtklib_rtkpos.cc index e59327680..65e3f6905 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtkpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtkpos.cc @@ -2075,10 +2075,10 @@ int resamb_LAMBDA(rtk_t *rtk, double *bias, double *xa) trace(4, "N(2)="); tracemat(4, b + nb, 1, nb, 10, 3); - rtk->sol.ratio = s[0] > 0 ? static_cast(s[1] / s[0]) : 0.0f; + rtk->sol.ratio = s[0] > 0 ? static_cast(s[1] / s[0]) : 0.0F; if (rtk->sol.ratio > 999.9) { - rtk->sol.ratio = 999.9f; + rtk->sol.ratio = 999.9F; } /* validation by popular ratio-test */ diff --git a/src/algorithms/libs/rtklib/rtklib_sbas.cc b/src/algorithms/libs/rtklib/rtklib_sbas.cc index 943b271f0..8b5c7c774 100644 --- a/src/algorithms/libs/rtklib/rtklib_sbas.cc +++ b/src/algorithms/libs/rtklib/rtklib_sbas.cc @@ -188,7 +188,7 @@ int decode_sbstype2(const sbsmsg_t *msg, sbssat_t *sbssat) t0 = sbssat->sat[j].fcorr.t0; prc = sbssat->sat[j].fcorr.prc; sbssat->sat[j].fcorr.t0 = gpst2time(msg->week, msg->tow); - sbssat->sat[j].fcorr.prc = getbits(msg->msg, 18 + i * 12, 12) * 0.125f; + sbssat->sat[j].fcorr.prc = getbits(msg->msg, 18 + i * 12, 12) * 0.125F; sbssat->sat[j].fcorr.udre = udre + 1; dt = timediff(sbssat->sat[j].fcorr.t0, t0); if (t0.time == 0 || dt <= 0.0 || 18.0 < dt || sbssat->sat[j].fcorr.ai == 0) @@ -468,7 +468,7 @@ int decode_sbstype24(const sbsmsg_t *msg, sbssat_t *sbssat) udre = getbitu(msg->msg, 86 + 4 * i, 4); sbssat->sat[j].fcorr.t0 = gpst2time(msg->week, msg->tow); - sbssat->sat[j].fcorr.prc = getbits(msg->msg, 14 + i * 12, 12) * 0.125f; + sbssat->sat[j].fcorr.prc = getbits(msg->msg, 14 + i * 12, 12) * 0.125F; sbssat->sat[j].fcorr.udre = udre + 1; sbssat->sat[j].fcorr.iodf = iodf; } @@ -509,7 +509,7 @@ int decode_sbstype26(const sbsmsg_t *msg, sbsion_t *sbsion) delay = getbitu(msg->msg, 22 + i * 13, 9); sbsion[band].igp[j].t0 = gpst2time(msg->week, msg->tow); - sbsion[band].igp[j].delay = delay == 0x1FF ? 0.0f : delay * 0.125f; + sbsion[band].igp[j].delay = delay == 0x1FF ? 0.0F : delay * 0.125F; sbsion[band].igp[j].give = give + 1; if (sbsion[band].igp[j].give >= 16) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc index 935f01f5c..91e4760f8 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc @@ -226,24 +226,14 @@ int32_t hybrid_observables_gs::save_matfile() { return 1; } - auto **RX_time = new double *[d_nchannels_out]; - auto **TOW_at_current_symbol_s = new double *[d_nchannels_out]; - auto **Carrier_Doppler_hz = new double *[d_nchannels_out]; - auto **Carrier_phase_cycles = new double *[d_nchannels_out]; - auto **Pseudorange_m = new double *[d_nchannels_out]; - auto **PRN = new double *[d_nchannels_out]; - auto **Flag_valid_pseudorange = new double *[d_nchannels_out]; - for (uint32_t i = 0; i < d_nchannels_out; i++) - { - RX_time[i] = new double[num_epoch]; - TOW_at_current_symbol_s[i] = new double[num_epoch]; - Carrier_Doppler_hz[i] = new double[num_epoch]; - Carrier_phase_cycles[i] = new double[num_epoch]; - Pseudorange_m[i] = new double[num_epoch]; - PRN[i] = new double[num_epoch]; - Flag_valid_pseudorange[i] = new double[num_epoch]; - } + auto RX_time = std::vector>(d_nchannels_out, std::vector(num_epoch)); + auto TOW_at_current_symbol_s = std::vector>(d_nchannels_out, std::vector(num_epoch)); + auto Carrier_Doppler_hz = std::vector>(d_nchannels_out, std::vector(num_epoch)); + auto Carrier_phase_cycles = std::vector>(d_nchannels_out, std::vector(num_epoch)); + auto Pseudorange_m = std::vector>(d_nchannels_out, std::vector(num_epoch)); + auto PRN = std::vector>(d_nchannels_out, std::vector(num_epoch)); + auto Flag_valid_pseudorange = std::vector>(d_nchannels_out, std::vector(num_epoch)); try { @@ -268,34 +258,17 @@ int32_t hybrid_observables_gs::save_matfile() catch (const std::ifstream::failure &e) { std::cerr << "Problem reading dump file:" << e.what() << std::endl; - for (uint32_t i = 0; i < d_nchannels_out; i++) - { - delete[] RX_time[i]; - delete[] TOW_at_current_symbol_s[i]; - delete[] Carrier_Doppler_hz[i]; - delete[] Carrier_phase_cycles[i]; - delete[] Pseudorange_m[i]; - delete[] PRN[i]; - delete[] Flag_valid_pseudorange[i]; - } - delete[] RX_time; - delete[] TOW_at_current_symbol_s; - delete[] Carrier_Doppler_hz; - delete[] Carrier_phase_cycles; - delete[] Pseudorange_m; - delete[] PRN; - delete[] Flag_valid_pseudorange; - return 1; } - auto *RX_time_aux = new double[d_nchannels_out * num_epoch]; - auto *TOW_at_current_symbol_s_aux = new double[d_nchannels_out * num_epoch]; - auto *Carrier_Doppler_hz_aux = new double[d_nchannels_out * num_epoch]; - auto *Carrier_phase_cycles_aux = new double[d_nchannels_out * num_epoch]; - auto *Pseudorange_m_aux = new double[d_nchannels_out * num_epoch]; - auto *PRN_aux = new double[d_nchannels_out * num_epoch]; - auto *Flag_valid_pseudorange_aux = new double[d_nchannels_out * num_epoch]; + auto RX_time_aux = std::vector(d_nchannels_out * num_epoch); + auto TOW_at_current_symbol_s_aux = std::vector(d_nchannels_out * num_epoch); + auto Carrier_Doppler_hz_aux = std::vector(d_nchannels_out * num_epoch); + auto Carrier_phase_cycles_aux = std::vector(d_nchannels_out * num_epoch); + auto Pseudorange_m_aux = std::vector(d_nchannels_out * num_epoch); + auto PRN_aux = std::vector(d_nchannels_out * num_epoch); + auto Flag_valid_pseudorange_aux = std::vector(d_nchannels_out * num_epoch); + uint32_t k = 0U; for (int64_t j = 0; j < num_epoch; j++) { @@ -325,61 +298,36 @@ int32_t hybrid_observables_gs::save_matfile() if (reinterpret_cast(matfp) != nullptr) { size_t dims[2] = {static_cast(d_nchannels_out), static_cast(num_epoch)}; - matvar = Mat_VarCreate("RX_time", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, RX_time_aux, MAT_F_DONT_COPY_DATA); + matvar = Mat_VarCreate("RX_time", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, RX_time_aux.data(), MAT_F_DONT_COPY_DATA); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("TOW_at_current_symbol_s", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, TOW_at_current_symbol_s_aux, MAT_F_DONT_COPY_DATA); + matvar = Mat_VarCreate("TOW_at_current_symbol_s", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, TOW_at_current_symbol_s_aux.data(), MAT_F_DONT_COPY_DATA); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Carrier_Doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, Carrier_Doppler_hz_aux, MAT_F_DONT_COPY_DATA); + matvar = Mat_VarCreate("Carrier_Doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, Carrier_Doppler_hz_aux.data(), MAT_F_DONT_COPY_DATA); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Carrier_phase_cycles", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, Carrier_phase_cycles_aux, MAT_F_DONT_COPY_DATA); + matvar = Mat_VarCreate("Carrier_phase_cycles", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, Carrier_phase_cycles_aux.data(), MAT_F_DONT_COPY_DATA); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Pseudorange_m", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, Pseudorange_m_aux, MAT_F_DONT_COPY_DATA); + matvar = Mat_VarCreate("Pseudorange_m", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, Pseudorange_m_aux.data(), MAT_F_DONT_COPY_DATA); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, PRN_aux, MAT_F_DONT_COPY_DATA); + matvar = Mat_VarCreate("PRN", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, PRN_aux.data(), MAT_F_DONT_COPY_DATA); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Flag_valid_pseudorange", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, Flag_valid_pseudorange_aux, MAT_F_DONT_COPY_DATA); + matvar = Mat_VarCreate("Flag_valid_pseudorange", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, Flag_valid_pseudorange_aux.data(), MAT_F_DONT_COPY_DATA); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); } Mat_Close(matfp); - for (uint32_t i = 0; i < d_nchannels_out; i++) - { - delete[] RX_time[i]; - delete[] TOW_at_current_symbol_s[i]; - delete[] Carrier_Doppler_hz[i]; - delete[] Carrier_phase_cycles[i]; - delete[] Pseudorange_m[i]; - delete[] PRN[i]; - delete[] Flag_valid_pseudorange[i]; - } - delete[] RX_time; - delete[] TOW_at_current_symbol_s; - delete[] Carrier_Doppler_hz; - delete[] Carrier_phase_cycles; - delete[] Pseudorange_m; - delete[] PRN; - delete[] Flag_valid_pseudorange; - - delete[] RX_time_aux; - delete[] TOW_at_current_symbol_s_aux; - delete[] Carrier_Doppler_hz_aux; - delete[] Carrier_phase_cycles_aux; - delete[] Pseudorange_m_aux; - delete[] PRN_aux; - delete[] Flag_valid_pseudorange_aux; return 0; } @@ -424,15 +372,15 @@ bool hybrid_observables_gs::interp_trk_obs(Gnss_Synchro &interpolated_obs, const int32_t t2_idx; if (rx_clock > d_gnss_synchro_history->at(ch, nearest_element).Tracking_sample_counter) { - //std::cout << "S1= " << d_gnss_synchro_history->at(ch, nearest_element).Tracking_sample_counter - // << " Si=" << rx_clock << " S2=" << d_gnss_synchro_history->at(ch, neighbor_element).Tracking_sample_counter << std::endl; + // std::cout << "S1= " << d_gnss_synchro_history->at(ch, nearest_element).Tracking_sample_counter + // << " Si=" << rx_clock << " S2=" << d_gnss_synchro_history->at(ch, neighbor_element).Tracking_sample_counter << std::endl; t1_idx = nearest_element; t2_idx = neighbor_element; } else { - //std::cout << "inv S1= " << d_gnss_synchro_history->at(ch, neighbor_element).Tracking_sample_counter - // << " Si=" << rx_clock << " S2=" << d_gnss_synchro_history->at(ch, nearest_element).Tracking_sample_counter << std::endl; + // std::cout << "inv S1= " << d_gnss_synchro_history->at(ch, neighbor_element).Tracking_sample_counter + // << " Si=" << rx_clock << " S2=" << d_gnss_synchro_history->at(ch, nearest_element).Tracking_sample_counter << std::endl; t1_idx = neighbor_element; t2_idx = nearest_element; } @@ -441,7 +389,6 @@ bool hybrid_observables_gs::interp_trk_obs(Gnss_Synchro &interpolated_obs, const interpolated_obs = d_gnss_synchro_history->at(ch, nearest_element); // 2nd: Linear interpolation: y(t) = y(t1) + (y(t2) - y(t1)) * (t - t1) / (t2 - t1) - double T_rx_s = static_cast(rx_clock) / static_cast(interpolated_obs.fs); double time_factor = (T_rx_s - d_gnss_synchro_history->at(ch, t1_idx).RX_time) / @@ -460,18 +407,18 @@ bool hybrid_observables_gs::interp_trk_obs(Gnss_Synchro &interpolated_obs, const } else { - //TOW rollover situation + // TOW rollover situation interpolated_obs.interp_TOW_ms = static_cast(d_gnss_synchro_history->at(ch, t1_idx).TOW_at_current_symbol_ms) + (static_cast(d_gnss_synchro_history->at(ch, t2_idx).TOW_at_current_symbol_ms + 604800000) - static_cast(d_gnss_synchro_history->at(ch, t1_idx).TOW_at_current_symbol_ms)) * time_factor; } - // LOG(INFO) << "Channel " << ch << " int idx: " << t1_idx << " TOW Int: " << interpolated_obs.interp_TOW_ms - // << " TOW p1 : " << d_gnss_synchro_history->at(ch, t1_idx).TOW_at_current_symbol_ms - // << " TOW p2: " - // << d_gnss_synchro_history->at(ch, t2_idx).TOW_at_current_symbol_ms - // << " t2-t1: " - // << d_gnss_synchro_history->at(ch, t2_idx).RX_time - d_gnss_synchro_history->at(ch, t1_idx).RX_time - // << " trx - t1: " - // << T_rx_s - d_gnss_synchro_history->at(ch, t1_idx).RX_time; + // LOG(INFO) << "Channel " << ch << " int idx: " << t1_idx << " TOW Int: " << interpolated_obs.interp_TOW_ms + // << " TOW p1 : " << d_gnss_synchro_history->at(ch, t1_idx).TOW_at_current_symbol_ms + // << " TOW p2: " + // << d_gnss_synchro_history->at(ch, t2_idx).TOW_at_current_symbol_ms + // << " t2-t1: " + // << d_gnss_synchro_history->at(ch, t2_idx).RX_time - d_gnss_synchro_history->at(ch, t1_idx).RX_time + // << " trx - t1: " + // << T_rx_s - d_gnss_synchro_history->at(ch, t1_idx).RX_time; // // std::cout << "Rx samplestamp: " << T_rx_s << " Channel " << ch << " interp buff idx " << nearest_element @@ -501,10 +448,10 @@ void hybrid_observables_gs::forecast(int noutput_items __attribute__((unused)), void hybrid_observables_gs::update_TOW(const std::vector &data) { - //1. Set the TOW using the minimum TOW in the observables. - // this will be the receiver time. - //2. If the TOW is set, it must be incremented by the desired receiver time step. - // the time step must match the observables timer block (connected to the las input channel) + // 1. Set the TOW using the minimum TOW in the observables. + // this will be the receiver time. + // 2. If the TOW is set, it must be incremented by the desired receiver time step. + // the time step must match the observables timer block (connected to the las input channel) std::vector::const_iterator it; if (!T_rx_TOW_set) { @@ -526,7 +473,7 @@ void hybrid_observables_gs::update_TOW(const std::vector &data) } else { - T_rx_TOW_ms += T_rx_step_ms; //the tow time step increment must match the ref time channel step + T_rx_TOW_ms += T_rx_step_ms; // the tow time step increment must match the ref time channel step if (T_rx_TOW_ms >= 604800000) { DLOG(INFO) << "TOW RX TIME rollover!"; @@ -538,8 +485,8 @@ void hybrid_observables_gs::update_TOW(const std::vector &data) void hybrid_observables_gs::compute_pranges(std::vector &data) { - // std::cout.precision(17); - // std::cout << " T_rx_TOW_ms: " << static_cast(T_rx_TOW_ms) << std::endl; + // std::cout.precision(17); + // std::cout << " T_rx_TOW_ms: " << static_cast(T_rx_TOW_ms) << std::endl; std::vector::iterator it; double current_T_rx_TOW_ms = (static_cast(T_rx_TOW_ms - T_rx_remnant_to_20ms)); double current_T_rx_TOW_s = current_T_rx_TOW_ms / 1000.0; @@ -548,7 +495,7 @@ void hybrid_observables_gs::compute_pranges(std::vector &data) if (it->Flag_valid_word) { double traveltime_ms = current_T_rx_TOW_ms - it->interp_TOW_ms; - if (fabs(traveltime_ms) > 302400) //check TOW roll over + if (fabs(traveltime_ms) > 302400) // check TOW roll over { traveltime_ms = 604800000.0 + current_T_rx_TOW_ms - it->interp_TOW_ms; } @@ -556,9 +503,8 @@ void hybrid_observables_gs::compute_pranges(std::vector &data) it->Pseudorange_m = traveltime_ms * SPEED_OF_LIGHT_MS; it->Flag_valid_pseudorange = true; // debug code - // - // std::cout << "[" << it->Channel_ID << "] interp_TOW_ms: " << it->interp_TOW_ms << std::endl; - // std::cout << "[" << it->Channel_ID << "] Diff T_rx_TOW_ms - interp_TOW_ms: " << static_cast(T_rx_TOW_ms) - it->interp_TOW_ms << std::endl; + // std::cout << "[" << it->Channel_ID << "] interp_TOW_ms: " << it->interp_TOW_ms << std::endl; + // std::cout << "[" << it->Channel_ID << "] Diff T_rx_TOW_ms - interp_TOW_ms: " << static_cast(T_rx_TOW_ms) - it->interp_TOW_ms << std::endl; } else { diff --git a/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.cc b/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.cc index 37c3ca36f..505f99681 100644 --- a/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.cc +++ b/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.cc @@ -208,10 +208,9 @@ void signal_generator_c::generate_codes() { if (signal_[sat].at(0) == '5') { - char signal[3]; - strcpy(signal, "5X"); + std::array signal = {{'5', 'X', '\0'}}; - galileo_e5_a_code_gen_complex_sampled(sampled_code_data_[sat], signal, PRN_[sat], fs_in_, + galileo_e5_a_code_gen_complex_sampled(gsl::span(sampled_code_data_[sat], vector_length_), signal, PRN_[sat], fs_in_, static_cast(GALILEO_E5A_CODE_LENGTH_CHIPS) - delay_chips_[sat]); //noise if (noise_flag_) @@ -226,10 +225,9 @@ void signal_generator_c::generate_codes() { // Generate one code-period of E1B signal bool cboc = true; - char signal[3]; - strcpy(signal, "1B"); + std::array signal = {{'1', 'B', '\0'}}; - galileo_e1_code_gen_complex_sampled(code, signal, cboc, PRN_[sat], fs_in_, + galileo_e1_code_gen_complex_sampled(gsl::span(code, 64000), signal, cboc, PRN_[sat], fs_in_, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS) - delay_chips_[sat]); // Obtain the desired CN0 assuming that Pn = 1. @@ -251,9 +249,9 @@ void signal_generator_c::generate_codes() // Generate E1C signal (25 code-periods, with secondary code) sampled_code_pilot_[sat] = static_cast(std::malloc(vector_length_ * sizeof(gr_complex))); - strcpy(signal, "1C"); + std::array signal_1C = {{'1', 'C', '\0'}}; - galileo_e1_code_gen_complex_sampled(sampled_code_pilot_[sat], signal, cboc, PRN_[sat], fs_in_, + galileo_e1_code_gen_complex_sampled(gsl::span(sampled_code_pilot_[sat], vector_length_), signal_1C, cboc, PRN_[sat], fs_in_, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS) - delay_chips_[sat], true); // Obtain the desired CN0 assuming that Pn = 1. diff --git a/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc b/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc index d030863ff..024966d0e 100644 --- a/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc +++ b/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc @@ -81,7 +81,7 @@ CustomUDPSignalSource::CustomUDPSignalSource(ConfigurationInterface* configurati { for (int n = 0; n < channels_in_udp_; n++) { - null_sinks_.push_back(gr::blocks::null_sink::make(sizeof(gr_complex))); + null_sinks_.emplace_back(gr::blocks::null_sink::make(sizeof(gr_complex))); } } else @@ -95,7 +95,7 @@ CustomUDPSignalSource::CustomUDPSignalSource(ConfigurationInterface* configurati for (int n = 0; n < channels_in_udp_; n++) { DLOG(INFO) << "Dumping output into file " << (dump_filename_ + "c_h" + std::to_string(n) + ".bin"); - file_sink_.push_back(gr::blocks::file_sink::make(item_size_, (dump_filename_ + "_ch" + std::to_string(n) + ".bin").c_str())); + file_sink_.emplace_back(gr::blocks::file_sink::make(item_size_, (dump_filename_ + "_ch" + std::to_string(n) + ".bin").c_str())); } } if (in_stream_ > 0) diff --git a/src/algorithms/signal_source/gnuradio_blocks/gr_complex_ip_packet_source.cc b/src/algorithms/signal_source/gnuradio_blocks/gr_complex_ip_packet_source.cc index 8085e9e81..ac52e0236 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/gr_complex_ip_packet_source.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/gr_complex_ip_packet_source.cc @@ -290,7 +290,10 @@ void Gr_Complex_Ip_Packet_Source::pcap_callback(__attribute__((unused)) u_char * // write all in a single memcpy memcpy(&fifo_buff[fifo_write_ptr], &udp_payload[0], payload_length_bytes); // size in bytes fifo_write_ptr += payload_length_bytes; - if (fifo_write_ptr == FIFO_SIZE) fifo_write_ptr = 0; + if (fifo_write_ptr == FIFO_SIZE) + { + fifo_write_ptr = 0; + } fifo_items += payload_length_bytes; } else @@ -378,7 +381,10 @@ void Gr_Complex_Ip_Packet_Source::demux_samples(gr_vector_void_star output_items std::cout << "Unknown wire sample type\n"; exit(0); } - if (fifo_read_ptr == FIFO_SIZE) fifo_read_ptr = 0; + if (fifo_read_ptr == FIFO_SIZE) + { + fifo_read_ptr = 0; + } } } @@ -389,7 +395,10 @@ int Gr_Complex_Ip_Packet_Source::work(int noutput_items, { // send samples to next GNU Radio block boost::mutex::scoped_lock lock(d_mutex); // hold mutex for duration of this function - if (fifo_items == 0) return 0; + if (fifo_items == 0) + { + return 0; + } if (output_items.size() > static_cast(d_n_baseband_channels)) { diff --git a/src/algorithms/signal_source/gnuradio_blocks/rtl_tcp_signal_source_c.cc b/src/algorithms/signal_source/gnuradio_blocks/rtl_tcp_signal_source_c.cc index 188da4bdc..bbc5b57d6 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/rtl_tcp_signal_source_c.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/rtl_tcp_signal_source_c.cc @@ -76,7 +76,7 @@ rtl_tcp_signal_source_c::rtl_tcp_signal_source_c(const std::string &address, // 1. Setup lookup table for (unsigned i = 0; i < 0xff; i++) { - lookup_[i] = (static_cast(i & 0xff) - 127.4f) * (1.0f / 128.0f); + lookup_[i] = (static_cast(i & 0xff) - 127.4F) * (1.0F / 128.0F); } // 2. Set socket options diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc index ebca21346..44cd5cd40 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc @@ -190,7 +190,7 @@ int gps_l2c_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( // Expand packet bits to bitsets. Notice the reverse order of the bits sequence, required by the CNAV message decoder for (uint32_t i = 0; i < GPS_L2_CNAV_DATA_PAGE_BITS; i++) { - raw_bits[GPS_L2_CNAV_DATA_PAGE_BITS - 1 - i] = ((msg.raw_msg[i / 8] >> (7 - i % 8)) & 1u); + raw_bits[GPS_L2_CNAV_DATA_PAGE_BITS - 1 - i] = ((msg.raw_msg[i / 8] >> (7 - i % 8)) & 1U); } d_CNAV_Message.decode_page(raw_bits); diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc index b5329b8d2..ea8a87e44 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc @@ -241,7 +241,7 @@ int gps_l5_telemetry_decoder_gs::general_work(int noutput_items __attribute__((u // Expand packet bits to bitsets. Notice the reverse order of the bits sequence, required by the CNAV message decoder for (uint32_t i = 0; i < GPS_L5_CNAV_DATA_PAGE_BITS; i++) { - raw_bits[GPS_L5_CNAV_DATA_PAGE_BITS - 1 - i] = ((msg.raw_msg[i / 8] >> (7 - i % 8)) & 1u); + raw_bits[GPS_L5_CNAV_DATA_PAGE_BITS - 1 - i] = ((msg.raw_msg[i / 8] >> (7 - i % 8)) & 1U); } d_CNAV_Message.decode_page(raw_bits); diff --git a/src/algorithms/telemetry_decoder/libs/libswiftcnav/bits.c b/src/algorithms/telemetry_decoder/libs/libswiftcnav/bits.c index 1cbe9eb12..3544aad03 100644 --- a/src/algorithms/telemetry_decoder/libs/libswiftcnav/bits.c +++ b/src/algorithms/telemetry_decoder/libs/libswiftcnav/bits.c @@ -75,7 +75,7 @@ uint32_t getbitu(const uint8_t *buff, uint32_t pos, uint8_t len) for (i = pos; i < pos + len; i++) { bits = (bits << 1) + - ((buff[i / 8] >> (7 - i % 8)) & 1u); + ((buff[i / 8] >> (7 - i % 8)) & 1U); } return bits; @@ -99,7 +99,7 @@ int32_t getbits(const uint8_t *buff, uint32_t pos, uint8_t len) /* Sign extend, taken from: * http://graphics.stanford.edu/~seander/bithacks.html#VariableSignExtend */ - int32_t m = 1u << (len - 1); + int32_t m = 1U << (len - 1); return (bits ^ m) - m; } @@ -114,7 +114,7 @@ int32_t getbits(const uint8_t *buff, uint32_t pos, uint8_t len) */ void setbitu(uint8_t *buff, uint32_t pos, uint32_t len, uint32_t data) { - uint32_t mask = 1u << (len - 1); + uint32_t mask = 1U << (len - 1); if (len <= 0 || 32 < len) { @@ -125,11 +125,11 @@ void setbitu(uint8_t *buff, uint32_t pos, uint32_t len, uint32_t data) { if (data & mask) { - buff[i / 8] |= 1u << (7 - i % 8); + buff[i / 8] |= 1U << (7 - i % 8); } else { - buff[i / 8] &= ~(1u << (7 - i % 8)); + buff[i / 8] &= ~(1U << (7 - i % 8)); } } } diff --git a/src/algorithms/telemetry_decoder/libs/libswiftcnav/cnav_msg.c b/src/algorithms/telemetry_decoder/libs/libswiftcnav/cnav_msg.c index 1676fc0cd..260237d40 100644 --- a/src/algorithms/telemetry_decoder/libs/libswiftcnav/cnav_msg.c +++ b/src/algorithms/telemetry_decoder/libs/libswiftcnav/cnav_msg.c @@ -56,9 +56,9 @@ */ /** GPS L2C preamble */ -const uint32_t GPS_CNAV_PREAMBLE1 = 0x8Bu; /* (0b10001011u) */ +const uint32_t GPS_CNAV_PREAMBLE1 = 0x8BU; /* (0b10001011u) */ /** Inverted GPS L2C preamble */ -const uint32_t GPS_CNAV_PREAMBLE2 = 0x74u; /* (0b01110100u) */ +const uint32_t GPS_CNAV_PREAMBLE2 = 0x74U; /* (0b01110100u) */ /** GPS L2C preamble length in bits */ #define GPS_CNAV_PREAMBLE_LENGTH (8) /** GPS L2C CNAV message length in bits */ @@ -307,7 +307,7 @@ static void _cnav_msg_invert(cnav_v27_part_t *part) size_t i = 0; for (i = 0; i < sizeof(part->decoded); i++) { - part->decoded[i] ^= 0xFFu; + part->decoded[i] ^= 0xFFU; } } diff --git a/src/algorithms/telemetry_decoder/libs/libswiftcnav/edc.c b/src/algorithms/telemetry_decoder/libs/libswiftcnav/edc.c index 6e3e06c6f..7bb1e644b 100644 --- a/src/algorithms/telemetry_decoder/libs/libswiftcnav/edc.c +++ b/src/algorithms/telemetry_decoder/libs/libswiftcnav/edc.c @@ -125,18 +125,18 @@ uint32_t crc24q_bits(uint32_t crc, const uint8_t *buf, uint32_t n_bits, bool inv acc = (acc << 8) | *buf++; if (invert) { - acc ^= 0xFFu; + acc ^= 0xFFU; } - b = (acc >> shift) & 0xFFu; - crc = ((crc << 8) & 0xFFFFFFu) ^ CRC24QTAB[((crc >> 16) ^ b) & 0xFFu]; + b = (acc >> shift) & 0xFFU; + crc = ((crc << 8) & 0xFFFFFFU) ^ CRC24QTAB[((crc >> 16) ^ b) & 0xFFU]; } acc = (acc << 8) | *buf; if (invert) { - acc ^= 0xFFu; + acc ^= 0xFFU; } - b = (acc >> shift) & 0xFFu; - crc = ((crc << 8) & 0xFFFFFFu) ^ CRC24QTAB[((crc >> 16) ^ b) & 0xFFu]; + b = (acc >> shift) & 0xFFU; + crc = ((crc << 8) & 0xFFFFFFU) ^ CRC24QTAB[((crc >> 16) ^ b) & 0xFFU]; return crc; } diff --git a/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.cc index 306a0efb5..fb998ab81 100644 --- a/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.cc @@ -59,14 +59,20 @@ BeidouB3iDllPllTracking::BeidouB3iDllPllTracking( bool dump = configuration->property(role + ".dump", false); trk_param.dump = dump; float pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); - if (FLAGS_pll_bw_hz != 0.0) pll_bw_hz = static_cast(FLAGS_pll_bw_hz); + if (FLAGS_pll_bw_hz != 0.0) + { + pll_bw_hz = static_cast(FLAGS_pll_bw_hz); + } trk_param.pll_bw_hz = pll_bw_hz; float pll_bw_narrow_hz = configuration->property(role + ".pll_bw_narrow_hz", 20.0); trk_param.pll_bw_narrow_hz = pll_bw_narrow_hz; float dll_bw_narrow_hz = configuration->property(role + ".dll_bw_narrow_hz", 2.0); trk_param.dll_bw_narrow_hz = dll_bw_narrow_hz; float dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); - if (FLAGS_dll_bw_hz != 0.0) dll_bw_hz = static_cast(FLAGS_dll_bw_hz); + if (FLAGS_dll_bw_hz != 0.0) + { + dll_bw_hz = static_cast(FLAGS_dll_bw_hz); + } trk_param.dll_bw_hz = dll_bw_hz; int dll_filter_order = configuration->property(role + ".dll_filter_order", 2); diff --git a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.cc b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.cc index ac916cef3..447e22231 100644 --- a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.cc +++ b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.cc @@ -227,17 +227,17 @@ GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga( for (uint32_t PRN = 1; PRN <= GALILEO_E1_NUMBER_OF_CODES; PRN++) { - char data_signal[3] = "1B"; + std::array data_signal = {'1', 'B', '\0'}; if (d_track_pilot) { - char pilot_signal[3] = "1C"; - galileo_e1_code_gen_sinboc11_float(ca_codes_f, pilot_signal, PRN); - galileo_e1_code_gen_sinboc11_float(data_codes_f, data_signal, PRN); + std::array pilot_signal = {'1', 'C', '\0'}; + galileo_e1_code_gen_sinboc11_float(gsl::span(ca_codes_f, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip), pilot_signal, PRN); + galileo_e1_code_gen_sinboc11_float(gsl::span(data_codes_f, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip), data_signal, PRN); // The code is generated as a series of 1s and -1s. In order to store the values using only one bit, a -1 is stored as a 0 in the FPGA for (uint32_t s = 0; s < 2 * GALILEO_E1_B_CODE_LENGTH_CHIPS; s++) { - int32_t tmp_value = static_cast(ca_codes_f[s]); + auto tmp_value = static_cast(ca_codes_f[s]); if (tmp_value < 0) { tmp_value = 0; @@ -255,12 +255,12 @@ GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga( } else { - galileo_e1_code_gen_sinboc11_float(ca_codes_f, data_signal, PRN); + galileo_e1_code_gen_sinboc11_float(gsl::span(ca_codes_f, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip), data_signal, PRN); // The code is generated as a series of 1s and -1s. In order to store the values using only one bit, a -1 is stored as a 0 in the FPGA for (uint32_t s = 0; s < 2 * GALILEO_E1_B_CODE_LENGTH_CHIPS; s++) { - int32_t tmp_value = static_cast(ca_codes_f[s]); + auto tmp_value = static_cast(ca_codes_f[s]); if (tmp_value < 0) { tmp_value = 0; diff --git a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.cc b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.cc index 5f3241696..7e3874101 100644 --- a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.cc +++ b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.cc @@ -217,14 +217,15 @@ GalileoE5aDllPllTrackingFpga::GalileoE5aDllPllTrackingFpga( for (uint32_t PRN = 1; PRN <= GALILEO_E5A_NUMBER_OF_CODES; PRN++) { - galileo_e5_a_code_gen_complex_primary(aux_code, PRN, const_cast(sig_)); + std::array sig_a = {'5', 'X', '\0'}; + galileo_e5_a_code_gen_complex_primary(gsl::span(aux_code, code_length_chips * code_samples_per_chip), PRN, sig_a); if (trk_param_fpga.track_pilot) { // The code is generated as a series of 1s and -1s. In order to store the values using only one bit, a -1 is stored as a 0 in the FPGA for (uint32_t s = 0; s < code_length_chips; s++) { - int32_t tmp_value = static_cast(aux_code[s].imag()); + auto tmp_value = static_cast(aux_code[s].imag()); if (tmp_value < 0) { tmp_value = 0; @@ -246,7 +247,7 @@ GalileoE5aDllPllTrackingFpga::GalileoE5aDllPllTrackingFpga( // The code is generated as a series of 1s and -1s. In order to store the values using only one bit, a -1 is stored as a 0 in the FPGA for (uint32_t s = 0; s < code_length_chips; s++) { - int32_t tmp_value = static_cast(aux_code[s].real()); + auto tmp_value = static_cast(aux_code[s].real()); if (tmp_value < 0) { tmp_value = 0; diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.cc b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.cc index e359dba88..2d244fbc0 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.cc +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.cc @@ -212,7 +212,7 @@ GpsL1CaDllPllTrackingFpga::GpsL1CaDllPllTrackingFpga( d_ca_codes = static_cast(volk_gnsssdr_malloc(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS * NUM_PRNs) * sizeof(int32_t), volk_gnsssdr_get_alignment())); for (uint32_t PRN = 1; PRN <= NUM_PRNs; PRN++) { - gps_l1_ca_code_gen_int(&d_ca_codes[(int32_t(GPS_L1_CA_CODE_LENGTH_CHIPS)) * (PRN - 1)], PRN, 0); + gps_l1_ca_code_gen_int(gsl::span(&d_ca_codes[static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) * (PRN - 1)], &d_ca_codes[static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) * (PRN)]), PRN, 0); // The code is generated as a series of 1s and -1s. In order to store the values using only one bit, a -1 is stored as a 0 in the FPGA for (uint32_t k = 0; k < GPS_L1_CA_CODE_LENGTH_CHIPS; k++) diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.cc b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.cc index 7b821a9f9..6cf1c2071 100644 --- a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.cc +++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.cc @@ -128,7 +128,7 @@ GpsL2MDllPllTrackingFpga::GpsL2MDllPllTrackingFpga( d_ca_codes = static_cast(volk_gnsssdr_malloc(static_cast(GPS_L2_M_CODE_LENGTH_CHIPS * NUM_PRNs) * sizeof(int), volk_gnsssdr_get_alignment())); for (unsigned int PRN = 1; PRN <= NUM_PRNs; PRN++) { - gps_l2c_m_code_gen_float(ca_codes_f, PRN); + gps_l2c_m_code_gen_float(gsl::span(ca_codes_f, static_cast(GPS_L2_M_CODE_LENGTH_CHIPS)), PRN); for (unsigned int s = 0; s < 2 * static_cast(GPS_L2_M_CODE_LENGTH_CHIPS); s++) { d_ca_codes[static_cast(GPS_L2_M_CODE_LENGTH_CHIPS) * (PRN - 1) + s] = static_cast(ca_codes_f[s]); diff --git a/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.cc b/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.cc index 1dca0c03a..c034017a8 100644 --- a/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.cc +++ b/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.cc @@ -236,13 +236,13 @@ GpsL5DllPllTrackingFpga::GpsL5DllPllTrackingFpga( { if (track_pilot) { - gps_l5q_code_gen_float(tracking_code, PRN); - gps_l5i_code_gen_float(data_code, PRN); + gps_l5q_code_gen_float(gsl::span(tracking_code, code_length_chips), PRN); + gps_l5i_code_gen_float(gsl::span(data_code, code_length_chips), PRN); // The code is generated as a series of 1s and -1s. In order to store the values using only one bit, a -1 is stored as a 0 in the FPGA for (uint32_t s = 0; s < code_length_chips; s++) { - int32_t tmp_value = static_cast(tracking_code[s]); + auto tmp_value = static_cast(tracking_code[s]); if (tmp_value < 0) { tmp_value = 0; @@ -261,12 +261,12 @@ GpsL5DllPllTrackingFpga::GpsL5DllPllTrackingFpga( } else { - gps_l5i_code_gen_float(tracking_code, PRN); + gps_l5i_code_gen_float(gsl::span(tracking_code, code_length_chips), PRN); // The code is generated as a series of 1s and -1s. In order to store the values using only one bit, a -1 is stored as a 0 in the FPGA for (uint32_t s = 0; s < code_length_chips; s++) { - int32_t tmp_value = static_cast(tracking_code[s]); + auto tmp_value = static_cast(tracking_code[s]); if (tmp_value < 0) { tmp_value = 0; 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 8554b72f8..e26712291 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc @@ -63,9 +63,11 @@ #include // for fill_n #include // for fmod, round, floor #include // for exception -#include // for cout, cerr +#include +#include // for cout, cerr #include #include +#include #if HAS_STD_FILESYSTEM #if HAS_STD_FILESYSTEM_EXPERIMENTAL @@ -447,7 +449,7 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) : gr::bl // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[trk_parameters.cn0_samples]; + d_Prompt_buffer = std::vector(trk_parameters.cn0_samples); d_carrier_lock_test = 1.0; d_CN0_SNV_dB_Hz = 0.0; d_carrier_lock_fail_counter = 0; @@ -587,48 +589,52 @@ void dll_pll_veml_tracking::start_tracking() d_carrier_phase_rate_step_rad = 0.0; d_carr_ph_history.clear(); d_code_ph_history.clear(); + std::array Signal_; + std::memcpy(Signal_.data(), d_acquisition_gnss_synchro->Signal, 3); if (systemName == "GPS" and signal_type == "1C") { - gps_l1_ca_code_gen_float(d_tracking_code, d_acquisition_gnss_synchro->PRN, 0); + gps_l1_ca_code_gen_float(gsl::span(d_tracking_code, 2 * d_code_length_chips), d_acquisition_gnss_synchro->PRN, 0); } else if (systemName == "GPS" and signal_type == "2S") { - gps_l2c_m_code_gen_float(d_tracking_code, d_acquisition_gnss_synchro->PRN); + gps_l2c_m_code_gen_float(gsl::span(d_tracking_code, 2 * d_code_length_chips), d_acquisition_gnss_synchro->PRN); } else if (systemName == "GPS" and signal_type == "L5") { if (trk_parameters.track_pilot) { - gps_l5q_code_gen_float(d_tracking_code, d_acquisition_gnss_synchro->PRN); - gps_l5i_code_gen_float(d_data_code, d_acquisition_gnss_synchro->PRN); + gps_l5q_code_gen_float(gsl::span(d_tracking_code, 2 * d_code_length_chips), d_acquisition_gnss_synchro->PRN); + gps_l5i_code_gen_float(gsl::span(d_data_code, 2 * d_code_length_chips), d_acquisition_gnss_synchro->PRN); d_Prompt_Data[0] = gr_complex(0.0, 0.0); correlator_data_cpu.set_local_code_and_taps(d_code_length_chips, d_data_code, d_prompt_data_shift); } else { - gps_l5i_code_gen_float(d_tracking_code, d_acquisition_gnss_synchro->PRN); + gps_l5i_code_gen_float(gsl::span(d_tracking_code, 2 * d_code_length_chips), d_acquisition_gnss_synchro->PRN); } } else if (systemName == "Galileo" and signal_type == "1B") { if (trk_parameters.track_pilot) { - char pilot_signal[3] = "1C"; - galileo_e1_code_gen_sinboc11_float(d_tracking_code, pilot_signal, d_acquisition_gnss_synchro->PRN); - galileo_e1_code_gen_sinboc11_float(d_data_code, d_acquisition_gnss_synchro->Signal, d_acquisition_gnss_synchro->PRN); + std::array pilot_signal = {{'1', 'C', '\0'}}; + + galileo_e1_code_gen_sinboc11_float(gsl::span(d_tracking_code, 2 * d_code_length_chips), pilot_signal, d_acquisition_gnss_synchro->PRN); + galileo_e1_code_gen_sinboc11_float(gsl::span(d_data_code, 2 * d_code_length_chips), Signal_, d_acquisition_gnss_synchro->PRN); d_Prompt_Data[0] = gr_complex(0.0, 0.0); correlator_data_cpu.set_local_code_and_taps(d_code_samples_per_chip * d_code_length_chips, d_data_code, d_prompt_data_shift); } else { - galileo_e1_code_gen_sinboc11_float(d_tracking_code, d_acquisition_gnss_synchro->Signal, d_acquisition_gnss_synchro->PRN); + galileo_e1_code_gen_sinboc11_float(gsl::span(d_tracking_code, 2 * d_code_length_chips), Signal_, d_acquisition_gnss_synchro->PRN); } } else if (systemName == "Galileo" and signal_type == "5X") { auto *aux_code = static_cast(volk_gnsssdr_malloc(sizeof(gr_complex) * d_code_length_chips, volk_gnsssdr_get_alignment())); - galileo_e5_a_code_gen_complex_primary(aux_code, d_acquisition_gnss_synchro->PRN, const_cast(signal_type.c_str())); + std::array signal_type_ = {{'5', 'X', '\0'}}; + galileo_e5_a_code_gen_complex_primary(gsl::span(aux_code, d_code_length_chips), d_acquisition_gnss_synchro->PRN, signal_type_); if (trk_parameters.track_pilot) { d_secondary_code_string = const_cast(&GALILEO_E5A_Q_SECONDARY_CODE[d_acquisition_gnss_synchro->PRN - 1]); @@ -651,7 +657,7 @@ 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); + beidou_b1i_code_gen_float(gsl::span(d_tracking_code, 2 * d_code_length_chips), 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) { @@ -691,7 +697,7 @@ void dll_pll_veml_tracking::start_tracking() else if (systemName == "Beidou" and signal_type == "B3") { - beidou_b3i_code_gen_float(d_tracking_code, d_acquisition_gnss_synchro->PRN, 0); + beidou_b3i_code_gen_float(gsl::span(d_tracking_code, 2 * d_code_length_chips), 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) { @@ -818,7 +824,6 @@ dll_pll_veml_tracking::~dll_pll_veml_tracking() volk_gnsssdr_free(d_data_code); correlator_data_cpu.free(); } - delete[] d_Prompt_buffer; multicorrelator_cpu.free(); } catch (const std::exception &ex) @@ -881,10 +886,10 @@ bool dll_pll_veml_tracking::cn0_and_tracking_lock_status(double coh_integration_ d_Prompt_buffer[d_cn0_estimation_counter % trk_parameters.cn0_samples] = d_P_accu; d_cn0_estimation_counter++; // Code lock indicator - float d_CN0_SNV_dB_Hz_raw = cn0_svn_estimator(d_Prompt_buffer, trk_parameters.cn0_samples, static_cast(coh_integration_time_s)); + float d_CN0_SNV_dB_Hz_raw = cn0_svn_estimator(d_Prompt_buffer.data(), trk_parameters.cn0_samples, static_cast(coh_integration_time_s)); d_CN0_SNV_dB_Hz = d_cn0_smoother.smooth(d_CN0_SNV_dB_Hz_raw); // Carrier lock indicator - d_carrier_lock_test = d_carrier_lock_test_smoother.smooth(carrier_lock_detector(d_Prompt_buffer, 1)); + d_carrier_lock_test = d_carrier_lock_test_smoother.smooth(carrier_lock_detector(d_Prompt_buffer.data(), 1)); //d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, trk_parameters.cn0_samples); // Loss of lock detection if (!d_pull_in_transitory) @@ -1356,28 +1361,28 @@ int32_t dll_pll_veml_tracking::save_matfile() { return 1; } - auto *abs_VE = new float[num_epoch]; - auto *abs_E = new float[num_epoch]; - auto *abs_P = new float[num_epoch]; - auto *abs_L = new float[num_epoch]; - auto *abs_VL = new float[num_epoch]; - auto *Prompt_I = new float[num_epoch]; - auto *Prompt_Q = new float[num_epoch]; - auto *PRN_start_sample_count = new uint64_t[num_epoch]; - auto *acc_carrier_phase_rad = new float[num_epoch]; - auto *carrier_doppler_hz = new float[num_epoch]; - auto *carrier_doppler_rate_hz = new float[num_epoch]; - auto *code_freq_chips = new float[num_epoch]; - auto *code_freq_rate_chips = new float[num_epoch]; - auto *carr_error_hz = new float[num_epoch]; - auto *carr_error_filt_hz = new float[num_epoch]; - auto *code_error_chips = new float[num_epoch]; - auto *code_error_filt_chips = new float[num_epoch]; - auto *CN0_SNV_dB_Hz = new float[num_epoch]; - auto *carrier_lock_test = new float[num_epoch]; - auto *aux1 = new float[num_epoch]; - auto *aux2 = new double[num_epoch]; - auto *PRN = new uint32_t[num_epoch]; + auto abs_VE = std::vector(num_epoch); + auto abs_E = std::vector(num_epoch); + auto abs_P = std::vector(num_epoch); + auto abs_L = std::vector(num_epoch); + auto abs_VL = std::vector(num_epoch); + auto Prompt_I = std::vector(num_epoch); + auto Prompt_Q = std::vector(num_epoch); + auto PRN_start_sample_count = std::vector(num_epoch); + auto acc_carrier_phase_rad = std::vector(num_epoch); + auto carrier_doppler_hz = std::vector(num_epoch); + auto carrier_doppler_rate_hz = std::vector(num_epoch); + auto code_freq_chips = std::vector(num_epoch); + auto code_freq_rate_chips = std::vector(num_epoch); + auto carr_error_hz = std::vector(num_epoch); + auto carr_error_filt_hz = std::vector(num_epoch); + auto code_error_chips = std::vector(num_epoch); + auto code_error_filt_chips = std::vector(num_epoch); + auto CN0_SNV_dB_Hz = std::vector(num_epoch); + auto carrier_lock_test = std::vector(num_epoch); + auto aux1 = std::vector(num_epoch); + auto aux2 = std::vector(num_epoch); + auto PRN = std::vector(num_epoch); try { @@ -1414,28 +1419,6 @@ int32_t dll_pll_veml_tracking::save_matfile() catch (const std::ifstream::failure &e) { std::cerr << "Problem reading dump file:" << e.what() << std::endl; - delete[] abs_VE; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] abs_VL; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] carrier_doppler_rate_hz; - delete[] code_freq_chips; - delete[] code_freq_rate_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 1; } @@ -1449,117 +1432,95 @@ int32_t dll_pll_veml_tracking::save_matfile() if (reinterpret_cast(matfp) != nullptr) { size_t dims[2] = {1, static_cast(num_epoch)}; - matvar = Mat_VarCreate("abs_VE", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VE, 0); + matvar = Mat_VarCreate("abs_VE", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VE.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0); + matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0); + matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0); + matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_VL", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VL, 0); + matvar = Mat_VarCreate("abs_VL", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VL.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0); + matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0); + matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0); + matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, acc_carrier_phase_rad, 0); + matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, acc_carrier_phase_rad.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_doppler_hz, 0); + matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_doppler_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_doppler_rate_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_doppler_rate_hz, 0); + matvar = Mat_VarCreate("carrier_doppler_rate_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_doppler_rate_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_freq_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_freq_chips, 0); + matvar = Mat_VarCreate("code_freq_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_freq_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_freq_rate_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_freq_rate_chips, 0); + matvar = Mat_VarCreate("code_freq_rate_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_freq_rate_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_hz, 0); + matvar = Mat_VarCreate("carr_error_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_filt_hz, 0); + matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_filt_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_chips, 0); + matvar = Mat_VarCreate("code_error_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_filt_chips, 0); + matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_filt_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, CN0_SNV_dB_Hz, 0); + matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, CN0_SNV_dB_Hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_lock_test", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_lock_test, 0); + matvar = Mat_VarCreate("carrier_lock_test", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_lock_test.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux1", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, aux1, 0); + matvar = Mat_VarCreate("aux1", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, aux1.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0); + matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0); + matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); } Mat_Close(matfp); - delete[] abs_VE; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] abs_VL; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] carrier_doppler_rate_hz; - delete[] code_freq_chips; - delete[] code_freq_rate_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 0; } 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 38969900a..170a3ddb5 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h @@ -46,6 +46,7 @@ #include // for int32_t #include // for string, ofstream #include // for pair +#include class Gnss_Synchro; class dll_pll_veml_tracking; @@ -201,7 +202,7 @@ private: double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; boost::circular_buffer d_Prompt_circular_buffer; - gr_complex *d_Prompt_buffer; + std::vector d_Prompt_buffer; Exponential_Smoother d_cn0_smoother; Exponential_Smoother d_carrier_lock_test_smoother; // file dump diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc index d555aecb8..456c5814b 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc @@ -58,6 +58,7 @@ #include #include #include +#include #if HAS_STD_FILESYSTEM #if HAS_STD_FILESYSTEM_EXPERIMENTAL @@ -360,7 +361,7 @@ dll_pll_veml_tracking_fpga::dll_pll_veml_tracking_fpga(const Dll_Pll_Conf_Fpga & // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[trk_parameters.cn0_samples]; + d_Prompt_buffer = std::vector(trk_parameters.cn0_samples); d_carrier_lock_test = 1.0; d_CN0_SNV_dB_Hz = 0.0; d_cn0_smoother = Exponential_Smoother(); @@ -536,7 +537,6 @@ dll_pll_veml_tracking_fpga::~dll_pll_veml_tracking_fpga() volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_Prompt_Data); - delete[] d_Prompt_buffer; multicorrelator_fpga->free(); } catch (const std::exception &ex) @@ -600,10 +600,10 @@ bool dll_pll_veml_tracking_fpga::cn0_and_tracking_lock_status(double coh_integra { d_cn0_estimation_counter = 0; // Code lock indicator - float d_CN0_SNV_dB_Hz_raw = cn0_svn_estimator(d_Prompt_buffer, trk_parameters.cn0_samples, static_cast(coh_integration_time_s)); + float d_CN0_SNV_dB_Hz_raw = cn0_svn_estimator(d_Prompt_buffer.data(), trk_parameters.cn0_samples, static_cast(coh_integration_time_s)); d_CN0_SNV_dB_Hz = d_cn0_smoother.smooth(d_CN0_SNV_dB_Hz_raw); // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, trk_parameters.cn0_samples); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer.data(), trk_parameters.cn0_samples); // Loss of lock detection if (!d_pull_in_transitory) { @@ -733,7 +733,6 @@ void dll_pll_veml_tracking_fpga::clear_tracking_vars() d_code_error_filt_chips = 0.0; d_current_symbol = 0; d_Prompt_circular_buffer.clear(); - //d_Prompt_buffer_deque.clear(); d_carrier_phase_rate_step_rad = 0.0; d_code_phase_rate_step_chips = 0.0; d_carr_ph_history.clear(); @@ -1036,28 +1035,28 @@ int32_t dll_pll_veml_tracking_fpga::save_matfile() { return 1; } - auto *abs_VE = new float[num_epoch]; - auto *abs_E = new float[num_epoch]; - auto *abs_P = new float[num_epoch]; - auto *abs_L = new float[num_epoch]; - auto *abs_VL = new float[num_epoch]; - auto *Prompt_I = new float[num_epoch]; - auto *Prompt_Q = new float[num_epoch]; - auto *PRN_start_sample_count = new uint64_t[num_epoch]; - auto *acc_carrier_phase_rad = new float[num_epoch]; - auto *carrier_doppler_hz = new float[num_epoch]; - auto *carrier_doppler_rate_hz = new float[num_epoch]; - auto *code_freq_chips = new float[num_epoch]; - auto *code_freq_rate_chips = new float[num_epoch]; - auto *carr_error_hz = new float[num_epoch]; - auto *carr_error_filt_hz = new float[num_epoch]; - auto *code_error_chips = new float[num_epoch]; - auto *code_error_filt_chips = new float[num_epoch]; - auto *CN0_SNV_dB_Hz = new float[num_epoch]; - auto *carrier_lock_test = new float[num_epoch]; - auto *aux1 = new float[num_epoch]; - auto *aux2 = new double[num_epoch]; - auto *PRN = new uint32_t[num_epoch]; + auto abs_VE = std::vector(num_epoch); + auto abs_E = std::vector(num_epoch); + auto abs_P = std::vector(num_epoch); + auto abs_L = std::vector(num_epoch); + auto abs_VL = std::vector(num_epoch); + auto Prompt_I = std::vector(num_epoch); + auto Prompt_Q = std::vector(num_epoch); + auto PRN_start_sample_count = std::vector(num_epoch); + auto acc_carrier_phase_rad = std::vector(num_epoch); + auto carrier_doppler_hz = std::vector(num_epoch); + auto carrier_doppler_rate_hz = std::vector(num_epoch); + auto code_freq_chips = std::vector(num_epoch); + auto code_freq_rate_chips = std::vector(num_epoch); + auto carr_error_hz = std::vector(num_epoch); + auto carr_error_filt_hz = std::vector(num_epoch); + auto code_error_chips = std::vector(num_epoch); + auto code_error_filt_chips = std::vector(num_epoch); + auto CN0_SNV_dB_Hz = std::vector(num_epoch); + auto carrier_lock_test = std::vector(num_epoch); + auto aux1 = std::vector(num_epoch); + auto aux2 = std::vector(num_epoch); + auto PRN = std::vector(num_epoch); try { @@ -1094,28 +1093,6 @@ int32_t dll_pll_veml_tracking_fpga::save_matfile() catch (const std::ifstream::failure &e) { std::cerr << "Problem reading dump file:" << e.what() << std::endl; - delete[] abs_VE; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] abs_VL; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] carrier_doppler_rate_hz; - delete[] code_freq_chips; - delete[] code_freq_rate_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 1; } @@ -1129,117 +1106,95 @@ int32_t dll_pll_veml_tracking_fpga::save_matfile() if (reinterpret_cast(matfp) != nullptr) { size_t dims[2] = {1, static_cast(num_epoch)}; - matvar = Mat_VarCreate("abs_VE", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VE, 0); + matvar = Mat_VarCreate("abs_VE", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VE.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0); + matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0); + matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0); + matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_VL", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VL, 0); + matvar = Mat_VarCreate("abs_VL", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VL.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0); + matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0); + matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0); + matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, acc_carrier_phase_rad, 0); + matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, acc_carrier_phase_rad.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_doppler_hz, 0); + matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_doppler_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_doppler_rate_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_doppler_rate_hz, 0); + matvar = Mat_VarCreate("carrier_doppler_rate_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_doppler_rate_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_freq_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_freq_chips, 0); + matvar = Mat_VarCreate("code_freq_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_freq_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_freq_rate_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_freq_rate_chips, 0); + matvar = Mat_VarCreate("code_freq_rate_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_freq_rate_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_hz, 0); + matvar = Mat_VarCreate("carr_error_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_filt_hz, 0); + matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_filt_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_chips, 0); + matvar = Mat_VarCreate("code_error_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_filt_chips, 0); + matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_filt_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, CN0_SNV_dB_Hz, 0); + matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, CN0_SNV_dB_Hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_lock_test", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_lock_test, 0); + matvar = Mat_VarCreate("carrier_lock_test", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_lock_test.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux1", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, aux1, 0); + matvar = Mat_VarCreate("aux1", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, aux1.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0); + matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0); + matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); } Mat_Close(matfp); - delete[] abs_VE; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] abs_VL; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] carrier_doppler_rate_hz; - delete[] code_freq_chips; - delete[] code_freq_rate_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 0; } diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.h b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.h index 0cb708323..bb63e0f89 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.h +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.h @@ -48,6 +48,7 @@ #include // for shared_ptr #include #include // for pair +#include class Fpga_Multicorrelator_8sc; class Gnss_Synchro; @@ -201,7 +202,7 @@ private: double d_carrier_lock_threshold; boost::circular_buffer d_Prompt_circular_buffer; //std::deque d_Prompt_buffer_deque; - gr_complex *d_Prompt_buffer; + std::vector d_Prompt_buffer; Exponential_Smoother d_cn0_smoother; // file dump diff --git a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc index 3d4ae0ff5..0966fb809 100644 --- a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc @@ -163,7 +163,7 @@ Galileo_E1_Tcp_Connector_Tracking_cc::Galileo_E1_Tcp_Connector_Tracking_cc( // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[FLAGS_cn0_samples]; + d_Prompt_buffer = std::vector(FLAGS_cn0_samples); d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; @@ -188,10 +188,12 @@ void Galileo_E1_Tcp_Connector_Tracking_cc::start_tracking() d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; + std::array Signal_; + std::memcpy(Signal_.data(), d_acquisition_gnss_synchro->Signal, 3); // generate local reference ALWAYS starting at chip 1 (2 samples per chip) - galileo_e1_code_gen_complex_sampled(d_ca_code, - d_acquisition_gnss_synchro->Signal, + galileo_e1_code_gen_complex_sampled(gsl::span(d_ca_code, (2 * GALILEO_E1_B_CODE_LENGTH_CHIPS)), + Signal_, false, d_acquisition_gnss_synchro->PRN, 2 * GALILEO_E1_CODE_CHIP_RATE_HZ, @@ -245,7 +247,6 @@ Galileo_E1_Tcp_Connector_Tracking_cc::~Galileo_E1_Tcp_Connector_Tracking_cc() volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); - delete[] d_Prompt_buffer; d_tcp_com.close_tcp_connection(d_port); multicorrelator_cpu.free(); } @@ -413,10 +414,10 @@ int Galileo_E1_Tcp_Connector_Tracking_cc::general_work(int noutput_items __attri d_cn0_estimation_counter = 0; // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, FLAGS_cn0_samples, GALILEO_E1_CODE_PERIOD); + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer.data(), FLAGS_cn0_samples, GALILEO_E1_CODE_PERIOD); // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, FLAGS_cn0_samples); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer.data(), FLAGS_cn0_samples); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < FLAGS_cn0_min) diff --git a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.h index 423eef516..dfd71cd9d 100644 --- a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.h @@ -47,6 +47,7 @@ #include #include #include +#include class Galileo_E1_Tcp_Connector_Tracking_cc; @@ -166,7 +167,7 @@ private: // CN0 estimation and lock detector int32_t d_cn0_estimation_counter; - gr_complex *d_Prompt_buffer; + std::vector d_Prompt_buffer; float d_carrier_lock_test; float d_CN0_SNV_dB_Hz; float d_carrier_lock_threshold; 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 26db5d57f..79bf4038d 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 @@ -175,7 +175,7 @@ glonass_l1_ca_dll_pll_c_aid_tracking_cc::glonass_l1_ca_dll_pll_c_aid_tracking_cc // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[FLAGS_cn0_samples]; + d_Prompt_buffer = std::vector(FLAGS_cn0_samples); d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; @@ -272,7 +272,7 @@ void glonass_l1_ca_dll_pll_c_aid_tracking_cc::start_tracking() d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) - glonass_l1_ca_code_gen_complex(d_ca_code, 0); + glonass_l1_ca_code_gen_complex(gsl::span(d_ca_code, GLONASS_L1_CA_CODE_LENGTH_CHIPS), 0); multicorrelator_cpu.set_local_code_and_taps(static_cast(GLONASS_L1_CA_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); for (int32_t n = 0; n < d_n_correlator_taps; n++) @@ -345,7 +345,6 @@ glonass_l1_ca_dll_pll_c_aid_tracking_cc::~glonass_l1_ca_dll_pll_c_aid_tracking_c volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); - delete[] d_Prompt_buffer; multicorrelator_cpu.free(); } catch (const std::exception &ex) @@ -386,24 +385,24 @@ int32_t glonass_l1_ca_dll_pll_c_aid_tracking_cc::save_matfile() { return 1; } - auto *abs_E = new float[num_epoch]; - auto *abs_P = new float[num_epoch]; - auto *abs_L = new float[num_epoch]; - auto *Prompt_I = new float[num_epoch]; - auto *Prompt_Q = new float[num_epoch]; - auto *PRN_start_sample_count = new uint64_t[num_epoch]; - auto *acc_carrier_phase_rad = new double[num_epoch]; - auto *carrier_doppler_hz = new double[num_epoch]; - auto *code_freq_chips = new double[num_epoch]; - auto *carr_error_hz = new double[num_epoch]; - auto *carr_error_filt_hz = new double[num_epoch]; - auto *code_error_chips = new double[num_epoch]; - auto *code_error_filt_chips = new double[num_epoch]; - auto *CN0_SNV_dB_Hz = new double[num_epoch]; - auto *carrier_lock_test = new double[num_epoch]; - auto *aux1 = new double[num_epoch]; - auto *aux2 = new double[num_epoch]; - auto *PRN = new uint32_t[num_epoch]; + auto abs_E = std::vector(num_epoch); + auto abs_P = std::vector(num_epoch); + auto abs_L = std::vector(num_epoch); + auto Prompt_I = std::vector(num_epoch); + auto Prompt_Q = std::vector(num_epoch); + auto PRN_start_sample_count = std::vector(num_epoch); + auto acc_carrier_phase_rad = std::vector(num_epoch); + auto carrier_doppler_hz = std::vector(num_epoch); + auto code_freq_chips = std::vector(num_epoch); + auto carr_error_hz = std::vector(num_epoch); + auto carr_error_filt_hz = std::vector(num_epoch); + auto code_error_chips = std::vector(num_epoch); + auto code_error_filt_chips = std::vector(num_epoch); + auto CN0_SNV_dB_Hz = std::vector(num_epoch); + auto carrier_lock_test = std::vector(num_epoch); + auto aux1 = std::vector(num_epoch); + auto aux2 = std::vector(num_epoch); + auto PRN = std::vector(num_epoch); try { @@ -436,24 +435,6 @@ int32_t glonass_l1_ca_dll_pll_c_aid_tracking_cc::save_matfile() catch (const std::ifstream::failure &e) { std::cerr << "Problem reading dump file:" << e.what() << std::endl; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 1; } @@ -467,97 +448,79 @@ int32_t glonass_l1_ca_dll_pll_c_aid_tracking_cc::save_matfile() if (reinterpret_cast(matfp) != nullptr) { size_t dims[2] = {1, static_cast(num_epoch)}; - matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0); + matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0); + matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0); + matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0); + matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0); + matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0); + matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0); + matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0); + matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0); + matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0); + matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0); + matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0); + matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0); + matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0); + matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0); + matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0); + matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0); + matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0); + matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); } Mat_Close(matfp); - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 0; } @@ -798,9 +761,9 @@ int glonass_l1_ca_dll_pll_c_aid_tracking_cc::general_work(int noutput_items __at { d_cn0_estimation_counter = 0; // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, GLONASS_L1_CA_CODE_PERIOD); + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES, GLONASS_L1_CA_CODE_PERIOD); // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < FLAGS_cn0_min) { diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.h index 93c43c35a..394966f28 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.h @@ -50,6 +50,7 @@ #include #include #include +#include class glonass_l1_ca_dll_pll_c_aid_tracking_cc; @@ -180,7 +181,7 @@ private: // CN0 estimation and lock detector int32_t d_cn0_estimation_counter; - gr_complex* d_Prompt_buffer; + std::vector d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; 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 563ee72f2..5b5e8fdc8 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 @@ -173,7 +173,7 @@ glonass_l1_ca_dll_pll_c_aid_tracking_sc::glonass_l1_ca_dll_pll_c_aid_tracking_sc // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[FLAGS_cn0_samples]; + d_Prompt_buffer = std::vector(FLAGS_cn0_samples); d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; @@ -266,7 +266,7 @@ void glonass_l1_ca_dll_pll_c_aid_tracking_sc::start_tracking() d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) - glonass_l1_ca_code_gen_complex(d_ca_code, 0); + glonass_l1_ca_code_gen_complex(gsl::span(d_ca_code, GLONASS_L1_CA_CODE_LENGTH_CHIPS), 0); volk_gnsssdr_32fc_convert_16ic(d_ca_code_16sc, d_ca_code, static_cast(GLONASS_L1_CA_CODE_LENGTH_CHIPS)); multicorrelator_cpu_16sc.set_local_code_and_taps(static_cast(GLONASS_L1_CA_CODE_LENGTH_CHIPS), d_ca_code_16sc, d_local_code_shift_chips); @@ -333,24 +333,24 @@ int32_t glonass_l1_ca_dll_pll_c_aid_tracking_sc::save_matfile() { return 1; } - auto *abs_E = new float[num_epoch]; - auto *abs_P = new float[num_epoch]; - auto *abs_L = new float[num_epoch]; - auto *Prompt_I = new float[num_epoch]; - auto *Prompt_Q = new float[num_epoch]; - auto *PRN_start_sample_count = new uint64_t[num_epoch]; - auto *acc_carrier_phase_rad = new double[num_epoch]; - auto *carrier_doppler_hz = new double[num_epoch]; - auto *code_freq_chips = new double[num_epoch]; - auto *carr_error_hz = new double[num_epoch]; - auto *carr_error_filt_hz = new double[num_epoch]; - auto *code_error_chips = new double[num_epoch]; - auto *code_error_filt_chips = new double[num_epoch]; - auto *CN0_SNV_dB_Hz = new double[num_epoch]; - auto *carrier_lock_test = new double[num_epoch]; - auto *aux1 = new double[num_epoch]; - auto *aux2 = new double[num_epoch]; - auto *PRN = new uint32_t[num_epoch]; + auto abs_E = std::vector(num_epoch); + auto abs_P = std::vector(num_epoch); + auto abs_L = std::vector(num_epoch); + auto Prompt_I = std::vector(num_epoch); + auto Prompt_Q = std::vector(num_epoch); + auto PRN_start_sample_count = std::vector(num_epoch); + auto acc_carrier_phase_rad = std::vector(num_epoch); + auto carrier_doppler_hz = std::vector(num_epoch); + auto code_freq_chips = std::vector(num_epoch); + auto carr_error_hz = std::vector(num_epoch); + auto carr_error_filt_hz = std::vector(num_epoch); + auto code_error_chips = std::vector(num_epoch); + auto code_error_filt_chips = std::vector(num_epoch); + auto CN0_SNV_dB_Hz = std::vector(num_epoch); + auto carrier_lock_test = std::vector(num_epoch); + auto aux1 = std::vector(num_epoch); + auto aux2 = std::vector(num_epoch); + auto PRN = std::vector(num_epoch); try { @@ -383,24 +383,6 @@ int32_t glonass_l1_ca_dll_pll_c_aid_tracking_sc::save_matfile() catch (const std::ifstream::failure &e) { std::cerr << "Problem reading dump file:" << e.what() << std::endl; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 1; } @@ -414,97 +396,79 @@ int32_t glonass_l1_ca_dll_pll_c_aid_tracking_sc::save_matfile() if (reinterpret_cast(matfp) != nullptr) { size_t dims[2] = {1, static_cast(num_epoch)}; - matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0); + matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0); + matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0); + matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0); + matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0); + matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0); + matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0); + matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0); + matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0); + matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0); + matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0); + matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0); + matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0); + matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0); + matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0); + matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0); + matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0); + matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0); + matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); } Mat_Close(matfp); - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 0; } @@ -549,7 +513,6 @@ glonass_l1_ca_dll_pll_c_aid_tracking_sc::~glonass_l1_ca_dll_pll_c_aid_tracking_s volk_gnsssdr_free(d_ca_code_16sc); volk_gnsssdr_free(d_correlator_outs_16sc); - delete[] d_Prompt_buffer; multicorrelator_cpu_16sc.free(); } @@ -788,9 +751,9 @@ int glonass_l1_ca_dll_pll_c_aid_tracking_sc::general_work(int noutput_items __at { d_cn0_estimation_counter = 0; // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, GLONASS_L1_CA_CODE_PERIOD); + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES, GLONASS_L1_CA_CODE_PERIOD); // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < FLAGS_cn0_min) { diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.h b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.h index a58fee4aa..a220d3690 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.h +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.h @@ -51,6 +51,7 @@ #include #include #include +#include class glonass_l1_ca_dll_pll_c_aid_tracking_sc; @@ -183,7 +184,7 @@ private: // CN0 estimation and lock detector int32_t d_cn0_estimation_counter; - gr_complex* d_Prompt_buffer; + std::vector d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; 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 02aa70906..ec8a6fd92 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 @@ -52,6 +52,7 @@ #include #include #include +#include #define CN0_ESTIMATION_SAMPLES 10 @@ -145,7 +146,7 @@ Glonass_L1_Ca_Dll_Pll_Tracking_cc::Glonass_L1_Ca_Dll_Pll_Tracking_cc( // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[FLAGS_cn0_samples]; + d_Prompt_buffer = std::vector(FLAGS_cn0_samples); d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; @@ -226,7 +227,7 @@ void Glonass_L1_Ca_Dll_Pll_Tracking_cc::start_tracking() d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) - glonass_l1_ca_code_gen_complex(d_ca_code, 0); + glonass_l1_ca_code_gen_complex(gsl::span(d_ca_code, GLONASS_L1_CA_CODE_LENGTH_CHIPS), 0); multicorrelator_cpu.set_local_code_and_taps(static_cast(GLONASS_L1_CA_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); for (int32_t n = 0; n < d_n_correlator_taps; n++) @@ -297,7 +298,6 @@ Glonass_L1_Ca_Dll_Pll_Tracking_cc::~Glonass_L1_Ca_Dll_Pll_Tracking_cc() volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); - delete[] d_Prompt_buffer; multicorrelator_cpu.free(); } catch (const std::exception &ex) @@ -338,24 +338,24 @@ int32_t Glonass_L1_Ca_Dll_Pll_Tracking_cc::save_matfile() { return 1; } - auto *abs_E = new float[num_epoch]; - auto *abs_P = new float[num_epoch]; - auto *abs_L = new float[num_epoch]; - auto *Prompt_I = new float[num_epoch]; - auto *Prompt_Q = new float[num_epoch]; - auto *PRN_start_sample_count = new uint64_t[num_epoch]; - auto *acc_carrier_phase_rad = new double[num_epoch]; - auto *carrier_doppler_hz = new double[num_epoch]; - auto *code_freq_chips = new double[num_epoch]; - auto *carr_error_hz = new double[num_epoch]; - auto *carr_error_filt_hz = new double[num_epoch]; - auto *code_error_chips = new double[num_epoch]; - auto *code_error_filt_chips = new double[num_epoch]; - auto *CN0_SNV_dB_Hz = new double[num_epoch]; - auto *carrier_lock_test = new double[num_epoch]; - auto *aux1 = new double[num_epoch]; - auto *aux2 = new double[num_epoch]; - auto *PRN = new uint32_t[num_epoch]; + auto abs_E = std::vector(num_epoch); + auto abs_P = std::vector(num_epoch); + auto abs_L = std::vector(num_epoch); + auto Prompt_I = std::vector(num_epoch); + auto Prompt_Q = std::vector(num_epoch); + auto PRN_start_sample_count = std::vector(num_epoch); + auto acc_carrier_phase_rad = std::vector(num_epoch); + auto carrier_doppler_hz = std::vector(num_epoch); + auto code_freq_chips = std::vector(num_epoch); + auto carr_error_hz = std::vector(num_epoch); + auto carr_error_filt_hz = std::vector(num_epoch); + auto code_error_chips = std::vector(num_epoch); + auto code_error_filt_chips = std::vector(num_epoch); + auto CN0_SNV_dB_Hz = std::vector(num_epoch); + auto carrier_lock_test = std::vector(num_epoch); + auto aux1 = std::vector(num_epoch); + auto aux2 = std::vector(num_epoch); + auto PRN = std::vector(num_epoch); try { @@ -388,24 +388,6 @@ int32_t Glonass_L1_Ca_Dll_Pll_Tracking_cc::save_matfile() catch (const std::ifstream::failure &e) { std::cerr << "Problem reading dump file:" << e.what() << std::endl; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 1; } @@ -419,97 +401,79 @@ int32_t Glonass_L1_Ca_Dll_Pll_Tracking_cc::save_matfile() if (reinterpret_cast(matfp) != nullptr) { size_t dims[2] = {1, static_cast(num_epoch)}; - matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0); + matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0); + matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0); + matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0); + matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0); + matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0); + matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0); + matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0); + matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0); + matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0); + matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0); + matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0); + matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0); + matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0); + matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0); + matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0); + matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0); + matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0); + matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); } Mat_Close(matfp); - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 0; } @@ -656,9 +620,9 @@ int Glonass_L1_Ca_Dll_Pll_Tracking_cc::general_work(int noutput_items __attribut { d_cn0_estimation_counter = 0; // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, GLONASS_L1_CA_CODE_PERIOD); + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES, GLONASS_L1_CA_CODE_PERIOD); // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < FLAGS_cn0_min) { diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.h index 158eaa761..d75e308c5 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.h @@ -47,6 +47,7 @@ #include #include #include +#include class Glonass_L1_Ca_Dll_Pll_Tracking_cc; @@ -148,7 +149,7 @@ private: // CN0 estimation and lock detector int32_t d_cn0_estimation_counter; - gr_complex* d_Prompt_buffer; + std::vector d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc index e76a5978a..00d3242a7 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc @@ -52,6 +52,7 @@ #include #include #include +#include #define CN0_ESTIMATION_SAMPLES 10 @@ -172,7 +173,7 @@ glonass_l2_ca_dll_pll_c_aid_tracking_cc::glonass_l2_ca_dll_pll_c_aid_tracking_cc // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[FLAGS_cn0_samples]; + d_Prompt_buffer = std::vector(FLAGS_cn0_samples); d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; @@ -269,7 +270,7 @@ void glonass_l2_ca_dll_pll_c_aid_tracking_cc::start_tracking() d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) - glonass_l2_ca_code_gen_complex(d_ca_code, 0); + glonass_l2_ca_code_gen_complex(gsl::span(d_ca_code, static_cast(GLONASS_L2_CA_CODE_LENGTH_CHIPS)), 0); multicorrelator_cpu.set_local_code_and_taps(static_cast(GLONASS_L2_CA_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); for (int32_t n = 0; n < d_n_correlator_taps; n++) @@ -343,7 +344,6 @@ glonass_l2_ca_dll_pll_c_aid_tracking_cc::~glonass_l2_ca_dll_pll_c_aid_tracking_c volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); - delete[] d_Prompt_buffer; multicorrelator_cpu.free(); } catch (const std::exception &ex) @@ -384,24 +384,24 @@ int32_t glonass_l2_ca_dll_pll_c_aid_tracking_cc::save_matfile() { return 1; } - auto *abs_E = new float[num_epoch]; - auto *abs_P = new float[num_epoch]; - auto *abs_L = new float[num_epoch]; - auto *Prompt_I = new float[num_epoch]; - auto *Prompt_Q = new float[num_epoch]; - auto *PRN_start_sample_count = new uint64_t[num_epoch]; - auto *acc_carrier_phase_rad = new double[num_epoch]; - auto *carrier_doppler_hz = new double[num_epoch]; - auto *code_freq_chips = new double[num_epoch]; - auto *carr_error_hz = new double[num_epoch]; - auto *carr_error_filt_hz = new double[num_epoch]; - auto *code_error_chips = new double[num_epoch]; - auto *code_error_filt_chips = new double[num_epoch]; - auto *CN0_SNV_dB_Hz = new double[num_epoch]; - auto *carrier_lock_test = new double[num_epoch]; - auto *aux1 = new double[num_epoch]; - auto *aux2 = new double[num_epoch]; - auto *PRN = new uint32_t[num_epoch]; + auto abs_E = std::vector(num_epoch); + auto abs_P = std::vector(num_epoch); + auto abs_L = std::vector(num_epoch); + auto Prompt_I = std::vector(num_epoch); + auto Prompt_Q = std::vector(num_epoch); + auto PRN_start_sample_count = std::vector(num_epoch); + auto acc_carrier_phase_rad = std::vector(num_epoch); + auto carrier_doppler_hz = std::vector(num_epoch); + auto code_freq_chips = std::vector(num_epoch); + auto carr_error_hz = std::vector(num_epoch); + auto carr_error_filt_hz = std::vector(num_epoch); + auto code_error_chips = std::vector(num_epoch); + auto code_error_filt_chips = std::vector(num_epoch); + auto CN0_SNV_dB_Hz = std::vector(num_epoch); + auto carrier_lock_test = std::vector(num_epoch); + auto aux1 = std::vector(num_epoch); + auto aux2 = std::vector(num_epoch); + auto PRN = std::vector(num_epoch); try { @@ -434,24 +434,6 @@ int32_t glonass_l2_ca_dll_pll_c_aid_tracking_cc::save_matfile() catch (const std::ifstream::failure &e) { std::cerr << "Problem reading dump file:" << e.what() << std::endl; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 1; } @@ -465,97 +447,79 @@ int32_t glonass_l2_ca_dll_pll_c_aid_tracking_cc::save_matfile() if (reinterpret_cast(matfp) != nullptr) { size_t dims[2] = {1, static_cast(num_epoch)}; - matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0); + matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0); + matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0); + matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0); + matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0); + matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0); + matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0); + matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0); + matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0); + matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0); + matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0); + matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0); + matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0); + matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0); + matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0); + matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0); + matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0); + matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0); + matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); } Mat_Close(matfp); - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 0; } @@ -796,9 +760,9 @@ int glonass_l2_ca_dll_pll_c_aid_tracking_cc::general_work(int noutput_items __at { d_cn0_estimation_counter = 0; // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, GLONASS_L2_CA_CODE_PERIOD); + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES, GLONASS_L2_CA_CODE_PERIOD); // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < FLAGS_cn0_min) { diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.h index 44b711243..90d47b04c 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.h @@ -48,6 +48,7 @@ #include #include #include +#include class glonass_l2_ca_dll_pll_c_aid_tracking_cc; @@ -178,7 +179,7 @@ private: // CN0 estimation and lock detector int32_t d_cn0_estimation_counter; - gr_complex* d_Prompt_buffer; + std::vector d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc index 4014c70d7..a8ae96797 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc @@ -172,7 +172,7 @@ glonass_l2_ca_dll_pll_c_aid_tracking_sc::glonass_l2_ca_dll_pll_c_aid_tracking_sc // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[FLAGS_cn0_samples]; + d_Prompt_buffer = std::vector(FLAGS_cn0_samples); d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; @@ -265,7 +265,7 @@ void glonass_l2_ca_dll_pll_c_aid_tracking_sc::start_tracking() d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) - glonass_l2_ca_code_gen_complex(d_ca_code, 0); + glonass_l2_ca_code_gen_complex(gsl::span(d_ca_code, static_cast(GLONASS_L2_CA_CODE_LENGTH_CHIPS)), 0); volk_gnsssdr_32fc_convert_16ic(d_ca_code_16sc, d_ca_code, static_cast(GLONASS_L2_CA_CODE_LENGTH_CHIPS)); multicorrelator_cpu_16sc.set_local_code_and_taps(static_cast(GLONASS_L2_CA_CODE_LENGTH_CHIPS), d_ca_code_16sc, d_local_code_shift_chips); @@ -332,24 +332,24 @@ int32_t glonass_l2_ca_dll_pll_c_aid_tracking_sc::save_matfile() { return 1; } - auto *abs_E = new float[num_epoch]; - auto *abs_P = new float[num_epoch]; - auto *abs_L = new float[num_epoch]; - auto *Prompt_I = new float[num_epoch]; - auto *Prompt_Q = new float[num_epoch]; - auto *PRN_start_sample_count = new uint64_t[num_epoch]; - auto *acc_carrier_phase_rad = new double[num_epoch]; - auto *carrier_doppler_hz = new double[num_epoch]; - auto *code_freq_chips = new double[num_epoch]; - auto *carr_error_hz = new double[num_epoch]; - auto *carr_error_filt_hz = new double[num_epoch]; - auto *code_error_chips = new double[num_epoch]; - auto *code_error_filt_chips = new double[num_epoch]; - auto *CN0_SNV_dB_Hz = new double[num_epoch]; - auto *carrier_lock_test = new double[num_epoch]; - auto *aux1 = new double[num_epoch]; - auto *aux2 = new double[num_epoch]; - auto *PRN = new uint32_t[num_epoch]; + auto abs_E = std::vector(num_epoch); + auto abs_P = std::vector(num_epoch); + auto abs_L = std::vector(num_epoch); + auto Prompt_I = std::vector(num_epoch); + auto Prompt_Q = std::vector(num_epoch); + auto PRN_start_sample_count = std::vector(num_epoch); + auto acc_carrier_phase_rad = std::vector(num_epoch); + auto carrier_doppler_hz = std::vector(num_epoch); + auto code_freq_chips = std::vector(num_epoch); + auto carr_error_hz = std::vector(num_epoch); + auto carr_error_filt_hz = std::vector(num_epoch); + auto code_error_chips = std::vector(num_epoch); + auto code_error_filt_chips = std::vector(num_epoch); + auto CN0_SNV_dB_Hz = std::vector(num_epoch); + auto carrier_lock_test = std::vector(num_epoch); + auto aux1 = std::vector(num_epoch); + auto aux2 = std::vector(num_epoch); + auto PRN = std::vector(num_epoch); try { @@ -382,24 +382,6 @@ int32_t glonass_l2_ca_dll_pll_c_aid_tracking_sc::save_matfile() catch (const std::ifstream::failure &e) { std::cerr << "Problem reading dump file:" << e.what() << std::endl; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 1; } @@ -413,97 +395,79 @@ int32_t glonass_l2_ca_dll_pll_c_aid_tracking_sc::save_matfile() if (reinterpret_cast(matfp) != nullptr) { size_t dims[2] = {1, static_cast(num_epoch)}; - matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0); + matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0); + matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0); + matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0); + matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0); + matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0); + matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0); + matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0); + matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0); + matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0); + matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0); + matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0); + matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0); + matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0); + matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0); + matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0); + matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0); + matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0); + matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); } Mat_Close(matfp); - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 0; } @@ -548,7 +512,6 @@ glonass_l2_ca_dll_pll_c_aid_tracking_sc::~glonass_l2_ca_dll_pll_c_aid_tracking_s volk_gnsssdr_free(d_ca_code_16sc); volk_gnsssdr_free(d_correlator_outs_16sc); - delete[] d_Prompt_buffer; multicorrelator_cpu_16sc.free(); } @@ -787,9 +750,9 @@ int glonass_l2_ca_dll_pll_c_aid_tracking_sc::general_work(int noutput_items __at { d_cn0_estimation_counter = 0; // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, GLONASS_L2_CA_CODE_PERIOD); + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES, GLONASS_L2_CA_CODE_PERIOD); // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < FLAGS_cn0_min) { diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.h b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.h index d451da17b..74309f51a 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.h +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.h @@ -49,6 +49,7 @@ #include #include #include +#include class glonass_l2_ca_dll_pll_c_aid_tracking_sc; @@ -181,7 +182,7 @@ private: // CN0 estimation and lock detector int32_t d_cn0_estimation_counter; - gr_complex* d_Prompt_buffer; + std::vector d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc index 8f4151f6a..125d93255 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc @@ -145,7 +145,7 @@ Glonass_L2_Ca_Dll_Pll_Tracking_cc::Glonass_L2_Ca_Dll_Pll_Tracking_cc( // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[FLAGS_cn0_samples]; + d_Prompt_buffer = std::vector(FLAGS_cn0_samples); d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; @@ -226,7 +226,7 @@ void Glonass_L2_Ca_Dll_Pll_Tracking_cc::start_tracking() d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) - glonass_l2_ca_code_gen_complex(d_ca_code, 0); + glonass_l2_ca_code_gen_complex(gsl::span(d_ca_code, static_cast(GLONASS_L2_CA_CODE_LENGTH_CHIPS)), 0); multicorrelator_cpu.set_local_code_and_taps(static_cast(GLONASS_L2_CA_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); for (int32_t n = 0; n < d_n_correlator_taps; n++) @@ -297,7 +297,6 @@ Glonass_L2_Ca_Dll_Pll_Tracking_cc::~Glonass_L2_Ca_Dll_Pll_Tracking_cc() volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); - delete[] d_Prompt_buffer; multicorrelator_cpu.free(); } catch (const std::exception &ex) @@ -338,24 +337,24 @@ int32_t Glonass_L2_Ca_Dll_Pll_Tracking_cc::save_matfile() { return 1; } - auto *abs_E = new float[num_epoch]; - auto *abs_P = new float[num_epoch]; - auto *abs_L = new float[num_epoch]; - auto *Prompt_I = new float[num_epoch]; - auto *Prompt_Q = new float[num_epoch]; - auto *PRN_start_sample_count = new uint64_t[num_epoch]; - auto *acc_carrier_phase_rad = new double[num_epoch]; - auto *carrier_doppler_hz = new double[num_epoch]; - auto *code_freq_chips = new double[num_epoch]; - auto *carr_error_hz = new double[num_epoch]; - auto *carr_error_filt_hz = new double[num_epoch]; - auto *code_error_chips = new double[num_epoch]; - auto *code_error_filt_chips = new double[num_epoch]; - auto *CN0_SNV_dB_Hz = new double[num_epoch]; - auto *carrier_lock_test = new double[num_epoch]; - auto *aux1 = new double[num_epoch]; - auto *aux2 = new double[num_epoch]; - auto *PRN = new uint32_t[num_epoch]; + auto abs_E = std::vector(num_epoch); + auto abs_P = std::vector(num_epoch); + auto abs_L = std::vector(num_epoch); + auto Prompt_I = std::vector(num_epoch); + auto Prompt_Q = std::vector(num_epoch); + auto PRN_start_sample_count = std::vector(num_epoch); + auto acc_carrier_phase_rad = std::vector(num_epoch); + auto carrier_doppler_hz = std::vector(num_epoch); + auto code_freq_chips = std::vector(num_epoch); + auto carr_error_hz = std::vector(num_epoch); + auto carr_error_filt_hz = std::vector(num_epoch); + auto code_error_chips = std::vector(num_epoch); + auto code_error_filt_chips = std::vector(num_epoch); + auto CN0_SNV_dB_Hz = std::vector(num_epoch); + auto carrier_lock_test = std::vector(num_epoch); + auto aux1 = std::vector(num_epoch); + auto aux2 = std::vector(num_epoch); + auto PRN = std::vector(num_epoch); try { @@ -388,24 +387,6 @@ int32_t Glonass_L2_Ca_Dll_Pll_Tracking_cc::save_matfile() catch (const std::ifstream::failure &e) { std::cerr << "Problem reading dump file:" << e.what() << std::endl; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 1; } @@ -419,97 +400,79 @@ int32_t Glonass_L2_Ca_Dll_Pll_Tracking_cc::save_matfile() if (reinterpret_cast(matfp) != nullptr) { size_t dims[2] = {1, static_cast(num_epoch)}; - matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0); + matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0); + matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0); + matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0); + matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0); + matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0); + matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0); + matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0); + matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0); + matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0); + matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0); + matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0); + matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0); + matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0); + matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0); + matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0); + matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0); + matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0); + matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); } Mat_Close(matfp); - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 0; } @@ -656,9 +619,9 @@ int Glonass_L2_Ca_Dll_Pll_Tracking_cc::general_work(int noutput_items __attribut { d_cn0_estimation_counter = 0; // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, GLONASS_L2_CA_CODE_PERIOD); + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES, GLONASS_L2_CA_CODE_PERIOD); // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer.data(), CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < FLAGS_cn0_min) { diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.h index d72137d29..06773090b 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.h @@ -45,6 +45,7 @@ #include #include #include +#include class Glonass_L2_Ca_Dll_Pll_Tracking_cc; @@ -146,7 +147,7 @@ private: // CN0 estimation and lock detector int32_t d_cn0_estimation_counter; - gr_complex* d_Prompt_buffer; + std::vector d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc index 0a363cac5..b74eee6b5 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc @@ -138,7 +138,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc( // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[FLAGS_cn0_samples]; + d_Prompt_buffer = std::vector(FLAGS_cn0_samples); d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; @@ -217,7 +217,7 @@ void Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::start_tracking() d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) - gps_l1_ca_code_gen_complex(d_ca_code, d_acquisition_gnss_synchro->PRN, 0); + gps_l1_ca_code_gen_complex(gsl::span(d_ca_code, static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS)), d_acquisition_gnss_synchro->PRN, 0); multicorrelator_gpu->set_local_code_and_taps(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips, d_n_correlator_taps); @@ -270,7 +270,6 @@ Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::~Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc() cudaFreeHost(d_correlator_outs); cudaFreeHost(d_local_code_shift_chips); cudaFreeHost(d_ca_code); - delete[] d_Prompt_buffer; multicorrelator_gpu->free_cuda(); delete (multicorrelator_gpu); } @@ -437,9 +436,9 @@ int Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::general_work(int noutput_items __attribut { d_cn0_estimation_counter = 0; // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, FLAGS_cn0_samples, GPS_L1_CA_CODE_PERIOD); + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer.data(), FLAGS_cn0_samples, GPS_L1_CA_CODE_PERIOD); // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, FLAGS_cn0_samples); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer.data(), FLAGS_cn0_samples); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < FLAGS_cn0_min) { diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.h index 987af5686..5282caacb 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.h @@ -44,6 +44,7 @@ #include #include #include +#include class Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc; @@ -157,7 +158,7 @@ private: // CN0 estimation and lock detector int32_t d_cn0_estimation_counter; - gr_complex *d_Prompt_buffer; + std::vector d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc index a07831b7d..dfe63deb4 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc @@ -49,10 +49,12 @@ #include #include #include +#include #include #include #include #include +#include gps_l1_ca_kf_tracking_cc_sptr @@ -161,7 +163,7 @@ Gps_L1_Ca_Kf_Tracking_cc::Gps_L1_Ca_Kf_Tracking_cc( // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[FLAGS_cn0_samples]; + d_Prompt_buffer = std::vector(FLAGS_cn0_samples); d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; @@ -320,7 +322,7 @@ void Gps_L1_Ca_Kf_Tracking_cc::start_tracking() d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) - gps_l1_ca_code_gen_float(d_ca_code, d_acquisition_gnss_synchro->PRN, 0); + gps_l1_ca_code_gen_float(gsl::span(d_ca_code, static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) * sizeof(float)), d_acquisition_gnss_synchro->PRN, 0); multicorrelator_cpu.set_local_code_and_taps(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); for (int32_t n = 0; n < d_n_correlator_taps; n++) @@ -392,7 +394,6 @@ Gps_L1_Ca_Kf_Tracking_cc::~Gps_L1_Ca_Kf_Tracking_cc() volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); - delete[] d_Prompt_buffer; multicorrelator_cpu.free(); } catch (const std::exception &ex) @@ -433,28 +434,28 @@ int32_t Gps_L1_Ca_Kf_Tracking_cc::save_matfile() { return 1; } - auto *abs_VE = new float[num_epoch]; - auto *abs_E = new float[num_epoch]; - auto *abs_P = new float[num_epoch]; - auto *abs_L = new float[num_epoch]; - auto *abs_VL = new float[num_epoch]; - auto *Prompt_I = new float[num_epoch]; - auto *Prompt_Q = new float[num_epoch]; - auto *PRN_start_sample_count = new uint64_t[num_epoch]; - auto *acc_carrier_phase_rad = new float[num_epoch]; - auto *carrier_doppler_hz = new float[num_epoch]; - auto *carrier_dopplerrate_hz2 = new float[num_epoch]; - auto *code_freq_chips = new float[num_epoch]; - auto *carr_error_hz = new float[num_epoch]; - auto *carr_noise_sigma2 = new float[num_epoch]; - auto *carr_error_filt_hz = new float[num_epoch]; - auto *code_error_chips = new float[num_epoch]; - auto *code_error_filt_chips = new float[num_epoch]; - auto *CN0_SNV_dB_Hz = new float[num_epoch]; - auto *carrier_lock_test = new float[num_epoch]; - auto *aux1 = new float[num_epoch]; - auto *aux2 = new double[num_epoch]; - auto *PRN = new uint32_t[num_epoch]; + auto abs_VE = std::vector(num_epoch); + auto abs_E = std::vector(num_epoch); + auto abs_P = std::vector(num_epoch); + auto abs_L = std::vector(num_epoch); + auto abs_VL = std::vector(num_epoch); + auto Prompt_I = std::vector(num_epoch); + auto Prompt_Q = std::vector(num_epoch); + auto PRN_start_sample_count = std::vector(num_epoch); + auto acc_carrier_phase_rad = std::vector(num_epoch); + auto carrier_doppler_hz = std::vector(num_epoch); + auto carrier_dopplerrate_hz2 = std::vector(num_epoch); + auto code_freq_chips = std::vector(num_epoch); + auto carr_error_hz = std::vector(num_epoch); + auto carr_noise_sigma2 = std::vector(num_epoch); + auto carr_error_filt_hz = std::vector(num_epoch); + auto code_error_chips = std::vector(num_epoch); + auto code_error_filt_chips = std::vector(num_epoch); + auto CN0_SNV_dB_Hz = std::vector(num_epoch); + auto carrier_lock_test = std::vector(num_epoch); + auto aux1 = std::vector(num_epoch); + auto aux2 = std::vector(num_epoch); + auto PRN = std::vector(num_epoch); try { @@ -491,28 +492,6 @@ int32_t Gps_L1_Ca_Kf_Tracking_cc::save_matfile() catch (const std::ifstream::failure &e) { std::cerr << "Problem reading dump file:" << e.what() << std::endl; - delete[] abs_VE; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] abs_VL; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] carrier_dopplerrate_hz2; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_noise_sigma2; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 1; } @@ -526,117 +505,95 @@ int32_t Gps_L1_Ca_Kf_Tracking_cc::save_matfile() if (reinterpret_cast(matfp) != nullptr) { size_t dims[2] = {1, static_cast(num_epoch)}; - matvar = Mat_VarCreate("abs_VE", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VE, 0); + matvar = Mat_VarCreate("abs_VE", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VE.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0); + matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0); + matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0); + matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("abs_VL", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VL, 0); + matvar = Mat_VarCreate("abs_VL", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_VL.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0); + matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0); + matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0); + matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, acc_carrier_phase_rad, 0); + matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, acc_carrier_phase_rad.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_doppler_hz, 0); + matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_doppler_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_dopplerrate_hz2", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_dopplerrate_hz2, 0); + matvar = Mat_VarCreate("carrier_dopplerrate_hz2", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_dopplerrate_hz2.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_freq_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_freq_chips, 0); + matvar = Mat_VarCreate("code_freq_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_freq_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_hz, 0); + matvar = Mat_VarCreate("carr_error_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_noise_sigma2", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_noise_sigma2, 0); + matvar = Mat_VarCreate("carr_noise_sigma2", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_noise_sigma2.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_filt_hz, 0); + matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_filt_hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_chips, 0); + matvar = Mat_VarCreate("code_error_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_filt_chips, 0); + matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_filt_chips.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, CN0_SNV_dB_Hz, 0); + matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, CN0_SNV_dB_Hz.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("carrier_lock_test", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_lock_test, 0); + matvar = Mat_VarCreate("carrier_lock_test", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_lock_test.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux1", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, aux1, 0); + matvar = Mat_VarCreate("aux1", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, aux1.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0); + matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); - matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0); + matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN.data(), 0); Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE Mat_VarFree(matvar); } Mat_Close(matfp); - delete[] abs_VE; - delete[] abs_E; - delete[] abs_P; - delete[] abs_L; - delete[] abs_VL; - delete[] Prompt_I; - delete[] Prompt_Q; - delete[] PRN_start_sample_count; - delete[] acc_carrier_phase_rad; - delete[] carrier_doppler_hz; - delete[] carrier_dopplerrate_hz2; - delete[] code_freq_chips; - delete[] carr_error_hz; - delete[] carr_noise_sigma2; - delete[] carr_error_filt_hz; - delete[] code_error_chips; - delete[] code_error_filt_chips; - delete[] CN0_SNV_dB_Hz; - delete[] carrier_lock_test; - delete[] aux1; - delete[] aux2; - delete[] PRN; return 0; } @@ -835,9 +792,9 @@ int Gps_L1_Ca_Kf_Tracking_cc::general_work(int noutput_items __attribute__((unus { d_cn0_estimation_counter = 0; // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, FLAGS_cn0_samples, GPS_L1_CA_CODE_PERIOD); + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer.data(), FLAGS_cn0_samples, GPS_L1_CA_CODE_PERIOD); // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, FLAGS_cn0_samples); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer.data(), FLAGS_cn0_samples); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < FLAGS_cn0_min) { diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.h index e2faa339c..565d862a5 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.h @@ -50,6 +50,7 @@ #include #include #include +#include class Gps_L1_Ca_Kf_Tracking_cc; @@ -198,7 +199,7 @@ private: // CN0 estimation and lock detector int32_t d_cn0_estimation_counter; - gr_complex* d_Prompt_buffer; + std::vector d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc index f69896a7a..e1481ebdb 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc @@ -149,7 +149,7 @@ Gps_L1_Ca_Tcp_Connector_Tracking_cc::Gps_L1_Ca_Tcp_Connector_Tracking_cc( // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[FLAGS_cn0_samples]; + d_Prompt_buffer = std::vector(FLAGS_cn0_samples); d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; @@ -223,7 +223,7 @@ void Gps_L1_Ca_Tcp_Connector_Tracking_cc::start_tracking() d_carrier_doppler_hz = d_acq_carrier_doppler_hz; // generate local reference ALWAYS starting at chip 1 (1 sample per chip) - gps_l1_ca_code_gen_complex(d_ca_code, d_acquisition_gnss_synchro->PRN, 0); + gps_l1_ca_code_gen_complex(gsl::span(d_ca_code, (GPS_L1_CA_CODE_LENGTH_CHIPS) * sizeof(gr_complex)), d_acquisition_gnss_synchro->PRN, 0); multicorrelator_cpu.set_local_code_and_taps(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); for (int32_t n = 0; n < d_n_correlator_taps; n++) @@ -276,7 +276,6 @@ Gps_L1_Ca_Tcp_Connector_Tracking_cc::~Gps_L1_Ca_Tcp_Connector_Tracking_cc() volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); d_tcp_com.close_tcp_connection(d_port); - delete[] d_Prompt_buffer; multicorrelator_cpu.free(); } catch (const std::exception &ex) @@ -450,8 +449,8 @@ int Gps_L1_Ca_Tcp_Connector_Tracking_cc::general_work(int noutput_items __attrib else { d_cn0_estimation_counter = 0; - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, FLAGS_cn0_samples, GPS_L1_CA_CODE_PERIOD); - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, FLAGS_cn0_samples); + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer.data(), FLAGS_cn0_samples, GPS_L1_CA_CODE_PERIOD); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer.data(), FLAGS_cn0_samples); // ###### TRACKING UNLOCK NOTIFICATION ##### if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < FLAGS_cn0_min) diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.h index 3fa928a4d..106f38ab4 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.h @@ -44,6 +44,7 @@ #include #include #include +#include class Gps_L1_Ca_Tcp_Connector_Tracking_cc; @@ -152,7 +153,7 @@ private: // CN0 estimation and lock detector int32_t d_cn0_estimation_counter; - gr_complex *d_Prompt_buffer; + std::vector d_Prompt_buffer; float d_carrier_lock_test; float d_CN0_SNV_dB_Hz; float d_carrier_lock_threshold; diff --git a/src/core/libs/INIReader.cc b/src/core/libs/INIReader.cc index 63c076b82..454986615 100644 --- a/src/core/libs/INIReader.cc +++ b/src/core/libs/INIReader.cc @@ -64,7 +64,7 @@ int INIReader::ParseError() } -std::string INIReader::Get(const std::string& section, const std::string& name, std::string default_value) +std::string INIReader::Get(const std::string& section, const std::string& name, const std::string& default_value) { std::string key = MakeKey(section, name); return _values.count(key) ? _values[key] : default_value; diff --git a/src/core/libs/INIReader.h b/src/core/libs/INIReader.h index bfe168bd9..1a9f0f3e5 100644 --- a/src/core/libs/INIReader.h +++ b/src/core/libs/INIReader.h @@ -67,7 +67,7 @@ public: //! Get a string value from INI file, returning default_value if not found. std::string Get(const std::string& section, const std::string& name, - std::string default_value); + const std::string& default_value); //! Get an integer (long) value from INI file, returning default_value if not found. int64_t GetInteger(const std::string& section, const std::string& name, int64_t default_value); diff --git a/src/core/monitor/gnss_synchro_udp_sink.cc b/src/core/monitor/gnss_synchro_udp_sink.cc index 5793358ac..5a412a593 100644 --- a/src/core/monitor/gnss_synchro_udp_sink.cc +++ b/src/core/monitor/gnss_synchro_udp_sink.cc @@ -35,7 +35,7 @@ #include #include -Gnss_Synchro_Udp_Sink::Gnss_Synchro_Udp_Sink(std::vector addresses, const uint16_t& port, bool enable_protobuf) : socket{io_context} +Gnss_Synchro_Udp_Sink::Gnss_Synchro_Udp_Sink(const std::vector& addresses, const uint16_t& port, bool enable_protobuf) : socket{io_context} { use_protobuf = enable_protobuf; if (enable_protobuf) diff --git a/src/core/monitor/gnss_synchro_udp_sink.h b/src/core/monitor/gnss_synchro_udp_sink.h index 0cf4cc5cd..52c786885 100644 --- a/src/core/monitor/gnss_synchro_udp_sink.h +++ b/src/core/monitor/gnss_synchro_udp_sink.h @@ -53,7 +53,7 @@ using b_io_context = boost::asio::io_service; class Gnss_Synchro_Udp_Sink { public: - Gnss_Synchro_Udp_Sink(std::vector addresses, const uint16_t& port, bool enable_protobuf); + Gnss_Synchro_Udp_Sink(const std::vector& addresses, const uint16_t& port, bool enable_protobuf); bool write_gnss_synchro(const std::vector& stocks); private: diff --git a/src/core/receiver/control_thread.cc b/src/core/receiver/control_thread.cc index e92646586..384d6f041 100644 --- a/src/core/receiver/control_thread.cc +++ b/src/core/receiver/control_thread.cc @@ -933,8 +933,8 @@ std::vector> ControlThread::get_visible_sats(time if (El > 0) { std::cout << "Using GPS Ephemeris: Sat " << it.second.i_satellite_PRN << " Az: " << Az << " El: " << El << std::endl; - available_satellites.push_back(std::pair(floor(El), - (Gnss_Satellite(std::string("GPS"), it.second.i_satellite_PRN)))); + available_satellites.emplace_back(floor(El), + (Gnss_Satellite(std::string("GPS"), it.second.i_satellite_PRN))); visible_gps.push_back(it.second.i_satellite_PRN); } } @@ -956,8 +956,8 @@ std::vector> ControlThread::get_visible_sats(time if (El > 0) { std::cout << "Using Galileo Ephemeris: Sat " << it.second.i_satellite_PRN << " Az: " << Az << " El: " << El << std::endl; - available_satellites.push_back(std::pair(floor(El), - (Gnss_Satellite(std::string("Galileo"), it.second.i_satellite_PRN)))); + available_satellites.emplace_back(floor(El), + (Gnss_Satellite(std::string("Galileo"), it.second.i_satellite_PRN))); visible_gal.push_back(it.second.i_satellite_PRN); } } @@ -984,8 +984,8 @@ std::vector> ControlThread::get_visible_sats(time if (it2 == visible_gps.end()) { std::cout << "Using GPS Almanac: Sat " << it.second.i_satellite_PRN << " Az: " << Az << " El: " << El << std::endl; - available_satellites.push_back(std::pair(floor(El), - (Gnss_Satellite(std::string("GPS"), it.second.i_satellite_PRN)))); + available_satellites.emplace_back(floor(El), + (Gnss_Satellite(std::string("GPS"), it.second.i_satellite_PRN))); } } } @@ -1012,8 +1012,8 @@ std::vector> ControlThread::get_visible_sats(time if (it2 == visible_gal.end()) { std::cout << "Using Galileo Almanac: Sat " << it.second.i_satellite_PRN << " Az: " << Az << " El: " << El << std::endl; - available_satellites.push_back(std::pair(floor(El), - (Gnss_Satellite(std::string("Galileo"), it.second.i_satellite_PRN)))); + available_satellites.emplace_back(floor(El), + (Gnss_Satellite(std::string("Galileo"), it.second.i_satellite_PRN))); } } } diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index 0611a4e26..51e805957 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -1511,7 +1511,7 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) } -void GNSSFlowgraph::priorize_satellites(std::vector> visible_satellites) +void GNSSFlowgraph::priorize_satellites(const std::vector>& visible_satellites) { size_t old_size; Gnss_Signal gs; @@ -1854,9 +1854,9 @@ void GNSSFlowgraph::set_signals_list() available_gnss_prn_iter != available_gps_prn.cend(); available_gnss_prn_iter++) { - available_GPS_1C_signals_.push_back(Gnss_Signal( + available_GPS_1C_signals_.emplace_back( Gnss_Satellite(std::string("GPS"), *available_gnss_prn_iter), - std::string("1C"))); + std::string("1C")); } } @@ -1867,9 +1867,9 @@ void GNSSFlowgraph::set_signals_list() available_gnss_prn_iter != available_gps_prn.cend(); available_gnss_prn_iter++) { - available_GPS_2S_signals_.push_back(Gnss_Signal( + available_GPS_2S_signals_.emplace_back( Gnss_Satellite(std::string("GPS"), *available_gnss_prn_iter), - std::string("2S"))); + std::string("2S")); } } @@ -1880,9 +1880,9 @@ void GNSSFlowgraph::set_signals_list() available_gnss_prn_iter != available_gps_prn.cend(); available_gnss_prn_iter++) { - available_GPS_L5_signals_.push_back(Gnss_Signal( + available_GPS_L5_signals_.emplace_back( Gnss_Satellite(std::string("GPS"), *available_gnss_prn_iter), - std::string("L5"))); + std::string("L5")); } } @@ -1893,9 +1893,9 @@ void GNSSFlowgraph::set_signals_list() available_gnss_prn_iter != available_sbas_prn.cend(); available_gnss_prn_iter++) { - available_SBAS_1C_signals_.push_back(Gnss_Signal( + available_SBAS_1C_signals_.emplace_back( Gnss_Satellite(std::string("SBAS"), *available_gnss_prn_iter), - std::string("1C"))); + std::string("1C")); } } @@ -1906,9 +1906,9 @@ void GNSSFlowgraph::set_signals_list() available_gnss_prn_iter != available_galileo_prn.cend(); available_gnss_prn_iter++) { - available_GAL_1B_signals_.push_back(Gnss_Signal( + available_GAL_1B_signals_.emplace_back( Gnss_Satellite(std::string("Galileo"), *available_gnss_prn_iter), - std::string("1B"))); + std::string("1B")); } } @@ -1919,9 +1919,9 @@ void GNSSFlowgraph::set_signals_list() available_gnss_prn_iter != available_galileo_prn.cend(); available_gnss_prn_iter++) { - available_GAL_5X_signals_.push_back(Gnss_Signal( + available_GAL_5X_signals_.emplace_back( Gnss_Satellite(std::string("Galileo"), *available_gnss_prn_iter), - std::string("5X"))); + std::string("5X")); } } @@ -1932,9 +1932,9 @@ void GNSSFlowgraph::set_signals_list() available_gnss_prn_iter != available_glonass_prn.cend(); available_gnss_prn_iter++) { - available_GLO_1G_signals_.push_back(Gnss_Signal( + available_GLO_1G_signals_.emplace_back( Gnss_Satellite(std::string("Glonass"), *available_gnss_prn_iter), - std::string("1G"))); + std::string("1G")); } } @@ -1945,9 +1945,9 @@ void GNSSFlowgraph::set_signals_list() available_gnss_prn_iter != available_glonass_prn.cend(); available_gnss_prn_iter++) { - available_GLO_2G_signals_.push_back(Gnss_Signal( + available_GLO_2G_signals_.emplace_back( Gnss_Satellite(std::string("Glonass"), *available_gnss_prn_iter), - std::string("2G"))); + std::string("2G")); } } @@ -1960,9 +1960,9 @@ void GNSSFlowgraph::set_signals_list() available_gnss_prn_iter != available_beidou_prn.cend(); available_gnss_prn_iter++) { - available_BDS_B1_signals_.push_back(Gnss_Signal( + available_BDS_B1_signals_.emplace_back( Gnss_Satellite(std::string("Beidou"), *available_gnss_prn_iter), - std::string("B1"))); + std::string("B1")); } } @@ -1975,9 +1975,9 @@ void GNSSFlowgraph::set_signals_list() available_gnss_prn_iter != available_beidou_prn.cend(); available_gnss_prn_iter++) { - available_BDS_B3_signals_.push_back(Gnss_Signal( + available_BDS_B3_signals_.emplace_back( Gnss_Satellite(std::string("Beidou"), *available_gnss_prn_iter), - std::string("B3"))); + std::string("B3")); } } } @@ -2243,7 +2243,10 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { for (unsigned int ch = 0; ch < channels_count_; ch++) { - if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) untracked_satellite = false; + if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) + { + untracked_satellite = false; + } } if (untracked_satellite) { @@ -2268,7 +2271,10 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { for (unsigned int ch = 0; ch < channels_count_; ch++) { - if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) untracked_satellite = false; + if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) + { + untracked_satellite = false; + } } if (untracked_satellite) { diff --git a/src/core/receiver/gnss_flowgraph.h b/src/core/receiver/gnss_flowgraph.h index 32e0ea2e3..7552c46a7 100644 --- a/src/core/receiver/gnss_flowgraph.h +++ b/src/core/receiver/gnss_flowgraph.h @@ -142,7 +142,7 @@ public: /*! * \brief Priorize visible satellites in the specified vector */ - void priorize_satellites(std::vector> visible_satellites); + void priorize_satellites(const std::vector>& visible_satellites); private: void init(); // Populates the SV PRN list available for acquisition and tracking diff --git a/src/core/receiver/in_memory_configuration.cc b/src/core/receiver/in_memory_configuration.cc index 4801d2eb2..c3c093104 100644 --- a/src/core/receiver/in_memory_configuration.cc +++ b/src/core/receiver/in_memory_configuration.cc @@ -128,7 +128,7 @@ void InMemoryConfiguration::set_property(std::string property_name, std::string } -void InMemoryConfiguration::supersede_property(std::string property_name, std::string value) +void InMemoryConfiguration::supersede_property(const std::string& property_name, const std::string& value) { properties_.erase(property_name); properties_.insert(std::make_pair(property_name, value)); diff --git a/src/core/receiver/in_memory_configuration.h b/src/core/receiver/in_memory_configuration.h index 698071a36..2201c0d61 100644 --- a/src/core/receiver/in_memory_configuration.h +++ b/src/core/receiver/in_memory_configuration.h @@ -66,7 +66,7 @@ public: float property(std::string property_name, float default_value); double property(std::string property_name, double default_value); void set_property(std::string property_name, std::string value); - void supersede_property(std::string property_name, std::string value); + void supersede_property(const std::string& property_name, const std::string& value); bool is_present(const std::string& property_name); private: diff --git a/src/core/system_parameters/galileo_fnav_message.cc b/src/core/system_parameters/galileo_fnav_message.cc index 9dc6eb49e..3807fc143 100644 --- a/src/core/system_parameters/galileo_fnav_message.cc +++ b/src/core/system_parameters/galileo_fnav_message.cc @@ -42,7 +42,7 @@ #include // for string, operator<< #include // for back_insert_iterator -using CRC_Galileo_FNAV_type = boost::crc_optimal<24, 0x1864CFBu, 0x0, 0x0, false, false>; +using CRC_Galileo_FNAV_type = boost::crc_optimal<24, 0x1864CFBU, 0x0, 0x0, false, false>; void Galileo_Fnav_Message::reset() { diff --git a/src/core/system_parameters/galileo_navigation_message.cc b/src/core/system_parameters/galileo_navigation_message.cc index 62fe2d243..cb5f55b02 100644 --- a/src/core/system_parameters/galileo_navigation_message.cc +++ b/src/core/system_parameters/galileo_navigation_message.cc @@ -38,7 +38,7 @@ #include // for operator<< -using CRC_Galileo_INAV_type = boost::crc_optimal<24, 0x1864CFBu, 0x0, 0x0, false, false>; +using CRC_Galileo_INAV_type = boost::crc_optimal<24, 0x1864CFBU, 0x0, 0x0, false, false>; void Galileo_Navigation_Message::reset() diff --git a/src/tests/common-files/gnuplot_i.h b/src/tests/common-files/gnuplot_i.h index 2f5d7d979..4e9a4568f 100644 --- a/src/tests/common-files/gnuplot_i.h +++ b/src/tests/common-files/gnuplot_i.h @@ -1023,7 +1023,7 @@ Gnuplot &Gnuplot::plot_xyz(const X &x, // define static member function: set Gnuplot path manual // for windows: path with slash '/' not backslash '\' // -bool Gnuplot::set_GNUPlotPath(const std::string &path) +inline bool Gnuplot::set_GNUPlotPath(const std::string &path) { std::string tmp = path + "/" + Gnuplot::m_sGNUPlotFileName; @@ -1047,7 +1047,7 @@ bool Gnuplot::set_GNUPlotPath(const std::string &path) // define static member function: set standard terminal, used by showonscreen // defaults: Windows - win, Linux - x11, Mac - aqua // -void Gnuplot::set_terminal_std(const std::string &type) +inline void Gnuplot::set_terminal_std(const std::string &type) { #if defined(unix) || defined(__unix) || defined(__unix__) || defined(__APPLE__) if (type.find("x11") != std::string::npos && std::getenv("DISPLAY") == nullptr) @@ -1128,7 +1128,7 @@ Gnuplot::~Gnuplot() // // Resets a gnuplot session (next plot will erase previous ones) // -Gnuplot &Gnuplot::reset_plot() +inline Gnuplot &Gnuplot::reset_plot() { // remove_tmpfiles(); nplots = 0; @@ -1140,7 +1140,7 @@ Gnuplot &Gnuplot::reset_plot() // // resets a gnuplot session and sets all variables to default // -Gnuplot &Gnuplot::reset_all() +inline Gnuplot &Gnuplot::reset_all() { // remove_tmpfiles(); nplots = 0; @@ -1157,7 +1157,7 @@ Gnuplot &Gnuplot::reset_all() // // Change the plotting style of a gnuplot session // -Gnuplot &Gnuplot::set_style(const std::string &stylestr) +inline Gnuplot &Gnuplot::set_style(const std::string &stylestr) { if (stylestr.find("lines") == std::string::npos && stylestr.find("points") == std::string::npos && @@ -1202,7 +1202,7 @@ Gnuplot &Gnuplot::set_style(const std::string &stylestr) // // smooth: interpolation and approximation of data // -Gnuplot &Gnuplot::set_smooth(const std::string &stylestr) +inline Gnuplot &Gnuplot::set_smooth(const std::string &stylestr) { if (stylestr.find("unique") == std::string::npos && stylestr.find("frequency") == std::string::npos && @@ -1226,7 +1226,7 @@ Gnuplot &Gnuplot::set_smooth(const std::string &stylestr) // // Disable screen output // -Gnuplot &Gnuplot::disablescreen() +inline Gnuplot &Gnuplot::disablescreen() { cmd("set output"); cmd("set terminal unknown"); @@ -1237,7 +1237,7 @@ Gnuplot &Gnuplot::disablescreen() // // sets terminal type to windows / x11 // -Gnuplot &Gnuplot::showonscreen() +inline Gnuplot &Gnuplot::showonscreen() { std::string persist(" persist"); #ifdef __APPLE__ @@ -1254,7 +1254,7 @@ Gnuplot &Gnuplot::showonscreen() // // saves a gnuplot session to a pdf file // -Gnuplot &Gnuplot::savetopdf(const std::string &filename, unsigned int font_size) +inline Gnuplot &Gnuplot::savetopdf(const std::string &filename, unsigned int font_size) { std::ostringstream cmdstr; cmdstr << "set term pdfcairo enhanced color font \"Times-New-Roman," + std::to_string(font_size) + "\"\n"; @@ -1270,7 +1270,7 @@ Gnuplot &Gnuplot::savetopdf(const std::string &filename, unsigned int font_size) // // saves a gnuplot session to a postscript file // -Gnuplot &Gnuplot::savetops(const std::string &filename) +inline Gnuplot &Gnuplot::savetops(const std::string &filename) { std::ostringstream cmdstr; cmdstr << "set term postscript landscape enhanced color dashed \"Times-Roman\" 18\n"; @@ -1286,7 +1286,7 @@ Gnuplot &Gnuplot::savetops(const std::string &filename) // // Switches legend on // -Gnuplot &Gnuplot::set_legend(const std::string &position) +inline Gnuplot &Gnuplot::set_legend(const std::string &position) { std::ostringstream cmdstr; cmdstr << "set key " << position; @@ -1301,7 +1301,7 @@ Gnuplot &Gnuplot::set_legend(const std::string &position) // // turns on log scaling for the x axis // -Gnuplot &Gnuplot::set_xlogscale(const double base) +inline Gnuplot &Gnuplot::set_xlogscale(const double base) { std::ostringstream cmdstr; @@ -1316,7 +1316,7 @@ Gnuplot &Gnuplot::set_xlogscale(const double base) // // turns on log scaling for the y axis // -Gnuplot &Gnuplot::set_ylogscale(const double base) +inline Gnuplot &Gnuplot::set_ylogscale(const double base) { std::ostringstream cmdstr; @@ -1331,7 +1331,7 @@ Gnuplot &Gnuplot::set_ylogscale(const double base) // // turns on log scaling for the z axis // -Gnuplot &Gnuplot::set_zlogscale(const double base) +inline Gnuplot &Gnuplot::set_zlogscale(const double base) { std::ostringstream cmdstr; @@ -1346,7 +1346,7 @@ Gnuplot &Gnuplot::set_zlogscale(const double base) // // scales the size of the points used in plots // -Gnuplot &Gnuplot::set_pointsize(const double pointsize) +inline Gnuplot &Gnuplot::set_pointsize(const double pointsize) { std::ostringstream cmdstr; cmdstr << "set pointsize " << pointsize; @@ -1360,7 +1360,7 @@ Gnuplot &Gnuplot::set_pointsize(const double pointsize) // // set isoline density (grid) for plotting functions as surfaces // -Gnuplot &Gnuplot::set_samples(const int samples) +inline Gnuplot &Gnuplot::set_samples(const int samples) { std::ostringstream cmdstr; cmdstr << "set samples " << samples; @@ -1374,7 +1374,7 @@ Gnuplot &Gnuplot::set_samples(const int samples) // // set isoline density (grid) for plotting functions as surfaces // -Gnuplot &Gnuplot::set_isosamples(const int isolines) +inline Gnuplot &Gnuplot::set_isosamples(const int isolines) { std::ostringstream cmdstr; cmdstr << "set isosamples " << isolines; @@ -1388,7 +1388,7 @@ Gnuplot &Gnuplot::set_isosamples(const int isolines) // // enables contour drawing for surfaces set contour {base | surface | both} // -Gnuplot &Gnuplot::set_contour(const std::string &position) +inline Gnuplot &Gnuplot::set_contour(const std::string &position) { if (position.find("base") == std::string::npos && position.find("surface") == std::string::npos && @@ -1410,7 +1410,7 @@ Gnuplot &Gnuplot::set_contour(const std::string &position) // set labels // // set the xlabel -Gnuplot &Gnuplot::set_xlabel(const std::string &label) +inline Gnuplot &Gnuplot::set_xlabel(const std::string &label) { std::ostringstream cmdstr; @@ -1424,7 +1424,7 @@ Gnuplot &Gnuplot::set_xlabel(const std::string &label) //------------------------------------------------------------------------------ // set the ylabel // -Gnuplot &Gnuplot::set_ylabel(const std::string &label) +inline Gnuplot &Gnuplot::set_ylabel(const std::string &label) { std::ostringstream cmdstr; @@ -1438,7 +1438,7 @@ Gnuplot &Gnuplot::set_ylabel(const std::string &label) //------------------------------------------------------------------------------ // set the zlabel // -Gnuplot &Gnuplot::set_zlabel(const std::string &label) +inline Gnuplot &Gnuplot::set_zlabel(const std::string &label) { std::ostringstream cmdstr; @@ -1454,7 +1454,7 @@ Gnuplot &Gnuplot::set_zlabel(const std::string &label) // set range // // set the xrange -Gnuplot &Gnuplot::set_xrange(const double iFrom, +inline Gnuplot &Gnuplot::set_xrange(const double iFrom, const double iTo) { std::ostringstream cmdstr; @@ -1469,7 +1469,7 @@ Gnuplot &Gnuplot::set_xrange(const double iFrom, //------------------------------------------------------------------------------ // set the yrange // -Gnuplot &Gnuplot::set_yrange(const double iFrom, +inline Gnuplot &Gnuplot::set_yrange(const double iFrom, const double iTo) { std::ostringstream cmdstr; @@ -1484,7 +1484,7 @@ Gnuplot &Gnuplot::set_yrange(const double iFrom, //------------------------------------------------------------------------------ // set the zrange // -Gnuplot &Gnuplot::set_zrange(const double iFrom, +inline Gnuplot &Gnuplot::set_zrange(const double iFrom, const double iTo) { std::ostringstream cmdstr; @@ -1500,7 +1500,7 @@ Gnuplot &Gnuplot::set_zrange(const double iFrom, // // set the palette range // -Gnuplot &Gnuplot::set_cbrange(const double iFrom, +inline Gnuplot &Gnuplot::set_cbrange(const double iFrom, const double iTo) { std::ostringstream cmdstr; @@ -1517,7 +1517,7 @@ Gnuplot &Gnuplot::set_cbrange(const double iFrom, // Plots a linear equation y=ax+b (where you supply the // slope a and intercept b) // -Gnuplot &Gnuplot::plot_slope(const double a, +inline Gnuplot &Gnuplot::plot_slope(const double a, const double b, const std::string &title) { @@ -1560,7 +1560,7 @@ Gnuplot &Gnuplot::plot_slope(const double a, // // Plot an equation supplied as a std::string y=f(x) (only f(x) expected) // -Gnuplot &Gnuplot::plot_equation(const std::string &equation, +inline Gnuplot &Gnuplot::plot_equation(const std::string &equation, const std::string &title) { std::ostringstream cmdstr; @@ -1602,7 +1602,7 @@ Gnuplot &Gnuplot::plot_equation(const std::string &equation, // // plot an equation supplied as a std::string y=(x) // -Gnuplot &Gnuplot::plot_equation3d(const std::string &equation, +inline Gnuplot &Gnuplot::plot_equation3d(const std::string &equation, const std::string &title) { std::ostringstream cmdstr; @@ -1644,7 +1644,7 @@ Gnuplot &Gnuplot::plot_equation3d(const std::string &equation, // // Plots a 2d graph from a list of doubles (x) saved in a file // -Gnuplot &Gnuplot::plotfile_x(const std::string &filename, +inline Gnuplot &Gnuplot::plotfile_x(const std::string &filename, const unsigned int column, const std::string &title) { @@ -1699,7 +1699,7 @@ Gnuplot &Gnuplot::plotfile_x(const std::string &filename, // // Plots a 2d graph from a list of doubles (x y) saved in a file // -Gnuplot &Gnuplot::plotfile_xy(const std::string &filename, +inline Gnuplot &Gnuplot::plotfile_xy(const std::string &filename, const unsigned int column_x, const unsigned int column_y, const std::string &title, @@ -1756,7 +1756,7 @@ Gnuplot &Gnuplot::plotfile_xy(const std::string &filename, // // Plots a 2d graph with errorbars from a list of doubles (x y dy) in a file // -Gnuplot &Gnuplot::plotfile_xy_err(const std::string &filename, +inline Gnuplot &Gnuplot::plotfile_xy_err(const std::string &filename, const unsigned int column_x, const unsigned int column_y, const unsigned int column_dy, @@ -1806,7 +1806,7 @@ Gnuplot &Gnuplot::plotfile_xy_err(const std::string &filename, // // Plots a 3d graph from a list of doubles (x y z) saved in a file // -Gnuplot &Gnuplot::plotfile_xyz(const std::string &filename, +inline Gnuplot &Gnuplot::plotfile_xyz(const std::string &filename, const unsigned int column_x, const unsigned int column_y, const unsigned int column_z, @@ -1855,7 +1855,7 @@ Gnuplot &Gnuplot::plotfile_xyz(const std::string &filename, // /// * note that this function is not valid for versions of GNUPlot below 4.2 // -Gnuplot &Gnuplot::plot_image(const unsigned char *ucPicBuf, +inline Gnuplot &Gnuplot::plot_image(const unsigned char *ucPicBuf, const unsigned int iWidth, const unsigned int iHeight, const std::string &title) @@ -1914,7 +1914,7 @@ Gnuplot &Gnuplot::plot_image(const unsigned char *ucPicBuf, } -Gnuplot &Gnuplot::plot_circle(double east, double north, double radius, const std::string &label) +inline Gnuplot &Gnuplot::plot_circle(double east, double north, double radius, const std::string &label) { std::ostringstream cmdstr; // @@ -1952,7 +1952,7 @@ Gnuplot &Gnuplot::plot_circle(double east, double north, double radius, const st // // Sends a command to an active gnuplot session // -Gnuplot &Gnuplot::cmd(const std::string &cmdstr) +inline Gnuplot &Gnuplot::cmd(const std::string &cmdstr) { if (!(valid)) { @@ -1996,7 +1996,7 @@ Gnuplot &Gnuplot::cmd(const std::string &cmdstr) // // Opens up a gnuplot session, ready to receive commands // -void Gnuplot::init() +inline void Gnuplot::init() { // char * getenv ( const char * name ); get value of environment variable // Retrieves a C string containing the value of the environment variable @@ -2058,7 +2058,7 @@ void Gnuplot::init() // // Find out if a command lives in m_sGNUPlotPath or in PATH // -bool Gnuplot::get_program_path() +inline bool Gnuplot::get_program_path() { // // first look in m_sGNUPlotPath for Gnuplot @@ -2129,7 +2129,7 @@ bool Gnuplot::get_program_path() // // check if file exists // -bool Gnuplot::file_exists(const std::string &filename, int mode) +inline bool Gnuplot::file_exists(const std::string &filename, int mode) { if (mode < 0 || mode > 7) { @@ -2161,7 +2161,7 @@ bool Gnuplot::file_exists(const std::string &filename, int mode) } -bool Gnuplot::file_available(const std::string &filename) +inline bool Gnuplot::file_available(const std::string &filename) { std::ostringstream except; if (Gnuplot::file_exists(filename, 0)) // check existence @@ -2187,7 +2187,7 @@ bool Gnuplot::file_available(const std::string &filename) // // Opens a temporary file // -std::string Gnuplot::create_tmpfile(std::ofstream &tmp) +inline std::string Gnuplot::create_tmpfile(std::ofstream &tmp) { #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__) char name[] = "gnuplotiXXXXXX"; //tmp file in working directory @@ -2256,7 +2256,7 @@ std::string Gnuplot::create_tmpfile(std::ofstream &tmp) } -void Gnuplot::remove_tmpfiles() +inline void Gnuplot::remove_tmpfiles() { if (!(tmpfile_list).empty()) { diff --git a/src/tests/unit-tests/arithmetic/code_generation_test.cc b/src/tests/unit-tests/arithmetic/code_generation_test.cc index e252771af..60d4a7033 100644 --- a/src/tests/unit-tests/arithmetic/code_generation_test.cc +++ b/src/tests/unit-tests/arithmetic/code_generation_test.cc @@ -33,6 +33,12 @@ #include "gps_sdr_signal_processing.h" #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif TEST(CodeGenerationTest, CodeGenGPSL1Test) @@ -48,7 +54,7 @@ TEST(CodeGenerationTest, CodeGenGPSL1Test) for (int i = 0; i < iterations; i++) { - gps_l1_ca_code_gen_complex(_dest, _prn, _chip_shift); + gps_l1_ca_code_gen_complex(gsl::span>(_dest, 1023), _prn, _chip_shift); } end = std::chrono::system_clock::now(); @@ -77,7 +83,7 @@ TEST(CodeGenerationTest, CodeGenGPSL1SampledTest) for (int i = 0; i < iterations; i++) { - gps_l1_ca_code_gen_complex_sampled(_dest, _prn, _fs, _chip_shift); + gps_l1_ca_code_gen_complex_sampled(gsl::span>(_dest, _samplesPerCode), _prn, _fs, _chip_shift); } end = std::chrono::system_clock::now(); @@ -105,7 +111,7 @@ TEST(CodeGenerationTest, ComplexConjugateTest) for (int i = 0; i < iterations; i++) { - complex_exp_gen_conj(_dest, _f, _fs, _samplesPerCode); + complex_exp_gen_conj(gsl::span>(_dest, _samplesPerCode), _f, _fs); } end = std::chrono::system_clock::now(); diff --git a/src/tests/unit-tests/arithmetic/complex_carrier_test.cc b/src/tests/unit-tests/arithmetic/complex_carrier_test.cc index bd87a3da7..1dd943a7a 100644 --- a/src/tests/unit-tests/arithmetic/complex_carrier_test.cc +++ b/src/tests/unit-tests/arithmetic/complex_carrier_test.cc @@ -34,6 +34,12 @@ #include #include #include +#if HAS_SPAN +#include +namespace gsl = std; +#else +#include +#endif DEFINE_int32(size_carrier_test, 100000, "Size of the arrays used for complex carrier testing"); @@ -120,7 +126,7 @@ TEST(ComplexCarrierTest, OwnComplexImplementation) std::chrono::time_point start, end; start = std::chrono::system_clock::now(); - complex_exp_gen(output, _f, _fs, static_cast(FLAGS_size_carrier_test)); + complex_exp_gen(gsl::span>(output, static_cast(FLAGS_size_carrier_test)), _f, _fs); end = std::chrono::system_clock::now(); std::chrono::duration elapsed_seconds = end - start; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc index 01f424eb8..0ec417ee0 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc @@ -88,7 +88,7 @@ private: public: int rx_message; - ~GpsL1CaPcpsAcquisitionTest_msg_rx(); //!< Default destructor + ~GpsL1CaPcpsAcquisitionTest_msg_rx() override; //!< Default destructor }; @@ -139,7 +139,7 @@ protected: doppler_step = 100; } - ~GpsL1CaPcpsAcquisitionTest() = default; + ~GpsL1CaPcpsAcquisitionTest() override = default; void init(); void plot_grid(); diff --git a/src/tests/unit-tests/signal-processing-blocks/adapter/adapter_test.cc b/src/tests/unit-tests/signal-processing-blocks/adapter/adapter_test.cc index 89f2cd338..7c0677825 100644 --- a/src/tests/unit-tests/signal-processing-blocks/adapter/adapter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/adapter/adapter_test.cc @@ -51,7 +51,7 @@ class DataTypeAdapter : public ::testing::Test { public: DataTypeAdapter(); - ~DataTypeAdapter(); + ~DataTypeAdapter() override; int run_byte_to_short_block(); int run_ibyte_to_cbyte_block(); int run_ibyte_to_complex_block(); diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc index 42fb1496a..03d055fac 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc @@ -63,7 +63,7 @@ protected: item_size = sizeof(gr_complex); config = std::make_shared(); } - ~FirFilterTest() = default; + ~FirFilterTest() override = default; void init(); void configure_cbyte_cbyte(); diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc index a77e9d853..69c1dddf9 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc @@ -62,7 +62,7 @@ protected: config = std::make_shared(); nsamples = FLAGS_notch_filter_lite_test_nsamples; } - ~NotchFilterLiteTest() = default; + ~NotchFilterLiteTest() override = default; void init(); void configure_gr_complex_gr_complex(); diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc index 943ac2fe2..8fb783b5f 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc @@ -62,7 +62,7 @@ protected: config = std::make_shared(); nsamples = FLAGS_notch_filter_test_nsamples; } - ~NotchFilterTest() = default; + ~NotchFilterTest() override = default; void init(); void configure_gr_complex_gr_complex(); diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc index 83a63d551..d31b971fb 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc @@ -62,7 +62,7 @@ protected: config = std::make_shared(); nsamples = FLAGS_pb_filter_test_nsamples; } - ~PulseBlankingFilterTest() = default; + ~PulseBlankingFilterTest() override = default; void init(); void configure_gr_complex_gr_complex(); diff --git a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test_fpga.cc b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test_fpga.cc index 5d87e5133..96c0374a6 100644 --- a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test_fpga.cc +++ b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test_fpga.cc @@ -259,6 +259,7 @@ public: Gnss_Synchro gnss_synchro_master; std::vector gnss_synchro_vec; size_t item_size; + pthread_mutex_t mutex_obs_test = PTHREAD_MUTEX_INITIALIZER; }; int HybridObservablesTestFpga::configure_generator() @@ -305,11 +306,10 @@ int HybridObservablesTestFpga::generate_signal() } -const size_t TEST_OBS_PAGE_SIZE = 0x10000; -const unsigned int TEST_OBS_TEST_REGISTER_TRACK_WRITEVAL = 0x55AA; - void setup_fpga_switch_obs_test(void) { + const size_t TEST_OBS_PAGE_SIZE = 0x10000; + const unsigned int TEST_OBS_TEST_REGISTER_TRACK_WRITEVAL = 0x55AA; int switch_device_descriptor; // driver descriptor volatile unsigned* switch_map_base; // driver memory map @@ -348,7 +348,7 @@ void setup_fpga_switch_obs_test(void) } -static pthread_mutex_t mutex_obs_test = PTHREAD_MUTEX_INITIALIZER; +//static pthread_mutex_t mutex_obs_test = PTHREAD_MUTEX_INITIALIZER; volatile unsigned int send_samples_start_obs_test = 0; @@ -642,9 +642,9 @@ bool HybridObservablesTestFpga::acquire_signal() { std::cout << "ERROR cannot create DMA Process" << std::endl; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&mutex_obs_test); send_samples_start_obs_test = 1; - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&mutex_obs_test); pthread_join(thread_DMA, nullptr); send_samples_start_obs_test = 0; @@ -669,9 +669,9 @@ bool HybridObservablesTestFpga::acquire_signal() msg_rx->rx_message = 0; top_block->start(); - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&mutex_obs_test); send_samples_start_obs_test = 1; - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&mutex_obs_test); acquisition->reset(); // set active @@ -686,9 +686,9 @@ bool HybridObservablesTestFpga::acquire_signal() // wait for the child DMA process to finish pthread_join(thread_DMA, nullptr); - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&mutex_obs_test); send_samples_start_obs_test = 0; - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&mutex_obs_test); // the DMA sends the exact number of samples needed for the acquisition. // however because of the LPF in the GPS L1/Gal E1 acquisition, this calculation is approximate diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_real_codes_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_real_codes_test.cc index b4c5f432c..98cbc094d 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_real_codes_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_real_codes_test.cc @@ -106,7 +106,7 @@ TEST(CpuMulticorrelatorRealCodesTest, MeasureExecutionTime) //local code resampler on GPU // generate local reference (1 sample per chip) - gps_l1_ca_code_gen_float(d_ca_code, 1, 0); + gps_l1_ca_code_gen_float(gsl::span(d_ca_code, static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) * sizeof(float)), 1, 0); // generate inut signal std::random_device r; std::default_random_engine e1(r()); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_test.cc index 0f133db98..0f56dbab0 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_test.cc @@ -104,7 +104,7 @@ TEST(CpuMulticorrelatorTest, MeasureExecutionTime) //local code resampler on GPU // generate local reference (1 sample per chip) - gps_l1_ca_code_gen_complex(d_ca_code, 1, 0); + gps_l1_ca_code_gen_complex(gsl::span(d_ca_code, static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) * sizeof(gr_complex)), 1, 0); // generate inut signal std::random_device r; std::default_random_engine e1(r()); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc index 56e18df38..a0d42aeb2 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc @@ -39,8 +39,8 @@ class TransitionModel : public ModelFunction { public: - TransitionModel(const arma::mat& kf_F) { coeff_mat = kf_F; }; - virtual arma::vec operator()(const arma::vec& input) { return coeff_mat * input; }; + explicit TransitionModel(const arma::mat& kf_F) { coeff_mat = kf_F; }; + arma::vec operator()(const arma::vec& input) override { return coeff_mat * input; }; private: arma::mat coeff_mat; @@ -49,8 +49,8 @@ private: class MeasurementModel : public ModelFunction { public: - MeasurementModel(const arma::mat& kf_H) { coeff_mat = kf_H; }; - virtual arma::vec operator()(const arma::vec& input) { return coeff_mat * input; }; + explicit MeasurementModel(const arma::mat& kf_H) { coeff_mat = kf_H; }; + arma::vec operator()(const arma::vec& input) override { return coeff_mat * input; }; private: arma::mat coeff_mat; diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc index 897257b93..469ec2c27 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc @@ -64,7 +64,7 @@ protected: gnss_synchro = Gnss_Synchro(); } - ~GalileoE1DllPllVemlTrackingInternalTest() = default; + ~GalileoE1DllPllVemlTrackingInternalTest() override = default; void init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test_fpga.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test_fpga.cc index bf997d7b4..d82fcd3cd 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test_fpga.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test_fpga.cc @@ -248,6 +248,7 @@ public: std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; + pthread_mutex_t the_mutex = PTHREAD_MUTEX_INITIALIZER; }; @@ -386,12 +387,10 @@ void TrackingPullInTestFpga::configure_receiver( } -const size_t PAGE_SIZE = 0x10000; -const unsigned int TEST_REGISTER_TRACK_WRITEVAL = 0x55AA; - - void setup_fpga_switch(void) { + const size_t PAGE_SIZE_ = 0x10000; + const unsigned int TEST_REGISTER_TRACK_WRITEVAL = 0x55AA; int switch_device_descriptor; // driver descriptor volatile unsigned* switch_map_base; // driver memory map @@ -400,7 +399,7 @@ void setup_fpga_switch(void) LOG(WARNING) << "Cannot open deviceio" << "/dev/uio1"; } - switch_map_base = reinterpret_cast(mmap(nullptr, PAGE_SIZE, + switch_map_base = reinterpret_cast(mmap(nullptr, PAGE_SIZE_, PROT_READ | PROT_WRITE, MAP_SHARED, switch_device_descriptor, 0)); if (switch_map_base == reinterpret_cast(-1)) @@ -430,7 +429,7 @@ void setup_fpga_switch(void) } -static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; +//static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; volatile unsigned int send_samples_start = 0; @@ -728,9 +727,9 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID) { std::cout << "ERROR cannot create DMA Process" << std::endl; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&the_mutex); send_samples_start = 1; - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&the_mutex); pthread_join(thread_DMA, nullptr); send_samples_start = 0; @@ -753,9 +752,9 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID) msg_rx->rx_message = 0; top_block->start(); - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&the_mutex); send_samples_start = 1; - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&the_mutex); acquisition->reset(); // set active @@ -770,9 +769,9 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID) // wait for the child DMA process to finish pthread_join(thread_DMA, nullptr); - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&the_mutex); send_samples_start = 0; - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&the_mutex); // the DMA sends the exact number of samples needed for the acquisition. // however because of the LPF in the GPS L1/Gal E1 acquisition, this calculation is approximate @@ -1063,9 +1062,9 @@ TEST_F(TrackingPullInTestFpga, ValidationOfResults) tracking->start_tracking(); - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&the_mutex); send_samples_start = 1; - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&the_mutex); top_block->start(); @@ -1077,9 +1076,9 @@ TEST_F(TrackingPullInTestFpga, ValidationOfResults) // reset the HW to launch the pending interrupts acquisition->stop_acquisition(); - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&the_mutex); send_samples_start = 0; - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&the_mutex); pull_in_results_v.push_back(msg_rx->rx_message != 3); //save last asynchronous tracking message in order to detect a loss of lock diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/unscented_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/unscented_filter_test.cc index eaef07845..61ae638d0 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/unscented_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/unscented_filter_test.cc @@ -39,8 +39,8 @@ class TransitionModelUKF : public ModelFunction { public: - TransitionModelUKF(const arma::mat& kf_F) { coeff_mat = kf_F; }; - virtual arma::vec operator()(const arma::vec& input) { return coeff_mat * input; }; + explicit TransitionModelUKF(const arma::mat& kf_F) { coeff_mat = kf_F; }; + arma::vec operator()(const arma::vec& input) override { return coeff_mat * input; }; private: arma::mat coeff_mat; @@ -49,8 +49,8 @@ private: class MeasurementModelUKF : public ModelFunction { public: - MeasurementModelUKF(const arma::mat& kf_H) { coeff_mat = kf_H; }; - virtual arma::vec operator()(const arma::vec& input) { return coeff_mat * input; }; + explicit MeasurementModelUKF(const arma::mat& kf_H) { coeff_mat = kf_H; }; + arma::vec operator()(const arma::vec& input) override { return coeff_mat * input; }; private: arma::mat coeff_mat; diff --git a/src/utils/front-end-cal/main.cc b/src/utils/front-end-cal/main.cc index 83b664362..54723dfc5 100644 --- a/src/utils/front-end-cal/main.cc +++ b/src/utils/front-end-cal/main.cc @@ -122,7 +122,7 @@ private: public: int rx_message; - ~FrontEndCal_msg_rx(); //!< Default destructor + ~FrontEndCal_msg_rx() override; //!< Default destructor };