Added center tuning for IC-R8600, partially moved meter balistics

(average and peak) to the meter class.
merge-requests/5/head
Elliott Liggett 2021-07-18 14:27:21 -07:00
rodzic fd82de2647
commit decdfe370b
6 zmienionych plików z 165 dodań i 16 usunięć

141
meter.cpp
Wyświetl plik

@ -36,6 +36,9 @@ meter::meter(QWidget *parent) : QWidget(parent)
lowTextColor.setNamedColor("#eff0f1"); lowTextColor.setNamedColor("#eff0f1");
lowLineColor = lowTextColor; lowLineColor = lowTextColor;
avgLevels.resize(averageBalisticLength, 0);
peakLevels.resize(peakBalisticLength, 0);
} }
void meter::setMeterType(meterKind type) void meter::setMeterType(meterKind type)
@ -45,7 +48,13 @@ void meter::setMeterType(meterKind type)
meterType = type; meterType = type;
// clear average and peak vectors: // clear average and peak vectors:
avgLevels.clear();
peakLevels.clear();
avgLevels.resize(averageBalisticLength, 0);
peakLevels.resize(peakBalisticLength, 0);
peakPosition = 0;
avgPosition = 0;
// re-draw scale: // re-draw scale:
} }
@ -81,7 +90,13 @@ void meter::paintEvent(QPaintEvent *)
peakRedLevel = 100; // SWR 2.5 peakRedLevel = 100; // SWR 2.5
drawScaleSWR(&painter); drawScaleSWR(&painter);
break; break;
case meterCenter:
peakRedLevel = 256; // No need for red here
drawScaleCenter(&painter);
break;
default: default:
peakRedLevel = 200;
drawScaleRaw(&painter);
break; break;
} }
@ -89,24 +104,48 @@ void meter::paintEvent(QPaintEvent *)
// Draws a bar from start to value. // Draws a bar from start to value.
painter.setPen(currentColor); painter.setPen(currentColor);
painter.setBrush(currentColor); painter.setBrush(currentColor);
// X, Y, Width, Height
painter.drawRect(mXstart,mYstart,current,barHeight);
// Average: if(meterType == meterCenter)
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.drawRect(mXstart+128,mYstart,current-128,barHeight);
painter.setPen(Qt::red);
}
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->current = current;
this->peak = peak; this->peak = peak;
this->average = average; 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(); 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 // 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(; i<mXstart+256; i+=20)
{
qp->drawText(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) void meter::drawScalePo(QPainter *qp)
{ {
//From the manual: "0000=0% to 0143=50% to 0213=100%" //From the manual: "0000=0% to 0143=50% to 0213=100%"

14
meter.h
Wyświetl plik

@ -3,6 +3,9 @@
#include <QWidget> #include <QWidget>
#include <QPainter> #include <QPainter>
#include <vector>
#include <algorithm>
#include <numeric>
#include "rigcommander.h" // for meter types #include "rigcommander.h" // for meter types
@ -32,6 +35,15 @@ private:
int peak = 0; int peak = 0;
int average = 0; int average = 0;
int averageBalisticLength = 30;
int peakBalisticLength = 30;
int avgPosition=0;
int peakPosition=0;
std::vector<unsigned char> avgLevels;
std::vector<unsigned char> peakLevels;
int peakRedLevel=0; int peakRedLevel=0;
int mXstart = 10; // Starting point for S=0. int mXstart = 10; // Starting point for S=0.
@ -43,12 +55,14 @@ private:
int widgetWindowHeight = mYstart + barHeight + 10; // height of drawing canvis. int widgetWindowHeight = mYstart + barHeight + 10; // height of drawing canvis.
void drawScaleS(QPainter *qp); void drawScaleS(QPainter *qp);
void drawScaleCenter(QPainter *qp);
void drawScalePo(QPainter *qp); void drawScalePo(QPainter *qp);
void drawScaleRxdB(QPainter *qp); void drawScaleRxdB(QPainter *qp);
void drawScaleALC(QPainter *qp); void drawScaleALC(QPainter *qp);
void drawScaleSWR(QPainter *qp); void drawScaleSWR(QPainter *qp);
void drawScaleVd(QPainter *qp); void drawScaleVd(QPainter *qp);
void drawScaleId(QPainter *qp); void drawScaleId(QPainter *qp);
void drawScaleRaw(QPainter *qp);
QColor currentColor; QColor currentColor;
QColor averageColor; QColor averageColor;

Wyświetl plik

@ -1386,6 +1386,11 @@ void rigCommander::parseLevels()
emit haveMeter(meterS, level); emit haveMeter(meterS, level);
rigState.sMeter = level; rigState.sMeter = level;
break; break;
case '\x04':
// Center (IC-R8600)
emit haveMeter(meterCenter, level);
rigState.sMeter = level;
break;
case '\x11': case '\x11':
// RF-Power meter // RF-Power meter
emit haveMeter(meterPower, level); emit haveMeter(meterPower, level);
@ -1914,6 +1919,9 @@ void rigCommander::getMeters(meterKind meter)
case meterS: case meterS:
getSMeter(); getSMeter();
break; break;
case meterCenter:
getCenterMeter();
break;
case meterSWR: case meterSWR:
getSWRMeter(); getSWRMeter();
break; break;
@ -1943,6 +1951,12 @@ void rigCommander::getSMeter()
prepDataAndSend(payload); prepDataAndSend(payload);
} }
void rigCommander::getCenterMeter()
{
QByteArray payload("\x15\x04");
prepDataAndSend(payload);
}
void rigCommander::getRFPowerMeter() void rigCommander::getRFPowerMeter()
{ {
QByteArray payload("\x15\x11"); QByteArray payload("\x15\x11");

Wyświetl plik

@ -21,6 +21,7 @@
enum meterKind { enum meterKind {
meterNone=0, meterNone=0,
meterS, meterS,
meterCenter,
meterSWR, meterSWR,
meterPower, meterPower,
meterALC, meterALC,
@ -224,6 +225,7 @@ public slots:
// Meters: // Meters:
void getSMeter(); void getSMeter();
void getCenterMeter();
void getRFPowerMeter(); void getRFPowerMeter();
void getSWRMeter(); void getSWRMeter();
void getALCMeter(); void getALCMeter();

Wyświetl plik

@ -667,6 +667,7 @@ void wfmain::setupMainUI()
ui->meter2selectionCombo->addItem("Compression", meterComp); ui->meter2selectionCombo->addItem("Compression", meterComp);
ui->meter2selectionCombo->addItem("Voltage", meterVoltage); ui->meter2selectionCombo->addItem("Voltage", meterVoltage);
ui->meter2selectionCombo->addItem("Current", meterCurrent); ui->meter2selectionCombo->addItem("Current", meterCurrent);
ui->meter2selectionCombo->addItem("Center", meterCenter);
ui->meter2Widget->hide(); ui->meter2Widget->hide();
// Future ideas: // Future ideas:
@ -2559,6 +2560,10 @@ void wfmain::doCmd(cmds cmd)
if(!amTransmitting) if(!amTransmitting)
emit getMeters(meterS); emit getMeters(meterS);
break; break;
case cmdGetCenterMeter:
if(!amTransmitting)
emit getMeters(meterCenter);
break;
case cmdGetPowerMeter: case cmdGetPowerMeter:
if(amTransmitting) if(amTransmitting)
emit getMeters(meterPower); emit getMeters(meterPower);
@ -5153,6 +5158,9 @@ wfmain::cmds wfmain::meterKindToMeterCommand(meterKind m)
case meterS: case meterS:
c = cmdGetSMeter; c = cmdGetSMeter;
break; break;
case meterCenter:
c = cmdGetCenterMeter;
break;
case meterPower: case meterPower:
c = cmdGetPowerMeter; c = cmdGetPowerMeter;
break; break;

Wyświetl plik

@ -604,7 +604,7 @@ private:
cmdGetSql, cmdSetSql, cmdGetATUStatus, cmdSetATU, cmdStartATU, cmdGetSpectrumMode, cmdGetSpectrumSpan, cmdScopeCenterMode, cmdScopeFixedMode, cmdGetPTT, cmdSetPTT, cmdGetSql, cmdSetSql, cmdGetATUStatus, cmdSetATU, cmdStartATU, cmdGetSpectrumMode, cmdGetSpectrumSpan, cmdScopeCenterMode, cmdScopeFixedMode, cmdGetPTT, cmdSetPTT,
cmdGetTxPower, cmdSetTxPower, cmdGetMicGain, cmdSetMicGain, cmdSetModLevel, cmdGetSpectrumRefLevel, cmdGetDuplexMode, cmdGetModInput, cmdGetModDataInput, cmdGetTxPower, cmdSetTxPower, cmdGetMicGain, cmdSetMicGain, cmdSetModLevel, cmdGetSpectrumRefLevel, cmdGetDuplexMode, cmdGetModInput, cmdGetModDataInput,
cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed, 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, cmdGetTone, cmdGetTSQL, cmdGetDTCS, cmdGetRptAccessMode, cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna,
cmdSetTime, cmdSetDate, cmdSetUTCOffset}; cmdSetTime, cmdSetDate, cmdSetUTCOffset};