Proper gain reduction metering now available.

Scale needs work though.
creator-widgets
Elliott Liggett 2024-02-06 11:06:50 -08:00
rodzic 562ce95971
commit 7f411a29f8
7 zmienionych plików z 123 dodań i 22 usunięć

Wyświetl plik

@ -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(; i<mXstart+midPointDn; i+=midPointDn/4)
{
qp->drawText(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(; i<mXstart+255-60; i+= 30)
{
qp->drawText(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:

Wyświetl plik

@ -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);

12
prefs.h
Wyświetl plik

@ -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;

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -238,6 +238,8 @@ private slots:
void on_meter3selectionCombo_currentIndexChanged(int index);
void on_revCompMeterBtn_clicked(bool checked);
private:
Ui::settingswidget *ui;
void createSettingsListItems();

Wyświetl plik

@ -795,9 +795,9 @@ ONLY use Manual CI-V when Transceive mode is not supported</string>
</widget>
</item>
<item>
<widget class="QCheckBox" name="clickDragTuningEnableChk">
<widget class="QCheckBox" name="pttEnableChk">
<property name="text">
<string>Allow tuning via click and drag (experimental)</string>
<string>Enable PTT Controls</string>
</property>
</widget>
</item>
@ -848,6 +848,13 @@ ONLY use Manual CI-V when Transceive mode is not supported</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="clickDragTuningEnableChk">
<property name="text">
<string>Allow tuning via click and drag (experimental)</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="useSystemThemeChk">
<property name="text">
@ -1026,13 +1033,6 @@ ONLY use Manual CI-V when Transceive mode is not supported</string>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_28">
<item>
<widget class="QCheckBox" name="pttEnableChk">
<property name="text">
<string>Enable PTT Controls</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_30">
<property name="orientation">
@ -1062,6 +1062,16 @@ ONLY use Manual CI-V when Transceive mode is not supported</string>
<item>
<widget class="QComboBox" name="meter3selectionCombo"/>
</item>
<item>
<widget class="QCheckBox" name="revCompMeterBtn">
<property name="toolTip">
<string>Broadcast-style reduction meter</string>
</property>
<property name="text">
<string>Reverse Comp Meter</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="autoPollBtn">
<property name="toolTip">

Wyświetl plik

@ -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<meter_t>(settings->value("Meter2Type", defPrefs.meter2Type).toInt());
prefs.meter3Type = static_cast<meter_t>(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<meter_t>(ui->meter2selectionCombo->itemData(i).toInt()) == prefs.meter2Type)