From 027815f4c0b6db77ad92fe5b4a1a278e13826144 Mon Sep 17 00:00:00 2001 From: Elliott Liggett Date: Sat, 17 Jul 2021 23:39:40 -0700 Subject: [PATCH 1/2] Preliminary secondary meter support. See Settings tab for selection. Some scales incomplete. --- meter.cpp | 16 ++++++- meter.h | 3 ++ rigcommander.h | 4 +- wfmain.cpp | 128 +++++++++++++++++++++++++++++++++++++++++++------ wfmain.h | 10 +++- wfmain.ui | 20 +++++++- 6 files changed, 160 insertions(+), 21 deletions(-) diff --git a/meter.cpp b/meter.cpp index 95b334b..ad5b99e 100644 --- a/meter.cpp +++ b/meter.cpp @@ -40,10 +40,19 @@ meter::meter(QWidget *parent) : QWidget(parent) void meter::setMeterType(meterKind type) { + if(type == meterType) + return; + meterType = type; + // clear average and peak vectors: + // re-draw scale: } +meterKind meter::getMeterType() +{ + return meterType; +} void meter::paintEvent(QPaintEvent *) { @@ -57,15 +66,19 @@ void meter::paintEvent(QPaintEvent *) switch(meterType) { case meterS: + peakRedLevel = 120; // S9+ drawScaleS(&painter); break; case meterPower: + peakRedLevel = 210; // 100% drawScalePo(&painter); break; case meterALC: + peakRedLevel = 100; drawScaleALC(&painter); break; case meterSWR: + peakRedLevel = 100; // SWR 2.5 drawScaleSWR(&painter); break; default: @@ -87,9 +100,8 @@ void meter::paintEvent(QPaintEvent *) // Peak: painter.setPen(peakColor); painter.setBrush(peakColor); - if(peak > 120) + if(peak > peakRedLevel) { - // 120 = +S9 painter.setBrush(Qt::red); painter.setPen(Qt::red); } diff --git a/meter.h b/meter.h index 5c48713..d87838f 100644 --- a/meter.h +++ b/meter.h @@ -20,6 +20,7 @@ public slots: void updateDrawing(int num); void setLevels(int current, int peak, int average); void setMeterType(meterKind type); + meterKind getMeterType(); private: @@ -31,6 +32,8 @@ private: int peak = 0; int average = 0; + int peakRedLevel=0; + 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 diff --git a/rigcommander.h b/rigcommander.h index a8f81c5..d214f93 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -19,6 +19,7 @@ #define compCivAddr 0xE1 enum meterKind { + meterNone=0, meterS, meterSWR, meterPower, @@ -28,7 +29,8 @@ enum meterKind { meterCurrent, meterRxdB, meterTxMod, - meterRxAudio + meterRxAudio, + meterLatency }; enum spectrumMode { diff --git a/wfmain.cpp b/wfmain.cpp index 4ef96cf..a8f6602 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -661,6 +661,22 @@ void wfmain::setupMainUI() ui->wfthemeCombo->addItem("Spectrum", QCPColorGradient::gpSpectrum); ui->wfthemeCombo->addItem("Candy", QCPColorGradient::gpCandy); + ui->meter2selectionCombo->addItem("None", meterNone); + ui->meter2selectionCombo->addItem("SWR", meterSWR); + ui->meter2selectionCombo->addItem("ALC", meterALC); + ui->meter2selectionCombo->addItem("Compression", meterComp); + ui->meter2selectionCombo->addItem("Voltage", meterVoltage); + ui->meter2selectionCombo->addItem("Current", meterCurrent); + ui->meter2Widget->hide(); + + // Future ideas: + //ui->meter2selectionCombo->addItem("Transmit Audio", meterTxMod); + //ui->meter2selectionCombo->addItem("Receive Audio", meterRxAudio); + //ui->meter2selectionCombo->addItem("Latency", meterLatency); + + + + spans << "2.5k" << "5.0k" << "10k" << "25k"; spans << "50k" << "100k" << "250k" << "500k"; ui->scopeBWCombo->insertItems(0, spans); @@ -2547,6 +2563,10 @@ void wfmain::doCmd(cmds cmd) if(amTransmitting) emit getMeters(meterPower); break; + case cmdGetSWRMeter: + if(amTransmitting) + emit getMeters(meterSWR); + break; case cmdGetIdMeter: emit getMeters(meterCurrent); break; @@ -2983,6 +3003,31 @@ void wfmain::insertPeriodicCommand(cmds cmd, unsigned char priority) } } +void wfmain::insertPeriodicCommandUnique(cmds cmd) +{ + // Use this function to insert a non-duplicate command + // into the fast periodic polling queue, typically + // meter commands where high refresh rates are desirable. + + removePeriodicCommand(cmd); + periodicCmdQueue.push_front(cmd); +} + +void wfmain::removePeriodicCommand(cmds cmd) +{ + while(true) + { + auto it = std::find(this->periodicCmdQueue.begin(), this->periodicCmdQueue.end(), cmd); + if(it != periodicCmdQueue.end()) + { + periodicCmdQueue.erase(it); + } else { + break; + } + } +} + + void wfmain::insertSlowPeriodicCommand(cmds cmd, unsigned char priority) { // TODO: meaningful priority @@ -4502,9 +4547,6 @@ void wfmain::receiveMeter(meterKind inMeter, unsigned char level) ui->meterSPoWidget->setLevels(level, peak, average); ui->meterSPoWidget->repaint(); break; - case meterSWR: - //ui->levelIndicator->setValue((int)level); - break; case meterPower: powerMeterReadings[(powerMeterPos++)%powerMeterReadings.length()] = level; for(int i=0; i < powerMeterReadings.length(); i++) @@ -4518,19 +4560,11 @@ void wfmain::receiveMeter(meterKind inMeter, unsigned char level) ui->meterSPoWidget->setLevels(level, peak, average); ui->meterSPoWidget->update(); break; - case meterALC: - //ui->levelIndicator->setValue((int)level); - break; - case meterComp: - //ui->levelIndicator->setValue((int)level); - break; - case meterCurrent: - //ui->levelIndicator->setValue((int)level); - break; - case meterVoltage: - //ui->levelIndicator->setValue((int)level); - break; default: + if(ui->meter2Widget->getMeterType() == inMeter) + { + ui->meter2Widget->setLevels(level, level, level); + } break; } } @@ -5108,6 +5142,70 @@ void wfmain::on_wfInterpolateChk_clicked(bool checked) prefs.wfInterpolate = checked; } +wfmain::cmds wfmain::meterKindToMeterCommand(meterKind m) +{ + cmds c; + switch(m) + { + case meterNone: + c = cmdNone; + break; + case meterS: + c = cmdGetSMeter; + break; + case meterPower: + c = cmdGetPowerMeter; + break; + case meterSWR: + c = cmdGetSWRMeter; + break; + case meterALC: + c = cmdGetALCMeter; + break; + case meterComp: + c = cmdGetCompMeter; + break; + case meterCurrent: + c = cmdGetIdMeter; + break; + case meterVoltage: + c = cmdGetVdMeter; + break; + default: + c = cmdNone; + break; + } + + return c; +} + + +void wfmain::on_meter2selectionCombo_activated(int index) +{ + meterKind newMeterType; + meterKind oldMeterType; + newMeterType = static_cast(ui->meter2selectionCombo->currentData().toInt()); + oldMeterType = ui->meter2Widget->getMeterType(); + + if(newMeterType == oldMeterType) + return; + + cmds newCmd = meterKindToMeterCommand(newMeterType); + cmds oldCmd = meterKindToMeterCommand(oldMeterType); + + removePeriodicCommand(oldCmd); + + if(newMeterType==meterNone) + { + ui->meter2Widget->hide(); + } else { + ui->meter2Widget->show(); + ui->meter2Widget->setMeterType(newMeterType); + insertPeriodicCommandUnique(newCmd); + } + (void)index; +} + // --- DEBUG FUNCTION --- void wfmain::on_debugBtn_clicked() { diff --git a/wfmain.h b/wfmain.h index 1ebcc50..e0f1fe1 100644 --- a/wfmain.h +++ b/wfmain.h @@ -468,6 +468,8 @@ private slots: void on_wfInterpolateChk_clicked(bool checked); + void on_meter2selectionCombo_activated(int index); + private: Ui::wfmain *ui; void closeEvent(QCloseEvent *event); @@ -602,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, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter, + cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetPowerMeter, cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter, cmdGetTone, cmdGetTSQL, cmdGetDTCS, cmdGetRptAccessMode, cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna, cmdSetTime, cmdSetDate, cmdSetUTCOffset}; @@ -741,14 +743,20 @@ private: void changeModLabelAndSlider(rigInput source); + // Fast command queue: void initPeriodicCommands(); void insertPeriodicCommand(cmds cmd, unsigned char priority); + void insertPeriodicCommandUnique(cmds cmd); + void removePeriodicCommand(cmds cmd); + void insertSlowPeriodicCommand(cmds cmd, unsigned char priority); void calculateTimingParameters(); void changeMode(mode_kind mode); void changeMode(mode_kind mode, bool dataOn); + cmds meterKindToMeterCommand(meterKind m); + int oldFreqDialVal; rigCapabilities rigCaps; diff --git a/wfmain.ui b/wfmain.ui index bdf8f9e..aa855c7 100644 --- a/wfmain.ui +++ b/wfmain.ui @@ -18,7 +18,7 @@ - 0 + 3 @@ -141,8 +141,11 @@ + + Waterfall color theme + - Spectrum color theme + Waterfall display color theme Selects the theme for the color waterfall dispaly @@ -264,6 +267,9 @@ + + + @@ -2205,6 +2211,16 @@ + + + + Secondary Meter Selection: + + + + + + From dc6b4884d6c832b04869f2e6e239c5d2d84ea20d Mon Sep 17 00:00:00 2001 From: Elliott Liggett Date: Sat, 17 Jul 2021 23:42:18 -0700 Subject: [PATCH 2/2] unknown change confusion --- wfmain.h | 1 - 1 file changed, 1 deletion(-) diff --git a/wfmain.h b/wfmain.h index 02564c1..e0f1fe1 100644 --- a/wfmain.h +++ b/wfmain.h @@ -750,7 +750,6 @@ private: void removePeriodicCommand(cmds cmd); void insertSlowPeriodicCommand(cmds cmd, unsigned char priority); - void calculateTimingParameters(); void changeMode(mode_kind mode);