From 2242f22df7bf1e3ae3562a7edd3002b9e1bf3ddf Mon Sep 17 00:00:00 2001 From: Tomer Harpaz Date: Sun, 4 Dec 2022 09:30:30 +0200 Subject: [PATCH] add controls for setting/getting the tuner freq and deviation --- src/abstractsamplesource.cpp | 4 +++- src/abstractsamplesource.h | 7 ++++++- src/mainwindow.cpp | 3 +++ src/plotview.cpp | 16 +++++++++++++++ src/plotview.h | 4 ++++ src/spectrogramcontrols.cpp | 40 ++++++++++++++++++++++++++++++++++++ src/spectrogramcontrols.h | 7 +++++++ src/spectrogramplot.cpp | 35 +++++++++++++++++++++++++++++++ src/spectrogramplot.h | 5 +++++ src/tuner.cpp | 14 ++++++++----- src/tuner.h | 3 ++- 11 files changed, 130 insertions(+), 8 deletions(-) diff --git a/src/abstractsamplesource.cpp b/src/abstractsamplesource.cpp index 04aa3180..358ffddf 100644 --- a/src/abstractsamplesource.cpp +++ b/src/abstractsamplesource.cpp @@ -22,6 +22,7 @@ void AbstractSampleSource::subscribe(Subscriber *subscriber) { subscribers.insert(subscriber); + emit subscribersChanged(); } void AbstractSampleSource::invalidate() @@ -39,4 +40,5 @@ int AbstractSampleSource::subscriberCount() void AbstractSampleSource::unsubscribe(Subscriber *subscriber) { subscribers.erase(subscriber); -} \ No newline at end of file + emit subscribersChanged(); +} diff --git a/src/abstractsamplesource.h b/src/abstractsamplesource.h index 9c15ccf5..ece4b212 100644 --- a/src/abstractsamplesource.h +++ b/src/abstractsamplesource.h @@ -23,10 +23,12 @@ #include #include #include +#include #include "subscriber.h" -class AbstractSampleSource +class AbstractSampleSource : public QObject { + Q_OBJECT public: virtual ~AbstractSampleSource() {}; @@ -35,6 +37,9 @@ class AbstractSampleSource int subscriberCount(); void unsubscribe(Subscriber *subscriber); +signals: + void subscribersChanged(); + protected: virtual void invalidate(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index dc62d769..b05bb3e8 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -54,9 +54,12 @@ MainWindow::MainWindow() connect(dock->annosCheckBox, &QCheckBox::stateChanged, dock, &SpectrogramControls::enableAnnotations); connect(dock->commentsCheckBox, &QCheckBox::stateChanged, plots, &PlotView::enableAnnotationCommentsTooltips); connect(dock->cursorSymbolsSpinBox, static_cast(&QSpinBox::valueChanged), plots, &PlotView::setCursorSegments); + connect(dock, static_cast(&SpectrogramControls::tunerCenterSet), plots, &PlotView::setTunerCenter); + connect(dock, static_cast(&SpectrogramControls::tunerDeviationSet), plots, &PlotView::setTunerDeviation); // Connect dock outputs connect(plots, &PlotView::timeSelectionChanged, dock, &SpectrogramControls::timeSelectionChanged); + connect(plots, &PlotView::plotTunerChanged, dock, &SpectrogramControls::tunerChanged); connect(plots, &PlotView::zoomIn, dock, &SpectrogramControls::zoomIn); connect(plots, &PlotView::zoomOut, dock, &SpectrogramControls::zoomOut); diff --git a/src/plotview.cpp b/src/plotview.cpp index d1c6bea4..9cd721e6 100644 --- a/src/plotview.cpp +++ b/src/plotview.cpp @@ -47,6 +47,7 @@ PlotView::PlotView(InputSource *input) : cursors(this), viewRange({0, 0}) spectrogramPlot = new SpectrogramPlot(std::shared_ptr>>(mainSampleSource)); auto tunerOutput = std::dynamic_pointer_cast>>(spectrogramPlot->output()); + connect(spectrogramPlot, &SpectrogramPlot::tunerChanged, this, &PlotView::tunerChanged); enableScales(true); @@ -200,6 +201,11 @@ void PlotView::cursorsMoved() viewport()->update(); } +void PlotView::tunerChanged(double center, double deviation, bool enabled) +{ + emit plotTunerChanged(center, deviation, enabled); +} + void PlotView::emitTimeSelection() { size_t sampleCount = selectedSamples.length(); @@ -429,6 +435,16 @@ void PlotView::setCursorSegments(int segments) emitTimeSelection(); } +void PlotView::setTunerCenter(double center) { + if (spectrogramPlot != nullptr) + spectrogramPlot->setTunerCenter(center); +} + +void PlotView::setTunerDeviation(double deviation) { + if (spectrogramPlot != nullptr) + spectrogramPlot->setTunerDeviation(deviation); +} + void PlotView::setFFTAndZoom(int size, int zoom) { auto oldSamplesPerColumn = samplesPerColumn(); diff --git a/src/plotview.h b/src/plotview.h index 326d547f..daf231e1 100644 --- a/src/plotview.h +++ b/src/plotview.h @@ -39,11 +39,13 @@ class PlotView : public QGraphicsView, Subscriber signals: void timeSelectionChanged(float time); + void plotTunerChanged(double center, double deviation, bool enabled); void zoomIn(); void zoomOut(); public slots: void cursorsMoved(); + void tunerChanged(double center, double deviation, bool enabled); void enableCursors(bool enabled); void enableScales(bool enabled); void enableAnnotations(bool enabled); @@ -51,6 +53,8 @@ public slots: void invalidateEvent() override; void repaint(); void setCursorSegments(int segments); + void setTunerCenter(double center); + void setTunerDeviation(double deviation); void setFFTAndZoom(int fftSize, int zoomLevel); void setPowerMin(int power); void setPowerMax(int power); diff --git a/src/spectrogramcontrols.cpp b/src/spectrogramcontrols.cpp index 0e0f9aa2..691ea50f 100644 --- a/src/spectrogramcontrols.cpp +++ b/src/spectrogramcontrols.cpp @@ -69,6 +69,18 @@ SpectrogramControls::SpectrogramControls(const QString & title, QWidget * parent scalesCheckBox->setCheckState(Qt::Checked); layout->addRow(new QLabel(tr("Scales:")), scalesCheckBox); + tunerCenter = new QLineEdit(); + double_validator = new QDoubleValidator(this); + double_validator->setBottom(0.0); + tunerCenter->setValidator(double_validator); + layout->addRow(new QLabel(tr("Tuner center:")), tunerCenter); + + tunerDeviation = new QLineEdit(); + double_validator = new QDoubleValidator(this); + double_validator->setBottom(0.0); + tunerDeviation->setValidator(double_validator); + layout->addRow(new QLabel(tr("Tuner deviation:")), tunerDeviation); + // Time selection settings layout->addRow(new QLabel()); // TODO: find a better way to add an empty row? layout->addRow(new QLabel(tr("Time selection"))); @@ -111,6 +123,8 @@ SpectrogramControls::SpectrogramControls(const QString & title, QWidget * parent connect(cursorsCheckBox, &QCheckBox::stateChanged, this, &SpectrogramControls::cursorsStateChanged); connect(powerMinSlider, &QSlider::valueChanged, this, &SpectrogramControls::powerMinChanged); connect(powerMaxSlider, &QSlider::valueChanged, this, &SpectrogramControls::powerMaxChanged); + connect(tunerCenter, &QLineEdit::returnPressed, this, static_cast(&SpectrogramControls::tunerCenterSet)); + connect(tunerDeviation, &QLineEdit::returnPressed, this, static_cast(&SpectrogramControls::tunerDeviationSet)); } void SpectrogramControls::clearCursorLabels() @@ -181,6 +195,18 @@ void SpectrogramControls::powerMaxChanged(int value) settings.setValue("PowerMax", value); } +void SpectrogramControls::tunerCenterSet() +{ + auto center = tunerCenter->text().toDouble(); + emit tunerCenterSet(center); +} + +void SpectrogramControls::tunerDeviationSet() +{ + auto deviation = tunerDeviation->text().toDouble(); + emit tunerDeviationSet(deviation); +} + void SpectrogramControls::fileOpenButtonClicked() { QSettings settings; @@ -229,6 +255,20 @@ void SpectrogramControls::timeSelectionChanged(float time) } } +void SpectrogramControls::tunerChanged(double center, double deviation, bool enabled) +{ + if (enabled) { + tunerCenter->setText(QString::number((int)center)); + tunerDeviation->setText(QString::number((int)deviation)); + } else { + tunerCenter->setText(""); + tunerDeviation->setText(""); + } + + tunerCenter->setEnabled(enabled); + tunerDeviation->setEnabled(enabled); +} + void SpectrogramControls::zoomIn() { zoomLevelSlider->setValue(zoomLevelSlider->value() + 1); diff --git a/src/spectrogramcontrols.h b/src/spectrogramcontrols.h index 69e7d608..7d112c35 100644 --- a/src/spectrogramcontrols.h +++ b/src/spectrogramcontrols.h @@ -39,9 +39,12 @@ class SpectrogramControls : public QDockWidget signals: void fftOrZoomChanged(int fftSize, int zoomLevel); void openFile(QString fileName); + void tunerCenterSet(double center); + void tunerDeviationSet(double deviation); public slots: void timeSelectionChanged(float time); + void tunerChanged(double center, double deviation, bool enabled); void zoomIn(); void zoomOut(); void enableAnnotations(bool enabled); @@ -53,6 +56,8 @@ private slots: void powerMaxChanged(int value); void fileOpenButtonClicked(); void cursorsStateChanged(int state); + void tunerCenterSet(); + void tunerDeviationSet(); private: QWidget *widget; @@ -63,6 +68,8 @@ private slots: public: QPushButton *fileOpenButton; QLineEdit *sampleRate; + QLineEdit *tunerCenter; + QLineEdit *tunerDeviation; QSlider *fftSizeSlider; QSlider *zoomLevelSlider; QSlider *powerMaxSlider; diff --git a/src/spectrogramplot.cpp b/src/spectrogramplot.cpp index 3ab57ecc..0b8990f5 100644 --- a/src/spectrogramplot.cpp +++ b/src/spectrogramplot.cpp @@ -48,6 +48,7 @@ SpectrogramPlot::SpectrogramPlot(std::shared_ptr(src); connect(&tuner, &Tuner::tunerMoved, this, &SpectrogramPlot::tunerMoved); + connect(tunerTransform.get(), &TunerTransform::subscribersChanged, this, &SpectrogramPlot::tunerMoved); } void SpectrogramPlot::invalidateEvent() @@ -379,6 +380,30 @@ void SpectrogramPlot::setFFTSize(int size) tuner.setCentre( centre * sizeScale ); } +void SpectrogramPlot::setTunerCenter(double abs_center) +{ + double k; + if (inputSource->realSignal()) + k = sampleRate / 2; + else + k = sampleRate; + + int center = tuner.height() * (1 - abs_center / k); + tuner.setCentre(center); +} + +void SpectrogramPlot::setTunerDeviation(double abs_deviation) +{ + double k; + if (inputSource->realSignal()) + k = sampleRate / 2; + else + k = sampleRate; + + int deviation = tuner.height() * abs_deviation / k; + tuner.setDeviation(deviation); +} + void SpectrogramPlot::setPowerMax(int power) { powerMax = power; @@ -432,6 +457,16 @@ void SpectrogramPlot::tunerMoved() QPixmapCache::clear(); emit repaint(); + + double k; + if (inputSource->realSignal()) + k = sampleRate / 2; + else + k = sampleRate; + + double abs_center = k * (1 - (double)tuner.centre() / tuner.height()); + double abs_deviation = k * (double)tuner.deviation() / tuner.height(); + emit tunerChanged(abs_center, abs_deviation, tunerEnabled()); } uint qHash(const TileCacheKey &key, uint seed) diff --git a/src/spectrogramplot.h b/src/spectrogramplot.h index 2e52cb4b..6b0370d5 100644 --- a/src/spectrogramplot.h +++ b/src/spectrogramplot.h @@ -55,8 +55,13 @@ class SpectrogramPlot : public Plot bool isAnnotationsEnabled(); QString *mouseAnnotationComment(const QMouseEvent *event); +signals: + void tunerChanged(double center, double deviation, bool enabled); + public slots: void setFFTSize(int size); + void setTunerCenter(double center); + void setTunerDeviation(double deviation); void setPowerMax(int power); void setPowerMin(int power); void setZoomLevel(int zoom); diff --git a/src/tuner.cpp b/src/tuner.cpp index 6ccac61c..05453e16 100644 --- a/src/tuner.cpp +++ b/src/tuner.cpp @@ -20,7 +20,7 @@ #include #include "tuner.h" -Tuner::Tuner(int height, QObject * parent) : height(height), QObject::QObject(parent) +Tuner::Tuner(int height, QObject * parent) : _height(height), QObject::QObject(parent) { minCursor = new Cursor(Qt::Horizontal, Qt::SizeVerCursor, this); cfCursor = new Cursor(Qt::Horizontal, Qt::SizeAllCursor, this); @@ -44,14 +44,14 @@ void Tuner::cursorMoved() Cursor *sender = static_cast(QObject::sender()); if (sender != cfCursor) { // Limit cursor positions to within plot - auto posRange = range_t{0, height}; + auto posRange = range_t{0, _height}; sender->setPos(posRange.clip(sender->pos())); // Limit deviation range to half of total BW (either side of centre) - auto deviationRange = range_t{2, height / 2}; + auto deviationRange = range_t{2, _height / 2}; _deviation = deviationRange.clip(std::abs(sender->pos() - cfCursor->pos())); } else { - auto cfRange = range_t{_deviation, height - _deviation}; + auto cfRange = range_t{_deviation, _height - _deviation}; sender->setPos(cfRange.clip(sender->pos())); } @@ -113,7 +113,11 @@ void Tuner::setDeviation(int dev) void Tuner::setHeight(int height) { - this->height = height; + _height = height; +} + +int Tuner::height() { + return _height; } void Tuner::updateCursors() diff --git a/src/tuner.h b/src/tuner.h index 958d9a74..a3302466 100644 --- a/src/tuner.h +++ b/src/tuner.h @@ -34,6 +34,7 @@ class Tuner : public QObject Tuner(int height, QObject * parent); int centre(); int deviation(); + int height(); bool mouseEvent(QEvent::Type, QMouseEvent event); void paintFront(QPainter &painter, QRect &rect, range_t sampleRange); void setCentre(int centre); @@ -53,5 +54,5 @@ public slots: Cursor *cfCursor; Cursor *maxCursor; int _deviation; - int height; + int _height; };