Power meter for transmit. Much work remains on this meter alone.

merge-requests/5/head
Elliott Liggett 2021-07-16 17:45:07 -07:00
rodzic 6a6a45d079
commit b6a4e06fe2
5 zmienionych plików z 141 dodań i 27 usunięć

117
meter.cpp
Wyświetl plik

@ -23,6 +23,8 @@ meter::meter(QWidget *parent) : QWidget(parent)
// //
// Text in qdarkstylesheet seems to be #EFF0F1 // Text in qdarkstylesheet seems to be #EFF0F1
meterType = meterS;
currentColor.setNamedColor("#148CD2"); currentColor.setNamedColor("#148CD2");
currentColor = currentColor.darker(); currentColor = currentColor.darker();
@ -36,6 +38,12 @@ meter::meter(QWidget *parent) : QWidget(parent)
} }
void meter::setMeterType(meterKind type)
{
meterType = type;
// re-draw scale:
}
void meter::paintEvent(QPaintEvent *) void meter::paintEvent(QPaintEvent *)
{ {
@ -45,18 +53,30 @@ void meter::paintEvent(QPaintEvent *)
// The end effect, is that the drawing functions will all // The end effect, is that the drawing functions will all
// scale to the window size. // scale to the window size.
painter.setWindow(QRect(0, 0, 255+mstart, 50)); painter.setWindow(QRect(0, 0, 255+mXstart, widgetWindowHeight));
drawScale(&painter); switch(meterType)
{
case meterS:
drawScaleS(&painter);
break;
case meterPower:
drawScalePo(&painter);
break;
default:
break;
}
// Current: // Current: the most-current value.
// Draws a bar from start to value.
painter.setPen(currentColor); painter.setPen(currentColor);
painter.setBrush(currentColor); painter.setBrush(currentColor);
painter.drawRect(mstart,mheight,current,mstart); // X, Y, Width, Height
painter.drawRect(mXstart,mYstart,current,barHeight);
// Average: // Average:
painter.setPen(averageColor); painter.setPen(averageColor);
painter.setBrush(averageColor); painter.setBrush(averageColor);
painter.drawRect(mstart+average-1,mheight,1,mstart); painter.drawRect(mXstart+average-1,mYstart,1,barHeight); // bar is 1 pixel wide, height = meter start?
// Peak: // Peak:
painter.setPen(peakColor); painter.setPen(peakColor);
@ -68,7 +88,7 @@ void meter::paintEvent(QPaintEvent *)
painter.setPen(Qt::red); painter.setPen(Qt::red);
} }
painter.drawRect(mstart+peak-1,mheight,2,mstart); painter.drawRect(mXstart+peak-1,mYstart,2,barHeight);
} }
@ -86,17 +106,86 @@ void meter::updateDrawing(int num)
length = num; length = num;
} }
// The drawScale functions draw the numbers and number unerline for each type of meter
void meter::drawScale(QPainter *qp) void meter::drawScalePo(QPainter *qp)
{
// 0000=0% to 0143=50% to 0213=100%
float dnPerWatt = 143.0 / 50.0;
qp->setPen(lowTextColor);
qp->setFont(QFont("Arial", fontSize));
int i=mXstart;
// 13.3 DN per s-unit:
int p=0;
for(; i<mXstart+143; i+=(int)(10*dnPerWatt))
{
// Stop just before the next 10w spot
if(i<mXstart+140)
qp->drawText(i,mXstart, QString("%1").arg(10*(p++)) );
}
// 2 DN per 1 dB now:
// 20 DN per 10 dB
// 40 DN per 20 dB
// Modify current scale position:
// Here, P is now 60 watts:
// Higher scale:
i = i - (int)(10*dnPerWatt); // back one tick first. Otherwise i starts at 178.
qDebug() << "meter i: " << i;
dnPerWatt = (213-143.0) / 50.0; // 1.4 dn per watt
qp->setPen(Qt::yellow);
for(i=mXstart+143; i<mXstart+213; i+=(10*dnPerWatt))
{
qp->drawText(i,mXstart, QString("%1").arg(10*(p++)) );
}
// Now we're out past 100:
qp->setPen(Qt::red);
for(i=mXstart+213; i<mXstart+255; i+=(10*dnPerWatt))
{
qp->drawText(i,mXstart, QString("%1").arg(10*(p++)) );
}
// Now the lines:
qp->setPen(lowLineColor);
qp->drawLine(mXstart,scaleLineYstart,213,scaleLineYstart);
qp->setPen(Qt::red);
qp->drawLine(213,scaleLineYstart,255,scaleLineYstart);
(void)qp;
}
void meter::drawScaleRxdB(QPainter *qp)
{
(void)qp;
}
void meter::drawScaleALC(QPainter *qp)
{
(void)qp;
}
void meter::drawScaleId(QPainter *qp)
{
(void)qp;
}
void meter::drawScaleS(QPainter *qp)
{ {
qp->setPen(lowTextColor); qp->setPen(lowTextColor);
qp->setFont(QFont("Arial", fontSize)); qp->setFont(QFont("Arial", fontSize));
int i=mstart; int i=mXstart;
// 13.3 DN per s-unit: // 13.3 DN per s-unit:
int s=0; int s=0;
for(; i<mstart+120; i+=13) for(; i<mXstart+120; i+=13)
{ {
qp->drawText(i,mstart, QString("%1").arg(s++) ); qp->drawText(i,mXstart, QString("%1").arg(s++) );
} }
// 2 DN per 1 dB now: // 2 DN per 1 dB now:
@ -109,16 +198,16 @@ void meter::drawScale(QPainter *qp)
qp->setPen(Qt::red); qp->setPen(Qt::red);
for(; i<mstart+255; i+=40) for(; i<mXstart+255; i+=40)
{ {
qp->drawText(i,mstart, QString("+%1").arg(s) ); qp->drawText(i,mXstart, QString("+%1").arg(s) );
s = s + 20; s = s + 20;
} }
qp->setPen(lowLineColor); qp->setPen(lowLineColor);
qp->drawLine(mstart,12,130,12); qp->drawLine(mXstart,scaleLineYstart,130,scaleLineYstart);
qp->setPen(Qt::red); qp->setPen(Qt::red);
qp->drawLine(130,12,255,12); qp->drawLine(130,scaleLineYstart,255,scaleLineYstart);
} }

19
meter.h
Wyświetl plik

@ -4,6 +4,8 @@
#include <QWidget> #include <QWidget>
#include <QPainter> #include <QPainter>
#include "rigcommander.h" // for meter types
class meter : public QWidget class meter : public QWidget
{ {
Q_OBJECT Q_OBJECT
@ -17,20 +19,31 @@ public slots:
void updateDrawing(int num); void updateDrawing(int num);
void setLevels(int current, int peak, int average); void setLevels(int current, int peak, int average);
void setMeterType(meterKind type);
private: private:
//QPainter painter; //QPainter painter;
meterKind meterType;
int fontSize = 5; int fontSize = 5;
int length=30; int length=30;
int current=0; int current=0;
int peak = 0; int peak = 0;
int average = 0; int average = 0;
int mstart = 10; // Starting point for S=0. int mXstart = 10; // Starting point for S=0.
int mheight = 14; // "thickness" of the meter block rectangle int mYstart = 14; // height, down from top, where the drawing starts
int barHeight = 10; // Height of meter "bar" indicators
int scaleLineYstart = 12;
void drawScale(QPainter *qp); int widgetWindowHeight = mYstart + barHeight; // height of drawing canvis.
void drawScaleS(QPainter *qp);
void drawScalePo(QPainter *qp);
void drawScaleRxdB(QPainter *qp);
void drawScaleALC(QPainter *qp);
void drawScaleVd(QPainter *qp);
void drawScaleId(QPainter *qp);
QColor currentColor; QColor currentColor;
QColor averageColor; QColor averageColor;

Wyświetl plik

@ -25,7 +25,10 @@ enum meterKind {
meterALC, meterALC,
meterComp, meterComp,
meterVoltage, meterVoltage,
meterCurrent meterCurrent,
meterRxdB,
meterTxMod,
meterRxAudio
}; };
enum spectrumMode { enum spectrumMode {

Wyświetl plik

@ -4492,9 +4492,9 @@ void wfmain::receiveMeter(meterKind inMeter, unsigned char level)
sum += (unsigned char)SMeterReadings.at(i); sum += (unsigned char)SMeterReadings.at(i);
} }
average = sum / SMeterReadings.length(); average = sum / SMeterReadings.length();
ui->meterWidget->setLevels(level, peak, average); ui->meterSPoWidget->setMeterType(meterS);
ui->meterWidget->repaint(); ui->meterSPoWidget->setLevels(level, peak, average);
//ui->levelIndicator->setValue((int)level); ui->meterSPoWidget->repaint();
break; break;
case meterSWR: case meterSWR:
//ui->levelIndicator->setValue((int)level); //ui->levelIndicator->setValue((int)level);
@ -4508,9 +4508,9 @@ void wfmain::receiveMeter(meterKind inMeter, unsigned char level)
sum += (unsigned char)powerMeterReadings.at(i); sum += (unsigned char)powerMeterReadings.at(i);
} }
average = sum / powerMeterReadings.length(); average = sum / powerMeterReadings.length();
ui->meterWidget->setLevels(level, peak, average); ui->meterSPoWidget->setMeterType(meterPower);
ui->meterWidget->update(); ui->meterSPoWidget->setLevels(level, peak, average);
//ui->levelIndicator->setValue((int)level); ui->meterSPoWidget->update();
break; break;
case meterALC: case meterALC:
//ui->levelIndicator->setValue((int)level); //ui->levelIndicator->setValue((int)level);

Wyświetl plik

@ -18,7 +18,7 @@
<item> <item>
<widget class="QTabWidget" name="tabWidget"> <widget class="QTabWidget" name="tabWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>3</number> <number>0</number>
</property> </property>
<widget class="QWidget" name="mainTab"> <widget class="QWidget" name="mainTab">
<attribute name="title"> <attribute name="title">
@ -238,9 +238,18 @@
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_21"> <layout class="QVBoxLayout" name="meterLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="topMargin">
<number>10</number>
</property>
<property name="bottomMargin">
<number>10</number>
</property>
<item> <item>
<widget class="meter" name="meterWidget" native="true"> <widget class="meter" name="meterSPoWidget" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>