From 238a40b9e09d64433e14de848f7ff1f4fe21ad02 Mon Sep 17 00:00:00 2001 From: srcejon Date: Wed, 6 Dec 2023 10:09:30 +0000 Subject: [PATCH] Allow replay time offset to be set by ctrl+left click in waterfall. --- plugins/samplesource/airspyhf/airspyhfgui.cpp | 5 +++++ plugins/samplesource/airspyhf/airspyhfgui.h | 1 + plugins/samplesource/rtlsdr/rtlsdrgui.cpp | 5 +++++ plugins/samplesource/rtlsdr/rtlsdrgui.h | 1 + .../samplesource/sdrplayv3/sdrplayv3gui.cpp | 5 +++++ plugins/samplesource/sdrplayv3/sdrplayv3gui.h | 1 + .../samplesource/usrpinput/usrpinputgui.cpp | 5 +++++ plugins/samplesource/usrpinput/usrpinputgui.h | 1 + .../samplesource/usrpinput/usrpinputgui.ui | 22 +++++++++---------- .../usrpinput/usrpinputsettings.h | 2 +- sdrgui/device/devicegui.h | 1 + sdrgui/device/deviceuiset.cpp | 9 ++++++++ sdrgui/device/deviceuiset.h | 1 + sdrgui/gui/glspectrumview.cpp | 12 ++++++++++ sdrgui/gui/glspectrumview.h | 2 ++ sdrgui/mainspectrum/mainspectrumgui.cpp | 7 ++++++ sdrgui/mainspectrum/mainspectrumgui.h | 2 ++ 17 files changed, 70 insertions(+), 12 deletions(-) diff --git a/plugins/samplesource/airspyhf/airspyhfgui.cpp b/plugins/samplesource/airspyhf/airspyhfgui.cpp index 59e464db7..159f996f2 100644 --- a/plugins/samplesource/airspyhf/airspyhfgui.cpp +++ b/plugins/samplesource/airspyhf/airspyhfgui.cpp @@ -623,6 +623,11 @@ void AirspyHFGui::on_replayLoop_toggled(bool checked) sendSettings(); } +void AirspyHFGui::setReplayTime(float time) +{ + ui->replayOffset->setValue(std::ceil(time * 10.0f)); +} + void AirspyHFGui::makeUIConnections() { QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &AirspyHFGui::on_centerFrequency_changed); diff --git a/plugins/samplesource/airspyhf/airspyhfgui.h b/plugins/samplesource/airspyhf/airspyhfgui.h index 877dd3e90..d3d48cd42 100644 --- a/plugins/samplesource/airspyhf/airspyhfgui.h +++ b/plugins/samplesource/airspyhf/airspyhfgui.h @@ -46,6 +46,7 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue* getInputMessageQueue() { return &m_inputMessageQueue; } + void setReplayTime(float time) override; uint32_t getDevSampleRate(unsigned int index); int getDevSampleRateIndex(uint32_t sampleRate); diff --git a/plugins/samplesource/rtlsdr/rtlsdrgui.cpp b/plugins/samplesource/rtlsdr/rtlsdrgui.cpp index 963e224c4..1cb0e9b21 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrgui.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrgui.cpp @@ -691,6 +691,11 @@ void RTLSDRGui::on_replayLoop_toggled(bool checked) sendSettings(); } +void RTLSDRGui::setReplayTime(float time) +{ + ui->replayOffset->setValue(std::ceil(time * 10.0f)); +} + void RTLSDRGui::makeUIConnections() { QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &RTLSDRGui::on_centerFrequency_changed); diff --git a/plugins/samplesource/rtlsdr/rtlsdrgui.h b/plugins/samplesource/rtlsdr/rtlsdrgui.h index 3cac63c4d..7abfaeba3 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrgui.h +++ b/plugins/samplesource/rtlsdr/rtlsdrgui.h @@ -50,6 +50,7 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + void setReplayTime(float time) override; private: Ui::RTLSDRGui* ui; diff --git a/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp b/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp index 1b7d6e43c..a1df4ec8d 100644 --- a/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp +++ b/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp @@ -687,6 +687,11 @@ void SDRPlayV3Gui::on_replayLoop_toggled(bool checked) sendSettings(); } +void SDRPlayV3Gui::setReplayTime(float time) +{ + ui->replayOffset->setValue(std::ceil(time * 10.0f)); +} + void SDRPlayV3Gui::makeUIConnections() { QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &SDRPlayV3Gui::on_centerFrequency_changed); diff --git a/plugins/samplesource/sdrplayv3/sdrplayv3gui.h b/plugins/samplesource/sdrplayv3/sdrplayv3gui.h index 7a130bebc..8e65a9fa5 100644 --- a/plugins/samplesource/sdrplayv3/sdrplayv3gui.h +++ b/plugins/samplesource/sdrplayv3/sdrplayv3gui.h @@ -46,6 +46,7 @@ public: virtual QByteArray serialize() const; virtual bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + void setReplayTime(float time) override; private: Ui::SDRPlayV3Gui* ui; diff --git a/plugins/samplesource/usrpinput/usrpinputgui.cpp b/plugins/samplesource/usrpinput/usrpinputgui.cpp index 523dff5a5..5a856f5fb 100644 --- a/plugins/samplesource/usrpinput/usrpinputgui.cpp +++ b/plugins/samplesource/usrpinput/usrpinputgui.cpp @@ -769,6 +769,11 @@ void USRPInputGUI::on_replayLoop_toggled(bool checked) sendSettings(); } +void USRPInputGUI::setReplayTime(float time) +{ + ui->replayOffset->setValue(std::ceil(time * 10.0f)); +} + void USRPInputGUI::makeUIConnections() { QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &USRPInputGUI::on_startStop_toggled); diff --git a/plugins/samplesource/usrpinput/usrpinputgui.h b/plugins/samplesource/usrpinput/usrpinputgui.h index 9a0f3dfcc..1a5fa8107 100644 --- a/plugins/samplesource/usrpinput/usrpinputgui.h +++ b/plugins/samplesource/usrpinput/usrpinputgui.h @@ -50,6 +50,7 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + void setReplayTime(float time) override; private: Ui::USRPInputGUI* ui; diff --git a/plugins/samplesource/usrpinput/usrpinputgui.ui b/plugins/samplesource/usrpinput/usrpinputgui.ui index b20bc042b..1110ab685 100644 --- a/plugins/samplesource/usrpinput/usrpinputgui.ui +++ b/plugins/samplesource/usrpinput/usrpinputgui.ui @@ -875,28 +875,28 @@ - - ValueDial - QWidget -
gui/valuedial.h
- 1 -
ButtonSwitch QToolButton
gui/buttonswitch.h
- - TransverterButton - QPushButton -
gui/transverterbutton.h
-
ValueDialZ QWidget
gui/valuedialz.h
1
+ + ValueDial + QWidget +
gui/valuedial.h
+ 1 +
+ + TransverterButton + QPushButton +
gui/transverterbutton.h
+
diff --git a/plugins/samplesource/usrpinput/usrpinputsettings.h b/plugins/samplesource/usrpinput/usrpinputsettings.h index 6bd90fa36..ae2f6e15d 100644 --- a/plugins/samplesource/usrpinput/usrpinputsettings.h +++ b/plugins/samplesource/usrpinput/usrpinputsettings.h @@ -55,7 +55,7 @@ struct USRPInputSettings float m_replayOffset; //!< Replay offset in seconds float m_replayLength; //!< Replay buffer size in seconds float m_replayStep; //!< Replay forward/back step size in seconds - bool m_replayLoop; //!< Replay buffer repeatedly without recording new data + bool m_replayLoop; //!< Replay buffer repeatedly without recording new data bool m_useReverseAPI; QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; diff --git a/sdrgui/device/devicegui.h b/sdrgui/device/devicegui.h index 69f78ee3a..94eb2a4c6 100644 --- a/sdrgui/device/devicegui.h +++ b/sdrgui/device/devicegui.h @@ -81,6 +81,7 @@ public: void setCurrentDeviceIndex(int index) { m_currentDeviceIndex = index; } //!< index in plugins list void setChannelNames(const QStringList& channelNames) { m_channelAddDialog.addChannelNames(channelNames); } DeviceUISet* getDeviceUISet() { return m_deviceUISet; } + virtual void setReplayTime(float time) {} //!< Not supported by all devices protected: void closeEvent(QCloseEvent *event) override; diff --git a/sdrgui/device/deviceuiset.cpp b/sdrgui/device/deviceuiset.cpp index 28c1dfe03..53bde72f2 100644 --- a/sdrgui/device/deviceuiset.cpp +++ b/sdrgui/device/deviceuiset.cpp @@ -73,6 +73,8 @@ DeviceUISet::DeviceUISet(int deviceSetIndex, DeviceSet *deviceSet) font.setFamily(QStringLiteral("Liberation Sans")); font.setPointSize(9); m_spectrum->setFont(font); + + connect(m_mainSpectrumGUI, &MainSpectrumGUI::timeSelected, this, &DeviceUISet::onTimeSelected); } DeviceUISet::~DeviceUISet() @@ -825,3 +827,10 @@ int DeviceUISet::webapiSpectrumServerDelete(SWGSDRangel::SWGSuccessResponse& res { return m_spectrumVis->webapiSpectrumServerDelete(response, errorMessage); } + +void DeviceUISet::onTimeSelected(int deviceSetIndex, float time) +{ + if (m_deviceGUI) { + m_deviceGUI->setReplayTime(time); + } +} diff --git a/sdrgui/device/deviceuiset.h b/sdrgui/device/deviceuiset.h index d0cd6f38b..f195364fd 100644 --- a/sdrgui/device/deviceuiset.h +++ b/sdrgui/device/deviceuiset.h @@ -167,6 +167,7 @@ private: private slots: void handleChannelGUIClosing(ChannelGUI* channelGUI); void handleDeleteChannel(ChannelAPI *channelAPI); + void onTimeSelected(int deviceSetIndex, float time); }; diff --git a/sdrgui/gui/glspectrumview.cpp b/sdrgui/gui/glspectrumview.cpp index 8b0edc547..a6d83347f 100644 --- a/sdrgui/gui/glspectrumview.cpp +++ b/sdrgui/gui/glspectrumview.cpp @@ -4175,6 +4175,18 @@ void GLSpectrumView::mousePressEvent(QMouseEvent* event) { frequencyPan(event); } + else if (event->modifiers() & Qt::ControlModifier) + { + if (!m_display3DSpectrogram && pointInWaterfallOrSpectrogram(ep)) + { + QPointF pWat = ep; + pWat.rx() = (ep.x()/width() - m_waterfallRect.left()) / m_waterfallRect.width(); + pWat.ry() = (ep.y()/height() - m_waterfallRect.top()) / m_waterfallRect.height(); + float time = m_timeScale.getRangeMin() + pWat.y()*m_timeScale.getRange(); + emit timeSelected(time); + } + return; + } else if (m_display3DSpectrogram) { // Detect click and drag to rotate 3D spectrogram diff --git a/sdrgui/gui/glspectrumview.h b/sdrgui/gui/glspectrumview.h index 6bc21fe30..8bef04239 100644 --- a/sdrgui/gui/glspectrumview.h +++ b/sdrgui/gui/glspectrumview.h @@ -541,6 +541,8 @@ signals: void requestCenterFrequency(qint64 frequency); // Emitted when annotations are changed void updateAnnotations(); + // Emitted when user ctrl-clicks on waterfall to select a time. time is in seconds. + void timeSelected(float time); }; diff --git a/sdrgui/mainspectrum/mainspectrumgui.cpp b/sdrgui/mainspectrum/mainspectrumgui.cpp index bdaf66a43..d01381e13 100644 --- a/sdrgui/mainspectrum/mainspectrumgui.cpp +++ b/sdrgui/mainspectrum/mainspectrumgui.cpp @@ -157,6 +157,8 @@ MainSpectrumGUI::MainSpectrumGUI(GLSpectrum *spectrum, GLSpectrumGUI *spectrumGU connect(spectrum->getSpectrumView(), &GLSpectrumView::requestCenterFrequency, this, &MainSpectrumGUI::onRequestCenterFrequency); connect(spectrumGUI, &GLSpectrumGUI::requestCenterFrequency, this, &MainSpectrumGUI::onRequestCenterFrequency); + connect(spectrum->getSpectrumView(), &GLSpectrumView::timeSelected, this, &MainSpectrumGUI::onTimeSelected); + m_resizer.enableChildMouseTracking(); shrinkWindow(); } @@ -380,3 +382,8 @@ void MainSpectrumGUI::onRequestCenterFrequency(qint64 frequency) { emit requestCenterFrequency(m_deviceSetIndex, frequency); } + +void MainSpectrumGUI::onTimeSelected(float time) +{ + emit timeSelected(m_deviceSetIndex, time); +} diff --git a/sdrgui/mainspectrum/mainspectrumgui.h b/sdrgui/mainspectrum/mainspectrumgui.h index 608e27800..ce8a21b9c 100644 --- a/sdrgui/mainspectrum/mainspectrumgui.h +++ b/sdrgui/mainspectrum/mainspectrumgui.h @@ -113,12 +113,14 @@ private slots: void shrinkWindow(); void maximizeWindow(); void onRequestCenterFrequency(qint64 frequency); + void onTimeSelected(float time); signals: void closing(); void moveToWorkspace(int workspaceIndex); void forceShrink(); void requestCenterFrequency(int deviceSetIndex, qint64 frequency); // an action from the user to move device center frequency + void timeSelected(int deviceSetIndex, float time); // user ctrl-clicked waterfall to set a time };