1
0
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:
Javier Arribas 2014-03-14 15:04:23 +00:00
parent 28d6b9a122
commit 851f98f879
3 changed files with 124 additions and 66 deletions

View File

@ -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")

View File

@ -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 ***
} }

View File

@ -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