diff --git a/plugins/channeltx/udpsink/udpsink.cpp b/plugins/channeltx/udpsink/udpsink.cpp
index 052e63383..902d1f814 100644
--- a/plugins/channeltx/udpsink/udpsink.cpp
+++ b/plugins/channeltx/udpsink/udpsink.cpp
@@ -374,6 +374,7 @@ bool UDPSink::handleMessage(const Message& cmd)
m_config.m_squelch = CalcDb::powerFromdB(cfg.getSquelchDB());
m_config.m_squelchGate = cfg.getSquelchGate();
m_config.m_squelchEnabled = cfg.getSquelchEnabled();
+ m_config.m_autoRWBalance = cfg.getAutoRWBalance();
apply(cfg.getForce());
@@ -389,7 +390,8 @@ bool UDPSink::handleMessage(const Message& cmd)
<< " squelchDB: " << cfg.getSquelchDB()
<< " m_squelchGate: " << m_config.m_squelchGate
<< " m_squelch: " << m_config.m_squelch
- << " m_squelchEnabled: " << m_config.m_squelchEnabled;
+ << " m_squelchEnabled: " << m_config.m_squelchEnabled
+ << " m_autoRWBalance: " << m_config.m_autoRWBalance;
return true;
}
@@ -489,6 +491,7 @@ void UDPSink::configure(MessageQueue* messageQueue,
Real squelchDB,
Real squelchGate,
bool squelchEnabled,
+ bool autoRWBalance,
bool force)
{
Message* cmd = MsgUDPSinkConfigure::create(sampleFormat,
@@ -503,6 +506,7 @@ void UDPSink::configure(MessageQueue* messageQueue,
squelchDB,
squelchGate,
squelchEnabled,
+ autoRWBalance,
force);
messageQueue->push(cmd);
}
diff --git a/plugins/channeltx/udpsink/udpsink.h b/plugins/channeltx/udpsink/udpsink.h
index 5f47f2d09..575ff7371 100644
--- a/plugins/channeltx/udpsink/udpsink.h
+++ b/plugins/channeltx/udpsink/udpsink.h
@@ -73,6 +73,7 @@ public:
Real squelchDB,
Real squelchGate,
bool squelchEnabled,
+ bool autoRWBalance,
bool force = false);
void setSpectrum(MessageQueue* messageQueue, bool enabled);
void resetReadIndex(MessageQueue* messageQueue);
@@ -104,6 +105,7 @@ private:
Real getSquelchGate() const { return m_squelchGate; }
bool getSquelchEnabled() const { return m_squelchEnabled; }
bool getForce() const { return m_force; }
+ bool getAutoRWBalance() const { return m_autoRWBalance; }
static MsgUDPSinkConfigure* create(SampleFormat
sampleFormat,
@@ -118,6 +120,7 @@ private:
Real squelchDB,
Real squelchGate,
bool squelchEnabled,
+ bool autoRWBalance,
bool force)
{
return new MsgUDPSinkConfigure(sampleFormat,
@@ -132,6 +135,7 @@ private:
squelchDB,
squelchGate,
squelchEnabled,
+ autoRWBalance,
force);
}
@@ -148,6 +152,7 @@ private:
Real m_squelchDB;
Real m_squelchGate;
bool m_squelchEnabled;
+ bool m_autoRWBalance;
bool m_force;
MsgUDPSinkConfigure(SampleFormat sampleFormat,
@@ -162,6 +167,7 @@ private:
Real squelchDB,
Real squelchGate,
bool squelchEnabled,
+ bool autoRWBalance,
bool force) :
Message(),
m_sampleFormat(sampleFormat),
@@ -176,6 +182,7 @@ private:
m_squelchDB(squelchDB),
m_squelchGate(squelchGate),
m_squelchEnabled(squelchEnabled),
+ m_autoRWBalance(autoRWBalance),
m_force(force)
{ }
};
@@ -232,6 +239,7 @@ private:
Real m_squelch; //!< squared magnitude
Real m_squelchGate; //!< seconds
bool m_squelchEnabled;
+ bool m_autoRWBalance;
QString m_udpAddressStr;
quint16 m_udpPort;
@@ -251,6 +259,7 @@ private:
m_squelch(-50.0),
m_squelchGate(0.05),
m_squelchEnabled(true),
+ m_autoRWBalance(true),
m_udpAddressStr("127.0.0.1"),
m_udpPort(9999)
{}
diff --git a/plugins/channeltx/udpsink/udpsinkgui.cpp b/plugins/channeltx/udpsink/udpsinkgui.cpp
index 881362b2f..b7b9ae5fc 100644
--- a/plugins/channeltx/udpsink/udpsinkgui.cpp
+++ b/plugins/channeltx/udpsink/udpsinkgui.cpp
@@ -95,6 +95,7 @@ QByteArray UDPSinkGUI::serialize() const
s.writeString(13, m_channelMarker.getTitle());
s.writeS32(14, ui->squelch->value());
s.writeS32(15, ui->squelchGate->value());
+ s.writeBool(16, ui->autoRWBalance->isChecked());
return s.final();
}
@@ -115,6 +116,7 @@ bool UDPSinkGUI::deserialize(const QByteArray& data)
qint32 s32tmp;
quint32 u32tmp;
Real realtmp;
+ bool booltmp;
blockApplySettings(true);
m_channelMarker.blockSignals(true);
@@ -184,6 +186,8 @@ bool UDPSinkGUI::deserialize(const QByteArray& data)
d.readS32(15, &s32tmp, 5);
ui->squelchGate->setValue(s32tmp);
ui->squelchGateText->setText(tr("%1").arg(s32tmp*10.0, 0, 'f', 0));
+ d.readBool(16, &booltmp, true);
+ ui->autoRWBalance->setChecked(booltmp);
blockApplySettings(false);
m_channelMarker.blockSignals(false);
@@ -412,6 +416,7 @@ void UDPSinkGUI::applySettings(bool force)
ui->squelch->value() * 1.0f,
ui->squelchGate->value() * 0.01f,
ui->squelch->value() != -100,
+ ui->autoRWBalance->isChecked(),
force);
ui->applyBtn->setEnabled(false);
@@ -532,6 +537,11 @@ void UDPSinkGUI::on_resetUDPReadIndex_clicked()
m_udpSink->resetReadIndex(m_udpSink->getInputMessageQueue());
}
+void UDPSinkGUI::on_autoRWBalance_toggled(bool checked __attribute__((unused)))
+{
+ applySettings();
+}
+
void UDPSinkGUI::onWidgetRolled(QWidget* widget, bool rollDown)
{
if ((widget == ui->spectrumBox) && (m_udpSink != 0))
diff --git a/plugins/channeltx/udpsink/udpsinkgui.h b/plugins/channeltx/udpsink/udpsinkgui.h
index 28169d27f..382e9e5b9 100644
--- a/plugins/channeltx/udpsink/udpsinkgui.h
+++ b/plugins/channeltx/udpsink/udpsinkgui.h
@@ -73,6 +73,7 @@ private slots:
void on_squelchGate_valueChanged(int value);
void on_channelMute_toggled(bool checked);
void on_resetUDPReadIndex_clicked();
+ void on_autoRWBalance_toggled(bool checked);
void tick();
private:
diff --git a/plugins/channeltx/udpsink/udpsinkgui.ui b/plugins/channeltx/udpsink/udpsinkgui.ui
index c88c059f0..758841887 100644
--- a/plugins/channeltx/udpsink/udpsinkgui.ui
+++ b/plugins/channeltx/udpsink/udpsinkgui.ui
@@ -654,6 +654,31 @@
+ -
+
+
+
+ 0
+ 22
+
+
+
+
+ 22
+ 16777215
+
+
+
+ Automatic R/W balance compensation
+
+
+ G
+
+
+ true
+
+
+
-
@@ -897,6 +922,11 @@
1
+
+ ButtonSwitch
+ QToolButton
+
+
diff --git a/plugins/channeltx/udpsink/udpsinkudphandler.cpp b/plugins/channeltx/udpsink/udpsinkudphandler.cpp
index 22cab9230..a5279ab7e 100644
--- a/plugins/channeltx/udpsink/udpsinkudphandler.cpp
+++ b/plugins/channeltx/udpsink/udpsinkudphandler.cpp
@@ -36,6 +36,7 @@ UDPSinkUDPHandler::UDPSinkUDPHandler() :
m_readIndex(0),
m_rwDelta(m_minNbUDPFrames/2),
m_d(0),
+ m_autoRWBalance(true),
m_feedbackMessageQueue(0)
{
m_udpBuf = new udpBlk_t[m_minNbUDPFrames];
@@ -192,7 +193,7 @@ void UDPSinkUDPHandler::advanceReadPointer(int nbBytes)
c = c < -0.05 ? -0.05 : c > 0.05 ? 0.05 : c; // limit
UDPSinkMessages::MsgSampleRateCorrection *msg = UDPSinkMessages::MsgSampleRateCorrection::create(c, d);
- if (m_feedbackMessageQueue) {
+ if (m_autoRWBalance && m_feedbackMessageQueue) {
m_feedbackMessageQueue->push(msg);
}
diff --git a/plugins/channeltx/udpsink/udpsinkudphandler.h b/plugins/channeltx/udpsink/udpsinkudphandler.h
index a1cdb26af..9fea34d4e 100644
--- a/plugins/channeltx/udpsink/udpsinkudphandler.h
+++ b/plugins/channeltx/udpsink/udpsinkudphandler.h
@@ -42,6 +42,7 @@ public:
void readSample(FixReal &t);
void readSample(Sample &s);
+ void setAutoRWBalance(bool autoRWBalance) { m_autoRWBalance = autoRWBalance; }
void setFeedbackMessageQueue(MessageQueue *messageQueue) { m_feedbackMessageQueue = messageQueue; }
/** Get buffer gauge value in % of buffer size ([-50:50])
@@ -107,6 +108,7 @@ private:
int m_readIndex;
int m_rwDelta;
float m_d;
+ bool m_autoRWBalance;
MessageQueue *m_feedbackMessageQueue;
MessageQueue m_inputMessageQueue;