From 29d3893bb0153f3ed7c3b3de8c3c62330ff74aab Mon Sep 17 00:00:00 2001 From: Elliott Liggett Date: Wed, 24 Feb 2021 00:18:19 -0800 Subject: [PATCH] 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. --- meter.cpp | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++ meter.h | 47 ++++++++++++++++++++ wfmain.cpp | 33 +++++++++++++- wfmain.h | 6 +++ wfmain.ui | 25 +++-------- wfview.pro | 6 ++- 6 files changed, 219 insertions(+), 22 deletions(-) create mode 100644 meter.cpp create mode 100644 meter.h diff --git a/meter.cpp b/meter.cpp new file mode 100644 index 0000000..adcb4cc --- /dev/null +++ b/meter.cpp @@ -0,0 +1,124 @@ +#include "meter.h" +#include + +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(; idrawText(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(; idrawText(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); + +} diff --git a/meter.h b/meter.h new file mode 100644 index 0000000..5bf5c93 --- /dev/null +++ b/meter.h @@ -0,0 +1,47 @@ +#ifndef METER_H +#define METER_H + +#include +#include + +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 diff --git a/wfmain.cpp b/wfmain.cpp index 7d89f3c..2cffde7 100644 --- a/wfmain.cpp +++ b/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); diff --git a/wfmain.h b/wfmain.h index a1d8d5f..eff3703 100644 --- a/wfmain.h +++ b/wfmain.h @@ -454,6 +454,12 @@ private: QByteArray spectrumPeaks; + QByteArray powerMeterReadings; + int powerMeterPos = 0; + + QByteArray SMeterReadings; + int smeterPos=0; + QVector wfimage; bool onFullscreen; diff --git a/wfmain.ui b/wfmain.ui index 317dc50..c4e9b27 100644 --- a/wfmain.ui +++ b/wfmain.ui @@ -190,24 +190,7 @@ - - - Signal - - - - - - - 255 - - - 100 - - - false - - + @@ -1964,6 +1947,12 @@ QCustomPlot 1 + + meter + QWidget +
meter.h
+ 1 +
diff --git a/wfview.pro b/wfview.pro index 9d3c63e..b4e71fe 100644 --- a/wfview.pro +++ b/wfview.pro @@ -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 \