mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-12-23 01:55:48 -05:00
GLSpectrum: added markers. Implements #557
This commit is contained in:
parent
a4a16265a3
commit
49c6027b8e
BIN
doc/img/Spectrum_Markers.png
Normal file
BIN
doc/img/Spectrum_Markers.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 372 KiB |
BIN
doc/img/Spectrum_Markers.xcf
Normal file
BIN
doc/img/Spectrum_Markers.xcf
Normal file
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -126,6 +126,103 @@ private:
|
||||
CSChannel,
|
||||
CSChannelMoving
|
||||
};
|
||||
struct HistogramMarker {
|
||||
QPointF m_point;
|
||||
float m_frequency;
|
||||
float m_power;
|
||||
QString m_frequencyStr;
|
||||
QString m_powerStr;
|
||||
QString m_deltaFrequencyStr;
|
||||
QString m_deltaPowerStr;
|
||||
HistogramMarker() :
|
||||
m_point(0, 0),
|
||||
m_frequency(0),
|
||||
m_power(0),
|
||||
m_frequencyStr(),
|
||||
m_powerStr(),
|
||||
m_deltaFrequencyStr(),
|
||||
m_deltaPowerStr()
|
||||
{}
|
||||
HistogramMarker(
|
||||
const QPointF& point,
|
||||
float frequency,
|
||||
float power,
|
||||
const QString& frequencyStr,
|
||||
const QString& powerStr,
|
||||
const QString& deltaFrequencyStr,
|
||||
const QString& deltaPowerStr
|
||||
) :
|
||||
m_point(point),
|
||||
m_frequency(frequency),
|
||||
m_power(power),
|
||||
m_frequencyStr(frequencyStr),
|
||||
m_powerStr(powerStr),
|
||||
m_deltaFrequencyStr(deltaFrequencyStr),
|
||||
m_deltaPowerStr(deltaPowerStr)
|
||||
{}
|
||||
HistogramMarker(const HistogramMarker& other) :
|
||||
m_point(other.m_point),
|
||||
m_frequency(other.m_frequency),
|
||||
m_power(other.m_power),
|
||||
m_frequencyStr(other.m_frequencyStr),
|
||||
m_powerStr(other.m_powerStr),
|
||||
m_deltaFrequencyStr(other.m_deltaFrequencyStr),
|
||||
m_deltaPowerStr(other.m_deltaPowerStr)
|
||||
{}
|
||||
explicit operator HistogramMarker() const {
|
||||
return HistogramMarker{static_cast<HistogramMarker>(*this)};
|
||||
}
|
||||
};
|
||||
QList<HistogramMarker> m_histogramMarkers;
|
||||
|
||||
struct WaterfallMarker {
|
||||
QPointF m_point;
|
||||
float m_frequency;
|
||||
float m_time;
|
||||
QString m_frequencyStr;
|
||||
QString m_timeStr;
|
||||
QString m_deltaFrequencyStr;
|
||||
QString m_deltaTimeStr;
|
||||
WaterfallMarker() :
|
||||
m_point(0, 0),
|
||||
m_frequency(0),
|
||||
m_time(0),
|
||||
m_frequencyStr(),
|
||||
m_timeStr(),
|
||||
m_deltaFrequencyStr(),
|
||||
m_deltaTimeStr()
|
||||
{}
|
||||
WaterfallMarker(
|
||||
const QPointF& point,
|
||||
float frequency,
|
||||
float time,
|
||||
const QString& frequencyStr,
|
||||
const QString& timeStr,
|
||||
const QString& deltaFrequencyStr,
|
||||
const QString& deltaTimeStr
|
||||
) :
|
||||
m_point(point),
|
||||
m_frequency(frequency),
|
||||
m_time(time),
|
||||
m_frequencyStr(frequencyStr),
|
||||
m_timeStr(timeStr),
|
||||
m_deltaFrequencyStr(deltaFrequencyStr),
|
||||
m_deltaTimeStr(deltaTimeStr)
|
||||
{}
|
||||
WaterfallMarker(const WaterfallMarker& other) :
|
||||
m_point(other.m_point),
|
||||
m_frequency(other.m_frequency),
|
||||
m_time(other.m_time),
|
||||
m_frequencyStr(other.m_frequencyStr),
|
||||
m_timeStr(other.m_timeStr),
|
||||
m_deltaFrequencyStr(other.m_deltaFrequencyStr),
|
||||
m_deltaTimeStr(other.m_deltaTimeStr)
|
||||
{}
|
||||
explicit operator WaterfallMarker() const {
|
||||
return WaterfallMarker{static_cast<WaterfallMarker>(*this)};
|
||||
}
|
||||
};
|
||||
QList<WaterfallMarker> m_waterfallMarkers;
|
||||
|
||||
CursorState m_cursorState;
|
||||
int m_cursorChannel;
|
||||
@ -158,12 +255,21 @@ private:
|
||||
Real m_waterfallShare;
|
||||
|
||||
int m_leftMargin;
|
||||
int m_rightMargin;
|
||||
int m_topMargin;
|
||||
int m_frequencyScaleHeight;
|
||||
int m_histogramHeight;
|
||||
int m_waterfallHeight;
|
||||
int m_bottomMargin;
|
||||
QFont m_textOverlayFont;
|
||||
QPixmap m_leftMarginPixmap;
|
||||
QPixmap m_frequencyPixmap;
|
||||
ScaleEngine m_timeScale;
|
||||
ScaleEngine m_powerScale;
|
||||
ScaleEngine m_frequencyScale;
|
||||
QRectF m_histogramRect;
|
||||
QRect m_frequencyScaleRect;
|
||||
QRectF m_waterfallRect;
|
||||
QMatrix4x4 m_glFrequencyScaleBoxMatrix;
|
||||
QMatrix4x4 m_glLeftScaleBoxMatrix;
|
||||
|
||||
@ -195,6 +301,7 @@ private:
|
||||
GLShaderTextured m_glShaderFrequencyScale;
|
||||
GLShaderTextured m_glShaderWaterfall;
|
||||
GLShaderTextured m_glShaderHistogram;
|
||||
GLShaderTextured m_glShaderTextOverlay;
|
||||
int m_matrixLoc;
|
||||
int m_colorLoc;
|
||||
IncrementalArray<GLfloat> m_q3TickTime;
|
||||
@ -224,6 +331,20 @@ private:
|
||||
void enterEvent(QEvent* event);
|
||||
void leaveEvent(QEvent* event);
|
||||
|
||||
QString displayScaled(int64_t value, char type, int precision, bool showMult);
|
||||
QString displayScaledF(float value, char type, int precision, bool showMult);
|
||||
QString displayScaledM(float value, char type, int precision, bool showMult);
|
||||
int getPrecision(int value);
|
||||
void drawTextOverlay( //!< Draws a text overlay
|
||||
const QString& text,
|
||||
const QColor& color,
|
||||
const QFont& font,
|
||||
float shiftX,
|
||||
float shiftY,
|
||||
bool leftHalf,
|
||||
bool topHalf,
|
||||
const QRectF& glRect);
|
||||
|
||||
private slots:
|
||||
void cleanup();
|
||||
void tick();
|
||||
|
@ -36,6 +36,26 @@ public:
|
||||
};
|
||||
typedef QList<Tick> TickList;
|
||||
|
||||
ScaleEngine();
|
||||
|
||||
void setOrientation(Qt::Orientation orientation);
|
||||
void setFont(const QFont& font);
|
||||
void setSize(float size);
|
||||
float getSize() { return m_size; }
|
||||
void setRange(Unit::Physical physicalUnit, float rangeMin, float rangeMax);
|
||||
float getRange() const { return m_rangeMax - m_rangeMin; }
|
||||
void setMakeOpposite(bool makeOpposite) { m_makeOpposite = makeOpposite; }
|
||||
void setFixedDecimalPlaces(int decimalPlaces) { m_fixedDecimalPlaces =decimalPlaces; }
|
||||
|
||||
float getPosFromValue(double value);
|
||||
float getValueFromPos(double pos);
|
||||
const TickList& getTickList();
|
||||
|
||||
QString getRangeMinStr();
|
||||
QString getRangeMaxStr();
|
||||
|
||||
float getScaleWidth();
|
||||
|
||||
private:
|
||||
// base configuration
|
||||
Qt::Orientation m_orientation;
|
||||
@ -70,26 +90,6 @@ private:
|
||||
|
||||
double majorTickValue(int tick);
|
||||
double minorTickValue(int tick);
|
||||
|
||||
public:
|
||||
ScaleEngine();
|
||||
|
||||
void setOrientation(Qt::Orientation orientation);
|
||||
void setFont(const QFont& font);
|
||||
void setSize(float size);
|
||||
float getSize() { return m_size; }
|
||||
void setRange(Unit::Physical physicalUnit, float rangeMin, float rangeMax);
|
||||
void setMakeOpposite(bool makeOpposite) { m_makeOpposite = makeOpposite; }
|
||||
void setFixedDecimalPlaces(int decimalPlaces) { m_fixedDecimalPlaces =decimalPlaces; }
|
||||
|
||||
float getPosFromValue(double value);
|
||||
float getValueFromPos(double pos);
|
||||
const TickList& getTickList();
|
||||
|
||||
QString getRangeMinStr();
|
||||
QString getRangeMaxStr();
|
||||
|
||||
float getScaleWidth();
|
||||
};
|
||||
|
||||
#endif // INCLUDE_SCALEENGINE_H
|
||||
|
@ -829,6 +829,20 @@ This shows the spectrum in the passband returned from the sampling device possib
|
||||
|
||||
The spectrum display is controlled by the display control (4).
|
||||
|
||||
<h4>Spectrum markers</h4>
|
||||
|
||||
![Spectrum Markers](../doc/img/Spectrum_Markers.png)
|
||||
|
||||
Left click while pressing the Shift key in the spectrum or waterfall window to set the markers. Right click in the same window to remove the last entered marker.
|
||||
|
||||
There is a maximum of two markers on each window with a different status:
|
||||
- the legend of the first marker is the frequency (2) and power (1) or delay (5). The frequency legend appears on the spectrum side closest to the frequency rule.
|
||||
- the legend of the second marker is the frequency difference with the first marker (3 or 6) and the difference in power (4) or time (7). It appears on the spectrum opposite side of the corresponding first marker legend.
|
||||
|
||||
Frequency difference units are Hz suffixed with a multiplier suffix k, M or G for kHz, MHz or GHz respectively.
|
||||
|
||||
Time units are seconds suffixed with a divisor suffix m, u, n, p for ms, us, ns or ps respectively.
|
||||
|
||||
<h3>8. Status</h3>
|
||||
|
||||
![Main Window status](../doc/img/MainWindow_status.png)
|
||||
|
Loading…
Reference in New Issue
Block a user