1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-07-04 09:55:22 -04:00

Remote Source: use fixed sample rate set to baseband sample rate. Remote Output: use sample rate from remote

This commit is contained in:
f4exb 2021-12-12 19:54:57 +01:00
parent 56ba6f3d80
commit 1168eefcc9
17 changed files with 120 additions and 212 deletions

View File

@ -54,36 +54,6 @@ void RemoteSourceSource::pull(SampleVector::iterator begin, unsigned int nbSampl
void RemoteSourceSource::pullOne(Sample& sample) void RemoteSourceSource::pullOne(Sample& sample)
{ {
m_dataReadQueue.readSample(sample, true); // true is scale for Tx m_dataReadQueue.readSample(sample, true); // true is scale for Tx
return;
Complex ci;
if (m_interpolatorDistance > 1.0f) // decimate
{
getSample();
while (!m_interpolator.decimate(&m_interpolatorDistanceRemain, m_modSample, &ci)) {
getSample();
}
}
else
{
if (m_interpolator.interpolate(&m_interpolatorDistanceRemain, m_modSample, &ci)) {
getSample();
}
}
m_interpolatorDistanceRemain += m_interpolatorDistance;
sample.m_real = (FixReal) ci.real();
sample.m_imag = (FixReal) ci.imag();
}
void RemoteSourceSource::getSample()
{
Sample s;
m_dataReadQueue.readSample(s, true); // true is scale for Tx
m_modSample.real(s.m_real);
m_modSample.imag(s.m_imag);
} }
void RemoteSourceSource::start() void RemoteSourceSource::start()
@ -267,17 +237,6 @@ void RemoteSourceSource::applyChannelSettings(int channelSampleRate, bool force)
{ {
qDebug() << "RemoteSourceSource::applyChannelSettings:" qDebug() << "RemoteSourceSource::applyChannelSettings:"
<< " channelSampleRate: " << channelSampleRate << " channelSampleRate: " << channelSampleRate
<< " m_currentMeta.m_sampleRate: " << m_currentMeta.m_sampleRate
<< " force: " << force; << " force: " << force;
if ((channelSampleRate != m_channelSampleRate) || force)
{
uint32_t metaSampleRate = m_currentMeta.m_sampleRate == 0 ? channelSampleRate : m_currentMeta.m_sampleRate;
m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false;
m_interpolatorDistance = (Real) metaSampleRate / (Real) channelSampleRate;
m_interpolator.create(48, metaSampleRate, metaSampleRate / 2.2, 3.0);
}
m_channelSampleRate = channelSampleRate; m_channelSampleRate = channelSampleRate;
} }

View File

@ -24,7 +24,6 @@
#include "cm256cc/cm256.h" #include "cm256cc/cm256.h"
#include "dsp/channelsamplesource.h" #include "dsp/channelsamplesource.h"
#include "dsp/interpolator.h"
#include "channel/remotedatablock.h" #include "channel/remotedatablock.h"
#include "channel/remotedataqueue.h" #include "channel/remotedataqueue.h"
#include "channel/remotedatareadqueue.h" #include "channel/remotedatareadqueue.h"
@ -72,17 +71,11 @@ private:
uint32_t m_nbUncorrectableErrors; //!< count of uncorrectable errors in number of blocks uint32_t m_nbUncorrectableErrors; //!< count of uncorrectable errors in number of blocks
int m_channelSampleRate; int m_channelSampleRate;
Interpolator m_interpolator;
Real m_interpolatorDistance;
Real m_interpolatorDistanceRemain;
bool m_interpolatorConsumed;
Complex m_modSample;
void startWorker(); void startWorker();
void stopWorker(); void stopWorker();
void handleDataFrame(RemoteDataFrame *dataFrame); void handleDataFrame(RemoteDataFrame *dataFrame);
void printMeta(const QString& header, RemoteMetaDataFEC *metaData); void printMeta(const QString& header, RemoteMetaDataFEC *metaData);
void getSample();
private slots: private slots:
void handleData(); void handleData();

View File

@ -51,7 +51,8 @@ const uint32_t RemoteOutput::NbSamplesForRateCorrection = 5000000;
RemoteOutput::RemoteOutput(DeviceAPI *deviceAPI) : RemoteOutput::RemoteOutput(DeviceAPI *deviceAPI) :
m_deviceAPI(deviceAPI), m_deviceAPI(deviceAPI),
m_settings(), m_settings(),
m_centerFrequency(0), m_centerFrequency(435000000),
m_sampleRate(48000),
m_remoteOutputWorker(nullptr), m_remoteOutputWorker(nullptr),
m_deviceDescription("RemoteOutput"), m_deviceDescription("RemoteOutput"),
m_startingTimeStamp(0), m_startingTimeStamp(0),
@ -72,6 +73,8 @@ RemoteOutput::RemoteOutput(DeviceAPI *deviceAPI) :
m_networkManager = new QNetworkAccessManager(); m_networkManager = new QNetworkAccessManager();
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
connect(&m_masterTimer, SIGNAL(timeout()), this, SLOT(tick())); connect(&m_masterTimer, SIGNAL(timeout()), this, SLOT(tick()));
applyCenterFrequency();
applySampleRate();
} }
RemoteOutput::~RemoteOutput() RemoteOutput::~RemoteOutput()
@ -94,7 +97,7 @@ bool RemoteOutput::start()
m_remoteOutputWorker = new RemoteOutputWorker(&m_sampleSourceFifo); m_remoteOutputWorker = new RemoteOutputWorker(&m_sampleSourceFifo);
m_remoteOutputWorker->moveToThread(&m_remoteOutputWorkerThread); m_remoteOutputWorker->moveToThread(&m_remoteOutputWorkerThread);
m_remoteOutputWorker->setDataAddress(m_settings.m_dataAddress, m_settings.m_dataPort); m_remoteOutputWorker->setDataAddress(m_settings.m_dataAddress, m_settings.m_dataPort);
m_remoteOutputWorker->setSamplerate(m_settings.m_sampleRate); m_remoteOutputWorker->setSamplerate(m_sampleRate);
m_remoteOutputWorker->setNbBlocksFEC(m_settings.m_nbFECBlocks); m_remoteOutputWorker->setNbBlocksFEC(m_settings.m_nbFECBlocks);
m_remoteOutputWorker->connectTimer(m_masterTimer); m_remoteOutputWorker->connectTimer(m_masterTimer);
startWorker(); startWorker();
@ -177,7 +180,7 @@ const QString& RemoteOutput::getDeviceDescription() const
int RemoteOutput::getSampleRate() const int RemoteOutput::getSampleRate() const
{ {
return m_settings.m_sampleRate; return m_sampleRate;
} }
quint64 RemoteOutput::getCenterFrequency() const quint64 RemoteOutput::getCenterFrequency() const
@ -270,7 +273,6 @@ bool RemoteOutput::handleMessage(const Message& message)
void RemoteOutput::applySettings(const RemoteOutputSettings& settings, bool force) void RemoteOutput::applySettings(const RemoteOutputSettings& settings, bool force)
{ {
QMutexLocker mutexLocker(&m_mutex); QMutexLocker mutexLocker(&m_mutex);
bool forwardChange = false;
QList<QString> reverseAPIKeys; QList<QString> reverseAPIKeys;
if ((m_settings.m_dataAddress != settings.m_dataAddress) || force) { if ((m_settings.m_dataAddress != settings.m_dataAddress) || force) {
@ -293,20 +295,6 @@ void RemoteOutput::applySettings(const RemoteOutputSettings& settings, bool forc
} }
} }
if (force || (m_settings.m_sampleRate != settings.m_sampleRate))
{
reverseAPIKeys.append("sampleRate");
if (m_remoteOutputWorker != 0) {
m_remoteOutputWorker->setSamplerate(settings.m_sampleRate);
}
m_tickMultiplier = (21*NbSamplesForRateCorrection) / (2*settings.m_sampleRate); // two times per sample filling period plus small extension
m_tickMultiplier /= 20; // greter tick (one per second)
m_tickMultiplier = m_tickMultiplier < 1 ? 1 : m_tickMultiplier; // not below 1 second
forwardChange = true;
}
if (force || (m_settings.m_nbFECBlocks != settings.m_nbFECBlocks)) if (force || (m_settings.m_nbFECBlocks != settings.m_nbFECBlocks))
{ {
reverseAPIKeys.append("nbFECBlocks"); reverseAPIKeys.append("nbFECBlocks");
@ -319,19 +307,12 @@ void RemoteOutput::applySettings(const RemoteOutputSettings& settings, bool forc
mutexLocker.unlock(); mutexLocker.unlock();
qDebug() << "RemoteOutput::applySettings:" qDebug() << "RemoteOutput::applySettings:"
<< " m_sampleRate: " << settings.m_sampleRate
<< " m_nbFECBlocks: " << settings.m_nbFECBlocks << " m_nbFECBlocks: " << settings.m_nbFECBlocks
<< " m_apiAddress: " << settings.m_apiAddress << " m_apiAddress: " << settings.m_apiAddress
<< " m_apiPort: " << settings.m_apiPort << " m_apiPort: " << settings.m_apiPort
<< " m_dataAddress: " << settings.m_dataAddress << " m_dataAddress: " << settings.m_dataAddress
<< " m_dataPort: " << settings.m_dataPort; << " m_dataPort: " << settings.m_dataPort;
if (forwardChange)
{
DSPSignalNotification *notif = new DSPSignalNotification(settings.m_sampleRate, m_centerFrequency);
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
}
if (settings.m_useReverseAPI) if (settings.m_useReverseAPI)
{ {
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
@ -344,6 +325,26 @@ void RemoteOutput::applySettings(const RemoteOutputSettings& settings, bool forc
m_settings = settings; m_settings = settings;
} }
void RemoteOutput::applyCenterFrequency()
{
DSPSignalNotification *notif = new DSPSignalNotification(m_sampleRate, m_centerFrequency);
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
}
void RemoteOutput::applySampleRate()
{
if (m_remoteOutputWorker) {
m_remoteOutputWorker->setSamplerate(m_sampleRate);
}
m_tickMultiplier = (21*NbSamplesForRateCorrection) / (2*m_sampleRate); // two times per sample filling period plus small extension
m_tickMultiplier /= 20; // greter tick (one per second)
m_tickMultiplier = m_tickMultiplier < 1 ? 1 : m_tickMultiplier; // not below 1 second
DSPSignalNotification *notif = new DSPSignalNotification(m_sampleRate, m_centerFrequency);
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
}
int RemoteOutput::webapiRunGet( int RemoteOutput::webapiRunGet(
SWGSDRangel::SWGDeviceState& response, SWGSDRangel::SWGDeviceState& response,
QString& errorMessage) QString& errorMessage)
@ -411,9 +412,6 @@ void RemoteOutput::webapiUpdateDeviceSettings(
const QStringList& deviceSettingsKeys, const QStringList& deviceSettingsKeys,
SWGSDRangel::SWGDeviceSettings& response) SWGSDRangel::SWGDeviceSettings& response)
{ {
if (deviceSettingsKeys.contains("sampleRate")) {
settings.m_sampleRate = response.getRemoteOutputSettings()->getSampleRate();
}
if (deviceSettingsKeys.contains("nbFECBlocks")) { if (deviceSettingsKeys.contains("nbFECBlocks")) {
settings.m_nbFECBlocks = response.getRemoteOutputSettings()->getNbFecBlocks(); settings.m_nbFECBlocks = response.getRemoteOutputSettings()->getNbFecBlocks();
} }
@ -462,7 +460,6 @@ int RemoteOutput::webapiReportGet(
void RemoteOutput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const RemoteOutputSettings& settings) void RemoteOutput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const RemoteOutputSettings& settings)
{ {
response.getRemoteOutputSettings()->setSampleRate(settings.m_sampleRate);
response.getRemoteOutputSettings()->setNbFecBlocks(settings.m_nbFECBlocks); response.getRemoteOutputSettings()->setNbFecBlocks(settings.m_nbFECBlocks);
response.getRemoteOutputSettings()->setApiAddress(new QString(settings.m_apiAddress)); response.getRemoteOutputSettings()->setApiAddress(new QString(settings.m_apiAddress));
response.getRemoteOutputSettings()->setApiPort(settings.m_apiPort); response.getRemoteOutputSettings()->setApiPort(settings.m_apiPort);
@ -485,6 +482,7 @@ void RemoteOutput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& re
void RemoteOutput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response) void RemoteOutput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response)
{ {
response.getRemoteOutputReport()->setCenterFrequency(m_centerFrequency); response.getRemoteOutputReport()->setCenterFrequency(m_centerFrequency);
response.getRemoteOutputReport()->setSampleRate(m_sampleRate);
response.getRemoteOutputReport()->setBufferRwBalance(m_sampleSourceFifo.getRWBalance()); response.getRemoteOutputReport()->setBufferRwBalance(m_sampleSourceFifo.getRWBalance());
response.getRemoteOutputReport()->setSampleCount(m_remoteOutputWorker ? (int) m_remoteOutputWorker->getSamplesCount() : 0); response.getRemoteOutputReport()->setSampleCount(m_remoteOutputWorker ? (int) m_remoteOutputWorker->getSamplesCount() : 0);
} }
@ -550,8 +548,25 @@ void RemoteOutput::analyzeApiReply(const QJsonObject& jsonObject, const QString&
{ {
MsgReportRemoteData::RemoteData msgRemoteData; MsgReportRemoteData::RemoteData msgRemoteData;
QJsonObject report = jsonObject["RemoteSourceReport"].toObject(); QJsonObject report = jsonObject["RemoteSourceReport"].toObject();
m_centerFrequency = report["deviceCenterFreq"].toInt(); uint64_t centerFrequency = report["deviceCenterFreq"].toInt();
if (centerFrequency != m_centerFrequency)
{
m_centerFrequency = centerFrequency;
applyCenterFrequency();
}
int remoteRate = report["deviceSampleRate"].toInt();
if (remoteRate != m_sampleRate)
{
m_sampleRate = remoteRate;
applySampleRate();
}
msgRemoteData.m_centerFrequency = m_centerFrequency; msgRemoteData.m_centerFrequency = m_centerFrequency;
msgRemoteData.m_sampleRate = m_sampleRate;
int queueSize = report["queueSize"].toInt(); int queueSize = report["queueSize"].toInt();
queueSize = queueSize == 0 ? 20 : queueSize; queueSize = queueSize == 0 ? 20 : queueSize;
msgRemoteData.m_queueSize = queueSize; msgRemoteData.m_queueSize = queueSize;
@ -563,8 +578,6 @@ void RemoteOutput::analyzeApiReply(const QJsonObject& jsonObject, const QString&
int intRemoteSampleCount = report["samplesCount"].toInt(); int intRemoteSampleCount = report["samplesCount"].toInt();
uint32_t remoteSampleCount = intRemoteSampleCount < 0 ? 0 : intRemoteSampleCount; uint32_t remoteSampleCount = intRemoteSampleCount < 0 ? 0 : intRemoteSampleCount;
msgRemoteData.m_sampleCount = remoteSampleCount; msgRemoteData.m_sampleCount = remoteSampleCount;
int remoteRate = report["deviceSampleRate"].toInt();
msgRemoteData.m_sampleRate = remoteRate;
int unrecoverableCount = report["uncorrectableErrorsCount"].toInt(); int unrecoverableCount = report["uncorrectableErrorsCount"].toInt();
msgRemoteData.m_unrecoverableCount = unrecoverableCount; msgRemoteData.m_unrecoverableCount = unrecoverableCount;
int recoverableCount = report["correctableErrorsCount"].toInt(); int recoverableCount = report["correctableErrorsCount"].toInt();
@ -696,9 +709,6 @@ void RemoteOutput::webapiReverseSendSettings(QList<QString>& deviceSettingsKeys,
// transfer data that has been modified. When force is on transfer all data except reverse API data // transfer data that has been modified. When force is on transfer all data except reverse API data
if (deviceSettingsKeys.contains("sampleRate") || force) {
swgRemoteOutputSettings->setSampleRate(settings.m_sampleRate);
}
if (deviceSettingsKeys.contains("nbFECBlocks") || force) { if (deviceSettingsKeys.contains("nbFECBlocks") || force) {
swgRemoteOutputSettings->setNbFecBlocks(settings.m_nbFECBlocks); swgRemoteOutputSettings->setNbFecBlocks(settings.m_nbFECBlocks);
} }

View File

@ -275,6 +275,7 @@ private:
QMutex m_mutex; QMutex m_mutex;
RemoteOutputSettings m_settings; RemoteOutputSettings m_settings;
uint64_t m_centerFrequency; uint64_t m_centerFrequency;
int m_sampleRate;
RemoteOutputWorker* m_remoteOutputWorker; RemoteOutputWorker* m_remoteOutputWorker;
QThread m_remoteOutputWorkerThread; QThread m_remoteOutputWorkerThread;
QString m_deviceDescription; QString m_deviceDescription;
@ -300,6 +301,8 @@ private:
void startWorker(); void startWorker();
void stopWorker(); void stopWorker();
void applySettings(const RemoteOutputSettings& settings, bool force = false); void applySettings(const RemoteOutputSettings& settings, bool force = false);
void applyCenterFrequency();
void applySampleRate();
void webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response); void webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response);
void analyzeApiReply(const QJsonObject& jsonObject, const QString& answer); void analyzeApiReply(const QJsonObject& jsonObject, const QString& answer);

View File

@ -55,7 +55,8 @@ RemoteOutputSinkGui::RemoteOutputSinkGui(DeviceUISet *deviceUISet, QWidget* pare
m_nbSinceLastFlowCheck(0), m_nbSinceLastFlowCheck(0),
m_lastEngineState(DeviceAPI::StNotStarted), m_lastEngineState(DeviceAPI::StNotStarted),
m_doApplySettings(true), m_doApplySettings(true),
m_forceSettings(true) m_forceSettings(true),
m_remoteAPIConnected(false)
{ {
m_countUnrecoverable = 0; m_countUnrecoverable = 0;
m_countRecovered = 0; m_countRecovered = 0;
@ -69,11 +70,6 @@ RemoteOutputSinkGui::RemoteOutputSinkGui(DeviceUISet *deviceUISet, QWidget* pare
ui->setupUi(this); ui->setupUi(this);
ui->sampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow));
ui->sampleRate->setValueRange(7, 32000U, 9000000U);
ui->apiAddressLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }");
connect(&(m_deviceUISet->m_deviceAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); connect(&(m_deviceUISet->m_deviceAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick()));
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware()));
connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
@ -215,7 +211,6 @@ void RemoteOutputSinkGui::displaySettings()
{ {
blockApplySettings(true); blockApplySettings(true);
ui->centerFrequency->setText(QString("%L1").arg(m_deviceCenterFrequency)); ui->centerFrequency->setText(QString("%L1").arg(m_deviceCenterFrequency));
ui->sampleRate->setValue(m_settings.m_sampleRate);
ui->nbFECBlocks->setValue(m_settings.m_nbFECBlocks); ui->nbFECBlocks->setValue(m_settings.m_nbFECBlocks);
QString s0 = QString::number(128 + m_settings.m_nbFECBlocks, 'f', 0); QString s0 = QString::number(128 + m_settings.m_nbFECBlocks, 'f', 0);
@ -276,12 +271,6 @@ void RemoteOutputSinkGui::updateStatus()
} }
} }
void RemoteOutputSinkGui::on_sampleRate_changed(quint64 value)
{
m_settings.m_sampleRate = value;
sendSettings();
}
void RemoteOutputSinkGui::on_nbFECBlocks_valueChanged(int value) void RemoteOutputSinkGui::on_nbFECBlocks_valueChanged(int value)
{ {
m_settings.m_nbFECBlocks = value; m_settings.m_nbFECBlocks = value;
@ -457,6 +446,17 @@ void RemoteOutputSinkGui::displayEventTimer()
void RemoteOutputSinkGui::tick() void RemoteOutputSinkGui::tick()
{ {
if (++m_tickCount == 20)
{
if (m_remoteAPIConnected) {
ui->apiAddressLabel->setStyleSheet("QLabel { background-color: green; }");
} else {
ui->apiAddressLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }");
}
m_remoteAPIConnected = false;
m_tickCount = 0;
}
} }
void RemoteOutputSinkGui::displayRemoteData(const RemoteOutput::MsgReportRemoteData::RemoteData& remoteData) void RemoteOutputSinkGui::displayRemoteData(const RemoteOutput::MsgReportRemoteData::RemoteData& remoteData)
@ -476,6 +476,7 @@ void RemoteOutputSinkGui::displayRemoteData(const RemoteOutput::MsgReportRemoteD
m_countUnrecoverable += unrecoverableCountDelta; m_countUnrecoverable += unrecoverableCountDelta;
displayEventCounts(); displayEventCounts();
displayEventTimer(); displayEventTimer();
m_remoteAPIConnected = true;
uint32_t sampleCountDelta; uint32_t sampleCountDelta;
@ -509,6 +510,7 @@ void RemoteOutputSinkGui::displayRemoteFixedData(const RemoteOutput::MsgReportRe
infoLine += " " + remoteData.m_architecture; infoLine += " " + remoteData.m_architecture;
infoLine += " " + remoteData.m_os; infoLine += " " + remoteData.m_os;
infoLine += QString(" %1/%2b").arg(remoteData.m_rxBits).arg(remoteData.m_txBits); infoLine += QString(" %1/%2b").arg(remoteData.m_rxBits).arg(remoteData.m_txBits);
m_remoteAPIConnected = true;
if (infoLine.size() > 0) { if (infoLine.size() > 0) {
ui->infoText->setText(infoLine); ui->infoText->setText(infoLine);

View File

@ -95,6 +95,7 @@ private:
int m_lastEngineState; int m_lastEngineState;
bool m_doApplySettings; bool m_doApplySettings;
bool m_forceSettings; bool m_forceSettings;
bool m_remoteAPIConnected;
uint32_t m_countUnrecoverable; uint32_t m_countUnrecoverable;
uint32_t m_countRecovered; uint32_t m_countRecovered;
@ -125,7 +126,6 @@ private:
private slots: private slots:
void handleInputMessages(); void handleInputMessages();
void on_sampleRate_changed(quint64 value);
void on_nbFECBlocks_valueChanged(int value); void on_nbFECBlocks_valueChanged(int value);
void on_deviceIndex_returnPressed(); void on_deviceIndex_returnPressed();
void on_channelIndex_returnPressed(); void on_channelIndex_returnPressed();

View File

@ -118,14 +118,14 @@
<widget class="QLabel" name="centerFrequency"> <widget class="QLabel" name="centerFrequency">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>140</width> <width>170</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Liberation Sans</family> <family>Liberation Sans</family>
<pointsize>14</pointsize> <pointsize>16</pointsize>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
@ -188,68 +188,6 @@
<property name="topMargin"> <property name="topMargin">
<number>2</number> <number>2</number>
</property> </property>
<item>
<widget class="QLabel" name="sampleRateLabel">
<property name="text">
<string>SR</string>
</property>
</widget>
</item>
<item>
<widget class="ValueDial" name="sampleRate" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>32</width>
<height>16</height>
</size>
</property>
<property name="font">
<font>
<family>Liberation Mono</family>
<pointsize>12</pointsize>
</font>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Remote device sample rate</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="sampleRateUnit">
<property name="text">
<string>S/s</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item> <item>
<widget class="QLabel" name="deviceIndexLabel"> <widget class="QLabel" name="deviceIndexLabel">
<property name="text"> <property name="text">
@ -302,6 +240,19 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -754,12 +705,6 @@
</layout> </layout>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget>
<class>ValueDial</class>
<extends>QWidget</extends>
<header>gui/valuedial.h</header>
<container>1</container>
</customwidget>
<customwidget> <customwidget>
<class>ButtonSwitch</class> <class>ButtonSwitch</class>
<extends>QToolButton</extends> <extends>QToolButton</extends>

View File

@ -25,7 +25,6 @@ RemoteOutputSettings::RemoteOutputSettings()
void RemoteOutputSettings::resetToDefaults() void RemoteOutputSettings::resetToDefaults()
{ {
m_sampleRate = 48000;
m_nbFECBlocks = 0; m_nbFECBlocks = 0;
m_apiAddress = "127.0.0.1"; m_apiAddress = "127.0.0.1";
m_apiPort = 9091; m_apiPort = 9091;
@ -43,7 +42,6 @@ QByteArray RemoteOutputSettings::serialize() const
{ {
SimpleSerializer s(1); SimpleSerializer s(1);
s.writeU32(2, m_sampleRate);
s.writeU32(4, m_nbFECBlocks); s.writeU32(4, m_nbFECBlocks);
s.writeString(5, m_apiAddress); s.writeString(5, m_apiAddress);
s.writeU32(6, m_apiPort); s.writeU32(6, m_apiPort);
@ -73,7 +71,6 @@ bool RemoteOutputSettings::deserialize(const QByteArray& data)
{ {
quint32 uintval; quint32 uintval;
d.readU32(2, &m_sampleRate, 48000);
d.readU32(4, &m_nbFECBlocks, 0); d.readU32(4, &m_nbFECBlocks, 0);
d.readString(5, &m_apiAddress, "127.0.0.1"); d.readString(5, &m_apiAddress, "127.0.0.1");
d.readU32(6, &uintval, 9090); d.readU32(6, &uintval, 9090);

View File

@ -22,7 +22,6 @@
#include <QString> #include <QString>
struct RemoteOutputSettings { struct RemoteOutputSettings {
quint32 m_sampleRate;
quint32 m_nbFECBlocks; quint32 m_nbFECBlocks;
QString m_apiAddress; QString m_apiAddress;
quint16 m_apiPort; quint16 m_apiPort;

View File

@ -9824,6 +9824,9 @@ margin-bottom: 20px;
"type" : "integer", "type" : "integer",
"format" : "int64" "format" : "int64"
}, },
"sampleRate" : {
"type" : "integer"
},
"bufferRWBalance" : { "bufferRWBalance" : {
"type" : "number", "type" : "number",
"format" : "float", "format" : "float",
@ -9838,9 +9841,6 @@ margin-bottom: 20px;
}; };
defs.RemoteOutputSettings = { defs.RemoteOutputSettings = {
"properties" : { "properties" : {
"sampleRate" : {
"type" : "integer"
},
"nbFECBlocks" : { "nbFECBlocks" : {
"type" : "integer" "type" : "integer"
}, },
@ -51597,7 +51597,7 @@ except ApiException as e:
</div> </div>
<div id="generator"> <div id="generator">
<div class="content"> <div class="content">
Generated 2021-12-12T13:16:20.821+01:00 Generated 2021-12-12T19:10:03.240+01:00
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,8 +1,6 @@
RemoteOutputSettings: RemoteOutputSettings:
description: RemoteOutput description: RemoteOutput
properties: properties:
sampleRate:
type: integer
nbFECBlocks: nbFECBlocks:
type: integer type: integer
apiAddress: apiAddress:
@ -35,6 +33,8 @@ RemoteOutputReport:
centerFrequency: centerFrequency:
type: integer type: integer
format: int64 format: int64
sampleRate:
type: integer
bufferRWBalance: bufferRWBalance:
description: ratio off the mid buffer (positive read leads) description: ratio off the mid buffer (positive read leads)
type: number type: number

View File

@ -1,8 +1,6 @@
RemoteOutputSettings: RemoteOutputSettings:
description: RemoteOutput description: RemoteOutput
properties: properties:
sampleRate:
type: integer
nbFECBlocks: nbFECBlocks:
type: integer type: integer
apiAddress: apiAddress:
@ -35,6 +33,8 @@ RemoteOutputReport:
centerFrequency: centerFrequency:
type: integer type: integer
format: int64 format: int64
sampleRate:
type: integer
bufferRWBalance: bufferRWBalance:
description: ratio off the mid buffer (positive read leads) description: ratio off the mid buffer (positive read leads)
type: number type: number

View File

@ -9824,6 +9824,9 @@ margin-bottom: 20px;
"type" : "integer", "type" : "integer",
"format" : "int64" "format" : "int64"
}, },
"sampleRate" : {
"type" : "integer"
},
"bufferRWBalance" : { "bufferRWBalance" : {
"type" : "number", "type" : "number",
"format" : "float", "format" : "float",
@ -9838,9 +9841,6 @@ margin-bottom: 20px;
}; };
defs.RemoteOutputSettings = { defs.RemoteOutputSettings = {
"properties" : { "properties" : {
"sampleRate" : {
"type" : "integer"
},
"nbFECBlocks" : { "nbFECBlocks" : {
"type" : "integer" "type" : "integer"
}, },
@ -51597,7 +51597,7 @@ except ApiException as e:
</div> </div>
<div id="generator"> <div id="generator">
<div class="content"> <div class="content">
Generated 2021-12-12T13:16:20.821+01:00 Generated 2021-12-12T19:10:03.240+01:00
</div> </div>
</div> </div>
</div> </div>

View File

@ -30,6 +30,8 @@ SWGRemoteOutputReport::SWGRemoteOutputReport(QString* json) {
SWGRemoteOutputReport::SWGRemoteOutputReport() { SWGRemoteOutputReport::SWGRemoteOutputReport() {
center_frequency = 0L; center_frequency = 0L;
m_center_frequency_isSet = false; m_center_frequency_isSet = false;
sample_rate = 0;
m_sample_rate_isSet = false;
buffer_rw_balance = 0.0f; buffer_rw_balance = 0.0f;
m_buffer_rw_balance_isSet = false; m_buffer_rw_balance_isSet = false;
sample_count = 0; sample_count = 0;
@ -44,6 +46,8 @@ void
SWGRemoteOutputReport::init() { SWGRemoteOutputReport::init() {
center_frequency = 0L; center_frequency = 0L;
m_center_frequency_isSet = false; m_center_frequency_isSet = false;
sample_rate = 0;
m_sample_rate_isSet = false;
buffer_rw_balance = 0.0f; buffer_rw_balance = 0.0f;
m_buffer_rw_balance_isSet = false; m_buffer_rw_balance_isSet = false;
sample_count = 0; sample_count = 0;
@ -55,6 +59,7 @@ SWGRemoteOutputReport::cleanup() {
} }
SWGRemoteOutputReport* SWGRemoteOutputReport*
@ -70,6 +75,8 @@ void
SWGRemoteOutputReport::fromJsonObject(QJsonObject &pJson) { SWGRemoteOutputReport::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&center_frequency, pJson["centerFrequency"], "qint64", ""); ::SWGSDRangel::setValue(&center_frequency, pJson["centerFrequency"], "qint64", "");
::SWGSDRangel::setValue(&sample_rate, pJson["sampleRate"], "qint32", "");
::SWGSDRangel::setValue(&buffer_rw_balance, pJson["bufferRWBalance"], "float", ""); ::SWGSDRangel::setValue(&buffer_rw_balance, pJson["bufferRWBalance"], "float", "");
::SWGSDRangel::setValue(&sample_count, pJson["sampleCount"], "qint32", ""); ::SWGSDRangel::setValue(&sample_count, pJson["sampleCount"], "qint32", "");
@ -93,6 +100,9 @@ SWGRemoteOutputReport::asJsonObject() {
if(m_center_frequency_isSet){ if(m_center_frequency_isSet){
obj->insert("centerFrequency", QJsonValue(center_frequency)); obj->insert("centerFrequency", QJsonValue(center_frequency));
} }
if(m_sample_rate_isSet){
obj->insert("sampleRate", QJsonValue(sample_rate));
}
if(m_buffer_rw_balance_isSet){ if(m_buffer_rw_balance_isSet){
obj->insert("bufferRWBalance", QJsonValue(buffer_rw_balance)); obj->insert("bufferRWBalance", QJsonValue(buffer_rw_balance));
} }
@ -113,6 +123,16 @@ SWGRemoteOutputReport::setCenterFrequency(qint64 center_frequency) {
this->m_center_frequency_isSet = true; this->m_center_frequency_isSet = true;
} }
qint32
SWGRemoteOutputReport::getSampleRate() {
return sample_rate;
}
void
SWGRemoteOutputReport::setSampleRate(qint32 sample_rate) {
this->sample_rate = sample_rate;
this->m_sample_rate_isSet = true;
}
float float
SWGRemoteOutputReport::getBufferRwBalance() { SWGRemoteOutputReport::getBufferRwBalance() {
return buffer_rw_balance; return buffer_rw_balance;
@ -141,6 +161,9 @@ SWGRemoteOutputReport::isSet(){
if(m_center_frequency_isSet){ if(m_center_frequency_isSet){
isObjectUpdated = true; break; isObjectUpdated = true; break;
} }
if(m_sample_rate_isSet){
isObjectUpdated = true; break;
}
if(m_buffer_rw_balance_isSet){ if(m_buffer_rw_balance_isSet){
isObjectUpdated = true; break; isObjectUpdated = true; break;
} }

View File

@ -44,6 +44,9 @@ public:
qint64 getCenterFrequency(); qint64 getCenterFrequency();
void setCenterFrequency(qint64 center_frequency); void setCenterFrequency(qint64 center_frequency);
qint32 getSampleRate();
void setSampleRate(qint32 sample_rate);
float getBufferRwBalance(); float getBufferRwBalance();
void setBufferRwBalance(float buffer_rw_balance); void setBufferRwBalance(float buffer_rw_balance);
@ -57,6 +60,9 @@ private:
qint64 center_frequency; qint64 center_frequency;
bool m_center_frequency_isSet; bool m_center_frequency_isSet;
qint32 sample_rate;
bool m_sample_rate_isSet;
float buffer_rw_balance; float buffer_rw_balance;
bool m_buffer_rw_balance_isSet; bool m_buffer_rw_balance_isSet;

View File

@ -28,8 +28,6 @@ SWGRemoteOutputSettings::SWGRemoteOutputSettings(QString* json) {
} }
SWGRemoteOutputSettings::SWGRemoteOutputSettings() { SWGRemoteOutputSettings::SWGRemoteOutputSettings() {
sample_rate = 0;
m_sample_rate_isSet = false;
nb_fec_blocks = 0; nb_fec_blocks = 0;
m_nb_fec_blocks_isSet = false; m_nb_fec_blocks_isSet = false;
api_address = nullptr; api_address = nullptr;
@ -60,8 +58,6 @@ SWGRemoteOutputSettings::~SWGRemoteOutputSettings() {
void void
SWGRemoteOutputSettings::init() { SWGRemoteOutputSettings::init() {
sample_rate = 0;
m_sample_rate_isSet = false;
nb_fec_blocks = 0; nb_fec_blocks = 0;
m_nb_fec_blocks_isSet = false; m_nb_fec_blocks_isSet = false;
api_address = new QString(""); api_address = new QString("");
@ -89,7 +85,6 @@ SWGRemoteOutputSettings::init() {
void void
SWGRemoteOutputSettings::cleanup() { SWGRemoteOutputSettings::cleanup() {
if(api_address != nullptr) { if(api_address != nullptr) {
delete api_address; delete api_address;
} }
@ -119,8 +114,6 @@ SWGRemoteOutputSettings::fromJson(QString &json) {
void void
SWGRemoteOutputSettings::fromJsonObject(QJsonObject &pJson) { SWGRemoteOutputSettings::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&sample_rate, pJson["sampleRate"], "qint32", "");
::SWGSDRangel::setValue(&nb_fec_blocks, pJson["nbFECBlocks"], "qint32", ""); ::SWGSDRangel::setValue(&nb_fec_blocks, pJson["nbFECBlocks"], "qint32", "");
::SWGSDRangel::setValue(&api_address, pJson["apiAddress"], "QString", "QString"); ::SWGSDRangel::setValue(&api_address, pJson["apiAddress"], "QString", "QString");
@ -159,9 +152,6 @@ SWGRemoteOutputSettings::asJson ()
QJsonObject* QJsonObject*
SWGRemoteOutputSettings::asJsonObject() { SWGRemoteOutputSettings::asJsonObject() {
QJsonObject* obj = new QJsonObject(); QJsonObject* obj = new QJsonObject();
if(m_sample_rate_isSet){
obj->insert("sampleRate", QJsonValue(sample_rate));
}
if(m_nb_fec_blocks_isSet){ if(m_nb_fec_blocks_isSet){
obj->insert("nbFECBlocks", QJsonValue(nb_fec_blocks)); obj->insert("nbFECBlocks", QJsonValue(nb_fec_blocks));
} }
@ -199,16 +189,6 @@ SWGRemoteOutputSettings::asJsonObject() {
return obj; return obj;
} }
qint32
SWGRemoteOutputSettings::getSampleRate() {
return sample_rate;
}
void
SWGRemoteOutputSettings::setSampleRate(qint32 sample_rate) {
this->sample_rate = sample_rate;
this->m_sample_rate_isSet = true;
}
qint32 qint32
SWGRemoteOutputSettings::getNbFecBlocks() { SWGRemoteOutputSettings::getNbFecBlocks() {
return nb_fec_blocks; return nb_fec_blocks;
@ -324,9 +304,6 @@ bool
SWGRemoteOutputSettings::isSet(){ SWGRemoteOutputSettings::isSet(){
bool isObjectUpdated = false; bool isObjectUpdated = false;
do{ do{
if(m_sample_rate_isSet){
isObjectUpdated = true; break;
}
if(m_nb_fec_blocks_isSet){ if(m_nb_fec_blocks_isSet){
isObjectUpdated = true; break; isObjectUpdated = true; break;
} }

View File

@ -42,9 +42,6 @@ public:
virtual void fromJsonObject(QJsonObject &json) override; virtual void fromJsonObject(QJsonObject &json) override;
virtual SWGRemoteOutputSettings* fromJson(QString &jsonString) override; virtual SWGRemoteOutputSettings* fromJson(QString &jsonString) override;
qint32 getSampleRate();
void setSampleRate(qint32 sample_rate);
qint32 getNbFecBlocks(); qint32 getNbFecBlocks();
void setNbFecBlocks(qint32 nb_fec_blocks); void setNbFecBlocks(qint32 nb_fec_blocks);
@ -82,9 +79,6 @@ public:
virtual bool isSet() override; virtual bool isSet() override;
private: private:
qint32 sample_rate;
bool m_sample_rate_isSet;
qint32 nb_fec_blocks; qint32 nb_fec_blocks;
bool m_nb_fec_blocks_isSet; bool m_nb_fec_blocks_isSet;