1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-05-24 11:12:27 -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()->setCenterFrequency(m_deviceCenterFrequency);
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)

View File

@ -43,7 +43,8 @@ MESSAGE_CLASS_DEFINITION(AaroniaRTSAInput::MsgSetStatus, Message)
AaroniaRTSAInput::AaroniaRTSAInput(DeviceAPI *deviceAPI) :
m_deviceAPI(deviceAPI),
m_sampleRate(2.0e5),
m_sampleRate(10000000),
m_centerFrequency(1450000),
m_settings(),
m_aaroniaRTSAWorker(nullptr),
m_aaroniaRTSAWorkerThread(nullptr),
@ -220,18 +221,21 @@ bool AaroniaRTSAInput::handleMessage(const Message& message)
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();
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)) {
qCritical("AaroniaRTSAInput::AaroniaRTSAInput: Could not allocate SampleFifo");
}
DSPSignalNotification *notif = new DSPSignalNotification(
m_sampleRate, m_settings.m_centerFrequency);
m_sampleRate, m_centerFrequency);
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
return true;

View File

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

View File

@ -16,10 +16,13 @@
///////////////////////////////////////////////////////////////////////////////////
#include <boost/endian/conversion.hpp>
#include "util/messagequeue.h"
#include "dsp/dspcommands.h"
#include "aaroniartsaworker.h"
MESSAGE_CLASS_DEFINITION(AaroniaRTSAWorker::MsgReportSampleRate, Message)
MESSAGE_CLASS_DEFINITION(AaroniaRTSAWorker::MsgReportSampleRateAndFrequency, Message)
AaroniaRTSAWorker::AaroniaRTSAWorker(SampleSinkFifo* sampleFifo) :
QObject(),
@ -27,28 +30,11 @@ AaroniaRTSAWorker::AaroniaRTSAWorker(SampleSinkFifo* sampleFifo) :
m_samplesBuf(),
m_sampleFifo(sampleFifo),
m_centerFrequency(1450000),
m_sampleRate(10.0e6),
m_sampleRate(10000000),
m_inputMessageQueue(nullptr),
m_gain(20),
m_useAGC(true),
m_status(0),
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
mNetworkAccessManager = new QNetworkAccessManager(this);
@ -65,8 +51,6 @@ AaroniaRTSAWorker::AaroniaRTSAWorker(SampleSinkFifo* sampleFifo) :
mPrevTime = 0;
mPacketSamples = 0;
}
void AaroniaRTSAWorker::onSocketError(QAbstractSocket::SocketError error)
@ -146,10 +130,10 @@ void AaroniaRTSAWorker::onReadyRead()
QTextStream qout(stdout);
// read as many bytes as possible into input buffer
qint64 n = mReply->bytesAvailable();
qint64 bs = mBuffer.size();
qint64 n = mReply->bytesAvailable();
qint64 bs = mBuffer.size();
mBuffer.resize(bs + n);
qint64 done = mReply->read(mBuffer.data() + bs, n);
qint64 done = mReply->read(mBuffer.data() + bs, n);
mBuffer.resize(bs + done);
// intialize parsing
@ -163,10 +147,10 @@ void AaroniaRTSAWorker::onReadyRead()
if (mPacketSamples)
{
// enough samples
if (offset + mPacketSamples * 2 * sizeof(float) <= avail)
if (offset + mPacketSamples * 2 * sizeof(float) <= (unsigned long) avail)
{
// do something with the IQ data
const float * sp = (const float * )(mBuffer.constData() + offset);
const float *sp = (const float *)(mBuffer.constData() + offset);
SampleVector::iterator it = m_convertBuffer.begin();
@ -193,28 +177,31 @@ void AaroniaRTSAWorker::onReadyRead()
mPacketSamples = 0;
}
else
{
break;
}
}
else
{
// is there a complete JSON metadata object in the buffer
int split = mBuffer.indexOf('\x1e', offset);
if (split != -1)
if (split != -1)
{
// Extract it
QByteArray data = mBuffer.mid(offset, split - offset);
QByteArray data = mBuffer.mid(offset, split - offset);
offset = split + 1;
// Parse the JSON data
QJsonParseError error;
QJsonDocument jdoc = QJsonDocument::fromJson(data, &error);
QJsonDocument jdoc = QJsonDocument::fromJson(data, &error);
if (error.error == QJsonParseError::NoError)
{
// Extract fields of interest
//double startTime = jdoc["startTime"].toDouble(), endTime = jdoc["endTime"].toDouble();
int samples = jdoc["samples"].toInt();
int samples = jdoc["samples"].toInt();
// Dump packet loss
//if (startTime != mPrevTime)
@ -223,6 +210,23 @@ void AaroniaRTSAWorker::onReadyRead()
// Switch to data phase
//mPrevTime = endTime;
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
{
@ -231,7 +235,9 @@ void AaroniaRTSAWorker::onReadyRead()
}
}
else
{
break;
}
}
}

View File

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