1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-05-24 03:02:29 -04:00

Aaronia RSA Rx: get center frequency and sample rate from meta data

This commit is contained in:
f4exb 2023-03-19 13:25:06 +01:00
parent 9e75ccb699
commit bfcc98c67c
5 changed files with 58 additions and 44 deletions

View File

@ -292,6 +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);
ui->centerFrequency->setValue(m_deviceCenterFrequency / 1000);
ui->centerFrequency->blockSignals(true);
} }
void AaroniaRTSAGui::openDeviceSettingsDialog(const QPoint& p) void AaroniaRTSAGui::openDeviceSettingsDialog(const QPoint& p)

View File

@ -43,7 +43,8 @@ MESSAGE_CLASS_DEFINITION(AaroniaRTSAInput::MsgSetStatus, Message)
AaroniaRTSAInput::AaroniaRTSAInput(DeviceAPI *deviceAPI) : AaroniaRTSAInput::AaroniaRTSAInput(DeviceAPI *deviceAPI) :
m_deviceAPI(deviceAPI), m_deviceAPI(deviceAPI),
m_sampleRate(2.0e5), m_sampleRate(10000000),
m_centerFrequency(1450000),
m_settings(), m_settings(),
m_aaroniaRTSAWorker(nullptr), m_aaroniaRTSAWorker(nullptr),
m_aaroniaRTSAWorkerThread(nullptr), m_aaroniaRTSAWorkerThread(nullptr),
@ -220,18 +221,21 @@ bool AaroniaRTSAInput::handleMessage(const Message& message)
return true; return true;
} }
else if (AaroniaRTSAWorker::MsgReportSampleRate::match(message)) else if (AaroniaRTSAWorker::MsgReportSampleRateAndFrequency::match(message))
{ {
AaroniaRTSAWorker::MsgReportSampleRate& report = (AaroniaRTSAWorker::MsgReportSampleRate&) message; AaroniaRTSAWorker::MsgReportSampleRateAndFrequency& report = (AaroniaRTSAWorker::MsgReportSampleRateAndFrequency&) message;
m_sampleRate = report.getSampleRate(); m_sampleRate = report.getSampleRate();
qDebug() << "AaroniaRTSAInput::handleMessage: AaroniaRTSAWorker::MsgReportSampleRate: m_sampleRate: " << m_sampleRate; m_centerFrequency = report.getCenterFrequency();
qDebug() << "AaroniaRTSAInput::handleMessage: AaroniaRTSAWorker::MsgReportSampleRateAndFrequency:"
<< " m_sampleRate: " << m_sampleRate
<< " m-centerFrequency" << m_centerFrequency;
if (!m_sampleFifo.setSize(m_sampleRate * 2)) { if (!m_sampleFifo.setSize(m_sampleRate * 2)) {
qCritical("AaroniaRTSAInput::AaroniaRTSAInput: Could not allocate SampleFifo"); qCritical("AaroniaRTSAInput::AaroniaRTSAInput: Could not allocate SampleFifo");
} }
DSPSignalNotification *notif = new DSPSignalNotification( DSPSignalNotification *notif = new DSPSignalNotification(
m_sampleRate, m_settings.m_centerFrequency); m_sampleRate, m_centerFrequency);
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
return true; return true;

View File

@ -156,6 +156,7 @@ private:
DeviceAPI *m_deviceAPI; DeviceAPI *m_deviceAPI;
QMutex m_mutex; QMutex m_mutex;
int m_sampleRate; int m_sampleRate;
quint64 m_centerFrequency;
AaroniaRTSASettings m_settings; AaroniaRTSASettings m_settings;
AaroniaRTSAWorker* m_aaroniaRTSAWorker; AaroniaRTSAWorker* m_aaroniaRTSAWorker;
QThread *m_aaroniaRTSAWorkerThread; QThread *m_aaroniaRTSAWorkerThread;

View File

@ -16,10 +16,13 @@
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include <boost/endian/conversion.hpp> #include <boost/endian/conversion.hpp>
#include "util/messagequeue.h" #include "util/messagequeue.h"
#include "dsp/dspcommands.h"
#include "aaroniartsaworker.h" #include "aaroniartsaworker.h"
MESSAGE_CLASS_DEFINITION(AaroniaRTSAWorker::MsgReportSampleRate, Message) MESSAGE_CLASS_DEFINITION(AaroniaRTSAWorker::MsgReportSampleRateAndFrequency, Message)
AaroniaRTSAWorker::AaroniaRTSAWorker(SampleSinkFifo* sampleFifo) : AaroniaRTSAWorker::AaroniaRTSAWorker(SampleSinkFifo* sampleFifo) :
QObject(), QObject(),
@ -27,28 +30,11 @@ AaroniaRTSAWorker::AaroniaRTSAWorker(SampleSinkFifo* sampleFifo) :
m_samplesBuf(), m_samplesBuf(),
m_sampleFifo(sampleFifo), m_sampleFifo(sampleFifo),
m_centerFrequency(1450000), m_centerFrequency(1450000),
m_sampleRate(10.0e6), m_sampleRate(10000000),
m_inputMessageQueue(nullptr), m_inputMessageQueue(nullptr),
m_gain(20),
m_useAGC(true),
m_status(0), m_status(0),
m_convertBuffer(64e6) m_convertBuffer(64e6)
{ {
/*connect(&m_timer, SIGNAL(timeout()), this, SLOT(tick()));
m_webSocket.setParent(this);
connect(&m_webSocket, &QWebSocket::connected,
this, &AaroniaRTSAWorker::onConnected);
connect(&m_webSocket, &QWebSocket::binaryMessageReceived,
this, &AaroniaRTSAWorker::onBinaryMessageReceived);
connect(&m_webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
this, &AaroniaRTSAWorker::onSocketError);
connect(&m_webSocket, &QWebSocket::disconnected,
this, &AaroniaRTSAWorker::onDisconnected);
*/
// Initialize network manager // Initialize network manager
mNetworkAccessManager = new QNetworkAccessManager(this); mNetworkAccessManager = new QNetworkAccessManager(this);
@ -65,8 +51,6 @@ AaroniaRTSAWorker::AaroniaRTSAWorker(SampleSinkFifo* sampleFifo) :
mPrevTime = 0; mPrevTime = 0;
mPacketSamples = 0; mPacketSamples = 0;
} }
void AaroniaRTSAWorker::onSocketError(QAbstractSocket::SocketError error) void AaroniaRTSAWorker::onSocketError(QAbstractSocket::SocketError error)
@ -163,7 +147,7 @@ void AaroniaRTSAWorker::onReadyRead()
if (mPacketSamples) if (mPacketSamples)
{ {
// enough samples // enough samples
if (offset + mPacketSamples * 2 * sizeof(float) <= avail) if (offset + mPacketSamples * 2 * sizeof(float) <= (unsigned long) avail)
{ {
// do something with the IQ data // do something with the IQ data
const float *sp = (const float *)(mBuffer.constData() + offset); const float *sp = (const float *)(mBuffer.constData() + offset);
@ -193,12 +177,15 @@ void AaroniaRTSAWorker::onReadyRead()
mPacketSamples = 0; mPacketSamples = 0;
} }
else else
{
break; break;
}
} }
else else
{ {
// is there a complete JSON metadata object in the buffer // is there a complete JSON metadata object in the buffer
int split = mBuffer.indexOf('\x1e', offset); int split = mBuffer.indexOf('\x1e', offset);
if (split != -1) if (split != -1)
{ {
// Extract it // Extract it
@ -223,6 +210,23 @@ void AaroniaRTSAWorker::onReadyRead()
// Switch to data phase // Switch to data phase
//mPrevTime = endTime; //mPrevTime = endTime;
mPacketSamples = samples; mPacketSamples = samples;
// qDebug() << jdoc.toJson();
quint64 endFreq = jdoc["endFrequency"].toDouble();
quint64 startFreq = jdoc["startFrequency"].toDouble();
int bw = endFreq - startFreq;
quint64 midFreq = (endFreq + startFreq) / 2;
if ((bw != m_sampleRate) || (midFreq != m_centerFrequency))
{
if (m_inputMessageQueue)
{
MsgReportSampleRateAndFrequency *msg = MsgReportSampleRateAndFrequency::create(bw, midFreq);
m_inputMessageQueue->push(msg);
}
m_sampleRate = bw;
m_centerFrequency = midFreq;
}
} }
else else
{ {
@ -231,9 +235,11 @@ void AaroniaRTSAWorker::onReadyRead()
} }
} }
else else
{
break; break;
} }
} }
}
// Remove consumed data from the buffer // Remove consumed data from the buffer
mBuffer.remove(0, offset); mBuffer.remove(0, offset);

View File

@ -40,22 +40,25 @@ class AaroniaRTSAWorker : public QObject {
Q_OBJECT Q_OBJECT
public: public:
class MsgReportSampleRate : public Message { class MsgReportSampleRateAndFrequency : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
int getSampleRate() const { return m_sampleRate; } int getSampleRate() const { return m_sampleRate; }
quint64 getCenterFrequency() const { return m_centerFrequency; }
static MsgReportSampleRate* create(int sampleRate) { static MsgReportSampleRateAndFrequency* create(int sampleRate, quint64 centerFrequency) {
return new MsgReportSampleRate(sampleRate); return new MsgReportSampleRateAndFrequency(sampleRate, centerFrequency);
} }
private: private:
int m_sampleRate; int m_sampleRate;
quint64 m_centerFrequency;
MsgReportSampleRate(int sampleRate) : MsgReportSampleRateAndFrequency(int sampleRate, qint64 centerFrequency) :
Message(), Message(),
m_sampleRate(sampleRate) m_sampleRate(sampleRate),
m_centerFrequency(centerFrequency)
{ } { }
}; };
@ -70,13 +73,10 @@ private:
SampleSinkFifo* m_sampleFifo; SampleSinkFifo* m_sampleFifo;
QString m_serverAddress; QString m_serverAddress;
uint64_t m_centerFrequency; quint64 m_centerFrequency;
int m_sampleRate; int m_sampleRate;
MessageQueue *m_inputMessageQueue; MessageQueue *m_inputMessageQueue;
uint32_t m_gain;
bool m_useAGC;
int m_status; //!< See GUI for status number detail int m_status; //!< See GUI for status number detail
void sendCenterFrequency(); void sendCenterFrequency();