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
-
- 1
-
ButtonSwitch
QToolButton
-
- TransverterButton
- QPushButton
-
-
ValueDialZ
QWidget
1
+
+ ValueDial
+ QWidget
+
+ 1
+
+
+ TransverterButton
+ QPushButton
+
+
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
};