mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-12-15 12:40:35 +00:00
Merge branch 'next' of https://github.com/gnss-sdr/gnss-sdr into next
This commit is contained in:
commit
ae386b5aa9
@ -147,15 +147,10 @@ private:
|
|||||||
gr::blocks::stream_to_vector::sptr stream_to_vector_;
|
gr::blocks::stream_to_vector::sptr stream_to_vector_;
|
||||||
gr::blocks::float_to_complex::sptr float_to_complex_;
|
gr::blocks::float_to_complex::sptr float_to_complex_;
|
||||||
complex_byte_to_float_x2_sptr cbyte_to_float_x2_;
|
complex_byte_to_float_x2_sptr cbyte_to_float_x2_;
|
||||||
bool bit_transition_flag_;
|
|
||||||
bool use_CFAR_algorithm_flag_;
|
|
||||||
bool acquire_pilot_;
|
bool acquire_pilot_;
|
||||||
uint32_t channel_;
|
uint32_t channel_;
|
||||||
uint32_t doppler_max_;
|
uint32_t doppler_max_;
|
||||||
uint32_t doppler_step_;
|
uint32_t doppler_step_;
|
||||||
uint32_t max_dwells_;
|
|
||||||
bool dump_;
|
|
||||||
bool blocking_;
|
|
||||||
std::string dump_filename_;
|
std::string dump_filename_;
|
||||||
Gnss_Synchro* gnss_synchro_;
|
Gnss_Synchro* gnss_synchro_;
|
||||||
std::string role_;
|
std::string role_;
|
||||||
|
@ -67,7 +67,7 @@ public:
|
|||||||
|
|
||||||
inline size_t item_size() override
|
inline size_t item_size() override
|
||||||
{
|
{
|
||||||
return item_size_;
|
return sizeof(int);
|
||||||
}
|
}
|
||||||
|
|
||||||
void connect(gr::top_block_sptr top_block) override;
|
void connect(gr::top_block_sptr top_block) override;
|
||||||
@ -150,35 +150,19 @@ private:
|
|||||||
pcps_acquisition_fpga_sptr acquisition_fpga_;
|
pcps_acquisition_fpga_sptr acquisition_fpga_;
|
||||||
gr::blocks::stream_to_vector::sptr stream_to_vector_;
|
gr::blocks::stream_to_vector::sptr stream_to_vector_;
|
||||||
|
|
||||||
size_t item_size_;
|
|
||||||
|
|
||||||
std::string item_type_;
|
std::string item_type_;
|
||||||
std::string dump_filename_;
|
std::string dump_filename_;
|
||||||
std::string role_;
|
std::string role_;
|
||||||
|
|
||||||
bool bit_transition_flag_;
|
|
||||||
bool dump_;
|
|
||||||
bool acq_pilot_;
|
bool acq_pilot_;
|
||||||
bool use_CFAR_;
|
|
||||||
bool blocking_;
|
|
||||||
bool acq_iq_;
|
bool acq_iq_;
|
||||||
|
|
||||||
uint32_t vector_length_;
|
|
||||||
uint32_t code_length_;
|
|
||||||
uint32_t channel_;
|
uint32_t channel_;
|
||||||
uint32_t doppler_max_;
|
uint32_t doppler_max_;
|
||||||
uint32_t doppler_step_;
|
uint32_t doppler_step_;
|
||||||
uint32_t sampled_ms_;
|
|
||||||
uint32_t max_dwells_;
|
|
||||||
unsigned int in_streams_;
|
unsigned int in_streams_;
|
||||||
unsigned int out_streams_;
|
unsigned int out_streams_;
|
||||||
|
|
||||||
int64_t fs_in_;
|
|
||||||
|
|
||||||
float threshold_;
|
|
||||||
|
|
||||||
gr_complex* code_;
|
|
||||||
|
|
||||||
Gnss_Synchro* gnss_synchro_;
|
Gnss_Synchro* gnss_synchro_;
|
||||||
|
|
||||||
lv_16sc_t* d_all_fft_codes_; // memory that contains all the code ffts
|
lv_16sc_t* d_all_fft_codes_; // memory that contains all the code ffts
|
||||||
|
@ -146,7 +146,6 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga(
|
|||||||
|
|
||||||
GpsL2MPcpsAcquisitionFpga::~GpsL2MPcpsAcquisitionFpga()
|
GpsL2MPcpsAcquisitionFpga::~GpsL2MPcpsAcquisitionFpga()
|
||||||
{
|
{
|
||||||
//delete[] code_;
|
|
||||||
delete[] d_all_fft_codes_;
|
delete[] d_all_fft_codes_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,9 +211,6 @@ void GpsL2MPcpsAcquisitionFpga::init()
|
|||||||
|
|
||||||
void GpsL2MPcpsAcquisitionFpga::set_local_code()
|
void GpsL2MPcpsAcquisitionFpga::set_local_code()
|
||||||
{
|
{
|
||||||
//gps_l2c_m_code_gen_complex_sampled(code_, gnss_synchro_->PRN, fs_in_);
|
|
||||||
|
|
||||||
//acquisition_fpga_->set_local_code(code_);
|
|
||||||
acquisition_fpga_->set_local_code();
|
acquisition_fpga_->set_local_code();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ public:
|
|||||||
|
|
||||||
inline size_t item_size() override
|
inline size_t item_size() override
|
||||||
{
|
{
|
||||||
return item_size_;
|
return sizeof(int);
|
||||||
}
|
}
|
||||||
|
|
||||||
void connect(gr::top_block_sptr top_block) override;
|
void connect(gr::top_block_sptr top_block) override;
|
||||||
@ -149,23 +149,13 @@ private:
|
|||||||
gr::blocks::stream_to_vector::sptr stream_to_vector_;
|
gr::blocks::stream_to_vector::sptr stream_to_vector_;
|
||||||
gr::blocks::float_to_complex::sptr float_to_complex_;
|
gr::blocks::float_to_complex::sptr float_to_complex_;
|
||||||
complex_byte_to_float_x2_sptr cbyte_to_float_x2_;
|
complex_byte_to_float_x2_sptr cbyte_to_float_x2_;
|
||||||
size_t item_size_;
|
|
||||||
std::string item_type_;
|
std::string item_type_;
|
||||||
unsigned int vector_length_;
|
|
||||||
unsigned int code_length_;
|
|
||||||
bool bit_transition_flag_;
|
|
||||||
bool use_CFAR_algorithm_flag_;
|
|
||||||
unsigned int channel_;
|
unsigned int channel_;
|
||||||
float threshold_;
|
float threshold_;
|
||||||
unsigned int doppler_max_;
|
unsigned int doppler_max_;
|
||||||
unsigned int doppler_step_;
|
unsigned int doppler_step_;
|
||||||
unsigned int max_dwells_;
|
|
||||||
int64_t fs_in_;
|
int64_t fs_in_;
|
||||||
//long if_;
|
|
||||||
bool dump_;
|
|
||||||
bool blocking_;
|
|
||||||
std::string dump_filename_;
|
std::string dump_filename_;
|
||||||
std::complex<float>* code_;
|
|
||||||
Gnss_Synchro* gnss_synchro_;
|
Gnss_Synchro* gnss_synchro_;
|
||||||
std::string role_;
|
std::string role_;
|
||||||
unsigned int in_streams_;
|
unsigned int in_streams_;
|
||||||
|
@ -76,7 +76,7 @@ public:
|
|||||||
|
|
||||||
inline size_t item_size() override
|
inline size_t item_size() override
|
||||||
{
|
{
|
||||||
return item_size_;
|
return sizeof(int);
|
||||||
}
|
}
|
||||||
|
|
||||||
void connect(gr::top_block_sptr top_block) override;
|
void connect(gr::top_block_sptr top_block) override;
|
||||||
@ -149,22 +149,11 @@ private:
|
|||||||
gr::blocks::stream_to_vector::sptr stream_to_vector_;
|
gr::blocks::stream_to_vector::sptr stream_to_vector_;
|
||||||
gr::blocks::float_to_complex::sptr float_to_complex_;
|
gr::blocks::float_to_complex::sptr float_to_complex_;
|
||||||
complex_byte_to_float_x2_sptr cbyte_to_float_x2_;
|
complex_byte_to_float_x2_sptr cbyte_to_float_x2_;
|
||||||
size_t item_size_;
|
|
||||||
std::string item_type_;
|
std::string item_type_;
|
||||||
uint32_t vector_length_;
|
|
||||||
uint32_t code_length_;
|
|
||||||
bool bit_transition_flag_;
|
|
||||||
bool use_CFAR_algorithm_flag_;
|
|
||||||
uint32_t channel_;
|
uint32_t channel_;
|
||||||
float threshold_;
|
|
||||||
uint32_t doppler_max_;
|
uint32_t doppler_max_;
|
||||||
uint32_t doppler_step_;
|
uint32_t doppler_step_;
|
||||||
uint32_t max_dwells_;
|
|
||||||
int64_t fs_in_;
|
|
||||||
bool dump_;
|
|
||||||
bool blocking_;
|
|
||||||
std::string dump_filename_;
|
std::string dump_filename_;
|
||||||
std::complex<float>* code_;
|
|
||||||
Gnss_Synchro* gnss_synchro_;
|
Gnss_Synchro* gnss_synchro_;
|
||||||
std::string role_;
|
std::string role_;
|
||||||
unsigned int in_streams_;
|
unsigned int in_streams_;
|
||||||
|
@ -62,6 +62,18 @@
|
|||||||
#define SELECT_ALL_CODE_BITS 0x000FFFFF // Select a 20 bit word
|
#define SELECT_ALL_CODE_BITS 0x000FFFFF // Select a 20 bit word
|
||||||
#define SHL_CODE_BITS 1024 // shift left by 10 bits
|
#define SHL_CODE_BITS 1024 // shift left by 10 bits
|
||||||
|
|
||||||
|
#ifndef TEMP_FAILURE_RETRY
|
||||||
|
#define TEMP_FAILURE_RETRY(exp) \
|
||||||
|
({ \
|
||||||
|
decltype(exp) _rc; \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
_rc = (exp); \
|
||||||
|
} \
|
||||||
|
while (_rc == -1 && errno == EINTR); \
|
||||||
|
_rc; \
|
||||||
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
bool Fpga_Acquisition::init()
|
bool Fpga_Acquisition::init()
|
||||||
{
|
{
|
||||||
|
@ -40,8 +40,23 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <sys/mman.h> // libraries used by the GIPO
|
#include <sys/mman.h> // libraries used by the GIPO
|
||||||
|
|
||||||
|
using google::LogMessage;
|
||||||
|
|
||||||
#define PAGE_SIZE 0x10000 // default page size for the multicorrelator memory map
|
#define PAGE_SIZE 0x10000 // default page size for the multicorrelator memory map
|
||||||
#define TEST_REG_SANITY_CHECK 0x55AA // value to check the presence of the test register (to detect the hw)
|
#define TEST_REG_SANITY_CHECK 0x55AA // value to check the presence of the test register (to detect the hw)
|
||||||
|
#ifndef TEMP_FAILURE_RETRY
|
||||||
|
#define TEMP_FAILURE_RETRY(exp) \
|
||||||
|
({ \
|
||||||
|
decltype(exp) _rc; \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
_rc = (exp); \
|
||||||
|
} \
|
||||||
|
while (_rc == -1 && errno == EINTR); \
|
||||||
|
_rc; \
|
||||||
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
gnss_sdr_fpga_sample_counter::gnss_sdr_fpga_sample_counter(
|
gnss_sdr_fpga_sample_counter::gnss_sdr_fpga_sample_counter(
|
||||||
double _fs,
|
double _fs,
|
||||||
@ -59,7 +74,7 @@ gnss_sdr_fpga_sample_counter::gnss_sdr_fpga_sample_counter(
|
|||||||
//The hardware timer must keep always interrupting the PS. It must not wait for the interrupt to
|
//The hardware timer must keep always interrupting the PS. It must not wait for the interrupt to
|
||||||
//be served.
|
//be served.
|
||||||
open_device();
|
open_device();
|
||||||
|
is_open = true;
|
||||||
sample_counter = 0ULL;
|
sample_counter = 0ULL;
|
||||||
current_T_rx_ms = 0;
|
current_T_rx_ms = 0;
|
||||||
current_s = 0;
|
current_s = 0;
|
||||||
@ -81,6 +96,15 @@ gnss_sdr_fpga_sample_counter_sptr gnss_sdr_make_fpga_sample_counter(double _fs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
gnss_sdr_fpga_sample_counter::~gnss_sdr_fpga_sample_counter()
|
||||||
|
{
|
||||||
|
if (is_open)
|
||||||
|
{
|
||||||
|
close_device();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Called by gnuradio to enable drivers, etc for i/o devices.
|
// Called by gnuradio to enable drivers, etc for i/o devices.
|
||||||
bool gnss_sdr_fpga_sample_counter::start()
|
bool gnss_sdr_fpga_sample_counter::start()
|
||||||
{
|
{
|
||||||
@ -100,102 +124,11 @@ bool gnss_sdr_fpga_sample_counter::stop()
|
|||||||
//todo: place here the routines to stop the associated hardware (if needed).This function will be called by GNURadio at every stop of the flowgraph.
|
//todo: place here the routines to stop the associated hardware (if needed).This function will be called by GNURadio at every stop of the flowgraph.
|
||||||
// return true if everything is ok.
|
// return true if everything is ok.
|
||||||
close_device();
|
close_device();
|
||||||
|
is_open = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int gnss_sdr_fpga_sample_counter::general_work(int noutput_items __attribute__((unused)),
|
|
||||||
__attribute__((unused)) gr_vector_int &ninput_items,
|
|
||||||
__attribute__((unused)) gr_vector_const_void_star &input_items,
|
|
||||||
gr_vector_void_star &output_items)
|
|
||||||
{
|
|
||||||
//todo: Call here a function that waits for an interrupt. Do not open a thread,
|
|
||||||
//it must be a simple call to a BLOCKING function.
|
|
||||||
// The function will return the actual absolute sample count of the internal counter of the timmer.
|
|
||||||
// store the sample count in class member sample_counter
|
|
||||||
// Possible problem: what happen if the PS is overloaded and gnuradio does not call this function
|
|
||||||
// with the sufficient rate to catch all the interrupts in the counter. To be evaluated later.
|
|
||||||
|
|
||||||
uint32_t counter = wait_for_interrupt_and_read_counter();
|
|
||||||
uint64_t samples_passed = 2 * static_cast<uint64_t>(samples_per_output) - static_cast<uint64_t>(counter); // ellapsed samples
|
|
||||||
// Note: at this moment the sample counter is implemented as a sample counter that decreases to zero and then it is automatically
|
|
||||||
// reloaded again and keeps counter. It is done in this way to minimize the logic in the FPGA and maximize the FPGA clock performance
|
|
||||||
// (it takes less resources and latency in the FPGA to compare a number against a fixed value like zero than to compare it to a programmable
|
|
||||||
// variable number).
|
|
||||||
|
|
||||||
sample_counter = sample_counter + samples_passed; //samples_per_output;
|
|
||||||
auto *out = reinterpret_cast<Gnss_Synchro *>(output_items[0]);
|
|
||||||
out[0] = Gnss_Synchro();
|
|
||||||
out[0].Flag_valid_symbol_output = false;
|
|
||||||
out[0].Flag_valid_word = false;
|
|
||||||
out[0].Channel_ID = -1;
|
|
||||||
out[0].fs = fs;
|
|
||||||
if ((current_T_rx_ms % report_interval_ms) == 0)
|
|
||||||
{
|
|
||||||
current_s++;
|
|
||||||
if ((current_s % 60) == 0)
|
|
||||||
{
|
|
||||||
current_s = 0;
|
|
||||||
current_m++;
|
|
||||||
flag_m = true;
|
|
||||||
if ((current_m % 60) == 0)
|
|
||||||
{
|
|
||||||
current_m = 0;
|
|
||||||
current_h++;
|
|
||||||
flag_h = true;
|
|
||||||
if ((current_h % 24) == 0)
|
|
||||||
{
|
|
||||||
current_h = 0;
|
|
||||||
current_days++;
|
|
||||||
flag_days = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flag_days)
|
|
||||||
{
|
|
||||||
std::string day;
|
|
||||||
if (current_days == 1)
|
|
||||||
{
|
|
||||||
day = " day ";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
day = " days ";
|
|
||||||
}
|
|
||||||
std::cout << "Current receiver time: " << current_days << day << current_h << " h " << current_m << " min " << current_s << " s" << std::endl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (flag_h)
|
|
||||||
{
|
|
||||||
std::cout << "Current receiver time: " << current_h << " h " << current_m << " min " << current_s << " s" << std::endl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (flag_m)
|
|
||||||
{
|
|
||||||
std::cout << "Current receiver time: " << current_m << " min " << current_s << " s" << std::endl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::cout << "Current receiver time: " << current_s << " s" << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (flag_enable_send_msg)
|
|
||||||
{
|
|
||||||
message_port_pub(pmt::mp("receiver_time"), pmt::from_double(static_cast<double>(current_T_rx_ms) / 1000.0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out[0].Tracking_sample_counter = sample_counter;
|
|
||||||
//current_T_rx_ms = (sample_counter * 1000) / samples_per_output;
|
|
||||||
current_T_rx_ms = interval_ms * (sample_counter) / samples_per_output;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t gnss_sdr_fpga_sample_counter::test_register(uint32_t writeval)
|
uint32_t gnss_sdr_fpga_sample_counter::test_register(uint32_t writeval)
|
||||||
{
|
{
|
||||||
uint32_t readval;
|
uint32_t readval;
|
||||||
@ -290,3 +223,94 @@ uint32_t gnss_sdr_fpga_sample_counter::wait_for_interrupt_and_read_counter()
|
|||||||
counter = samples_per_output; //map_base[0];
|
counter = samples_per_output; //map_base[0];
|
||||||
return counter;
|
return counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int gnss_sdr_fpga_sample_counter::general_work(int noutput_items __attribute__((unused)),
|
||||||
|
__attribute__((unused)) gr_vector_int &ninput_items,
|
||||||
|
__attribute__((unused)) gr_vector_const_void_star &input_items,
|
||||||
|
gr_vector_void_star &output_items)
|
||||||
|
{
|
||||||
|
//todo: Call here a function that waits for an interrupt. Do not open a thread,
|
||||||
|
//it must be a simple call to a BLOCKING function.
|
||||||
|
// The function will return the actual absolute sample count of the internal counter of the timmer.
|
||||||
|
// store the sample count in class member sample_counter
|
||||||
|
// Possible problem: what happen if the PS is overloaded and gnuradio does not call this function
|
||||||
|
// with the sufficient rate to catch all the interrupts in the counter. To be evaluated later.
|
||||||
|
|
||||||
|
uint32_t counter = wait_for_interrupt_and_read_counter();
|
||||||
|
uint64_t samples_passed = 2 * static_cast<uint64_t>(samples_per_output) - static_cast<uint64_t>(counter); // ellapsed samples
|
||||||
|
// Note: at this moment the sample counter is implemented as a sample counter that decreases to zero and then it is automatically
|
||||||
|
// reloaded again and keeps counter. It is done in this way to minimize the logic in the FPGA and maximize the FPGA clock performance
|
||||||
|
// (it takes less resources and latency in the FPGA to compare a number against a fixed value like zero than to compare it to a programmable
|
||||||
|
// variable number).
|
||||||
|
|
||||||
|
sample_counter = sample_counter + samples_passed; //samples_per_output;
|
||||||
|
auto *out = reinterpret_cast<Gnss_Synchro *>(output_items[0]);
|
||||||
|
out[0] = Gnss_Synchro();
|
||||||
|
out[0].Flag_valid_symbol_output = false;
|
||||||
|
out[0].Flag_valid_word = false;
|
||||||
|
out[0].Channel_ID = -1;
|
||||||
|
out[0].fs = fs;
|
||||||
|
if ((current_T_rx_ms % report_interval_ms) == 0)
|
||||||
|
{
|
||||||
|
current_s++;
|
||||||
|
if ((current_s % 60) == 0)
|
||||||
|
{
|
||||||
|
current_s = 0;
|
||||||
|
current_m++;
|
||||||
|
flag_m = true;
|
||||||
|
if ((current_m % 60) == 0)
|
||||||
|
{
|
||||||
|
current_m = 0;
|
||||||
|
current_h++;
|
||||||
|
flag_h = true;
|
||||||
|
if ((current_h % 24) == 0)
|
||||||
|
{
|
||||||
|
current_h = 0;
|
||||||
|
current_days++;
|
||||||
|
flag_days = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flag_days)
|
||||||
|
{
|
||||||
|
std::string day;
|
||||||
|
if (current_days == 1)
|
||||||
|
{
|
||||||
|
day = " day ";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
day = " days ";
|
||||||
|
}
|
||||||
|
std::cout << "Current receiver time: " << current_days << day << current_h << " h " << current_m << " min " << current_s << " s" << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (flag_h)
|
||||||
|
{
|
||||||
|
std::cout << "Current receiver time: " << current_h << " h " << current_m << " min " << current_s << " s" << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (flag_m)
|
||||||
|
{
|
||||||
|
std::cout << "Current receiver time: " << current_m << " min " << current_s << " s" << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Current receiver time: " << current_s << " s" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (flag_enable_send_msg)
|
||||||
|
{
|
||||||
|
message_port_pub(pmt::mp("receiver_time"), pmt::from_double(static_cast<double>(current_T_rx_ms) / 1000.0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out[0].Tracking_sample_counter = sample_counter;
|
||||||
|
//current_T_rx_ms = (sample_counter * 1000) / samples_per_output;
|
||||||
|
current_T_rx_ms = interval_ms * (sample_counter) / samples_per_output;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
@ -72,9 +72,11 @@ private:
|
|||||||
int32_t fd; // driver descriptor
|
int32_t fd; // driver descriptor
|
||||||
volatile uint32_t *map_base; // driver memory map
|
volatile uint32_t *map_base; // driver memory map
|
||||||
std::string device_name = "/dev/uio2"; // HW device name
|
std::string device_name = "/dev/uio2"; // HW device name
|
||||||
|
bool is_open;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
friend gnss_sdr_fpga_sample_counter_sptr gnss_sdr_make_fpga_sample_counter(double _fs, int32_t _interval_ms);
|
friend gnss_sdr_fpga_sample_counter_sptr gnss_sdr_make_fpga_sample_counter(double _fs, int32_t _interval_ms);
|
||||||
|
~gnss_sdr_fpga_sample_counter();
|
||||||
int general_work(int noutput_items,
|
int general_work(int noutput_items,
|
||||||
gr_vector_int &ninput_items,
|
gr_vector_int &ninput_items,
|
||||||
gr_vector_const_void_star &input_items,
|
gr_vector_const_void_star &input_items,
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
* \brief Adapts a DLL+PLL VEML (Very Early Minus Late) tracking loop block
|
* \brief Adapts a DLL+PLL VEML (Very Early Minus Late) tracking loop block
|
||||||
* to a TrackingInterface for Galileo E1 signals for the FPGA
|
* to a TrackingInterface for Galileo E1 signals for the FPGA
|
||||||
* \author Marc Majoral, 2019. mmajoral(at)cttc.cat
|
* \author Marc Majoral, 2019. mmajoral(at)cttc.cat
|
||||||
* \author Luis Esteve, 2012. luis(at)epsilon-formacion.com
|
|
||||||
*
|
*
|
||||||
* Code DLL + carrier PLL according to the algorithms described in:
|
* Code DLL + carrier PLL according to the algorithms described in:
|
||||||
* K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen,
|
* K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen,
|
||||||
@ -45,10 +44,6 @@
|
|||||||
|
|
||||||
using google::LogMessage;
|
using google::LogMessage;
|
||||||
|
|
||||||
void GalileoE1DllPllVemlTrackingFpga::stop_tracking()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga(
|
GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga(
|
||||||
ConfigurationInterface* configuration, const std::string& role,
|
ConfigurationInterface* configuration, const std::string& role,
|
||||||
unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams)
|
unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams)
|
||||||
@ -136,6 +131,7 @@ GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga(
|
|||||||
d_ca_codes = static_cast<int32_t*>(volk_gnsssdr_malloc(static_cast<int32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip * GALILEO_E1_NUMBER_OF_CODES * sizeof(int32_t), volk_gnsssdr_get_alignment()));
|
d_ca_codes = static_cast<int32_t*>(volk_gnsssdr_malloc(static_cast<int32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip * GALILEO_E1_NUMBER_OF_CODES * sizeof(int32_t), volk_gnsssdr_get_alignment()));
|
||||||
float* ca_codes_f;
|
float* ca_codes_f;
|
||||||
float* data_codes_f = nullptr;
|
float* data_codes_f = nullptr;
|
||||||
|
d_data_codes = nullptr;
|
||||||
|
|
||||||
if (d_track_pilot)
|
if (d_track_pilot)
|
||||||
{
|
{
|
||||||
@ -200,6 +196,11 @@ GalileoE1DllPllVemlTrackingFpga::~GalileoE1DllPllVemlTrackingFpga()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GalileoE1DllPllVemlTrackingFpga::stop_tracking()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void GalileoE1DllPllVemlTrackingFpga::start_tracking()
|
void GalileoE1DllPllVemlTrackingFpga::start_tracking()
|
||||||
{
|
{
|
||||||
tracking_fpga_sc->start_tracking();
|
tracking_fpga_sc->start_tracking();
|
||||||
|
@ -71,7 +71,7 @@ public:
|
|||||||
|
|
||||||
inline size_t item_size() override
|
inline size_t item_size() override
|
||||||
{
|
{
|
||||||
return item_size_;
|
return sizeof(int);
|
||||||
}
|
}
|
||||||
|
|
||||||
void connect(gr::top_block_sptr top_block) override;
|
void connect(gr::top_block_sptr top_block) override;
|
||||||
@ -101,7 +101,6 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
dll_pll_veml_tracking_fpga_sptr tracking_fpga_sc;
|
dll_pll_veml_tracking_fpga_sptr tracking_fpga_sc;
|
||||||
size_t item_size_;
|
|
||||||
uint32_t channel_;
|
uint32_t channel_;
|
||||||
std::string role_;
|
std::string role_;
|
||||||
uint32_t in_streams_;
|
uint32_t in_streams_;
|
||||||
|
@ -114,6 +114,7 @@ GalileoE5aDllPllTrackingFpga::GalileoE5aDllPllTrackingFpga(
|
|||||||
double carrier_lock_th = configuration->property(role + ".carrier_lock_th", 0.85);
|
double carrier_lock_th = configuration->property(role + ".carrier_lock_th", 0.85);
|
||||||
if (FLAGS_carrier_lock_th != 0.85) carrier_lock_th = FLAGS_carrier_lock_th;
|
if (FLAGS_carrier_lock_th != 0.85) carrier_lock_th = FLAGS_carrier_lock_th;
|
||||||
trk_param_fpga.carrier_lock_th = carrier_lock_th;
|
trk_param_fpga.carrier_lock_th = carrier_lock_th;
|
||||||
|
d_data_codes = nullptr;
|
||||||
|
|
||||||
// FPGA configuration parameters
|
// FPGA configuration parameters
|
||||||
std::string default_device_name = "/dev/uio";
|
std::string default_device_name = "/dev/uio";
|
||||||
@ -136,7 +137,6 @@ GalileoE5aDllPllTrackingFpga::GalileoE5aDllPllTrackingFpga(
|
|||||||
d_data_codes = static_cast<int32_t *>(volk_gnsssdr_malloc((static_cast<uint32_t>(code_length_chips)) * code_samples_per_chip * GALILEO_E5A_NUMBER_OF_CODES * sizeof(int32_t), volk_gnsssdr_get_alignment()));
|
d_data_codes = static_cast<int32_t *>(volk_gnsssdr_malloc((static_cast<uint32_t>(code_length_chips)) * code_samples_per_chip * GALILEO_E5A_NUMBER_OF_CODES * sizeof(int32_t), volk_gnsssdr_get_alignment()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (uint32_t PRN = 1; PRN <= GALILEO_E5A_NUMBER_OF_CODES; PRN++)
|
for (uint32_t PRN = 1; PRN <= GALILEO_E5A_NUMBER_OF_CODES; PRN++)
|
||||||
{
|
{
|
||||||
galileo_e5_a_code_gen_complex_primary(aux_code, PRN, const_cast<char *>(sig_));
|
galileo_e5_a_code_gen_complex_primary(aux_code, PRN, const_cast<char *>(sig_));
|
||||||
|
@ -70,7 +70,7 @@ public:
|
|||||||
|
|
||||||
inline size_t item_size() override
|
inline size_t item_size() override
|
||||||
{
|
{
|
||||||
return item_size_;
|
return sizeof(int)
|
||||||
}
|
}
|
||||||
|
|
||||||
void connect(gr::top_block_sptr top_block) override;
|
void connect(gr::top_block_sptr top_block) override;
|
||||||
@ -98,7 +98,6 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
dll_pll_veml_tracking_fpga_sptr tracking_fpga_sc;
|
dll_pll_veml_tracking_fpga_sptr tracking_fpga_sc;
|
||||||
size_t item_size_;
|
|
||||||
uint32_t channel_;
|
uint32_t channel_;
|
||||||
std::string role_;
|
std::string role_;
|
||||||
uint32_t in_streams_;
|
uint32_t in_streams_;
|
||||||
|
@ -70,7 +70,7 @@ public:
|
|||||||
|
|
||||||
inline size_t item_size() override
|
inline size_t item_size() override
|
||||||
{
|
{
|
||||||
return item_size_;
|
return sizeof(int);
|
||||||
}
|
}
|
||||||
|
|
||||||
void connect(gr::top_block_sptr top_block) override;
|
void connect(gr::top_block_sptr top_block) override;
|
||||||
@ -97,7 +97,6 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
dll_pll_veml_tracking_fpga_sptr tracking_fpga_sc;
|
dll_pll_veml_tracking_fpga_sptr tracking_fpga_sc;
|
||||||
size_t item_size_;
|
|
||||||
uint32_t channel_;
|
uint32_t channel_;
|
||||||
std::string role_;
|
std::string role_;
|
||||||
uint32_t in_streams_;
|
uint32_t in_streams_;
|
||||||
|
@ -66,6 +66,18 @@
|
|||||||
#define LOCAL_CODE_FPGA_ENABLE_WRITE_MEMORY 0x0C000000
|
#define LOCAL_CODE_FPGA_ENABLE_WRITE_MEMORY 0x0C000000
|
||||||
#define TEST_REGISTER_TRACK_WRITEVAL 0x55AA
|
#define TEST_REGISTER_TRACK_WRITEVAL 0x55AA
|
||||||
|
|
||||||
|
#ifndef TEMP_FAILURE_RETRY
|
||||||
|
#define TEMP_FAILURE_RETRY(exp) \
|
||||||
|
({ \
|
||||||
|
decltype(exp) _rc; \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
_rc = (exp); \
|
||||||
|
} \
|
||||||
|
while (_rc == -1 && errno == EINTR); \
|
||||||
|
_rc; \
|
||||||
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators,
|
Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators,
|
||||||
std::string device_name, uint32_t device_base, int32_t *ca_codes, int32_t *data_codes, uint32_t code_length_chips, bool track_pilot,
|
std::string device_name, uint32_t device_base, int32_t *ca_codes, int32_t *data_codes, uint32_t code_length_chips, bool track_pilot,
|
||||||
@ -95,6 +107,7 @@ Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators,
|
|||||||
}
|
}
|
||||||
d_shifts_chips = nullptr;
|
d_shifts_chips = nullptr;
|
||||||
d_prompt_data_shift = nullptr;
|
d_prompt_data_shift = nullptr;
|
||||||
|
d_Prompt_Data = nullptr;
|
||||||
d_corr_out = nullptr;
|
d_corr_out = nullptr;
|
||||||
d_code_length_chips = 0;
|
d_code_length_chips = 0;
|
||||||
d_rem_code_phase_chips = 0;
|
d_rem_code_phase_chips = 0;
|
||||||
@ -105,7 +118,8 @@ Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators,
|
|||||||
d_phase_step_rad_int = 0;
|
d_phase_step_rad_int = 0;
|
||||||
d_initial_sample_counter = 0;
|
d_initial_sample_counter = 0;
|
||||||
d_channel = 0;
|
d_channel = 0;
|
||||||
d_correlator_length_samples = 0,
|
d_correlator_length_samples = 0;
|
||||||
|
d_code_phase_step_chips_num = 0;
|
||||||
d_code_length_chips = code_length_chips;
|
d_code_length_chips = code_length_chips;
|
||||||
d_ca_codes = ca_codes;
|
d_ca_codes = ca_codes;
|
||||||
d_data_codes = data_codes;
|
d_data_codes = data_codes;
|
||||||
@ -119,6 +133,14 @@ Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators,
|
|||||||
Fpga_Multicorrelator_8sc::~Fpga_Multicorrelator_8sc()
|
Fpga_Multicorrelator_8sc::~Fpga_Multicorrelator_8sc()
|
||||||
{
|
{
|
||||||
close_device();
|
close_device();
|
||||||
|
if (d_initial_index != nullptr)
|
||||||
|
{
|
||||||
|
volk_gnsssdr_free(d_initial_index);
|
||||||
|
}
|
||||||
|
if (d_initial_interp_counter != nullptr)
|
||||||
|
{
|
||||||
|
volk_gnsssdr_free(d_initial_interp_counter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ private:
|
|||||||
float *d_shifts_chips;
|
float *d_shifts_chips;
|
||||||
float *d_prompt_data_shift;
|
float *d_prompt_data_shift;
|
||||||
int32_t d_code_length_chips;
|
int32_t d_code_length_chips;
|
||||||
int32_t d_n_correlators;
|
int32_t d_n_correlators; // number of correlators
|
||||||
|
|
||||||
// data related to the hardware module and the driver
|
// data related to the hardware module and the driver
|
||||||
int32_t d_device_descriptor; // driver descriptor
|
int32_t d_device_descriptor; // driver descriptor
|
||||||
@ -106,7 +106,6 @@ private:
|
|||||||
|
|
||||||
// configuration data received from the interface
|
// configuration data received from the interface
|
||||||
uint32_t d_channel; // channel number
|
uint32_t d_channel; // channel number
|
||||||
uint32_t d_ncorrelators; // number of correlators
|
|
||||||
uint32_t d_correlator_length_samples;
|
uint32_t d_correlator_length_samples;
|
||||||
float d_rem_code_phase_chips;
|
float d_rem_code_phase_chips;
|
||||||
float d_code_phase_step_chips;
|
float d_code_phase_step_chips;
|
||||||
|
Loading…
Reference in New Issue
Block a user