From decdfe370b01bcae181309af7ecdd1bbe7df9ef2 Mon Sep 17 00:00:00 2001 From: Elliott Liggett Date: Sun, 18 Jul 2021 14:27:21 -0700 Subject: [PATCH] Added center tuning for IC-R8600, partially moved meter balistics (average and peak) to the meter class. --- meter.cpp | 141 ++++++++++++++++++++++++++++++++++++++++++----- meter.h | 14 +++++ rigcommander.cpp | 14 +++++ rigcommander.h | 2 + wfmain.cpp | 8 +++ wfmain.h | 2 +- 6 files changed, 165 insertions(+), 16 deletions(-) diff --git a/meter.cpp b/meter.cpp index ad5b99e..09c90ef 100644 --- a/meter.cpp +++ b/meter.cpp @@ -36,6 +36,9 @@ meter::meter(QWidget *parent) : QWidget(parent) lowTextColor.setNamedColor("#eff0f1"); lowLineColor = lowTextColor; + avgLevels.resize(averageBalisticLength, 0); + peakLevels.resize(peakBalisticLength, 0); + } void meter::setMeterType(meterKind type) @@ -45,7 +48,13 @@ void meter::setMeterType(meterKind type) meterType = type; // clear average and peak vectors: + avgLevels.clear(); + peakLevels.clear(); + avgLevels.resize(averageBalisticLength, 0); + peakLevels.resize(peakBalisticLength, 0); + peakPosition = 0; + avgPosition = 0; // re-draw scale: } @@ -81,7 +90,13 @@ void meter::paintEvent(QPaintEvent *) peakRedLevel = 100; // SWR 2.5 drawScaleSWR(&painter); break; + case meterCenter: + peakRedLevel = 256; // No need for red here + drawScaleCenter(&painter); + break; default: + peakRedLevel = 200; + drawScaleRaw(&painter); break; } @@ -89,24 +104,48 @@ void meter::paintEvent(QPaintEvent *) // Draws a bar from start to value. painter.setPen(currentColor); painter.setBrush(currentColor); - // X, Y, Width, Height - painter.drawRect(mXstart,mYstart,current,barHeight); - // Average: - painter.setPen(averageColor); - painter.setBrush(averageColor); - painter.drawRect(mXstart+average-1,mYstart,1,barHeight); // bar is 1 pixel wide, height = meter start? - - // Peak: - painter.setPen(peakColor); - painter.setBrush(peakColor); - if(peak > peakRedLevel) + if(meterType == meterCenter) { - painter.setBrush(Qt::red); - painter.setPen(Qt::red); - } + painter.drawRect(mXstart+128,mYstart,current-128,barHeight); - painter.drawRect(mXstart+peak-1,mYstart,2,barHeight); + // Average: + painter.setPen(averageColor); + painter.setBrush(averageColor); + painter.drawRect(mXstart+average-1,mYstart,1,barHeight); // bar is 1 pixel wide, height = meter start? + + // Peak: + painter.setPen(peakColor); + painter.setBrush(peakColor); + if((peak > 191) || (peak < 63)) + { + painter.setBrush(Qt::red); + painter.setPen(Qt::red); + } + + painter.drawRect(mXstart+peak-1,mYstart,1,barHeight); + + } else { + + // X, Y, Width, Height + painter.drawRect(mXstart,mYstart,current,barHeight); + + // Average: + painter.setPen(averageColor); + painter.setBrush(averageColor); + painter.drawRect(mXstart+average-1,mYstart,1,barHeight); // bar is 1 pixel wide, height = meter start? + + // Peak: + painter.setPen(peakColor); + painter.setBrush(peakColor); + if(peak > peakRedLevel) + { + painter.setBrush(Qt::red); + painter.setPen(Qt::red); + } + + painter.drawRect(mXstart+peak-1,mYstart,2,barHeight); + } } @@ -115,6 +154,33 @@ void meter::setLevels(int current, int peak, int average) this->current = current; this->peak = peak; this->average = average; + + avgLevels[(avgPosition++)%averageBalisticLength] = current; + peakLevels[(peakPosition++)%peakBalisticLength] = current; + + // TODO: only average up to clamp(position, size) that way we don't average in + // zeros for the first couple of seconds. We might have to not use the accumulate function + // if we want to specify positions. + + int sum=0; + + for(unsigned int i=0; i < (unsigned int)std::min(avgPosition, (int)avgLevels.size()); i++) + { + sum += avgLevels.at(i); + } + this->average = sum / std::min(avgPosition, (int)avgLevels.size()); + + // this->average = std::accumulate(avgLevels.begin(), std::min(avgLevels.begin() + avgPosition, avgLevels.begin()+avgLevels.size())) / averageBalisticLength; + // this->peak = std::max_element(peakLevels.begin(), peakLevels.end()); + + this->peak = 0; + + for(unsigned int i=0; i < peakLevels.size(); i++) + { + if( peakLevels.at(i) > this->peak) + this->peak = peakLevels.at(i); + } + this->update(); } @@ -126,6 +192,51 @@ void meter::updateDrawing(int num) // The drawScale functions draw the numbers and number unerline for each type of meter +void meter::drawScaleRaw(QPainter *qp) +{ + qp->setPen(lowTextColor); + qp->setFont(QFont("Arial", fontSize)); + int i=mXstart; + for(; idrawText(i,scaleTextYstart, QString("%1").arg(i) ); + } + + // Now the lines: + qp->setPen(lowLineColor); + + // Line: X1, Y1 -->to--> X2, Y2 + qp->drawLine(mXstart,scaleLineYstart,peakRedLevel+mXstart,scaleLineYstart); + qp->setPen(Qt::red); + qp->drawLine(peakRedLevel+mXstart,scaleLineYstart,255+mXstart,scaleLineYstart); + +} + +void meter::drawScaleCenter(QPainter *qp) +{ + // No known units + qp->setPen(lowLineColor); + qp->drawText(60+mXstart,scaleTextYstart, QString("-")); + + qp->setPen(Qt::green); + // Attempt to draw the zero at the actual center + qp->drawText(128-2+mXstart,scaleTextYstart, QString("0")); + + qp->setPen(lowLineColor); + qp->drawText(195+mXstart,scaleTextYstart, QString("+")); + + + qp->setPen(lowLineColor); + qp->drawLine(mXstart,scaleLineYstart,128-32+mXstart,scaleLineYstart); + + qp->setPen(Qt::green); + qp->drawLine(128-32+mXstart,scaleLineYstart,128+32+mXstart,scaleLineYstart); + + qp->setPen(lowLineColor); + qp->drawLine(128+32+mXstart,scaleLineYstart,255+mXstart,scaleLineYstart); +} + + void meter::drawScalePo(QPainter *qp) { //From the manual: "0000=0% to 0143=50% to 0213=100%" diff --git a/meter.h b/meter.h index d87838f..3ee4f72 100644 --- a/meter.h +++ b/meter.h @@ -3,6 +3,9 @@ #include #include +#include +#include +#include #include "rigcommander.h" // for meter types @@ -32,6 +35,15 @@ private: int peak = 0; int average = 0; + int averageBalisticLength = 30; + int peakBalisticLength = 30; + int avgPosition=0; + int peakPosition=0; + std::vector avgLevels; + std::vector peakLevels; + + + int peakRedLevel=0; int mXstart = 10; // Starting point for S=0. @@ -43,12 +55,14 @@ private: int widgetWindowHeight = mYstart + barHeight + 10; // height of drawing canvis. void drawScaleS(QPainter *qp); + void drawScaleCenter(QPainter *qp); void drawScalePo(QPainter *qp); void drawScaleRxdB(QPainter *qp); void drawScaleALC(QPainter *qp); void drawScaleSWR(QPainter *qp); void drawScaleVd(QPainter *qp); void drawScaleId(QPainter *qp); + void drawScaleRaw(QPainter *qp); QColor currentColor; QColor averageColor; diff --git a/rigcommander.cpp b/rigcommander.cpp index 628e2f9..61b9c89 100644 --- a/rigcommander.cpp +++ b/rigcommander.cpp @@ -1386,6 +1386,11 @@ void rigCommander::parseLevels() emit haveMeter(meterS, level); rigState.sMeter = level; break; + case '\x04': + // Center (IC-R8600) + emit haveMeter(meterCenter, level); + rigState.sMeter = level; + break; case '\x11': // RF-Power meter emit haveMeter(meterPower, level); @@ -1914,6 +1919,9 @@ void rigCommander::getMeters(meterKind meter) case meterS: getSMeter(); break; + case meterCenter: + getCenterMeter(); + break; case meterSWR: getSWRMeter(); break; @@ -1943,6 +1951,12 @@ void rigCommander::getSMeter() prepDataAndSend(payload); } +void rigCommander::getCenterMeter() +{ + QByteArray payload("\x15\x04"); + prepDataAndSend(payload); +} + void rigCommander::getRFPowerMeter() { QByteArray payload("\x15\x11"); diff --git a/rigcommander.h b/rigcommander.h index d214f93..91f6193 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -21,6 +21,7 @@ enum meterKind { meterNone=0, meterS, + meterCenter, meterSWR, meterPower, meterALC, @@ -224,6 +225,7 @@ public slots: // Meters: void getSMeter(); + void getCenterMeter(); void getRFPowerMeter(); void getSWRMeter(); void getALCMeter(); diff --git a/wfmain.cpp b/wfmain.cpp index 6d52d9f..d6abcde 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -667,6 +667,7 @@ void wfmain::setupMainUI() ui->meter2selectionCombo->addItem("Compression", meterComp); ui->meter2selectionCombo->addItem("Voltage", meterVoltage); ui->meter2selectionCombo->addItem("Current", meterCurrent); + ui->meter2selectionCombo->addItem("Center", meterCenter); ui->meter2Widget->hide(); // Future ideas: @@ -2559,6 +2560,10 @@ void wfmain::doCmd(cmds cmd) if(!amTransmitting) emit getMeters(meterS); break; + case cmdGetCenterMeter: + if(!amTransmitting) + emit getMeters(meterCenter); + break; case cmdGetPowerMeter: if(amTransmitting) emit getMeters(meterPower); @@ -5153,6 +5158,9 @@ wfmain::cmds wfmain::meterKindToMeterCommand(meterKind m) case meterS: c = cmdGetSMeter; break; + case meterCenter: + c = cmdGetCenterMeter; + break; case meterPower: c = cmdGetPowerMeter; break; diff --git a/wfmain.h b/wfmain.h index e0f1fe1..28fdfec 100644 --- a/wfmain.h +++ b/wfmain.h @@ -604,7 +604,7 @@ private: cmdGetSql, cmdSetSql, cmdGetATUStatus, cmdSetATU, cmdStartATU, cmdGetSpectrumMode, cmdGetSpectrumSpan, cmdScopeCenterMode, cmdScopeFixedMode, cmdGetPTT, cmdSetPTT, cmdGetTxPower, cmdSetTxPower, cmdGetMicGain, cmdSetMicGain, cmdSetModLevel, cmdGetSpectrumRefLevel, cmdGetDuplexMode, cmdGetModInput, cmdGetModDataInput, cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed, - cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetPowerMeter, cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter, + cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetCenterMeter, cmdGetPowerMeter, cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter, cmdGetTone, cmdGetTSQL, cmdGetDTCS, cmdGetRptAccessMode, cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna, cmdSetTime, cmdSetDate, cmdSetUTCOffset};