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; + }; }