Aaronia RSA Rx: implemented change of server address and status indicator

This commit is contained in:
f4exb 2023-03-22 17:57:21 +01:00
parent be719f9653
commit 813e6580fd
5 changed files with 88 additions and 42 deletions

View File

@ -56,13 +56,13 @@ AaroniaRTSAGui::AaroniaRTSAGui(DeviceUISet *deviceUISet, QWidget* parent) :
m_sampleSource = m_deviceUISet->m_deviceAPI->getSampleSource();
m_statusTooltips.push_back("Idle"); // 0
m_statusTooltips.push_back("Connecting..."); // 1
m_statusTooltips.push_back("Unstable"); // 1
m_statusTooltips.push_back("Connected"); // 2
m_statusTooltips.push_back("Error"); // 3
m_statusTooltips.push_back("Disconnected"); // 4
m_statusColors.push_back("gray"); // Idle
m_statusColors.push_back("rgb(232, 212, 35)"); // Connecting (yellow)
m_statusColors.push_back("rgb(232, 212, 35)"); // Unstable (yellow)
m_statusColors.push_back("rgb(35, 138, 35)"); // Connected (green)
m_statusColors.push_back("rgb(232, 85, 85)"); // Error (red)
m_statusColors.push_back("rgb(232, 85, 232)"); // Disconnected (magenta)
@ -292,9 +292,9 @@ void AaroniaRTSAGui::updateSampleRateAndFrequency()
m_deviceUISet->getSpectrum()->setSampleRate(m_deviceSampleRate);
m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency);
ui->deviceRateText->setText(tr("%1M").arg((float)m_deviceSampleRate / 1000 / 1000));
ui->centerFrequency->blockSignals(true);
blockApplySettings(true);
ui->centerFrequency->setValue(m_deviceCenterFrequency / 1000);
ui->centerFrequency->blockSignals(true);
blockApplySettings(false);
}
void AaroniaRTSAGui::openDeviceSettingsDialog(const QPoint& p)

View File

@ -290,9 +290,9 @@ bool AaroniaRTSAInput::applySettings(const AaroniaRTSASettings& settings, const
{
emit setWorkerCenterFrequency(settings.m_centerFrequency);
DSPSignalNotification *notif = new DSPSignalNotification(
getSampleRate(), settings.m_centerFrequency);
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
// DSPSignalNotification *notif = new DSPSignalNotification(
// getSampleRate(), settings.m_centerFrequency);
// m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
}
if (settingsKeys.contains("useReverseAPI"))

View File

@ -24,6 +24,15 @@
struct AaroniaRTSASettings {
enum ConnectionStatus
{
ConnectionIdle, // 0 - gray
ConnectionUnstable, // 1 - yellow
ConnectionOK, // 2 - green
ConnectionError, // 3 - red
ConnectionDisconnected // 4 - magenta
};
quint64 m_centerFrequency;
QString m_serverAddress;

View File

@ -20,6 +20,7 @@
#include "util/messagequeue.h"
#include "dsp/dspcommands.h"
#include "aaroniartsasettings.h"
#include "aaroniartsaworker.h"
MESSAGE_CLASS_DEFINITION(AaroniaRTSAWorker::MsgReportSampleRateAndFrequency, Message)
@ -29,39 +30,58 @@ AaroniaRTSAWorker::AaroniaRTSAWorker(SampleSinkFifo* sampleFifo) :
m_timer(this),
m_samplesBuf(),
m_sampleFifo(sampleFifo),
m_centerFrequency(1450000),
m_sampleRate(10000000),
m_centerFrequency(0),
m_sampleRate(1),
m_inputMessageQueue(nullptr),
m_status(0),
m_status(AaroniaRTSASettings::ConnectionIdle),
mReply(nullptr),
m_convertBuffer(64e6)
{
// Initialize network manager
// Initialize network managers
mNetworkAccessManager = new QNetworkAccessManager(this);
// Request 16bit raw samples
QUrl url("http://localhost:55123/stream?format=float32");
// m_serverAddress = "localhost:55123";
// QUrl url(tr("http://%1/stream?format=float32").arg(m_serverAddress));
QNetworkRequest req(url);
mReply = mNetworkAccessManager->get(req);
// QNetworkRequest req(url);
// mReply = mNetworkAccessManager->get(req);
// Connect Qt slots to network events
connect(mReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
connect(mReply, SIGNAL(finished()), this, SLOT(onFinished()));
connect(mReply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
// // Connect Qt slots to network events
// connect(mReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
// connect(mReply, SIGNAL(finished()), this, SLOT(onFinished()));
// connect(mReply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
mPrevTime = 0;
mPacketSamples = 0;
}
AaroniaRTSAWorker::~AaroniaRTSAWorker()
{
if (mReply)
{
// disconnect previous sugnals
disconnect(mReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
disconnect(mReply, SIGNAL(finished()), this, SLOT(onFinished()));
disconnect(mReply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
mReply->abort();
mReply->deleteLater();
}
mNetworkAccessManager->deleteLater();
}
void AaroniaRTSAWorker::onSocketError(QAbstractSocket::SocketError error)
{
(void) error;
m_status = 3;
emit updateStatus(3);
m_status = AaroniaRTSASettings::ConnectionError;
emit updateStatus(m_status);
}
void AaroniaRTSAWorker::sendCenterFrequency()
{
qDebug("AaroniaRTSAWorker::sendCenterFrequency: %llu", m_centerFrequency);
//if (!m_webSocket.isValid())
// return;
@ -84,21 +104,34 @@ void AaroniaRTSAWorker::onCenterFrequencyChanged(quint64 centerFrequency)
void AaroniaRTSAWorker::onServerAddressChanged(QString serverAddress)
{
/*if (m_serverAddress == serverAddress) {
return;
m_status = AaroniaRTSASettings::ConnectionDisconnected;
updateStatus(m_status);
if (mReply)
{
// disconnect previous sugnals
disconnect(mReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
disconnect(mReply, SIGNAL(finished()), this, SLOT(onFinished()));
disconnect(mReply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
mReply->abort();
mReply->deleteLater();
}
m_serverAddress = serverAddress;
QUrl url(tr("http://%1/stream?format=float32").arg(serverAddress));
QNetworkRequest req(url);
mReply = mNetworkAccessManager->get(req);
m_status = 1;
emit updateStatus(1);
// Connect Qt slots to network events
connect(mReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
connect(mReply, SIGNAL(finished()), this, SLOT(onFinished()));
connect(mReply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
QString url("ws://");
url.append(m_serverAddress);
url.append("/rtsa/");
url.append(QString::number(QDateTime::currentMSecsSinceEpoch()));
url.append("/SND");
m_webSocket.open(QUrl(url));*/
mPrevTime = 0;
mPacketSamples = 0;
m_sampleRate = 1;
m_centerFrequency = 0;
m_serverAddress = serverAddress;
}
void AaroniaRTSAWorker::tick()
@ -109,8 +142,11 @@ void AaroniaRTSAWorker::tick()
void AaroniaRTSAWorker::onError(QNetworkReply::NetworkError code)
{
(void) code;
QTextStream qerr(stderr);
qerr << "Network Error: " + mReply->errorString();
m_status = 3;
emit updateStatus(3);
}
void AaroniaRTSAWorker::onFinished()
@ -127,6 +163,12 @@ void AaroniaRTSAWorker::onFinished()
// bytes received from the socket
void AaroniaRTSAWorker::onReadyRead()
{
if (m_status != AaroniaRTSASettings::ConnectionOK)
{
m_status = AaroniaRTSASettings::ConnectionOK;
emit updateStatus(m_status);
}
QTextStream qout(stdout);
// read as many bytes as possible into input buffer

View File

@ -63,6 +63,7 @@ public:
};
AaroniaRTSAWorker(SampleSinkFifo* sampleFifo);
~AaroniaRTSAWorker();
int getStatus() const { return m_status; }
void setInputMessageQueue(MessageQueue *messageQueue) { m_inputMessageQueue = messageQueue; }
@ -83,20 +84,15 @@ private:
// QT htttp client
QNetworkAccessManager * mNetworkAccessManager;
QNetworkAccessManager *mNetworkAccessManager;
// Reply from the HTTP server
QNetworkReply * mReply;
QNetworkReply *mReply;
// Input buffer
QByteArray mBuffer;
QByteArray mBuffer;
// Number of IQ sample pairs in the current packet
int mPacketSamples;
int mPacketSamples;
// Previous sample end time to check for packet loss
double mPrevTime;
double mPrevTime;
//Decimators<qint32, float, SDR_RX_SAMP_SZ, 32, true> m_decimatorsIQ;
DecimatorsFI<true> m_decimatorsFloatIQ;
@ -113,7 +109,6 @@ public slots:
private slots:
void onSocketError(QAbstractSocket::SocketError error);
void onError(QNetworkReply::NetworkError code);
void onFinished(void);
void onReadyRead(void);