83 lines
2.4 KiB
C++
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();
|
|
}
|
|
}
|