mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-02-03 09:44:01 -05:00
SDRDaemonSink GUI: enhanced status reporting
This commit is contained in:
parent
829299cb74
commit
90fb223b01
@ -57,6 +57,7 @@ SDRdaemonSinkGui::SDRdaemonSinkGui(DeviceUISet *deviceUISet, QWidget* parent) :
|
|||||||
m_countRecovered = 0;
|
m_countRecovered = 0;
|
||||||
m_lastCountUnrecoverable = 0;
|
m_lastCountUnrecoverable = 0;
|
||||||
m_lastCountRecovered = 0;
|
m_lastCountRecovered = 0;
|
||||||
|
m_lastSampleCount = 0;
|
||||||
m_resetCounts = true;
|
m_resetCounts = true;
|
||||||
|
|
||||||
m_paletteGreenText.setColor(QPalette::WindowText, Qt::green);
|
m_paletteGreenText.setColor(QPalette::WindowText, Qt::green);
|
||||||
@ -335,6 +336,10 @@ void SDRdaemonSinkGui::on_apiAddress_returnPressed()
|
|||||||
{
|
{
|
||||||
m_settings.m_apiAddress = ui->apiAddress->text();
|
m_settings.m_apiAddress = ui->apiAddress->text();
|
||||||
sendSettings();
|
sendSettings();
|
||||||
|
|
||||||
|
QString infoURL = QString("http://%1:%2/sdrdaemon").arg(m_settings.m_apiAddress).arg(m_settings.m_apiPort);
|
||||||
|
m_networkRequest.setUrl(QUrl(infoURL));
|
||||||
|
m_networkManager->get(m_networkRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRdaemonSinkGui::on_apiPort_returnPressed()
|
void SDRdaemonSinkGui::on_apiPort_returnPressed()
|
||||||
@ -352,6 +357,10 @@ void SDRdaemonSinkGui::on_apiPort_returnPressed()
|
|||||||
}
|
}
|
||||||
|
|
||||||
sendSettings();
|
sendSettings();
|
||||||
|
|
||||||
|
QString infoURL = QString("http://%1:%2/sdrdaemon").arg(m_settings.m_apiAddress).arg(m_settings.m_apiPort);
|
||||||
|
m_networkRequest.setUrl(QUrl(infoURL));
|
||||||
|
m_networkManager->get(m_networkRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRdaemonSinkGui::on_dataAddress_returnPressed()
|
void SDRdaemonSinkGui::on_dataAddress_returnPressed()
|
||||||
@ -390,6 +399,10 @@ void SDRdaemonSinkGui::on_apiApplyButton_clicked(bool checked __attribute__((unu
|
|||||||
}
|
}
|
||||||
|
|
||||||
sendSettings();
|
sendSettings();
|
||||||
|
|
||||||
|
QString infoURL = QString("http://%1:%2/sdrdaemon").arg(m_settings.m_apiAddress).arg(m_settings.m_apiPort);
|
||||||
|
m_networkRequest.setUrl(QUrl(infoURL));
|
||||||
|
m_networkManager->get(m_networkRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRdaemonSinkGui::on_dataApplyButton_clicked(bool checked __attribute__((unused)))
|
void SDRdaemonSinkGui::on_dataApplyButton_clicked(bool checked __attribute__((unused)))
|
||||||
@ -496,7 +509,7 @@ void SDRdaemonSinkGui::networkManagerFinished(QNetworkReply *reply)
|
|||||||
if (reply->error())
|
if (reply->error())
|
||||||
{
|
{
|
||||||
ui->apiAddressLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }");
|
ui->apiAddressLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }");
|
||||||
qDebug() << "SDRdaemonSinkGui::networkManagerFinished" << reply->errorString();
|
ui->statusText->setText(reply->errorString());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -511,25 +524,30 @@ void SDRdaemonSinkGui::networkManagerFinished(QNetworkReply *reply)
|
|||||||
if (error.error == QJsonParseError::NoError)
|
if (error.error == QJsonParseError::NoError)
|
||||||
{
|
{
|
||||||
ui->apiAddressLabel->setStyleSheet("QLabel { background-color : green; }");
|
ui->apiAddressLabel->setStyleSheet("QLabel { background-color : green; }");
|
||||||
analyzeChannelReport(doc.object());
|
ui->statusText->setText(QString("API OK"));
|
||||||
|
analyzeApiReply(doc.object());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ui->apiAddressLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }");
|
ui->apiAddressLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }");
|
||||||
QString errorMsg = QString("Reply JSON error: ") + error.errorString() + QString(" at offset ") + QString::number(error.offset);
|
QString errorMsg = QString("Reply JSON error: ") + error.errorString() + QString(" at offset ") + QString::number(error.offset);
|
||||||
qDebug().noquote() << "SDRdaemonSinkGui::networkManagerFinished" << errorMsg;
|
ui->statusText->setText(QString("JSON error. See log"));
|
||||||
|
qInfo().noquote() << "SDRdaemonSinkGui::networkManagerFinished" << errorMsg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
ui->apiAddressLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }");
|
ui->apiAddressLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }");
|
||||||
QString errorMsg = QString("Error parsing request: ") + ex.what();
|
QString errorMsg = QString("Error parsing request: ") + ex.what();
|
||||||
qDebug().noquote() << "SDRdaemonSinkGui::networkManagerFinished" << errorMsg;
|
ui->statusText->setText("Error parsing request. See log for details");
|
||||||
|
qInfo().noquote() << "SDRdaemonSinkGui::networkManagerFinished" << errorMsg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRdaemonSinkGui::analyzeChannelReport(const QJsonObject& jsonObject)
|
void SDRdaemonSinkGui::analyzeApiReply(const QJsonObject& jsonObject)
|
||||||
{
|
{
|
||||||
|
QString infoLine;
|
||||||
|
|
||||||
if (jsonObject.contains("SDRDaemonChannelSourceReport"))
|
if (jsonObject.contains("SDRDaemonChannelSourceReport"))
|
||||||
{
|
{
|
||||||
QJsonObject report = jsonObject["SDRDaemonChannelSourceReport"].toObject();
|
QJsonObject report = jsonObject["SDRDaemonChannelSourceReport"].toObject();
|
||||||
@ -541,6 +559,8 @@ void SDRdaemonSinkGui::analyzeChannelReport(const QJsonObject& jsonObject)
|
|||||||
ui->queueLengthGauge->setValue((queueLength*100)/queueSize);
|
ui->queueLengthGauge->setValue((queueLength*100)/queueSize);
|
||||||
int unrecoverableCount = report["uncorrectableErrorsCount"].toInt();
|
int unrecoverableCount = report["uncorrectableErrorsCount"].toInt();
|
||||||
int recoverableCount = report["correctableErrorsCount"].toInt();
|
int recoverableCount = report["correctableErrorsCount"].toInt();
|
||||||
|
int sampleCount = report["samplesCount"].toInt();
|
||||||
|
uint64_t timestampUs = report["tvSec"].toInt()*1000000ULL + report["tvUSec"].toInt();
|
||||||
|
|
||||||
if (!m_resetCounts)
|
if (!m_resetCounts)
|
||||||
{
|
{
|
||||||
@ -552,8 +572,41 @@ void SDRdaemonSinkGui::analyzeChannelReport(const QJsonObject& jsonObject)
|
|||||||
displayEventCounts();
|
displayEventCounts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((sampleCount - m_lastSampleCount) == 0) {
|
||||||
|
ui->allFramesDecoded->setStyleSheet("QToolButton { background-color : blue; }");
|
||||||
|
}
|
||||||
|
|
||||||
|
double remoteStreamRate = (sampleCount - m_lastSampleCount) / (double) (timestampUs - m_lastTimestampUs);
|
||||||
|
ui->remoteStreamRateText->setText(QString("%1").arg(remoteStreamRate * 1e6, 0, 'f', 0));
|
||||||
|
|
||||||
m_resetCounts = false;
|
m_resetCounts = false;
|
||||||
m_lastCountRecovered = recoverableCount;
|
m_lastCountRecovered = recoverableCount;
|
||||||
m_lastCountUnrecoverable = unrecoverableCount;
|
m_lastCountUnrecoverable = unrecoverableCount;
|
||||||
|
m_lastSampleCount = sampleCount;
|
||||||
|
m_lastTimestampUs = timestampUs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jsonObject.contains("version")) {
|
||||||
|
infoLine = "v" + jsonObject["version"].toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jsonObject.contains("qtVersion")) {
|
||||||
|
infoLine += " Qt" + jsonObject["qtVersion"].toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jsonObject.contains("architecture")) {
|
||||||
|
infoLine += " " + jsonObject["architecture"].toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jsonObject.contains("os")) {
|
||||||
|
infoLine += " " + jsonObject["os"].toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jsonObject.contains("dspRxBits") && jsonObject.contains("dspTxBits")) {
|
||||||
|
infoLine += QString(" %1/%2b").arg(jsonObject["dspRxBits"].toInt()).arg(jsonObject["dspTxBits"].toInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (infoLine.size() > 0) {
|
||||||
|
ui->infoText->setText(infoLine);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,12 +75,12 @@ private:
|
|||||||
bool m_doApplySettings;
|
bool m_doApplySettings;
|
||||||
bool m_forceSettings;
|
bool m_forceSettings;
|
||||||
|
|
||||||
int m_nnSender;
|
|
||||||
|
|
||||||
uint32_t m_countUnrecoverable;
|
uint32_t m_countUnrecoverable;
|
||||||
uint32_t m_countRecovered;
|
uint32_t m_countRecovered;
|
||||||
uint32_t m_lastCountUnrecoverable;
|
uint32_t m_lastCountUnrecoverable;
|
||||||
uint32_t m_lastCountRecovered;
|
uint32_t m_lastCountRecovered;
|
||||||
|
uint32_t m_lastSampleCount;
|
||||||
|
uint64_t m_lastTimestampUs;
|
||||||
bool m_resetCounts;
|
bool m_resetCounts;
|
||||||
QTime m_time;
|
QTime m_time;
|
||||||
|
|
||||||
@ -104,7 +104,7 @@ private:
|
|||||||
void displayEventCounts();
|
void displayEventCounts();
|
||||||
void displayEventStatus(int recoverableCount, int unrecoverableCount);
|
void displayEventStatus(int recoverableCount, int unrecoverableCount);
|
||||||
void displayEventTimer();
|
void displayEventTimer();
|
||||||
void analyzeChannelReport(const QJsonObject& jsonObject);
|
void analyzeApiReply(const QJsonObject& jsonObject);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void handleInputMessages();
|
void handleInputMessages();
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>360</width>
|
<width>360</width>
|
||||||
<height>237</height>
|
<height>270</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@ -19,7 +19,7 @@
|
|||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>360</width>
|
<width>360</width>
|
||||||
<height>190</height>
|
<height>270</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="font">
|
<property name="font">
|
||||||
@ -358,7 +358,7 @@
|
|||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Frames status: green = all original received, none = some recovered by FEC, red = some lost</string>
|
<string>Frames status: green = all original received, none = some recovered by FEC, red = some lost, blue = remote not streaming</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@ -369,6 +369,38 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="remoteStreamRateText">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>50</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Remote stream rate (S/s)</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>0000000</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="remoteStreamRateUnits">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>S/s</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="eventCountsReset">
|
<widget class="QPushButton" name="eventCountsReset">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
@ -673,6 +705,28 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="statusLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="statusText">
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="infoLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="infoText">
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="padLayout">
|
<layout class="QHBoxLayout" name="padLayout">
|
||||||
<item>
|
<item>
|
||||||
|
Loading…
Reference in New Issue
Block a user