1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-25 09:18:54 -05:00

Remote Output: improve report API

This commit is contained in:
f4exb 2021-12-15 22:56:18 +01:00
parent 54866a1a1e
commit 9097e2f6d4
9 changed files with 275 additions and 69 deletions

View File

@ -187,7 +187,7 @@ public:
virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getIdentifier(QString& id) { id = objectName(); }
virtual void getTitle(QString& title) { title = m_settings.m_title; } 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 getNbSinkStreams() const { return 0; }
virtual int getNbSourceStreams() const { return 1; } virtual int getNbSourceStreams() const { return 1; }

View File

@ -29,6 +29,7 @@
#include "SWGRemoteOutputReport.h" #include "SWGRemoteOutputReport.h"
#include "util/simpleserializer.h" #include "util/simpleserializer.h"
#include "util/timeutil.h"
#include "dsp/dspcommands.h" #include "dsp/dspcommands.h"
#include "dsp/dspengine.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::MsgConfigureRemoteOutputWork, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgStartStop, Message) MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgStartStop, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgConfigureRemoteOutputChunkCorrection, Message) MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgConfigureRemoteOutputChunkCorrection, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgConfigureRemoteOutputSampleRate, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgReportRemoteData, Message) MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgReportRemoteData, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgReportRemoteFixedData, Message) MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgReportRemoteFixedData, Message)
MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgRequestFixedData, Message) MESSAGE_CLASS_DEFINITION(RemoteOutput::MsgRequestFixedData, Message)
@ -57,7 +57,11 @@ RemoteOutput::RemoteOutput(DeviceAPI *deviceAPI) :
m_masterTimer(deviceAPI->getMasterTimer()), m_masterTimer(deviceAPI->getMasterTimer()),
m_tickCount(0), m_tickCount(0),
m_greaterTickCount(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_deviceAPI->setNbSinkStreams(1);
m_networkManager = new QNetworkAccessManager(); m_networkManager = new QNetworkAccessManager();
@ -466,10 +470,16 @@ void RemoteOutput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& re
void RemoteOutput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response) 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()->setCenterFrequency(m_centerFrequency);
response.getRemoteOutputReport()->setSampleRate(m_sampleRate); 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()->setSampleCount(m_remoteOutputWorker ? (int) m_remoteOutputWorker->getSamplesCount() : 0);
response.getRemoteOutputReport()->setCorrectableErrorsCount(m_recoverableCount);
response.getRemoteOutputReport()->setUncorrectableErrorsCount(m_unrecoverableCount);
} }
void RemoteOutput::tick() void RemoteOutput::tick()
@ -552,20 +562,20 @@ void RemoteOutput::analyzeApiReply(const QJsonObject& jsonObject, const QString&
msgRemoteData.m_centerFrequency = m_centerFrequency; msgRemoteData.m_centerFrequency = m_centerFrequency;
msgRemoteData.m_sampleRate = m_sampleRate; msgRemoteData.m_sampleRate = m_sampleRate;
int queueSize = report["queueSize"].toInt(); m_queueSize = report["queueSize"].toInt();
queueSize = queueSize == 0 ? 20 : queueSize; m_queueSize = m_queueSize == 0 ? 20 : m_queueSize;
msgRemoteData.m_queueSize = queueSize; msgRemoteData.m_queueSize = m_queueSize;
int queueLength = report["queueLength"].toInt(); m_queueLength = report["queueLength"].toInt();
msgRemoteData.m_queueLength = queueLength; msgRemoteData.m_queueLength = m_queueLength;
uint64_t remoteTimestampUs = report["tvSec"].toInt()*1000000ULL + report["tvUSec"].toInt(); uint64_t remoteTimestampUs = report["tvSec"].toInt()*1000000ULL + report["tvUSec"].toInt();
msgRemoteData.m_timestampUs = remoteTimestampUs; msgRemoteData.m_timestampUs = remoteTimestampUs;
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 unrecoverableCount = report["uncorrectableErrorsCount"].toInt(); m_unrecoverableCount = report["uncorrectableErrorsCount"].toInt();
msgRemoteData.m_unrecoverableCount = unrecoverableCount; msgRemoteData.m_unrecoverableCount = m_unrecoverableCount;
int recoverableCount = report["correctableErrorsCount"].toInt(); m_recoverableCount = report["correctableErrorsCount"].toInt();
msgRemoteData.m_recoverableCount = recoverableCount; msgRemoteData.m_recoverableCount = m_recoverableCount;
if (m_guiMessageQueue) if (m_guiMessageQueue)
{ {
@ -579,7 +589,7 @@ void RemoteOutput::analyzeApiReply(const QJsonObject& jsonObject, const QString&
if (++m_greaterTickCount == m_tickMultiplier) if (++m_greaterTickCount == m_tickMultiplier)
{ {
queueLengthCompensation(m_sampleRate, queueLength, queueSize); queueLengthCompensation(m_sampleRate, m_queueLength, m_queueSize);
m_greaterTickCount = 0; m_greaterTickCount = 0;
} }
} }

View File

@ -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 { class MsgReportRemoteData : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
@ -284,6 +265,10 @@ private:
uint32_t m_tickCount; // for 50 ms timer uint32_t m_tickCount; // for 50 ms timer
uint32_t m_greaterTickCount; // for 1 s derived timer uint32_t m_greaterTickCount; // for 1 s derived timer
uint32_t m_tickMultiplier; // for greater tick count uint32_t m_tickMultiplier; // for greater tick count
int m_queueLength;
int m_queueSize;
int m_recoverableCount;
int m_unrecoverableCount;
QNetworkAccessManager *m_networkManager; QNetworkAccessManager *m_networkManager;
QNetworkRequest m_networkRequest; QNetworkRequest m_networkRequest;

View File

@ -9827,14 +9827,33 @@ margin-bottom: 20px;
"sampleRate" : { "sampleRate" : {
"type" : "integer" "type" : "integer"
}, },
"bufferRWBalance" : { "queueLength" : {
"type" : "number", "type" : "integer",
"format" : "float", "description" : "Data read/write queue length in number of data frames"
"description" : "ratio off the mid buffer (positive read leads)" },
"queueSize" : {
"type" : "integer",
"description" : "Data read/write queue size in number of data frames"
}, },
"sampleCount" : { "sampleCount" : {
"type" : "integer", "type" : "integer",
"description" : "count of samples that have been sent" "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" "description" : "RemoteOutput"
@ -51603,7 +51622,7 @@ except ApiException as e:
</div> </div>
<div id="generator"> <div id="generator">
<div class="content"> <div class="content">
Generated 2021-12-12T22:32:39.234+01:00 Generated 2021-12-15T21:39:08.842+01:00
</div> </div>
</div> </div>
</div> </div>

View File

@ -35,10 +35,24 @@ RemoteOutputReport:
format: int64 format: int64
sampleRate: sampleRate:
type: integer type: integer
bufferRWBalance: queueLength:
description: ratio off the mid buffer (positive read leads) description: "Data read/write queue length in number of data frames"
type: number type: integer
format: float queueSize:
description: "Data read/write queue size in number of data frames"
type: integer
sampleCount: sampleCount:
description: count of samples that have been sent description: count of samples that have been sent
type: integer 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

View File

@ -35,10 +35,24 @@ RemoteOutputReport:
format: int64 format: int64
sampleRate: sampleRate:
type: integer type: integer
bufferRWBalance: queueLength:
description: ratio off the mid buffer (positive read leads) description: "Data read/write queue length in number of data frames"
type: number type: integer
format: float queueSize:
description: "Data read/write queue size in number of data frames"
type: integer
sampleCount: sampleCount:
description: count of samples that have been sent description: count of samples that have been sent
type: integer 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

View File

@ -9827,14 +9827,33 @@ margin-bottom: 20px;
"sampleRate" : { "sampleRate" : {
"type" : "integer" "type" : "integer"
}, },
"bufferRWBalance" : { "queueLength" : {
"type" : "number", "type" : "integer",
"format" : "float", "description" : "Data read/write queue length in number of data frames"
"description" : "ratio off the mid buffer (positive read leads)" },
"queueSize" : {
"type" : "integer",
"description" : "Data read/write queue size in number of data frames"
}, },
"sampleCount" : { "sampleCount" : {
"type" : "integer", "type" : "integer",
"description" : "count of samples that have been sent" "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" "description" : "RemoteOutput"
@ -51603,7 +51622,7 @@ except ApiException as e:
</div> </div>
<div id="generator"> <div id="generator">
<div class="content"> <div class="content">
Generated 2021-12-12T22:32:39.234+01:00 Generated 2021-12-15T21:39:08.842+01:00
</div> </div>
</div> </div>
</div> </div>

View File

@ -32,10 +32,20 @@ SWGRemoteOutputReport::SWGRemoteOutputReport() {
m_center_frequency_isSet = false; m_center_frequency_isSet = false;
sample_rate = 0; sample_rate = 0;
m_sample_rate_isSet = false; m_sample_rate_isSet = false;
buffer_rw_balance = 0.0f; queue_length = 0;
m_buffer_rw_balance_isSet = false; m_queue_length_isSet = false;
queue_size = 0;
m_queue_size_isSet = false;
sample_count = 0; sample_count = 0;
m_sample_count_isSet = false; 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() { SWGRemoteOutputReport::~SWGRemoteOutputReport() {
@ -48,10 +58,20 @@ SWGRemoteOutputReport::init() {
m_center_frequency_isSet = false; m_center_frequency_isSet = false;
sample_rate = 0; sample_rate = 0;
m_sample_rate_isSet = false; m_sample_rate_isSet = false;
buffer_rw_balance = 0.0f; queue_length = 0;
m_buffer_rw_balance_isSet = false; m_queue_length_isSet = false;
queue_size = 0;
m_queue_size_isSet = false;
sample_count = 0; sample_count = 0;
m_sample_count_isSet = false; 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 void
@ -60,6 +80,11 @@ SWGRemoteOutputReport::cleanup() {
} }
SWGRemoteOutputReport* SWGRemoteOutputReport*
@ -77,10 +102,20 @@ SWGRemoteOutputReport::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&sample_rate, pJson["sampleRate"], "qint32", ""); ::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(&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 QString
@ -103,12 +138,27 @@ SWGRemoteOutputReport::asJsonObject() {
if(m_sample_rate_isSet){ if(m_sample_rate_isSet){
obj->insert("sampleRate", QJsonValue(sample_rate)); obj->insert("sampleRate", QJsonValue(sample_rate));
} }
if(m_buffer_rw_balance_isSet){ if(m_queue_length_isSet){
obj->insert("bufferRWBalance", QJsonValue(buffer_rw_balance)); obj->insert("queueLength", QJsonValue(queue_length));
}
if(m_queue_size_isSet){
obj->insert("queueSize", QJsonValue(queue_size));
} }
if(m_sample_count_isSet){ if(m_sample_count_isSet){
obj->insert("sampleCount", QJsonValue(sample_count)); 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; return obj;
} }
@ -133,14 +183,24 @@ SWGRemoteOutputReport::setSampleRate(qint32 sample_rate) {
this->m_sample_rate_isSet = true; this->m_sample_rate_isSet = true;
} }
float qint32
SWGRemoteOutputReport::getBufferRwBalance() { SWGRemoteOutputReport::getQueueLength() {
return buffer_rw_balance; return queue_length;
} }
void void
SWGRemoteOutputReport::setBufferRwBalance(float buffer_rw_balance) { SWGRemoteOutputReport::setQueueLength(qint32 queue_length) {
this->buffer_rw_balance = buffer_rw_balance; this->queue_length = queue_length;
this->m_buffer_rw_balance_isSet = true; 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 qint32
@ -153,6 +213,46 @@ SWGRemoteOutputReport::setSampleCount(qint32 sample_count) {
this->m_sample_count_isSet = true; 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 bool
SWGRemoteOutputReport::isSet(){ SWGRemoteOutputReport::isSet(){
@ -164,12 +264,27 @@ SWGRemoteOutputReport::isSet(){
if(m_sample_rate_isSet){ if(m_sample_rate_isSet){
isObjectUpdated = true; break; 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; isObjectUpdated = true; break;
} }
if(m_sample_count_isSet){ if(m_sample_count_isSet){
isObjectUpdated = true; break; 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); }while(false);
return isObjectUpdated; return isObjectUpdated;
} }

View File

@ -47,12 +47,27 @@ public:
qint32 getSampleRate(); qint32 getSampleRate();
void setSampleRate(qint32 sample_rate); void setSampleRate(qint32 sample_rate);
float getBufferRwBalance(); qint32 getQueueLength();
void setBufferRwBalance(float buffer_rw_balance); void setQueueLength(qint32 queue_length);
qint32 getQueueSize();
void setQueueSize(qint32 queue_size);
qint32 getSampleCount(); qint32 getSampleCount();
void setSampleCount(qint32 sample_count); 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; virtual bool isSet() override;
@ -63,12 +78,27 @@ private:
qint32 sample_rate; qint32 sample_rate;
bool m_sample_rate_isSet; bool m_sample_rate_isSet;
float buffer_rw_balance; qint32 queue_length;
bool m_buffer_rw_balance_isSet; bool m_queue_length_isSet;
qint32 queue_size;
bool m_queue_size_isSet;
qint32 sample_count; qint32 sample_count;
bool m_sample_count_isSet; 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;
}; };
} }