gnss-sim/uhd_device.cpp

83 lines
2.4 KiB
C++

#include "uhd_device.h"
#include <uhd/types/tune_request.hpp>
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/utils/safe_main.hpp>
#include <uhd/utils/thread.hpp>
#include <uhd/exception.hpp>
#include <QEventLoop>
#include <QTimer>
static uhd::usrp::multi_usrp::sptr usrp = nullptr;
static uhd::tx_streamer::sptr tx_stream;
bool start;
int init_device(double rate, double freq, double gain)
{
try {
usrp = uhd::usrp::multi_usrp::make("master_clock_rate=52e6");
} catch (uhd::key_error e) {
std::cout<<e.what()<<std::endl;
}
if(!usrp){
return false;
}
printf("Using Device: %s\n",usrp->get_pp_string().c_str());
printf("Setting TX Rate: %f Msps...\n",rate/1e6);
usrp->set_tx_rate(rate);
printf("Actual TX Rate: %f Msps...\n",usrp->get_tx_rate()/1e6);
double lo_offset = 0.0;
printf("Setting TX LO Offset: %f MHz...\n",lo_offset/1e6);
uhd::tune_request_t tune_request;
tune_request = uhd::tune_request_t(freq, lo_offset);
usrp->set_tx_freq(tune_request);
printf("Actual TX Freq: %f MHz...\n",usrp->get_tx_freq() / 1e6);
// set the rf gain
printf("Setting TX Gain: %f dB...\n",gain);
usrp->set_tx_gain(gain);
printf("Actual TX Gain: %f dB...\n",usrp->get_tx_gain());
QEventLoop loop;
QTimer::singleShot(1000,&loop,SLOT(quit()));
loop.exec();
std::vector<std::string> sensor_names;
sensor_names = usrp->get_tx_sensor_names(0);
if (std::find(sensor_names.begin(), sensor_names.end(), "lo_locked")
!= sensor_names.end()) {
uhd::sensor_value_t lo_locked = usrp->get_tx_sensor("lo_locked", 0);
printf("Checking TX: %s ...\n",lo_locked.to_pp_string().c_str());
UHD_ASSERT_THROW(lo_locked.to_bool());
}
// create a transmit streamer
std::string cpu_format = "sc16";
std::vector<size_t> channel_nums;
std::string wirefmt = "sc16";
uhd::stream_args_t stream_args(cpu_format, wirefmt);
channel_nums.push_back(0);
stream_args.channels = channel_nums;
tx_stream = usrp->get_tx_stream(stream_args);
start = true;
return true;
}
int device_transmit(short* sample, size_t samps_count)
{
uhd::tx_metadata_t md;
md.start_of_burst = start;
if(start)
start = false;
md.end_of_burst = false;
return tx_stream->send(sample, samps_count, md);
}
void close_device()
{
if(usrp){
usrp.reset();
}
}