diff --git a/sdrgui/gui/glspectrum.cpp b/sdrgui/gui/glspectrum.cpp
index 621ef092f..388fe6845 100644
--- a/sdrgui/gui/glspectrum.cpp
+++ b/sdrgui/gui/glspectrum.cpp
@@ -1180,13 +1180,36 @@ void GLSpectrum::drawMarkers()
if (m_histogramMarkers.at(i).m_markerType == SpectrumHistogramMarkerTypePower)
{
+ float power = m_currentSpectrum[m_histogramMarkers.at(i).m_fftBin];
ypoint.ry() =
- (m_powerScale.getRangeMax() - m_currentSpectrum[m_histogramMarkers.at(i).m_fftBin]) / m_powerScale.getRange();
+ (m_powerScale.getRangeMax() - power) / m_powerScale.getRange();
ypoint.ry() = ypoint.ry() < 0 ?
0 : ypoint.ry() > 1 ?
1 : ypoint.ry();
powerStr = displayScaledF(
- m_currentSpectrum[m_histogramMarkers.at(i).m_fftBin],
+ power,
+ m_linear ? 'e' : 'f',
+ m_linear ? 3 : 1,
+ false
+ );
+ }
+ else if (m_histogramMarkers.at(i).m_markerType == SpectrumHistogramMarkerTypePowerMax)
+ {
+ float power = m_currentSpectrum[m_histogramMarkers.at(i).m_fftBin];
+
+ if ((m_histogramMarkers.at(i).m_holdReset) || (power > m_histogramMarkers[i].m_powerMax))
+ {
+ m_histogramMarkers[i].m_powerMax = power;
+ m_histogramMarkers[i].m_holdReset = false;
+ }
+
+ ypoint.ry() =
+ (m_powerScale.getRangeMax() - m_histogramMarkers[i].m_powerMax) / m_powerScale.getRange();
+ ypoint.ry() = ypoint.ry() < 0 ?
+ 0 : ypoint.ry() > 1 ?
+ 1 : ypoint.ry();
+ powerStr = displayScaledF(
+ m_histogramMarkers[i].m_powerMax,
m_linear ? 'e' : 'f',
m_linear ? 3 : 1,
false
@@ -1230,12 +1253,24 @@ void GLSpectrum::drawMarkers()
else
{
textColor.setAlpha(192);
- float power0 = m_histogramMarkers.at(0).m_markerType == SpectrumHistogramMarkerTypePower ?
- m_currentSpectrum[m_histogramMarkers.at(0).m_fftBin] :
- m_linear ? m_histogramMarkers.at(0).m_power : CalcDb::dbPower(m_histogramMarkers.at(0).m_power);
- float poweri = m_histogramMarkers.at(i).m_markerType == SpectrumHistogramMarkerTypePower ?
- m_currentSpectrum[m_histogramMarkers.at(i).m_fftBin] :
- m_linear ? m_histogramMarkers.at(i).m_power : CalcDb::dbPower(m_histogramMarkers.at(i).m_power);
+ float power0, poweri;
+
+ if (m_histogramMarkers.at(0).m_markerType == SpectrumHistogramMarkerTypePower) {
+ power0 = m_currentSpectrum[m_histogramMarkers.at(0).m_fftBin];
+ } else if (m_histogramMarkers.at(0).m_markerType == SpectrumHistogramMarkerTypePowerMax) {
+ power0 = m_histogramMarkers.at(0).m_powerMax;
+ } else {
+ power0 = m_linear ? m_histogramMarkers.at(0).m_power : CalcDb::dbPower(m_histogramMarkers.at(0).m_power);
+ }
+
+ if (m_histogramMarkers.at(i).m_markerType == SpectrumHistogramMarkerTypePower) {
+ poweri = m_currentSpectrum[m_histogramMarkers.at(i).m_fftBin];
+ } else if (m_histogramMarkers.at(i).m_markerType == SpectrumHistogramMarkerTypePowerMax) {
+ poweri = m_histogramMarkers.at(i).m_powerMax;
+ } else {
+ poweri = m_linear ? m_histogramMarkers.at(i).m_power : CalcDb::dbPower(m_histogramMarkers.at(i).m_power);
+ }
+
QString deltaPowerStr;
if (m_linear) {
diff --git a/sdrgui/gui/spectrummarkers.h b/sdrgui/gui/spectrummarkers.h
index e3f08f3aa..c55734404 100644
--- a/sdrgui/gui/spectrummarkers.h
+++ b/sdrgui/gui/spectrummarkers.h
@@ -27,7 +27,8 @@
enum SpectrumHistogramMarkerType {
SpectrumHistogramMarkerTypeManual,
- SpectrumHistogramMarkerTypePower
+ SpectrumHistogramMarkerTypePower,
+ SpectrumHistogramMarkerTypePowerMax
};
struct SpectrumHistogramMarker
@@ -36,6 +37,8 @@ struct SpectrumHistogramMarker
float m_frequency;
int m_fftBin;
float m_power;
+ bool m_holdReset;
+ float m_powerMax;
SpectrumHistogramMarkerType m_markerType;
QColor m_markerColor;
QString m_frequencyStr;
@@ -49,6 +52,8 @@ struct SpectrumHistogramMarker
m_frequency(0),
m_fftBin(0),
m_power(0),
+ m_holdReset(true),
+ m_powerMax(0),
m_markerType(SpectrumHistogramMarkerTypeManual),
m_markerColor(QColorConstants::White),
m_frequencyStr(),
@@ -62,6 +67,8 @@ struct SpectrumHistogramMarker
float frequency,
int fftBin,
float power,
+ bool holdReset,
+ float powerMax,
SpectrumHistogramMarkerType markerType,
QColor markerColor,
const QString& frequencyStr,
@@ -73,6 +80,8 @@ struct SpectrumHistogramMarker
m_frequency(frequency),
m_fftBin(fftBin),
m_power(power),
+ m_holdReset(holdReset),
+ m_powerMax(powerMax),
m_markerType(markerType),
m_markerColor(markerColor),
m_frequencyStr(frequencyStr),
diff --git a/sdrgui/gui/spectrummarkersdialog.cpp b/sdrgui/gui/spectrummarkersdialog.cpp
index a53b57255..cc749ef5d 100644
--- a/sdrgui/gui/spectrummarkersdialog.cpp
+++ b/sdrgui/gui/spectrummarkersdialog.cpp
@@ -250,6 +250,15 @@ void SpectrumMarkersDialog::on_powerMode_currentIndexChanged(int index)
m_histogramMarkers[m_histogramMarkerIndex].m_markerType = (SpectrumHistogramMarkerType) index;
}
+void SpectrumMarkersDialog::on_powerHoldReset_clicked()
+{
+ if (m_histogramMarkers.size() == 0) {
+ return;
+ }
+
+ m_histogramMarkers[m_histogramMarkerIndex].m_holdReset = true;
+}
+
void SpectrumMarkersDialog::on_wMarkerFrequency_changed(qint64 value)
{
if (m_waterfallMarkers.size() == 0) {
diff --git a/sdrgui/gui/spectrummarkersdialog.h b/sdrgui/gui/spectrummarkersdialog.h
index e6c48f53c..d4c0d3622 100644
--- a/sdrgui/gui/spectrummarkersdialog.h
+++ b/sdrgui/gui/spectrummarkersdialog.h
@@ -68,6 +68,7 @@ private slots:
void on_markerAdd_clicked();
void on_markerDel_clicked();
void on_powerMode_currentIndexChanged(int index);
+ void on_powerHoldReset_clicked();
void on_wMarkerFrequency_changed(qint64 value);
void on_timeCoarse_valueChanged(int value);
void on_timeFine_valueChanged(int value);
diff --git a/sdrgui/gui/spectrummarkersdialog.ui b/sdrgui/gui/spectrummarkersdialog.ui
index 3d35da8df..ba041adac 100644
--- a/sdrgui/gui/spectrummarkersdialog.ui
+++ b/sdrgui/gui/spectrummarkersdialog.ui
@@ -6,7 +6,7 @@
0
0
- 390
+ 418
201
@@ -34,7 +34,7 @@
0
10
- 361
+ 391
74
@@ -367,6 +367,22 @@
+ -
+
+
+
+ 24
+ 24
+
+
+
+ Reset power max hold
+
+
+ R
+
+
+
-
@@ -382,7 +398,12 @@
-
- Pow
+ Cur
+
+
+ -
+
+ Max
@@ -449,7 +470,7 @@
0
10
- 361
+ 391
93