diff --git a/plugins/channeltx/remotesource/remotesource.h b/plugins/channeltx/remotesource/remotesource.h
index b178ea503..e569ea923 100644
--- a/plugins/channeltx/remotesource/remotesource.h
+++ b/plugins/channeltx/remotesource/remotesource.h
@@ -187,7 +187,7 @@ public:
virtual void getIdentifier(QString& id) { id = objectName(); }
virtual void getTitle(QString& title) { title = m_settings.m_title; }
- virtual qint64 getCenterFrequency() const { return 0; }
+ virtual qint64 getCenterFrequency() const { return m_frequencyOffset; }
virtual int getNbSinkStreams() const { return 0; }
virtual int getNbSourceStreams() const { return 1; }
diff --git a/plugins/samplesink/remoteoutput/remoteoutput.cpp b/plugins/samplesink/remoteoutput/remoteoutput.cpp
index 375a2d84f..fa046086f 100644
--- a/plugins/samplesink/remoteoutput/remoteoutput.cpp
+++ b/plugins/samplesink/remoteoutput/remoteoutput.cpp
@@ -29,6 +29,7 @@
#include "SWGRemoteOutputReport.h"
#include "util/simpleserializer.h"
+#include "util/timeutil.h"
#include "dsp/dspcommands.h"
#include "dsp/dspengine.h"
@@ -41,7 +42,6 @@ MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgConfigureRemoteOutput, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgConfigureRemoteOutputWork, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgStartStop, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgConfigureRemoteOutputChunkCorrection, Message)
-MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgConfigureRemoteOutputSampleRate, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgReportRemoteData, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgReportRemoteFixedData, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgRequestFixedData, Message)
@@ -57,7 +57,11 @@ RemoteOutput::RemoteOutput(DeviceAPI *deviceAPI) :
m_masterTimer(deviceAPI->getMasterTimer()),
m_tickCount(0),
m_greaterTickCount(0),
- m_tickMultiplier(1)
+ m_tickMultiplier(1),
+ m_queueLength(0),
+ m_queueSize(0),
+ m_recoverableCount(0),
+ m_unrecoverableCount(0)
{
m_deviceAPI->setNbSinkStreams(1);
m_networkManager = new QNetworkAccessManager();
@@ -466,10 +470,16 @@ void RemoteOutput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& re
void RemoteOutput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response)
{
+ uint64_t nowus = TimeUtil::nowus();
+ response.getRemoteOutputReport()->setTvSec(nowus / 1000000U);
+ response.getRemoteOutputReport()->setTvUSec(nowus % 1000000U);
response.getRemoteOutputReport()->setCenterFrequency(m_centerFrequency);
response.getRemoteOutputReport()->setSampleRate(m_sampleRate);
- response.getRemoteOutputReport()->setBufferRwBalance(m_sampleSourceFifo.getRWBalance());
+ response.getRemoteOutputReport()->setQueueSize(m_queueSize);
+ response.getRemoteOutputReport()->setQueueLength(m_queueLength);
response.getRemoteOutputReport()->setSampleCount(m_remoteOutputWorker ? (int) m_remoteOutputWorker->getSamplesCount() : 0);
+ response.getRemoteOutputReport()->setCorrectableErrorsCount(m_recoverableCount);
+ response.getRemoteOutputReport()->setUncorrectableErrorsCount(m_unrecoverableCount);
}
void RemoteOutput::tick()
@@ -552,20 +562,20 @@ void RemoteOutput::analyzeApiReply(const QJsonObject& jsonObject, const QString&
msgRemoteData.m_centerFrequency = m_centerFrequency;
msgRemoteData.m_sampleRate = m_sampleRate;
- int queueSize = report["queueSize"].toInt();
- queueSize = queueSize == 0 ? 20 : queueSize;
- msgRemoteData.m_queueSize = queueSize;
- int queueLength = report["queueLength"].toInt();
- msgRemoteData.m_queueLength = queueLength;
+ m_queueSize = report["queueSize"].toInt();
+ m_queueSize = m_queueSize == 0 ? 20 : m_queueSize;
+ msgRemoteData.m_queueSize = m_queueSize;
+ m_queueLength = report["queueLength"].toInt();
+ msgRemoteData.m_queueLength = m_queueLength;
uint64_t remoteTimestampUs = report["tvSec"].toInt()*1000000ULL + report["tvUSec"].toInt();
msgRemoteData.m_timestampUs = remoteTimestampUs;
int intRemoteSampleCount = report["samplesCount"].toInt();
uint32_t remoteSampleCount = intRemoteSampleCount < 0 ? 0 : intRemoteSampleCount;
msgRemoteData.m_sampleCount = remoteSampleCount;
- int unrecoverableCount = report["uncorrectableErrorsCount"].toInt();
- msgRemoteData.m_unrecoverableCount = unrecoverableCount;
- int recoverableCount = report["correctableErrorsCount"].toInt();
- msgRemoteData.m_recoverableCount = recoverableCount;
+ m_unrecoverableCount = report["uncorrectableErrorsCount"].toInt();
+ msgRemoteData.m_unrecoverableCount = m_unrecoverableCount;
+ m_recoverableCount = report["correctableErrorsCount"].toInt();
+ msgRemoteData.m_recoverableCount = m_recoverableCount;
if (m_guiMessageQueue)
{
@@ -579,7 +589,7 @@ void RemoteOutput::analyzeApiReply(const QJsonObject& jsonObject, const QString&
if (++m_greaterTickCount == m_tickMultiplier)
{
- queueLengthCompensation(m_sampleRate, queueLength, queueSize);
+ queueLengthCompensation(m_sampleRate, m_queueLength, m_queueSize);
m_greaterTickCount = 0;
}
}
diff --git a/plugins/samplesink/remoteoutput/remoteoutput.h b/plugins/samplesink/remoteoutput/remoteoutput.h
index 12a292cb4..a4d7b8d0d 100644
--- a/plugins/samplesink/remoteoutput/remoteoutput.h
+++ b/plugins/samplesink/remoteoutput/remoteoutput.h
@@ -123,25 +123,6 @@ public:
{ }
};
- class MsgConfigureRemoteOutputSampleRate : public Message {
- MESSAGE_CLASS_DECLARATION
-
- public:
- int getSampleRate() const { return m_sampleRate; }
-
- static MsgConfigureRemoteOutputSampleRate* create(int sampleRate) {
- return new MsgConfigureRemoteOutputSampleRate(sampleRate);
- }
-
- private:
- int m_sampleRate;
-
- MsgConfigureRemoteOutputSampleRate(int sampleRate) :
- Message(),
- m_sampleRate(sampleRate)
- { }
- };
-
class MsgReportRemoteData : public Message {
MESSAGE_CLASS_DECLARATION
@@ -284,6 +265,10 @@ private:
uint32_t m_tickCount; // for 50 ms timer
uint32_t m_greaterTickCount; // for 1 s derived timer
uint32_t m_tickMultiplier; // for greater tick count
+ int m_queueLength;
+ int m_queueSize;
+ int m_recoverableCount;
+ int m_unrecoverableCount;
QNetworkAccessManager *m_networkManager;
QNetworkRequest m_networkRequest;
diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html
index 7493bc9f9..bac167a93 100644
--- a/sdrbase/resources/webapi/doc/html2/index.html
+++ b/sdrbase/resources/webapi/doc/html2/index.html
@@ -9827,14 +9827,33 @@ margin-bottom: 20px;
"sampleRate" : {
"type" : "integer"
},
- "bufferRWBalance" : {
- "type" : "number",
- "format" : "float",
- "description" : "ratio off the mid buffer (positive read leads)"
+ "queueLength" : {
+ "type" : "integer",
+ "description" : "Data read/write queue length in number of data frames"
+ },
+ "queueSize" : {
+ "type" : "integer",
+ "description" : "Data read/write queue size in number of data frames"
},
"sampleCount" : {
"type" : "integer",
"description" : "count of samples that have been sent"
+ },
+ "correctableErrorsCount" : {
+ "type" : "integer",
+ "description" : "Absolute number of correctable errors"
+ },
+ "uncorrectableErrorsCount" : {
+ "type" : "integer",
+ "description" : "Absolute number of uncorrectable errors"
+ },
+ "tvSec" : {
+ "type" : "integer",
+ "description" : "Counts timestamp seconds"
+ },
+ "tvUSec" : {
+ "type" : "integer",
+ "description" : "Counts timestamp microseconds"
}
},
"description" : "RemoteOutput"
@@ -51603,7 +51622,7 @@ except ApiException as e:
- Generated 2021-12-12T22:32:39.234+01:00
+ Generated 2021-12-15T21:39:08.842+01:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/RemoteOutput.yaml b/sdrbase/resources/webapi/doc/swagger/include/RemoteOutput.yaml
index 44e917694..dad91083b 100644
--- a/sdrbase/resources/webapi/doc/swagger/include/RemoteOutput.yaml
+++ b/sdrbase/resources/webapi/doc/swagger/include/RemoteOutput.yaml
@@ -35,10 +35,24 @@ RemoteOutputReport:
format: int64
sampleRate:
type: integer
- bufferRWBalance:
- description: ratio off the mid buffer (positive read leads)
- type: number
- format: float
+ queueLength:
+ description: "Data read/write queue length in number of data frames"
+ type: integer
+ queueSize:
+ description: "Data read/write queue size in number of data frames"
+ type: integer
sampleCount:
description: count of samples that have been sent
type: integer
+ correctableErrorsCount:
+ description: "Absolute number of correctable errors"
+ type: integer
+ uncorrectableErrorsCount:
+ description: "Absolute number of uncorrectable errors"
+ type: integer
+ tvSec:
+ description: "Counts timestamp seconds"
+ type: integer
+ tvUSec:
+ description: "Counts timestamp microseconds"
+ type: integer
diff --git a/swagger/sdrangel/api/swagger/include/RemoteOutput.yaml b/swagger/sdrangel/api/swagger/include/RemoteOutput.yaml
index 44e917694..dad91083b 100644
--- a/swagger/sdrangel/api/swagger/include/RemoteOutput.yaml
+++ b/swagger/sdrangel/api/swagger/include/RemoteOutput.yaml
@@ -35,10 +35,24 @@ RemoteOutputReport:
format: int64
sampleRate:
type: integer
- bufferRWBalance:
- description: ratio off the mid buffer (positive read leads)
- type: number
- format: float
+ queueLength:
+ description: "Data read/write queue length in number of data frames"
+ type: integer
+ queueSize:
+ description: "Data read/write queue size in number of data frames"
+ type: integer
sampleCount:
description: count of samples that have been sent
type: integer
+ correctableErrorsCount:
+ description: "Absolute number of correctable errors"
+ type: integer
+ uncorrectableErrorsCount:
+ description: "Absolute number of uncorrectable errors"
+ type: integer
+ tvSec:
+ description: "Counts timestamp seconds"
+ type: integer
+ tvUSec:
+ description: "Counts timestamp microseconds"
+ type: integer
diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html
index 7493bc9f9..bac167a93 100644
--- a/swagger/sdrangel/code/html2/index.html
+++ b/swagger/sdrangel/code/html2/index.html
@@ -9827,14 +9827,33 @@ margin-bottom: 20px;
"sampleRate" : {
"type" : "integer"
},
- "bufferRWBalance" : {
- "type" : "number",
- "format" : "float",
- "description" : "ratio off the mid buffer (positive read leads)"
+ "queueLength" : {
+ "type" : "integer",
+ "description" : "Data read/write queue length in number of data frames"
+ },
+ "queueSize" : {
+ "type" : "integer",
+ "description" : "Data read/write queue size in number of data frames"
},
"sampleCount" : {
"type" : "integer",
"description" : "count of samples that have been sent"
+ },
+ "correctableErrorsCount" : {
+ "type" : "integer",
+ "description" : "Absolute number of correctable errors"
+ },
+ "uncorrectableErrorsCount" : {
+ "type" : "integer",
+ "description" : "Absolute number of uncorrectable errors"
+ },
+ "tvSec" : {
+ "type" : "integer",
+ "description" : "Counts timestamp seconds"
+ },
+ "tvUSec" : {
+ "type" : "integer",
+ "description" : "Counts timestamp microseconds"
}
},
"description" : "RemoteOutput"
@@ -51603,7 +51622,7 @@ except ApiException as e:
- Generated 2021-12-12T22:32:39.234+01:00
+ Generated 2021-12-15T21:39:08.842+01:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGRemoteOutputReport.cpp b/swagger/sdrangel/code/qt5/client/SWGRemoteOutputReport.cpp
index cc2df2a34..2ebf2c83f 100644
--- a/swagger/sdrangel/code/qt5/client/SWGRemoteOutputReport.cpp
+++ b/swagger/sdrangel/code/qt5/client/SWGRemoteOutputReport.cpp
@@ -32,10 +32,20 @@ SWGRemoteOutputReport::SWGRemoteOutputReport() {
m_center_frequency_isSet = false;
sample_rate = 0;
m_sample_rate_isSet = false;
- buffer_rw_balance = 0.0f;
- m_buffer_rw_balance_isSet = false;
+ queue_length = 0;
+ m_queue_length_isSet = false;
+ queue_size = 0;
+ m_queue_size_isSet = false;
sample_count = 0;
m_sample_count_isSet = false;
+ correctable_errors_count = 0;
+ m_correctable_errors_count_isSet = false;
+ uncorrectable_errors_count = 0;
+ m_uncorrectable_errors_count_isSet = false;
+ tv_sec = 0;
+ m_tv_sec_isSet = false;
+ tv_u_sec = 0;
+ m_tv_u_sec_isSet = false;
}
SWGRemoteOutputReport::~SWGRemoteOutputReport() {
@@ -48,10 +58,20 @@ SWGRemoteOutputReport::init() {
m_center_frequency_isSet = false;
sample_rate = 0;
m_sample_rate_isSet = false;
- buffer_rw_balance = 0.0f;
- m_buffer_rw_balance_isSet = false;
+ queue_length = 0;
+ m_queue_length_isSet = false;
+ queue_size = 0;
+ m_queue_size_isSet = false;
sample_count = 0;
m_sample_count_isSet = false;
+ correctable_errors_count = 0;
+ m_correctable_errors_count_isSet = false;
+ uncorrectable_errors_count = 0;
+ m_uncorrectable_errors_count_isSet = false;
+ tv_sec = 0;
+ m_tv_sec_isSet = false;
+ tv_u_sec = 0;
+ m_tv_u_sec_isSet = false;
}
void
@@ -60,6 +80,11 @@ SWGRemoteOutputReport::cleanup() {
+
+
+
+
+
}
SWGRemoteOutputReport*
@@ -77,10 +102,20 @@ SWGRemoteOutputReport::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&sample_rate, pJson["sampleRate"], "qint32", "");
- ::SWGSDRangel::setValue(&buffer_rw_balance, pJson["bufferRWBalance"], "float", "");
+ ::SWGSDRangel::setValue(&queue_length, pJson["queueLength"], "qint32", "");
+
+ ::SWGSDRangel::setValue(&queue_size, pJson["queueSize"], "qint32", "");
::SWGSDRangel::setValue(&sample_count, pJson["sampleCount"], "qint32", "");
+ ::SWGSDRangel::setValue(&correctable_errors_count, pJson["correctableErrorsCount"], "qint32", "");
+
+ ::SWGSDRangel::setValue(&uncorrectable_errors_count, pJson["uncorrectableErrorsCount"], "qint32", "");
+
+ ::SWGSDRangel::setValue(&tv_sec, pJson["tvSec"], "qint32", "");
+
+ ::SWGSDRangel::setValue(&tv_u_sec, pJson["tvUSec"], "qint32", "");
+
}
QString
@@ -103,12 +138,27 @@ SWGRemoteOutputReport::asJsonObject() {
if(m_sample_rate_isSet){
obj->insert("sampleRate", QJsonValue(sample_rate));
}
- if(m_buffer_rw_balance_isSet){
- obj->insert("bufferRWBalance", QJsonValue(buffer_rw_balance));
+ if(m_queue_length_isSet){
+ obj->insert("queueLength", QJsonValue(queue_length));
+ }
+ if(m_queue_size_isSet){
+ obj->insert("queueSize", QJsonValue(queue_size));
}
if(m_sample_count_isSet){
obj->insert("sampleCount", QJsonValue(sample_count));
}
+ if(m_correctable_errors_count_isSet){
+ obj->insert("correctableErrorsCount", QJsonValue(correctable_errors_count));
+ }
+ if(m_uncorrectable_errors_count_isSet){
+ obj->insert("uncorrectableErrorsCount", QJsonValue(uncorrectable_errors_count));
+ }
+ if(m_tv_sec_isSet){
+ obj->insert("tvSec", QJsonValue(tv_sec));
+ }
+ if(m_tv_u_sec_isSet){
+ obj->insert("tvUSec", QJsonValue(tv_u_sec));
+ }
return obj;
}
@@ -133,14 +183,24 @@ SWGRemoteOutputReport::setSampleRate(qint32 sample_rate) {
this->m_sample_rate_isSet = true;
}
-float
-SWGRemoteOutputReport::getBufferRwBalance() {
- return buffer_rw_balance;
+qint32
+SWGRemoteOutputReport::getQueueLength() {
+ return queue_length;
}
void
-SWGRemoteOutputReport::setBufferRwBalance(float buffer_rw_balance) {
- this->buffer_rw_balance = buffer_rw_balance;
- this->m_buffer_rw_balance_isSet = true;
+SWGRemoteOutputReport::setQueueLength(qint32 queue_length) {
+ this->queue_length = queue_length;
+ this->m_queue_length_isSet = true;
+}
+
+qint32
+SWGRemoteOutputReport::getQueueSize() {
+ return queue_size;
+}
+void
+SWGRemoteOutputReport::setQueueSize(qint32 queue_size) {
+ this->queue_size = queue_size;
+ this->m_queue_size_isSet = true;
}
qint32
@@ -153,6 +213,46 @@ SWGRemoteOutputReport::setSampleCount(qint32 sample_count) {
this->m_sample_count_isSet = true;
}
+qint32
+SWGRemoteOutputReport::getCorrectableErrorsCount() {
+ return correctable_errors_count;
+}
+void
+SWGRemoteOutputReport::setCorrectableErrorsCount(qint32 correctable_errors_count) {
+ this->correctable_errors_count = correctable_errors_count;
+ this->m_correctable_errors_count_isSet = true;
+}
+
+qint32
+SWGRemoteOutputReport::getUncorrectableErrorsCount() {
+ return uncorrectable_errors_count;
+}
+void
+SWGRemoteOutputReport::setUncorrectableErrorsCount(qint32 uncorrectable_errors_count) {
+ this->uncorrectable_errors_count = uncorrectable_errors_count;
+ this->m_uncorrectable_errors_count_isSet = true;
+}
+
+qint32
+SWGRemoteOutputReport::getTvSec() {
+ return tv_sec;
+}
+void
+SWGRemoteOutputReport::setTvSec(qint32 tv_sec) {
+ this->tv_sec = tv_sec;
+ this->m_tv_sec_isSet = true;
+}
+
+qint32
+SWGRemoteOutputReport::getTvUSec() {
+ return tv_u_sec;
+}
+void
+SWGRemoteOutputReport::setTvUSec(qint32 tv_u_sec) {
+ this->tv_u_sec = tv_u_sec;
+ this->m_tv_u_sec_isSet = true;
+}
+
bool
SWGRemoteOutputReport::isSet(){
@@ -164,12 +264,27 @@ SWGRemoteOutputReport::isSet(){
if(m_sample_rate_isSet){
isObjectUpdated = true; break;
}
- if(m_buffer_rw_balance_isSet){
+ if(m_queue_length_isSet){
+ isObjectUpdated = true; break;
+ }
+ if(m_queue_size_isSet){
isObjectUpdated = true; break;
}
if(m_sample_count_isSet){
isObjectUpdated = true; break;
}
+ if(m_correctable_errors_count_isSet){
+ isObjectUpdated = true; break;
+ }
+ if(m_uncorrectable_errors_count_isSet){
+ isObjectUpdated = true; break;
+ }
+ if(m_tv_sec_isSet){
+ isObjectUpdated = true; break;
+ }
+ if(m_tv_u_sec_isSet){
+ isObjectUpdated = true; break;
+ }
}while(false);
return isObjectUpdated;
}
diff --git a/swagger/sdrangel/code/qt5/client/SWGRemoteOutputReport.h b/swagger/sdrangel/code/qt5/client/SWGRemoteOutputReport.h
index 74665f179..4ece62517 100644
--- a/swagger/sdrangel/code/qt5/client/SWGRemoteOutputReport.h
+++ b/swagger/sdrangel/code/qt5/client/SWGRemoteOutputReport.h
@@ -47,12 +47,27 @@ public:
qint32 getSampleRate();
void setSampleRate(qint32 sample_rate);
- float getBufferRwBalance();
- void setBufferRwBalance(float buffer_rw_balance);
+ qint32 getQueueLength();
+ void setQueueLength(qint32 queue_length);
+
+ qint32 getQueueSize();
+ void setQueueSize(qint32 queue_size);
qint32 getSampleCount();
void setSampleCount(qint32 sample_count);
+ qint32 getCorrectableErrorsCount();
+ void setCorrectableErrorsCount(qint32 correctable_errors_count);
+
+ qint32 getUncorrectableErrorsCount();
+ void setUncorrectableErrorsCount(qint32 uncorrectable_errors_count);
+
+ qint32 getTvSec();
+ void setTvSec(qint32 tv_sec);
+
+ qint32 getTvUSec();
+ void setTvUSec(qint32 tv_u_sec);
+
virtual bool isSet() override;
@@ -63,12 +78,27 @@ private:
qint32 sample_rate;
bool m_sample_rate_isSet;
- float buffer_rw_balance;
- bool m_buffer_rw_balance_isSet;
+ qint32 queue_length;
+ bool m_queue_length_isSet;
+
+ qint32 queue_size;
+ bool m_queue_size_isSet;
qint32 sample_count;
bool m_sample_count_isSet;
+ qint32 correctable_errors_count;
+ bool m_correctable_errors_count_isSet;
+
+ qint32 uncorrectable_errors_count;
+ bool m_uncorrectable_errors_count_isSet;
+
+ qint32 tv_sec;
+ bool m_tv_sec_isSet;
+
+ qint32 tv_u_sec;
+ bool m_tv_u_sec_isSet;
+
};
}