diff --git a/meter.cpp b/meter.cpp index adcb4cc..a3106bf 100644 --- a/meter.cpp +++ b/meter.cpp @@ -23,6 +23,8 @@ meter::meter(QWidget *parent) : QWidget(parent) // // Text in qdarkstylesheet seems to be #EFF0F1 + meterType = meterS; + currentColor.setNamedColor("#148CD2"); 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 *) { @@ -45,18 +53,30 @@ void meter::paintEvent(QPaintEvent *) // 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); + painter.setWindow(QRect(0, 0, 255+mXstart, widgetWindowHeight)); + 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.setBrush(currentColor); - painter.drawRect(mstart,mheight,current,mstart); + // X, Y, Width, Height + painter.drawRect(mXstart,mYstart,current,barHeight); // Average: painter.setPen(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: painter.setPen(peakColor); @@ -68,7 +88,7 @@ void meter::paintEvent(QPaintEvent *) 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; } +// 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(; idrawText(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; idrawText(i,mXstart, QString("%1").arg(10*(p++)) ); + } + + // Now we're out past 100: + qp->setPen(Qt::red); + + for(i=mXstart+213; idrawText(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->setFont(QFont("Arial", fontSize)); - int i=mstart; + int i=mXstart; // 13.3 DN per s-unit: int s=0; - for(; idrawText(i,mstart, QString("%1").arg(s++) ); + qp->drawText(i,mXstart, QString("%1").arg(s++) ); } // 2 DN per 1 dB now: @@ -109,16 +198,16 @@ void meter::drawScale(QPainter *qp) qp->setPen(Qt::red); - for(; idrawText(i,mstart, QString("+%1").arg(s) ); + qp->drawText(i,mXstart, QString("+%1").arg(s) ); s = s + 20; } qp->setPen(lowLineColor); - qp->drawLine(mstart,12,130,12); + qp->drawLine(mXstart,scaleLineYstart,130,scaleLineYstart); qp->setPen(Qt::red); - qp->drawLine(130,12,255,12); + qp->drawLine(130,scaleLineYstart,255,scaleLineYstart); } diff --git a/meter.h b/meter.h index 5bf5c93..e7544cc 100644 --- a/meter.h +++ b/meter.h @@ -4,6 +4,8 @@ #include #include +#include "rigcommander.h" // for meter types + class meter : public QWidget { Q_OBJECT @@ -17,20 +19,31 @@ public slots: void updateDrawing(int num); void setLevels(int current, int peak, int average); + void setMeterType(meterKind type); private: //QPainter painter; + meterKind meterType; 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 + int mXstart = 10; // Starting point for S=0. + 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 averageColor; diff --git a/rigcommander.h b/rigcommander.h index f9dbc8a..a8f81c5 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -25,7 +25,10 @@ enum meterKind { meterALC, meterComp, meterVoltage, - meterCurrent + meterCurrent, + meterRxdB, + meterTxMod, + meterRxAudio }; enum spectrumMode { diff --git a/wfmain.cpp b/wfmain.cpp index 1f8016f..c6c03a6 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -4492,9 +4492,9 @@ void wfmain::receiveMeter(meterKind inMeter, unsigned char level) sum += (unsigned char)SMeterReadings.at(i); } average = sum / SMeterReadings.length(); - ui->meterWidget->setLevels(level, peak, average); - ui->meterWidget->repaint(); - //ui->levelIndicator->setValue((int)level); + ui->meterSPoWidget->setMeterType(meterS); + ui->meterSPoWidget->setLevels(level, peak, average); + ui->meterSPoWidget->repaint(); break; case meterSWR: //ui->levelIndicator->setValue((int)level); @@ -4508,9 +4508,9 @@ void wfmain::receiveMeter(meterKind inMeter, unsigned char level) sum += (unsigned char)powerMeterReadings.at(i); } average = sum / powerMeterReadings.length(); - ui->meterWidget->setLevels(level, peak, average); - ui->meterWidget->update(); - //ui->levelIndicator->setValue((int)level); + ui->meterSPoWidget->setMeterType(meterPower); + ui->meterSPoWidget->setLevels(level, peak, average); + ui->meterSPoWidget->update(); break; case meterALC: //ui->levelIndicator->setValue((int)level); diff --git a/wfmain.ui b/wfmain.ui index 5e59588..bdf8f9e 100644 --- a/wfmain.ui +++ b/wfmain.ui @@ -18,7 +18,7 @@ - 3 + 0 @@ -238,9 +238,18 @@ - + + + 0 + + + 10 + + + 10 + - + 0