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_sampleSource = m_deviceUISet->m_deviceAPI->getSampleSource();
m_statusTooltips.push_back("Idle"); // 0 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("Connected"); // 2
m_statusTooltips.push_back("Error"); // 3 m_statusTooltips.push_back("Error"); // 3
m_statusTooltips.push_back("Disconnected"); // 4 m_statusTooltips.push_back("Disconnected"); // 4
m_statusColors.push_back("gray"); // Idle 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(35, 138, 35)"); // Connected (green)
m_statusColors.push_back("rgb(232, 85, 85)"); // Error (red) m_statusColors.push_back("rgb(232, 85, 85)"); // Error (red)
m_statusColors.push_back("rgb(232, 85, 232)"); // Disconnected (magenta) 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()->setSampleRate(m_deviceSampleRate);
m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency);
ui->deviceRateText->setText(tr("%1M").arg((float)m_deviceSampleRate / 1000 / 1000)); 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->setValue(m_deviceCenterFrequency / 1000);
ui->centerFrequency->blockSignals(true); blockApplySettings(false);
} }
void AaroniaRTSAGui::openDeviceSettingsDialog(const QPoint& p) void AaroniaRTSAGui::openDeviceSettingsDialog(const QPoint& p)

View File

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

View File

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

View File

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

View File

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