Hello Vasil
I am using the below code to capture both downlink and uplink, please check it once:
#include <uhd/types/tune_request.hpp>
#include <uhd/utils/thread_priority.hpp>
#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/exception.hpp>
#include <boost/program_options.hpp>
#include <boost/format.hpp>
#include <boost/thread.hpp>
#include <uhd/stream.hpp>
#include <iostream>
#include <fstream>
#include <csignal>
#include <complex>
#include <pthread.h>
#include "../include/conf.hpp"
static bool stop_signal_called = false;
void sig_int_handler(int){
stop_signal_called = true;
}
typedef boost::function<uhd::sensor_value_t (const std::string&)> get_sensor_fn_t;
//template<typename samp_type>
void recv_to_file(struct data2hosts data){
uhd::usrp::multi_usrp::sptr usrp = data.usrp;
const std::string file = data.file;
size_t samps_per_buff = data.spb;
unsigned long long num_requested_samples = data.total_num_samps;
bool null = NULL;
bool enable_size_map = data.enable_size_map;
bool continue_on_bad_packet = data.continue_on_bad_packet;
unsigned long long num_total_samps = 0;
//create a receive streamer
uhd::stream_args_t stream_args("fc32","sc16");//cpu_format,wire_format);
stream_args.channels.push_back(data.chan_no);
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
uhd::rx_metadata_t md;
std::vector<std::complex<float>> buff(samps_per_buff);///////
std::ofstream outfile;
if (not null)
outfile.open(file.c_str(), std::ofstream::binary);
bool overflow_message = true;
//setup streaming
uhd::stream_cmd_t stream_cmd((num_requested_samples == 0)?
uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS:
uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE
);
stream_cmd.num_samps = size_t(num_requested_samples);
stream_cmd.stream_now = true;
stream_cmd.time_spec = uhd::time_spec_t();
rx_stream->issue_stream_cmd(stream_cmd);
boost::system_time start = boost::get_system_time();
//unsigned long long ticks_requested = (long)(time_requested * (double)boost::posix_time::time_duration::ticks_per_second());
boost::posix_time::time_duration ticks_diff;
boost::system_time last_update = start;
unsigned long long last_update_samps = 0;
typedef std::map<size_t,size_t> SizeMap;
SizeMap mapSizes;
while(not stop_signal_called and (num_requested_samples != num_total_samps or num_requested_samples == 0)) {
boost::system_time now = boost::get_system_time();
size_t num_rx_samps = rx_stream->recv(&buff.front(), buff.size(), md, 3.0, enable_size_map);
//std::cout << boost::format("No of bytes received %u")% num_rx_samps << std::endl;
if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT) {
std::cout << boost::format("Timeout while streaming") << std::endl;
break;
}
if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW){
if (overflow_message) {
overflow_message = false;
std::cerr << boost::format(
"Got an overflow indication. Please consider the following:\n"
" Your write medium must sustain a rate of %fMB/s.\n"
" Dropped samples will not be written to the file.\n"
" Please modify this example for your purposes.\n"
" This message will not appear again.\n"
) % (usrp->get_rx_rate()*sizeof(std::complex<float>)/1e6);////////////////
}
continue;
}
if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE){
std::string error = str(boost::format("Receiver error: %s") % md.strerror());
if (continue_on_bad_packet){
std::cerr << error << std::endl;
continue;
}
else
throw std::runtime_error(error);
}
if (enable_size_map) {
SizeMap::iterator it = mapSizes.find(num_rx_samps);
if (it == mapSizes.end())
mapSizes[num_rx_samps] = 0;
mapSizes[num_rx_samps] += 1;
}
num_total_samps += num_rx_samps;
if (outfile.is_open())
outfile.write((const char*)&buff.front(), num_rx_samps*sizeof(std::complex<float>));//////////////
ticks_diff = now - start;
/*if (ticks_requested > 0){
if ((unsigned long long)ticks_diff.ticks() > ticks_requested)
break;
}*/
}
stream_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS;
rx_stream->issue_stream_cmd(stream_cmd);
if (outfile.is_open())
outfile.close();
}
bool check_locked_sensor(std::vector<std::string> sensor_names, const char* sensor_name, get_sensor_fn_t get_sensor_fn, double setup_time){
if (std::find(sensor_names.begin(), sensor_names.end(), sensor_name) == sensor_names.end())
return false;
boost::system_time start = boost::get_system_time();
boost::system_time first_lock_time;
std::cout << boost::format("Waiting for \"%s\": ") % sensor_name;
std::cout.flush();
while (true) {
if ((not first_lock_time.is_not_a_date_time()) and
(boost::get_system_time() > (first_lock_time + boost::posix_time::seconds(setup_time))))
{
std::cout << " locked." << std::endl;
break;
}
if (get_sensor_fn(sensor_name).to_bool()){
if (first_lock_time.is_not_a_date_time())
first_lock_time = boost::get_system_time();
std::cout << "+";
std::cout.flush();
}
else {
first_lock_time = boost::system_time(); //reset to 'not a date time'
if (boost::get_system_time() > (start + boost::posix_time::seconds(setup_time))){
std::cout << std::endl;
throw std::runtime_error(str(boost::format("timed out waiting for consecutive locks on sensor \"%s\"") % sensor_name));
}
std::cout << "_";
std::cout.flush();
}
boost::this_thread::sleep(boost::posix_time::milliseconds(100));
}
std::cout << std::endl;
return true;
}
int UHD_SAFE_MAIN(int argc, char *argv[]){
uhd::set_thread_priority_safe();
int i=0;
std::string args, type ;
struct rfSettings rfParam[3];
struct data2hosts data[2];
double rate, freq, gain, bw, setupTime, totalTime = 0;;
pthread_t tid[2]={0x00};
std::string ant("RX2");
std::string file1("/media/nameme/usrp_data.dat");
std::string file2("/media/nameme/usrp_data1.dat");
std::string wirefmt("sc16");
bool enable_size_map = true;
bool continue_on_bad_packet = true;
size_t total_num_samps = 0, spb = 1000000;
pthread_t tid1,tid2;
memset(rfParam,0x00,sizeof(rfParam));
/*****************************Koyel to check***************************/
rfParam[0].freq = 935800000;
strcpy(rfParam[0].band,"P-GSM");
rfParam[0].bandwidth = 25000000;
rfParam[0].samplerate = 50000000;
rfParam[0].total_time = 0x00;
rfParam[0].setup_time = 1.0;
rfParam[0].gain = 30.0;
rfParam[1].freq = 925000000;
strcpy(rfParam[1].band,"E-GSM");
rfParam[1].bandwidth = 35000000;
rfParam[1].samplerate = 70000000;
rfParam[1].setup_time = 1.0;
rfParam[1].gain = 30.0;
/* rfParam[2].freq = 1805200000;
strcpy(rfParam[2].band,"DCS");
rfParam[2].bandwidth = 100000000; //75000000;
rfParam[2].samplerate = 200000000;//200000000; //149200000;
rfParam[2].setup_time = 1.0;
rfParam[2].gain = 30.0;*/
rfParam[2].freq = 959600000;//935800000;
strcpy(rfParam[2].band,"DCS");
rfParam[2].bandwidth = 250000; //75000000;
rfParam[2].samplerate = 1000000;//200000000; //149200000;
rfParam[2].setup_time = 1.0;
rfParam[2].gain = 30.0;
/*************************************************************************/
std::string subdev("A:0 B:0");
std::string sync("internal");
for(i=0;i<3;i++){
if(strcmp(rfParam[i].band,"DCS")==0x00){
rate = rfParam[i].samplerate;
freq = rfParam[i].freq;
gain = rfParam[i].gain;
bw = rfParam[i].bandwidth;
setupTime = rfParam[i].setup_time;
totalTime = rfParam[i].total_time;
break;
}
}
//create a usrp device
std::cout << boost::format("\nCreating the USRP device with args: \"%s\"...\n") % args;
static uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
//set subdevice
usrp->set_rx_subdev_spec(subdev);
//set antenna
std::cout << boost::format("Setting antenna to: %s\n") % ant;
usrp->set_rx_antenna(ant);
usrp->set_rx_antenna(ant);
//tune to a particular frequency
std::cout << boost::format("Setting RX Freq: %f MHz...") % (freq/1e6) << std::endl;
uhd::tune_request_t tune_request(freq,0);
tune_request.args = uhd::device_addr_t("mode_n=integer");
usrp->set_rx_freq(tune_request,0);
uhd::tune_request_t tune_requestUplink(freq-45000000);
usrp->set_rx_freq(tune_requestUplink,1);
std::cout << boost::format("Actual RX Freq: %f MHz...") % (usrp->get_rx_freq(0)/1e6) << std::endl << std::endl;
std::cout << boost::format("Actual RX Freq: %f MHz...") % (usrp->get_rx_freq(1)/1e6) << std::endl << std::endl;
//set sample rate
std::cout << boost::format("Setting sample rate to: %d\n") % rate;
usrp->set_rx_rate(rate);
usrp->set_rx_rate(rate);
std::cout << boost::format("Actual sample rate: %d \n") % usrp->get_rx_rate(0);
std::cout << boost::format("Actual sample rate: %d \n") % usrp->get_rx_rate(1);
//set gain
std::cout << boost::format("Setting gain to: %d\n") % gain;
usrp->set_rx_gain(gain,0);
usrp->set_rx_gain(gain,1);
std::cout << boost::format("Actual gain: %d\n") % usrp->get_rx_gain(0);
std::cout << boost::format("Actual gain: %d\n") % usrp->get_rx_gain(1);
//set the bandwidth
std::cout << boost::format("Setting bandwidth to %f MHz")%(bw/1e6) << std::endl;
usrp->set_rx_bandwidth(bw,0);
usrp->set_rx_bandwidth(bw,1);
std::cout << boost::format("Actual RX Bandwidth: %f MHz...") % (usrp->get_rx_bandwidth(0)/1e6) << std::endl << std::endl;
std::cout << boost::format("Actual RX Bandwidth: %f MHz...") % (usrp->get_rx_bandwidth(1)/1e6) << std::endl << std::endl;
boost::this_thread::sleep(boost::posix_time::seconds(rfParam[0].setup_time)); //allow for some setup time
check_locked_sensor(usrp->get_rx_sensor_names(0), "lo_locked", boost::bind(&uhd::usrp::multi_usrp::get_rx_sensor, usrp, _1, 0), rfParam[0].setup_time);
// Get an rx_streamer from the device
//check_locked_sensor(usrp->get_rx_sensor_names(0), "lo_locked", boost::bind(&uhd::usrp::multi_usrp::get_rx_sensor, usrp, _1, 0), rfParam[0].setup_time);
std::signal(SIGINT, &sig_int_handler);
std::cout << "Press Ctrl + C to stop streaming..." << std::endl;
data[0].usrp = usrp;
data[0].file = file1;
data[0].total_num_samps = total_num_samps;
data[0].spb = spb;
data[0].enable_size_map = enable_size_map;
data[0].continue_on_bad_packet = continue_on_bad_packet;
data[0].chan_no = 0;
data[1].usrp = usrp;
data[1].file = file2;
data[1].total_num_samps = total_num_samps;
data[1].spb = spb;
data[1].enable_size_map = enable_size_map;
data[1].continue_on_bad_packet = continue_on_bad_packet;
data[1].chan_no = 1;
/*#define recv_to_file_args(format) \
(usrp, file1, spb, total_num_samps, NULL, enable_size_map, continue_on_bad_packet)
recv_to_file<std::complex<float> >recv_to_file_args("fc32");*/
boost::thread thread1(&recv_to_file,data[0]);
boost::thread thread2(&recv_to_file,data[1]);
thread1.join();
thread2.join();
//finished
std::cout << std::endl << "Done!" << std::endl << std::endl;