diff --git a/meter.cpp b/meter.cpp index b009c98..a6df5da 100644 --- a/meter.cpp +++ b/meter.cpp @@ -68,6 +68,10 @@ meter::meter(QWidget *parent) : QWidget(parent) } +void meter::setCompReverse(bool reverse) { + this->reverseCompMeter = reverse; +} + void meter::setColors(QColor current, QColor peakScale, QColor peakLevel, QColor average, QColor lowLine, QColor lowText) @@ -242,7 +246,11 @@ void meter::paintEvent(QPaintEvent *) case meterComp: label = "CMP(dB)"; peakRedLevel = 100; - drawScaleComp(&painter); + if(reverseCompMeter) { + drawScaleCompInverted(&painter); + } else { + drawScaleComp(&painter); + } break; case meterNone: return; @@ -304,6 +312,7 @@ void meter::paintEvent(QPaintEvent *) int logAverage = (int)((1-audiopot[255-average])*255); int logPeak = (int)((1-audiopot[255-peak])*255); + // Current value: // X, Y, Width, Height painter.drawRect(mXstart,mYstart,logCurrent,barHeight); @@ -325,15 +334,22 @@ void meter::paintEvent(QPaintEvent *) } else { - + // Current value: // X, Y, Width, Height - painter.drawRect(mXstart,mYstart,current,barHeight); + if(meterType==meterComp && reverseCompMeter) { + painter.drawRect(255+mXstart,mYstart,-current,barHeight); + } else { + 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? - + if(meterType==meterComp && reverseCompMeter) { + painter.drawRect(255+mXstart-average,mYstart,-1,barHeight); // bar is 1 pixel wide, height = meter start? + } else { + painter.drawRect(mXstart+average-1,mYstart,1,barHeight); // bar is 1 pixel wide, height = meter start? + } // Peak: painter.setPen(peakColor); painter.setBrush(peakColor); @@ -342,9 +358,13 @@ void meter::paintEvent(QPaintEvent *) painter.setBrush(Qt::red); painter.setPen(Qt::red); } - - painter.drawRect(mXstart+peak-1,mYstart,2,barHeight); + if(meterType==meterComp && reverseCompMeter) { + painter.drawRect(255+mXstart-peak+1,mYstart,-1,barHeight); + } else { + painter.drawRect(mXstart+peak-1,mYstart,2,barHeight); + } } + if(drawLabels) { drawLabel(&painter); @@ -670,6 +690,50 @@ void meter::drawScaleComp(QPainter *qp) qp->drawLine(peakRedLevel+mXstart,scaleLineYstart,255+mXstart,scaleLineYstart); } +void meter::drawScaleCompInverted(QPainter *qp) { + // inverted scale + // + // 0000=0 dB, 0130=15 dB,0241=30 dB + // + + qp->setPen(lowTextColor); + + int midPointDn = 130; + int midPointdB = 15; + + int highPointDn = 241; + int highPointdB = 30; + float dBperDn = (float)(highPointdB-midPointdB) / float(highPointDn-midPointDn); + + int i=mXstart; + //i+=midPointDn/4; // skip the 0 for cleaner label space + + // Vertical graticules and text + + // drawLine expects two sets of coordinates dictating start and end position. + for(; idrawText(255+mXstart-i+(midPointDn/4),scaleTextYstart, QString("%1").arg( (int)((i-mXstart) * (float(midPointdB) / float(midPointDn)) )) ); + qp->drawLine(255+mXstart-i+(midPointDn/4),scaleTextYstart, 255+mXstart-i+(midPointDn/4), scaleTextYstart+5); + } + + i = midPointDn+60; + // The "-60" blocks the last digit which runs over the label text + for(; idrawText(255+mXstart-i,scaleTextYstart, QString("%1").arg( (int) std::round( ((i-mXstart-midPointDn) * (dBperDn) ) + (midPointdB) ))); + qp->drawLine(255+mXstart-i,scaleTextYstart, 255+mXstart-i, scaleTextYstart+5); + } + + // Now the lines: + qp->setPen(lowLineColor); + + // Line: X1, Y1 -->to--> X2, Y2 + qp->drawLine(255+mXstart,scaleLineYstart,255-peakRedLevel+mXstart,scaleLineYstart); + qp->setPen(highLineColor); + qp->drawLine(255-peakRedLevel+mXstart,scaleLineYstart,mXstart,scaleLineYstart); +} + void meter::drawScaleSWR(QPainter *qp) { // From the manual: diff --git a/meter.h b/meter.h index 89d64b9..3f4c637 100644 --- a/meter.h +++ b/meter.h @@ -30,6 +30,7 @@ public slots: void setLevels(int current, int peak, int average); void setLevels(int current, int peak); // calculate avg void setLevel(int current); + void setCompReverse(bool reverse); void clearMeterOnPTTtoggle(); void clearMeter(); void setMeterType(meter_t type); @@ -58,6 +59,7 @@ private: int current=0; int peak = 0; int average = 0; + bool reverseCompMeter = true; int averageBalisticLength = 30; int peakBalisticLength = 30; @@ -85,6 +87,7 @@ private: void drawScaleVd(QPainter *qp); void drawScaleId(QPainter *qp); void drawScaleComp(QPainter *qp); + void drawScaleCompInverted(QPainter *qp); void drawScale_dBFs(QPainter *qp); void drawScaleRaw(QPainter *qp); diff --git a/prefs.h b/prefs.h index 33bc13a..dbf4b4d 100644 --- a/prefs.h +++ b/prefs.h @@ -26,11 +26,12 @@ enum prefIfItem { if_confirmPowerOff = 1 << 13, if_meter2Type = 1 << 14, if_meter3Type = 1 << 15, - if_clickDragTuningEnable = 1 << 16, - if_currentColorPresetNumber = 1 << 17, - if_rigCreatorEnable = 1 << 18, - if_frequencyUnits = 1 << 19, - if_all = 1 << 20 + if_compMeterReverse = 1 << 16, + if_clickDragTuningEnable = 1 << 17, + if_currentColorPresetNumber = 1 << 18, + if_rigCreatorEnable = 1 << 19, + if_frequencyUnits = 1 << 20, + if_all = 1 << 21 }; enum prefColItem { @@ -180,6 +181,7 @@ struct preferences { bool confirmPowerOff; meter_t meter2Type; meter_t meter3Type; + bool compMeterReverse = false; bool clickDragTuningEnable; int currentColorPresetNumber = 0; bool rigCreatorEnable = false; diff --git a/settingswidget.cpp b/settingswidget.cpp index 80dd434..12a0068 100644 --- a/settingswidget.cpp +++ b/settingswidget.cpp @@ -442,6 +442,11 @@ void settingswidget::updateIfPref(prefIfItem pif) } break; } + case if_compMeterReverse: + { + quietlyUpdateCheckbox(ui->revCompMeterBtn, prefs->compMeterReverse); + break; + } case if_clickDragTuningEnable: quietlyUpdateCheckbox(ui->clickDragTuningEnableChk, prefs->clickDragTuningEnable); break; @@ -1536,6 +1541,12 @@ void settingswidget::on_meter3selectionCombo_currentIndexChanged(int index) } } +void settingswidget::on_revCompMeterBtn_clicked(bool checked) +{ + prefs->compMeterReverse = checked; + emit changedIfPref(if_compMeterReverse); +} + void settingswidget::muteSingleComboItem(QComboBox *comboBox, int index) { enableAllComboBoxItems(comboBox); setComboBoxItemEnabled(comboBox, index, false); @@ -2714,3 +2725,4 @@ void settingswidget::connectionStatus(bool conn) ui->audioSystemServerCombo->setEnabled(!conn); } + diff --git a/settingswidget.h b/settingswidget.h index 98a79db..1c06c05 100644 --- a/settingswidget.h +++ b/settingswidget.h @@ -238,6 +238,8 @@ private slots: void on_meter3selectionCombo_currentIndexChanged(int index); + void on_revCompMeterBtn_clicked(bool checked); + private: Ui::settingswidget *ui; void createSettingsListItems(); diff --git a/settingswidget.ui b/settingswidget.ui index e94da3a..f4e9066 100644 --- a/settingswidget.ui +++ b/settingswidget.ui @@ -795,9 +795,9 @@ ONLY use Manual CI-V when Transceive mode is not supported - + - Allow tuning via click and drag (experimental) + Enable PTT Controls @@ -848,6 +848,13 @@ ONLY use Manual CI-V when Transceive mode is not supported + + + + Allow tuning via click and drag (experimental) + + + @@ -1026,13 +1033,6 @@ ONLY use Manual CI-V when Transceive mode is not supported - - - - Enable PTT Controls - - - @@ -1062,6 +1062,16 @@ ONLY use Manual CI-V when Transceive mode is not supported + + + + Broadcast-style reduction meter + + + Reverse Comp Meter + + + diff --git a/wfmain.cpp b/wfmain.cpp index 0e4c0cf..654d308 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -1542,6 +1542,7 @@ void wfmain::setDefPrefs() defPrefs.confirmPowerOff = true; defPrefs.meter2Type = meterNone; defPrefs.meter3Type = meterNone; + defPrefs.compMeterReverse = false; defPrefs.tcpPort = 0; defPrefs.tciPort = 50001; @@ -1614,7 +1615,7 @@ void wfmain::loadSettings() prefs.confirmPowerOff = settings->value("ConfirmPowerOff", defPrefs.confirmPowerOff).toBool(); prefs.meter2Type = static_cast(settings->value("Meter2Type", defPrefs.meter2Type).toInt()); prefs.meter3Type = static_cast(settings->value("Meter3Type", defPrefs.meter3Type).toInt()); - + prefs.compMeterReverse = settings->value("compMeterReverse", defPrefs.compMeterReverse).toBool(); prefs.clickDragTuningEnable = settings->value("ClickDragTuning", false).toBool(); prefs.rigCreatorEnable = settings->value("RigCreator",false).toBool(); @@ -2327,6 +2328,10 @@ void wfmain::extChangedIfPref(prefIfItem i) // There's nothing to do here since the code // already uses the preference variable as state. break; + case if_compMeterReverse: + ui->meter2Widget->setCompReverse(prefs.compMeterReverse); + ui->meter3Widget->setCompReverse(prefs.compMeterReverse); + break; case if_rigCreatorEnable: ui->rigCreatorBtn->setEnabled(prefs.rigCreatorEnable); break; @@ -2779,6 +2784,7 @@ void wfmain::saveSettings() settings->setValue("ConfirmPowerOff", prefs.confirmPowerOff); settings->setValue("Meter2Type", (int)prefs.meter2Type); settings->setValue("Meter3Type", (int)prefs.meter3Type); + settings->setValue("compMeterReverse", prefs.compMeterReverse); settings->setValue("ClickDragTuning", prefs.clickDragTuningEnable); settings->setValue("RigCreator",prefs.rigCreatorEnable); settings->setValue("FrequencyUnits",prefs.frequencyUnits); @@ -3930,6 +3936,8 @@ void wfmain::receiveRigID(rigCapabilities rigCaps) // Set the second meter here as I suspect we need to be connected for it to work? changeMeterType(prefs.meter2Type, 2); changeMeterType(prefs.meter3Type, 3); + ui->meter2Widget->setCompReverse(prefs.compMeterReverse); + ui->meter3Widget->setCompReverse(prefs.compMeterReverse); // for (int i = 0; i < ui->meter2selectionCombo->count(); i++) // { // if (static_cast(ui->meter2selectionCombo->itemData(i).toInt()) == prefs.meter2Type)