kopia lustrzana https://gitlab.com/eliggett/wfview
Added a nice s-meter. It isn't right yet, but it's a start.
TODO: Change scale for power meter, make sure full-scale fits TODO: create static image from scale to overlay each time rather than drawing each time.merge-requests/2/head
rodzic
5da631ab0a
commit
29d3893bb0
|
@ -0,0 +1,124 @@
|
|||
#include "meter.h"
|
||||
#include <QDebug>
|
||||
|
||||
meter::meter(QWidget *parent) : QWidget(parent)
|
||||
{
|
||||
//QPainter painter(this);
|
||||
|
||||
// Colors from qdarkstylesheet:
|
||||
// $COLOR_BACKGROUND_LIGHT: #505F69;
|
||||
// $COLOR_BACKGROUND_NORMAL: #32414B;
|
||||
// $COLOR_BACKGROUND_DARK: #19232D;
|
||||
// $COLOR_FOREGROUND_LIGHT: #F0F0F0; // grey
|
||||
// $COLOR_FOREGROUND_NORMAL: #AAAAAA; // grey
|
||||
// $COLOR_FOREGROUND_DARK: #787878; // grey
|
||||
// $COLOR_SELECTION_LIGHT: #148CD2;
|
||||
// $COLOR_SELECTION_NORMAL: #1464A0;
|
||||
// $COLOR_SELECTION_DARK: #14506E;
|
||||
|
||||
|
||||
// Colors I found that I liked from VFD images:
|
||||
// 3FB7CD
|
||||
// 3CA0DB
|
||||
//
|
||||
// Text in qdarkstylesheet seems to be #EFF0F1
|
||||
|
||||
currentColor.setNamedColor("#148CD2");
|
||||
currentColor = currentColor.darker();
|
||||
|
||||
peakColor.setNamedColor("#3CA0DB");
|
||||
peakColor = peakColor.lighter();
|
||||
|
||||
averageColor.setNamedColor("#3FB7CD");
|
||||
|
||||
lowTextColor.setNamedColor("#eff0f1");
|
||||
lowLineColor = lowTextColor;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void meter::paintEvent(QPaintEvent *)
|
||||
{
|
||||
QPainter painter(this);
|
||||
// This next line sets up a canvis within the
|
||||
// space of the widget, and gives it corrdinates.
|
||||
// The end effect, is that the drawing functions will all
|
||||
// scale to the window size.
|
||||
|
||||
painter.setWindow(QRect(0, 0, 255+mstart, 50));
|
||||
drawScale(&painter);
|
||||
|
||||
// Current:
|
||||
painter.setPen(currentColor);
|
||||
painter.setBrush(currentColor);
|
||||
painter.drawRect(mstart,mheight,current,mstart);
|
||||
|
||||
// Average:
|
||||
painter.setPen(averageColor);
|
||||
painter.setBrush(averageColor);
|
||||
painter.drawRect(mstart+average-1,mheight,1,mstart);
|
||||
|
||||
// Peak:
|
||||
painter.setPen(peakColor);
|
||||
painter.setBrush(peakColor);
|
||||
if(peak > 120)
|
||||
{
|
||||
// 120 = +S9
|
||||
painter.setBrush(Qt::red);
|
||||
painter.setPen(Qt::red);
|
||||
}
|
||||
|
||||
painter.drawRect(mstart+peak-1,mheight,2,mstart);
|
||||
|
||||
}
|
||||
|
||||
void meter::setLevels(int current, int peak, int average)
|
||||
{
|
||||
this->current = current;
|
||||
this->peak = peak;
|
||||
this->average = average;
|
||||
this->update();
|
||||
}
|
||||
|
||||
void meter::updateDrawing(int num)
|
||||
{
|
||||
fontSize = num;
|
||||
length = num;
|
||||
}
|
||||
|
||||
|
||||
void meter::drawScale(QPainter *qp)
|
||||
{
|
||||
qp->setPen(lowTextColor);
|
||||
qp->setFont(QFont("Arial", fontSize));
|
||||
int i=mstart;
|
||||
// 13.3 DN per s-unit:
|
||||
int s=0;
|
||||
for(; i<mstart+120; i+=13)
|
||||
{
|
||||
qp->drawText(i,mstart, QString("%1").arg(s++) );
|
||||
}
|
||||
|
||||
// 2 DN per 1 dB now:
|
||||
// 20 DN per 10 dB
|
||||
// 40 DN per 20 dB
|
||||
|
||||
// Modify current scale position:
|
||||
s = 20;
|
||||
i+=20;
|
||||
|
||||
qp->setPen(Qt::red);
|
||||
|
||||
for(; i<mstart+255; i+=40)
|
||||
{
|
||||
qp->drawText(i,mstart, QString("+%1").arg(s) );
|
||||
s = s + 20;
|
||||
}
|
||||
|
||||
qp->setPen(lowLineColor);
|
||||
|
||||
qp->drawLine(mstart,12,130,12);
|
||||
qp->setPen(Qt::red);
|
||||
qp->drawLine(130,12,255,12);
|
||||
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
#ifndef METER_H
|
||||
#define METER_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QPainter>
|
||||
|
||||
class meter : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit meter(QWidget *parent = nullptr);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
void paintEvent(QPaintEvent *);
|
||||
|
||||
void updateDrawing(int num);
|
||||
void setLevels(int current, int peak, int average);
|
||||
|
||||
|
||||
private:
|
||||
//QPainter painter;
|
||||
int fontSize = 5;
|
||||
int length=30;
|
||||
int current=0;
|
||||
int peak = 0;
|
||||
int average = 0;
|
||||
|
||||
int mstart = 10; // Starting point for S=0.
|
||||
int mheight = 14; // "thickness" of the meter block rectangle
|
||||
|
||||
void drawScale(QPainter *qp);
|
||||
|
||||
QColor currentColor;
|
||||
QColor averageColor;
|
||||
QColor peakColor;
|
||||
// S0-S9:
|
||||
QColor lowTextColor;
|
||||
QColor lowLineColor;
|
||||
// S9+:
|
||||
QColor highTextColor;
|
||||
QColor highLineColor;
|
||||
|
||||
};
|
||||
|
||||
#endif // METER_H
|
33
wfmain.cpp
33
wfmain.cpp
|
@ -425,6 +425,10 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, QWidget *parent
|
|||
|
||||
drawPeaks = false;
|
||||
|
||||
SMeterReadings.fill(0,10);
|
||||
powerMeterReadings.fill(0,10);
|
||||
|
||||
|
||||
ui->freqMhzLineEdit->setValidator( new QDoubleValidator(0, 100, 6, this));
|
||||
ui->audioPortTxt->setValidator(new QIntValidator(this));
|
||||
ui->serialPortTxt->setValidator(new QIntValidator(this));
|
||||
|
@ -3099,16 +3103,41 @@ void wfmain::receiveLANGain(unsigned char level)
|
|||
|
||||
void wfmain::receiveMeter(meterKind inMeter, unsigned char level)
|
||||
{
|
||||
|
||||
int peak = 0;
|
||||
int sum=0;
|
||||
int average=0;
|
||||
|
||||
|
||||
|
||||
switch(inMeter)
|
||||
{
|
||||
case meterS:
|
||||
ui->levelIndicator->setValue((int)level);
|
||||
SMeterReadings[(smeterPos++)%SMeterReadings.length()] = level;
|
||||
for(int i=0; i < SMeterReadings.length(); i++)
|
||||
{
|
||||
if(SMeterReadings.at(i) > peak)
|
||||
peak = SMeterReadings.at(i);
|
||||
sum += SMeterReadings.at(i);
|
||||
}
|
||||
average = sum / SMeterReadings.length();
|
||||
ui->meterWidget->setLevels(level, peak, average);
|
||||
//ui->levelIndicator->setValue((int)level);
|
||||
break;
|
||||
case meterSWR:
|
||||
//ui->levelIndicator->setValue((int)level);
|
||||
break;
|
||||
case meterPower:
|
||||
ui->levelIndicator->setValue((int)level);
|
||||
powerMeterReadings[(powerMeterPos++)%powerMeterReadings.length()] = level;
|
||||
for(int i=0; i < powerMeterReadings.length(); i++)
|
||||
{
|
||||
if(powerMeterReadings.at(i) > peak)
|
||||
peak = powerMeterReadings.at(i);
|
||||
sum += powerMeterReadings.at(i);
|
||||
}
|
||||
average = sum / powerMeterReadings.length();
|
||||
ui->meterWidget->setLevels(level, peak, average);
|
||||
//ui->levelIndicator->setValue((int)level);
|
||||
break;
|
||||
case meterALC:
|
||||
//ui->levelIndicator->setValue((int)level);
|
||||
|
|
6
wfmain.h
6
wfmain.h
|
@ -454,6 +454,12 @@ private:
|
|||
|
||||
QByteArray spectrumPeaks;
|
||||
|
||||
QByteArray powerMeterReadings;
|
||||
int powerMeterPos = 0;
|
||||
|
||||
QByteArray SMeterReadings;
|
||||
int smeterPos=0;
|
||||
|
||||
QVector <QByteArray> wfimage;
|
||||
|
||||
bool onFullscreen;
|
||||
|
|
25
wfmain.ui
25
wfmain.ui
|
@ -190,24 +190,7 @@
|
|||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_21">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_26">
|
||||
<property name="text">
|
||||
<string>Signal</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QProgressBar" name="levelIndicator">
|
||||
<property name="maximum">
|
||||
<number>255</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="textVisible">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="meter" name="meterWidget" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
|
@ -1964,6 +1947,12 @@
|
|||
<class>QCustomPlot</class>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>meter</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>meter.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
|
|
|
@ -85,7 +85,8 @@ SOURCES += main.cpp\
|
|||
calibrationwindow.cpp \
|
||||
satellitesetup.cpp \
|
||||
udpserversetup.cpp \
|
||||
udpserver.cpp
|
||||
udpserver.cpp \
|
||||
meter.cpp
|
||||
|
||||
HEADERS += wfmain.h \
|
||||
commhandler.h \
|
||||
|
@ -99,7 +100,8 @@ HEADERS += wfmain.h \
|
|||
satellitesetup.h \
|
||||
udpserversetup.h \
|
||||
udpserver.h \
|
||||
packettypes.h
|
||||
packettypes.h \
|
||||
meter.h
|
||||
|
||||
|
||||
FORMS += wfmain.ui \
|
||||
|
|
Ładowanie…
Reference in New Issue