summaryrefslogtreecommitdiff
path: root/gr-qtgui/lib/sink_f_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-qtgui/lib/sink_f_impl.cc')
-rw-r--r--gr-qtgui/lib/sink_f_impl.cc113
1 files changed, 43 insertions, 70 deletions
diff --git a/gr-qtgui/lib/sink_f_impl.cc b/gr-qtgui/lib/sink_f_impl.cc
index 074c04219e..74d8cf6430 100644
--- a/gr-qtgui/lib/sink_f_impl.cc
+++ b/gr-qtgui/lib/sink_f_impl.cc
@@ -25,6 +25,10 @@
namespace gr {
namespace qtgui {
+namespace {
+constexpr uint64_t maxBufferSize = 32768;
+}
+
sink_f::sptr sink_f::make(int fftsize,
int wintype,
double fc,
@@ -66,51 +70,28 @@ sink_f_impl::sink_f_impl(int fftsize,
d_bandwidth(bw),
d_name(name),
d_port(pmt::mp("freq")),
+ d_fft(std::make_unique<fft::fft_complex_fwd>(d_fftsize)),
+ d_residbuf(d_fftsize),
+ d_magbuf(d_fftsize),
d_plotfreq(plotfreq),
d_plotwaterfall(plotwaterfall),
d_plottime(plottime),
d_plotconst(plotconst),
- d_parent(parent)
+ d_parent(parent),
+ d_main_gui(maxBufferSize, d_fftsize, d_center_freq, -d_bandwidth, d_bandwidth)
{
- // Required now for Qt; argc must be greater than 0 and argv
- // must have at least one valid character. Must be valid through
- // life of the qApplication:
- // http://harmattan-dev.nokia.com/docs/library/html/qt4/qapplication.html
- d_argc = 1;
- d_argv = new char;
- d_argv[0] = '\0';
-
// setup output message port to post frequency when display is
// double-clicked
message_port_register_out(d_port);
message_port_register_in(d_port);
set_msg_handler(d_port, [this](pmt::pmt_t msg) { this->handle_set_freq(msg); });
- d_main_gui = NULL;
-
- // Perform fftshift operation;
- // this is usually desired when plotting
- d_shift = true;
-
- d_fft = new fft::fft_complex_fwd(d_fftsize);
-
- d_index = 0;
- d_residbuf = (float*)volk_malloc(d_fftsize * sizeof(float), volk_get_alignment());
- d_magbuf = (float*)volk_malloc(d_fftsize * sizeof(float), volk_get_alignment());
-
buildwindow();
initialize();
}
-sink_f_impl::~sink_f_impl()
-{
- delete d_main_gui;
- delete d_fft;
- delete d_argv;
- volk_free(d_residbuf);
- volk_free(d_magbuf);
-}
+sink_f_impl::~sink_f_impl() {}
bool sink_f_impl::check_topology(int ninputs, int noutputs) { return ninputs == 1; }
@@ -137,14 +118,11 @@ void sink_f_impl::initialize()
// If a style sheet is set in the prefs file, enable it here.
check_set_qss(d_qApplication);
- uint64_t maxBufferSize = 32768;
- d_main_gui = new SpectrumGUIClass(
- maxBufferSize, d_fftsize, d_center_freq, -d_bandwidth, d_bandwidth);
- d_main_gui->setDisplayTitle(d_name);
- d_main_gui->setWindowType((int)d_wintype);
+ d_main_gui.setDisplayTitle(d_name);
+ d_main_gui.setWindowType((int)d_wintype);
set_fft_size(d_fftsize);
- d_main_gui->openSpectrumWindow(
+ d_main_gui.openSpectrumWindow(
d_parent, d_plotfreq, d_plotwaterfall, d_plottime, d_plotconst);
// initialize update time to 10 times a second
@@ -153,12 +131,12 @@ void sink_f_impl::initialize()
void sink_f_impl::exec_() { d_qApplication->exec(); }
-QWidget* sink_f_impl::qwidget() { return d_main_gui->qwidget(); }
+QWidget* sink_f_impl::qwidget() { return d_main_gui.qwidget(); }
#ifdef ENABLE_PYTHON
PyObject* sink_f_impl::pyqwidget()
{
- PyObject* w = PyLong_FromVoidPtr((void*)d_main_gui->qwidget());
+ PyObject* w = PyLong_FromVoidPtr((void*)d_main_gui.qwidget());
PyObject* retarg = Py_BuildValue("N", w);
return retarg;
}
@@ -169,7 +147,7 @@ void* sink_f_impl::pyqwidget() { return NULL; }
void sink_f_impl::set_fft_size(const int fftsize)
{
d_fftsize = fftsize;
- d_main_gui->setFFTSize(fftsize);
+ d_main_gui.setFFTSize(fftsize);
}
int sink_f_impl::fft_size() const { return d_fftsize; }
@@ -178,41 +156,41 @@ void sink_f_impl::set_frequency_range(const double centerfreq, const double band
{
d_center_freq = centerfreq;
d_bandwidth = bandwidth;
- d_main_gui->setFrequencyRange(d_center_freq, -d_bandwidth, d_bandwidth);
+ d_main_gui.setFrequencyRange(d_center_freq, -d_bandwidth, d_bandwidth);
}
void sink_f_impl::set_fft_power_db(double min, double max)
{
- d_main_gui->setFrequencyAxis(min, max);
+ d_main_gui.setFrequencyAxis(min, max);
}
-void sink_f_impl::enable_rf_freq(bool en) { d_main_gui->enableRFFreq(en); }
+void sink_f_impl::enable_rf_freq(bool en) { d_main_gui.enableRFFreq(en); }
/*
void
sink_f_impl::set_time_domain_axis(double min, double max)
{
- d_main_gui->setTimeDomainAxis(min, max);
+ d_main_gui.setTimeDomainAxis(min, max);
}
void
sink_f_impl::set_constellation_axis(double xmin, double xmax,
double ymin, double ymax)
{
- d_main_gui->setConstellationAxis(xmin, xmax, ymin, ymax);
+ d_main_gui.setConstellationAxis(xmin, xmax, ymin, ymax);
}
void
sink_f_impl::set_constellation_pen_size(int size)
{
- d_main_gui->setConstellationPenSize(size);
+ d_main_gui.setConstellationPenSize(size);
}
*/
void sink_f_impl::set_update_time(double t)
{
d_update_time = t;
- d_main_gui->setUpdateTime(d_update_time);
+ d_main_gui.setUpdateTime(d_update_time);
}
void sink_f_impl::fft(float* data_out, const float* data_in, int size)
@@ -235,7 +213,7 @@ void sink_f_impl::fft(float* data_out, const float* data_in, int size)
void sink_f_impl::windowreset()
{
fft::window::win_type newwintype;
- newwintype = (fft::window::win_type)d_main_gui->getWindowType();
+ newwintype = (fft::window::win_type)d_main_gui.getWindowType();
if (d_wintype != newwintype) {
d_wintype = newwintype;
buildwindow();
@@ -252,17 +230,13 @@ void sink_f_impl::buildwindow()
void sink_f_impl::fftresize()
{
- int newfftsize = d_main_gui->getFFTSize();
+ int newfftsize = d_main_gui.getFFTSize();
if (newfftsize != d_fftsize) {
// Resize residbuf and replace data
- volk_free(d_residbuf);
- d_residbuf =
- (float*)volk_malloc(newfftsize * sizeof(float), volk_get_alignment());
-
- volk_free(d_magbuf);
- d_magbuf = (float*)volk_malloc(newfftsize * sizeof(float), volk_get_alignment());
+ d_residbuf.resize(newfftsize);
+ d_magbuf.resize(newfftsize);
// Set new fft size and reset buffer index
// (throws away any currently held data, but who cares?)
@@ -273,15 +247,14 @@ void sink_f_impl::fftresize()
buildwindow();
// Reset FFTW plan for new size
- delete d_fft;
- d_fft = new fft::fft_complex_fwd(d_fftsize);
+ d_fft = std::make_unique<fft::fft_complex_fwd>(d_fftsize);
}
}
void sink_f_impl::check_clicked()
{
- if (d_main_gui->checkClicked()) {
- double freq = d_main_gui->getClickedFreq();
+ if (d_main_gui.checkClicked()) {
+ double freq = d_main_gui.getClickedFreq();
message_port_pub(d_port, pmt::cons(d_port, pmt::from_double(freq)));
}
}
@@ -319,25 +292,25 @@ int sink_f_impl::general_work(int noutput_items,
const gr::high_res_timer_type currentTime = gr::high_res_timer_now();
// Fill up residbuf with d_fftsize number of items
- memcpy(d_residbuf + d_index, &in[j], sizeof(float) * resid);
+ memcpy(d_residbuf.data() + d_index, &in[j], sizeof(float) * resid);
d_index = 0;
j += resid;
- fft(d_magbuf, d_residbuf, d_fftsize);
-
- d_main_gui->updateWindow(true,
- d_magbuf,
- d_fftsize,
- (float*)d_residbuf,
- d_fftsize,
- NULL,
- 0,
- currentTime,
- true);
+ fft(d_magbuf.data(), d_residbuf.data(), d_fftsize);
+
+ d_main_gui.updateWindow(true,
+ d_magbuf.data(),
+ d_fftsize,
+ d_residbuf.data(),
+ d_fftsize,
+ NULL,
+ 0,
+ currentTime,
+ true);
}
// Otherwise, copy what we received into the residbuf for next time
else {
- memcpy(d_residbuf + d_index, &in[j], sizeof(float) * datasize);
+ memcpy(d_residbuf.data() + d_index, &in[j], sizeof(float) * datasize);
d_index += datasize;
j += datasize;
}