diff --git a/plotview.cpp b/plotview.cpp index 7822696..b860241 100644 --- a/plotview.cpp +++ b/plotview.cpp @@ -29,7 +29,6 @@ #include "grsamplebuffer.h" #include "memory_sink.h" #include "memory_source.h" -#include "traceplot.h" PlotView::PlotView(InputSource *input) : cursors(this), viewRange({0, 0}) { @@ -37,18 +36,18 @@ PlotView::PlotView(InputSource *input) : cursors(this), viewRange({0, 0}) setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); enableCursors(false); - mainSampleSource->subscribe(this); -} - -void PlotView::refreshSources() -{ - plots.clear(); - if (mainSampleSource == nullptr) - return; - spectrogramPlot = new SpectrogramPlot(mainSampleSource); plots.emplace_back(spectrogramPlot); + iqPlot = createIQPlot(mainSampleSource); + plots.emplace_back(iqPlot); + plots.emplace_back(createQuadratureDemodPlot(static_cast>*>(iqPlot->source().get()))); + + mainSampleSource->subscribe(this); +} + +TracePlot* PlotView::createIQPlot(SampleSource> *src) +{ gr::top_block_sptr iq_tb = gr::make_top_block("multiply"); auto iq_mem_source = gr::blocks::memory_source::make(8); auto iq_mem_sink = gr::blocks::memory_sink::make(8); @@ -67,6 +66,12 @@ void PlotView::refreshSources() iq_tb->connect(multiply, 0, iq_mem_sink, 0); } + auto iq_src = std::make_shared, std::complex>>(mainSampleSource, iq_tb, iq_mem_source, iq_mem_sink); + return new TracePlot(iq_src); +} + +TracePlot* PlotView::createQuadratureDemodPlot(SampleSource> *src) +{ gr::top_block_sptr quad_demod_tb = gr::make_top_block("quad_demod"); auto quad_demod_mem_source = gr::blocks::memory_source::make(8); auto quad_demod_mem_sink = gr::blocks::memory_sink::make(4); @@ -74,17 +79,11 @@ void PlotView::refreshSources() quad_demod_tb->connect(quad_demod_mem_source, 0, quad_demod, 0); quad_demod_tb->connect(quad_demod, 0, quad_demod_mem_sink, 0); - auto iq_src = std::make_shared, std::complex>>(mainSampleSource, iq_tb, iq_mem_source, iq_mem_sink); - plots.emplace_back(new TracePlot(iq_src)); - - plots.emplace_back( - new TracePlot( - std::make_shared, float>>( - dynamic_cast>*>(iq_src.get()), quad_demod_tb, quad_demod_mem_source, quad_demod_mem_sink - ) + return new TracePlot( + std::make_shared, float>>( + dynamic_cast>*>(src), quad_demod_tb, quad_demod_mem_source, quad_demod_mem_sink ) ); - update(); } void PlotView::enableCursors(bool enabled) @@ -97,8 +96,6 @@ void PlotView::enableCursors(bool enabled) void PlotView::invalidateEvent() { - refreshSources(); - horizontalScrollBar()->setMinimum(0); horizontalScrollBar()->setMaximum(mainSampleSource->count()); } @@ -108,13 +105,11 @@ void PlotView::selectionChanged(std::pair selectionTime, std::pair this->selectionTime = selectionTime; this->selectionFreq = selectionFreq; selection = true; - refreshSources(); } void PlotView::selectionCleared() { selection = false; - refreshSources(); } void PlotView::setFFTSize(int size) diff --git a/plotview.h b/plotview.h index 3b204f2..5983b1c 100644 --- a/plotview.h +++ b/plotview.h @@ -25,7 +25,9 @@ #include "cursors.h" #include "inputsource.h" #include "plot.h" +#include "samplesource.h" #include "spectrogramplot.h" +#include "traceplot.h" class PlotView : public QAbstractScrollArea, Subscriber { @@ -51,6 +53,7 @@ private: Cursors cursors; SampleSource> *mainSampleSource = nullptr; SpectrogramPlot *spectrogramPlot = nullptr; + TracePlot *iqPlot = nullptr; std::vector> plots; std::pair viewRange; bool selection = false; @@ -60,6 +63,7 @@ private: int fftSize; int zoomLevel; - void refreshSources(); + TracePlot* createIQPlot(SampleSource> *src); + TracePlot* createQuadratureDemodPlot(SampleSource> *src); void updateView(); }; \ No newline at end of file diff --git a/spectrogramplot.cpp b/spectrogramplot.cpp index d7c0d3c..41f5585 100644 --- a/spectrogramplot.cpp +++ b/spectrogramplot.cpp @@ -102,6 +102,9 @@ void SpectrogramPlot::mousePressEvent(QMouseEvent *event) void SpectrogramPlot::paintMid(QPainter &painter, QRect &rect, range_t sampleRange) { + if (!inputSource || inputSource->count() == 0) + return; + for (int x = rect.left(); x < rect.right(); x += linesPerTile()) { QPixmap *tile = getPixmapTile(sampleRange.minimum + x * getStride()); painter.drawPixmap(QRect(x, rect.y(), linesPerTile(), fftSize), *tile); diff --git a/traceplot.h b/traceplot.h index 4a7097e..bae457d 100644 --- a/traceplot.h +++ b/traceplot.h @@ -32,6 +32,7 @@ public: void paintMid(QPainter &painter, QRect &rect, range_t sampleRange); void paintFront(QPainter &painter, QRect &rect, range_t sampleRange); + std::shared_ptr source() { return sampleSource; }; private: std::shared_ptr sampleSource;