mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-12-14 12:10:34 +00:00
Updated array driver (added 16 + 16 bits snapshot transport support)
Fix compilation issues with mac osx git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@483 64b25241-fba3-4117-9849-534c7e92360d
This commit is contained in:
parent
28d6b9a122
commit
851f98f879
@ -57,7 +57,7 @@ set(Boost_ADDITIONAL_VERSIONS
|
|||||||
"1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64"
|
"1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64"
|
||||||
"1.65.0" "1.65" "1.66.0" "1.66" "1.67.0" "1.67" "1.68.0" "1.68" "1.69.0" "1.69"
|
"1.65.0" "1.65" "1.66.0" "1.66" "1.67.0" "1.67" "1.68.0" "1.68" "1.69.0" "1.69"
|
||||||
)
|
)
|
||||||
find_package(Boost "1.35" COMPONENTS filesystem system)
|
find_package(Boost "1.35" COMPONENTS filesystem system thread)
|
||||||
|
|
||||||
if(NOT Boost_FOUND)
|
if(NOT Boost_FOUND)
|
||||||
message(FATAL_ERROR "Boost required to compile dbfcttc")
|
message(FATAL_ERROR "Boost required to compile dbfcttc")
|
||||||
|
@ -78,6 +78,7 @@ namespace gr {
|
|||||||
d_fifo_full=false;
|
d_fifo_full=false;
|
||||||
d_last_frame_counter=0;
|
d_last_frame_counter=0;
|
||||||
d_num_rx_errors=0;
|
d_num_rx_errors=0;
|
||||||
|
flag_16_bits_sample=true;
|
||||||
|
|
||||||
//allocate signal samples buffer
|
//allocate signal samples buffer
|
||||||
//TODO: Check memory pointers
|
//TODO: Check memory pointers
|
||||||
@ -279,79 +280,134 @@ namespace gr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void raw_array_impl::pcap_callback(u_char *args, const struct pcap_pkthdr* pkthdr,
|
void raw_array_impl::pcap_callback(u_char *args, const struct pcap_pkthdr* pkthdr,
|
||||||
const u_char* packet)
|
const u_char* packet)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(d_mutex); // hold mutex for duration of this function
|
boost::mutex::scoped_lock lock(d_mutex); // hold mutex for duration of this function
|
||||||
int numframebyte;
|
int numframebyte;
|
||||||
short int real,imag;
|
short int real,imag;
|
||||||
// eth frame parameters
|
// eth frame parameters
|
||||||
int number_of_channels;
|
int number_of_channels;
|
||||||
unsigned short int snapshots_per_frame;
|
unsigned short int snapshots_per_frame;
|
||||||
|
|
||||||
// **** CTTC DBF PACKET DECODER ****
|
// **** CTTC DBF PACKET DECODER ****
|
||||||
if ((packet[12]==0xCD) & (packet[13]==0xBF))
|
if ((packet[12]==0xCD) & (packet[13]==0xBF))
|
||||||
{
|
{
|
||||||
//printf(".");
|
//printf(".");
|
||||||
// control parameters
|
// control parameters
|
||||||
number_of_channels=(int)packet[14];
|
number_of_channels=(int)packet[14];
|
||||||
//std::cout<<"number_of_channels="<<number_of_channels<<std::endl;
|
//std::cout<<"number_of_channels="<<number_of_channels<<std::endl;
|
||||||
snapshots_per_frame=packet[15] << 8 | packet[16];
|
snapshots_per_frame=packet[15] << 8 | packet[16];
|
||||||
//std::cout<<"snapshots_per_frame="<<snapshots_per_frame<<std::endl;
|
//std::cout<<"snapshots_per_frame="<<snapshots_per_frame<<std::endl;
|
||||||
//snapshots reading..
|
//frame counter check for overflows!
|
||||||
for(int i=0;i<snapshots_per_frame;i++)
|
numframebyte=(unsigned char)packet[16+snapshots_per_frame*2*number_of_channels+1];
|
||||||
{
|
//std::cout<<"numframebyte="<<numframebyte<<std::endl;
|
||||||
if (fifo_items <= FIFO_SIZE) {
|
//Overflow detector and mitigator
|
||||||
for (int ch=0;ch<number_of_channels;ch++)
|
if (d_flag_start_frame == true)
|
||||||
{
|
{
|
||||||
real = (signed char)packet[17 + ch*2 + i * 16];
|
d_last_frame_counter=numframebyte;
|
||||||
imag = (signed char)packet[17 + ch*2 + 1 + i * 16];
|
d_flag_start_frame=false;
|
||||||
//todo: invert IQ in FPGA
|
}else{
|
||||||
//fifo_buff_ch[ch][fifo_write_ptr] = std::complex<float>(real, imag);
|
|
||||||
fifo_buff_ch[ch][fifo_write_ptr] = std::complex<float>(imag, real); //inverted due to inversion in front-end
|
|
||||||
//std::cout<<"["<<ch<<"]["<<fifo_write_ptr<<"]"<<fifo_buff_ch[ch][fifo_write_ptr]<<std::endl;
|
|
||||||
}
|
|
||||||
fifo_write_ptr++;
|
|
||||||
if (fifo_write_ptr == FIFO_SIZE) fifo_write_ptr = 0;
|
|
||||||
fifo_items++;
|
|
||||||
}else{
|
|
||||||
if (d_fifo_full==false)
|
|
||||||
{
|
|
||||||
printf("FIFO full\n");
|
|
||||||
fflush(stdout);
|
|
||||||
d_fifo_full=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
if ((d_last_frame_counter-numframebyte)>1)
|
||||||
//frame counter check for overflows!
|
{
|
||||||
numframebyte=(unsigned char)packet[16+snapshots_per_frame*2*number_of_channels+1];
|
int missing_frames=abs(d_last_frame_counter-numframebyte);
|
||||||
//std::cout<<"numframebyte="<<numframebyte<<std::endl;
|
if (missing_frames!=255 )
|
||||||
//test RX
|
{
|
||||||
|
//fake samples generation to help tracking loops
|
||||||
|
std::complex<float> last_sample[DBFCTTC_NUM_CHANNELS];
|
||||||
|
if (fifo_write_ptr == 0)
|
||||||
|
{
|
||||||
|
for (int ch=0;ch<number_of_channels;ch++)
|
||||||
|
{
|
||||||
|
last_sample[ch]=fifo_buff_ch[ch][FIFO_SIZE];
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
for (int ch=0;ch<number_of_channels;ch++)
|
||||||
|
{
|
||||||
|
last_sample[ch]=fifo_buff_ch[ch][fifo_write_ptr-1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i=0;i<(snapshots_per_frame*missing_frames);i++)
|
||||||
|
{
|
||||||
|
if (fifo_items <= FIFO_SIZE) {
|
||||||
|
for (int ch=0;ch<number_of_channels;ch++)
|
||||||
|
{
|
||||||
|
fifo_buff_ch[ch][fifo_write_ptr] = last_sample[ch];
|
||||||
|
}
|
||||||
|
fifo_write_ptr++;
|
||||||
|
if (fifo_write_ptr == FIFO_SIZE) fifo_write_ptr = 0;
|
||||||
|
fifo_items++;
|
||||||
|
if (d_fifo_full==true)
|
||||||
|
{
|
||||||
|
d_fifo_full=false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if (d_fifo_full==false)
|
||||||
|
{
|
||||||
|
printf("FIFO full\n");
|
||||||
|
fflush(stdout);
|
||||||
|
d_fifo_full=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
d_num_rx_errors=d_num_rx_errors + 1;
|
||||||
|
printf("RAW Array driver overflow RX %d\n",numframebyte);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
d_last_frame_counter=numframebyte;
|
||||||
|
|
||||||
// **** CTTC DBF PACKET DECODER ***
|
};
|
||||||
|
|
||||||
if (d_flag_start_frame == true)
|
|
||||||
{
|
|
||||||
d_last_frame_counter=numframebyte;
|
|
||||||
d_flag_start_frame=false;
|
|
||||||
}else{
|
|
||||||
|
|
||||||
if ((d_last_frame_counter-numframebyte)>1)
|
//snapshots reading..
|
||||||
{
|
for(int i=0;i<snapshots_per_frame;i++)
|
||||||
if (abs(d_last_frame_counter-numframebyte)!=255 )
|
{
|
||||||
{
|
if (fifo_items <= FIFO_SIZE) {
|
||||||
d_num_rx_errors=d_num_rx_errors + 1;
|
for (int ch=0;ch<number_of_channels;ch++)
|
||||||
printf("RAW Array driver overflow RX %d\n",numframebyte);
|
{
|
||||||
}
|
if (flag_16_bits_sample==true)
|
||||||
}
|
{
|
||||||
}
|
//(2i+2q)*8channels =32 bytes
|
||||||
d_last_frame_counter=numframebyte;
|
real=(signed short int)(packet[17 + ch*4 + i * 32] << 8 | packet[17 + ch*4 + 1 + i * 32]);
|
||||||
|
imag=(signed short int)(packet[17 + ch*4 + 2 + i * 32] << 8 | packet[17 + ch*4 + 3 + i * 32]);
|
||||||
|
}else{
|
||||||
|
//(1i+1q)*8channels =16 bytes
|
||||||
|
real = (signed char)packet[17 + ch*2 + i * 16];
|
||||||
|
imag = (signed char)packet[17 + ch*2 + 1 + i * 16];
|
||||||
|
}
|
||||||
|
//todo: invert IQ in FPGA
|
||||||
|
//fifo_buff_ch[ch][fifo_write_ptr] = std::complex<float>(real, imag);
|
||||||
|
fifo_buff_ch[ch][fifo_write_ptr] = std::complex<float>(imag, real); //inverted due to inversion in front-end
|
||||||
|
//std::cout<<"["<<ch<<"]["<<fifo_write_ptr<<"]"<<fifo_buff_ch[ch][fifo_write_ptr]<<std::endl;
|
||||||
|
}
|
||||||
|
fifo_write_ptr++;
|
||||||
|
if (fifo_write_ptr == FIFO_SIZE) fifo_write_ptr = 0;
|
||||||
|
fifo_items++;
|
||||||
|
if (d_fifo_full==true)
|
||||||
|
{
|
||||||
|
d_fifo_full=false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if (d_fifo_full==false)
|
||||||
|
{
|
||||||
|
printf("FIFO full\n");
|
||||||
|
fflush(stdout);
|
||||||
|
d_fifo_full=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
};//else{
|
}
|
||||||
//std::cout<<"RX PKT ID="<<(int)packet[12]<<","<<(int)packet[13]<<std::endl;
|
|
||||||
//}
|
|
||||||
|
|
||||||
// // *** END CTTC DBF PACKET DECODER ***
|
|
||||||
|
//test RX
|
||||||
|
|
||||||
|
// **** CTTC DBF PACKET DECODER ***
|
||||||
|
//else{
|
||||||
|
//std::cout<<"RX PKT ID="<<(int)packet[12]<<","<<(int)packet[13]<<std::endl;
|
||||||
|
//}
|
||||||
|
|
||||||
|
// // *** END CTTC DBF PACKET DECODER ***
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,12 +61,14 @@ private:
|
|||||||
int d_inter_frame_delay;
|
int d_inter_frame_delay;
|
||||||
int d_sampling_freq;
|
int d_sampling_freq;
|
||||||
|
|
||||||
|
bool flag_16_bits_sample;
|
||||||
bool d_flag_start_frame;
|
bool d_flag_start_frame;
|
||||||
bool d_fifo_full;
|
bool d_fifo_full;
|
||||||
|
|
||||||
int d_last_frame_counter;
|
int d_last_frame_counter;
|
||||||
int d_num_rx_errors;
|
int d_num_rx_errors;
|
||||||
|
|
||||||
|
|
||||||
boost::thread *d_pcap_thread;
|
boost::thread *d_pcap_thread;
|
||||||
/*!
|
/*!
|
||||||
* \brief
|
* \brief
|
||||||
|
Loading…
Reference in New Issue
Block a user