kopia lustrzana https://gitlab.com/eliggett/wfview
Added center tuning for IC-R8600, partially moved meter balistics
(average and peak) to the meter class.merge-requests/5/head
rodzic
fd82de2647
commit
decdfe370b
141
meter.cpp
141
meter.cpp
|
@ -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
14
meter.h
|
@ -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;
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
2
wfmain.h
2
wfmain.h
|
@ -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};
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue