mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-05-23 18:52:28 -04:00
Aaronia RSA Rx: get center frequency and sample rate from meta data
This commit is contained in:
parent
9e75ccb699
commit
bfcc98c67c
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user