mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-05-29 13:32:26 -04:00
Demod Analyzer: fixed sample rate handling. Fixes #931
This commit is contained in:
parent
a57c856a26
commit
0d4da317b3
@ -64,6 +64,7 @@ AISDemod::AISDemod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
AISDemod::~AISDemod()
|
AISDemod::~AISDemod()
|
||||||
@ -180,6 +181,13 @@ bool AISDemod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "AISDemod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -279,6 +287,25 @@ bool AISDemod::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AISDemod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int AISDemod::webapiSettingsGet(
|
int AISDemod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -498,3 +525,15 @@ void AISDemod::networkManagerFinished(QNetworkReply *reply)
|
|||||||
|
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AISDemod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -165,6 +165,7 @@ private:
|
|||||||
QNetworkRequest m_networkRequest;
|
QNetworkRequest m_networkRequest;
|
||||||
|
|
||||||
void applySettings(const AISDemodSettings& settings, bool force = false);
|
void applySettings(const AISDemodSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AISDemodSettings& settings, bool force);
|
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AISDemodSettings& settings, bool force);
|
||||||
void webapiFormatChannelSettings(
|
void webapiFormatChannelSettings(
|
||||||
QList<QString>& channelSettingsKeys,
|
QList<QString>& channelSettingsKeys,
|
||||||
@ -175,7 +176,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_AISDEMOD_H
|
#endif // INCLUDE_AISDEMOD_H
|
||||||
|
@ -160,7 +160,7 @@ void AISDemodBaseband::applySettings(const AISDemodSettings& settings, bool forc
|
|||||||
{
|
{
|
||||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
|
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
|
||||||
{
|
{
|
||||||
m_channelizer->setChannelization(AISDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
|
m_channelizer->setChannelization(AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
|
||||||
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,6 +61,8 @@ struct AISDemodSettings
|
|||||||
int m_messageColumnIndexes[AISDEMOD_MESSAGE_COLUMNS];//!< How the columns are ordered in the table
|
int m_messageColumnIndexes[AISDEMOD_MESSAGE_COLUMNS];//!< How the columns are ordered in the table
|
||||||
int m_messageColumnSizes[AISDEMOD_MESSAGE_COLUMNS]; //!< Size of the columns in the table
|
int m_messageColumnSizes[AISDEMOD_MESSAGE_COLUMNS]; //!< Size of the columns in the table
|
||||||
|
|
||||||
|
static const int AISDEMOD_CHANNEL_SAMPLE_RATE = 57600; //!< 6x 9600 baud rate (use even multiple so Gausian filter has odd number of taps)
|
||||||
|
|
||||||
AISDemodSettings();
|
AISDemodSettings();
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
|
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
AISDemodSink::AISDemodSink(AISDemod *aisDemod) :
|
AISDemodSink::AISDemodSink(AISDemod *aisDemod) :
|
||||||
m_scopeSink(nullptr),
|
m_scopeSink(nullptr),
|
||||||
m_aisDemod(aisDemod),
|
m_aisDemod(aisDemod),
|
||||||
m_channelSampleRate(AISDEMOD_CHANNEL_SAMPLE_RATE),
|
m_channelSampleRate(AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE),
|
||||||
m_channelFrequencyOffset(0),
|
m_channelFrequencyOffset(0),
|
||||||
m_magsqSum(0.0f),
|
m_magsqSum(0.0f),
|
||||||
m_magsqPeak(0.0f),
|
m_magsqPeak(0.0f),
|
||||||
@ -410,13 +410,13 @@ void AISDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
|
|||||||
if ((m_channelSampleRate != channelSampleRate) || force)
|
if ((m_channelSampleRate != channelSampleRate) || force)
|
||||||
{
|
{
|
||||||
m_interpolator.create(16, channelSampleRate, m_settings.m_rfBandwidth / 2.2);
|
m_interpolator.create(16, channelSampleRate, m_settings.m_rfBandwidth / 2.2);
|
||||||
m_interpolatorDistance = (Real) channelSampleRate / (Real) AISDEMOD_CHANNEL_SAMPLE_RATE;
|
m_interpolatorDistance = (Real) channelSampleRate / (Real) AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE;
|
||||||
m_interpolatorDistanceRemain = m_interpolatorDistance;
|
m_interpolatorDistanceRemain = m_interpolatorDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_channelSampleRate = channelSampleRate;
|
m_channelSampleRate = channelSampleRate;
|
||||||
m_channelFrequencyOffset = channelFrequencyOffset;
|
m_channelFrequencyOffset = channelFrequencyOffset;
|
||||||
m_samplesPerSymbol = AISDEMOD_CHANNEL_SAMPLE_RATE / m_settings.m_baud;
|
m_samplesPerSymbol = AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / m_settings.m_baud;
|
||||||
qDebug() << "AISDemodSink::applyChannelSettings: m_samplesPerSymbol: " << m_samplesPerSymbol;
|
qDebug() << "AISDemodSink::applyChannelSettings: m_samplesPerSymbol: " << m_samplesPerSymbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -428,18 +428,18 @@ void AISDemodSink::applySettings(const AISDemodSettings& settings, bool force)
|
|||||||
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
|
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
|
||||||
{
|
{
|
||||||
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2);
|
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2);
|
||||||
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) AISDEMOD_CHANNEL_SAMPLE_RATE;
|
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE;
|
||||||
m_interpolatorDistanceRemain = m_interpolatorDistance;
|
m_interpolatorDistanceRemain = m_interpolatorDistance;
|
||||||
m_lowpass.create(301, AISDEMOD_CHANNEL_SAMPLE_RATE, settings.m_rfBandwidth / 2.0f);
|
m_lowpass.create(301, AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE, settings.m_rfBandwidth / 2.0f);
|
||||||
}
|
}
|
||||||
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force)
|
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force)
|
||||||
{
|
{
|
||||||
m_phaseDiscri.setFMScaling(AISDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
|
m_phaseDiscri.setFMScaling(AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((settings.m_baud != m_settings.m_baud) || force)
|
if ((settings.m_baud != m_settings.m_baud) || force)
|
||||||
{
|
{
|
||||||
m_samplesPerSymbol = AISDEMOD_CHANNEL_SAMPLE_RATE / settings.m_baud;
|
m_samplesPerSymbol = AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / settings.m_baud;
|
||||||
qDebug() << "ISDemodSink::applySettings: m_samplesPerSymbol: " << m_samplesPerSymbol << " baud " << settings.m_baud;
|
qDebug() << "ISDemodSink::applySettings: m_samplesPerSymbol: " << m_samplesPerSymbol << " baud " << settings.m_baud;
|
||||||
m_pulseShape.create(0.5, 3, m_samplesPerSymbol);
|
m_pulseShape.create(0.5, 3, m_samplesPerSymbol);
|
||||||
|
|
||||||
|
@ -41,9 +41,6 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
// 6x 9600 baud rate (use even multiple so Gausian filter has odd number of taps)
|
|
||||||
#define AISDEMOD_CHANNEL_SAMPLE_RATE 57600
|
|
||||||
|
|
||||||
#define AISDEMOD_MAX_BYTES (3+1+126+2+1+1)
|
#define AISDEMOD_MAX_BYTES (3+1+126+2+1+1)
|
||||||
|
|
||||||
class ChannelAPI;
|
class ChannelAPI;
|
||||||
|
@ -63,6 +63,7 @@ AMDemod::AMDemod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
AMDemod::~AMDemod()
|
AMDemod::~AMDemod()
|
||||||
@ -135,6 +136,13 @@ bool AMDemod::handleMessage(const Message& cmd)
|
|||||||
m_basebandSink->getInputMessageQueue()->push(rep);
|
m_basebandSink->getInputMessageQueue()->push(rep);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "AMDemod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -258,6 +266,25 @@ bool AMDemod::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AMDemod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
getAudioSampleRate()
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int AMDemod::webapiSettingsGet(
|
int AMDemod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -540,3 +567,15 @@ void AMDemod::networkManagerFinished(QNetworkReply *reply)
|
|||||||
|
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AMDemod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -140,6 +140,7 @@ private:
|
|||||||
QNetworkRequest m_networkRequest;
|
QNetworkRequest m_networkRequest;
|
||||||
|
|
||||||
void applySettings(const AMDemodSettings& settings, bool force = false);
|
void applySettings(const AMDemodSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AMDemodSettings& settings, bool force);
|
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AMDemodSettings& settings, bool force);
|
||||||
void sendChannelSettings(
|
void sendChannelSettings(
|
||||||
@ -157,7 +158,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_AMDEMOD_H
|
#endif // INCLUDE_AMDEMOD_H
|
||||||
|
@ -74,6 +74,7 @@ DABDemod::DABDemod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
DABDemod::~DABDemod()
|
DABDemod::~DABDemod()
|
||||||
@ -257,6 +258,13 @@ bool DABDemod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "DABDemod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -345,6 +353,25 @@ bool DABDemod::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DABDemod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
getAudioSampleRate()
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int DABDemod::webapiSettingsGet(
|
int DABDemod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -550,3 +577,15 @@ void DABDemod::networkManagerFinished(QNetworkReply *reply)
|
|||||||
|
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DABDemod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -369,6 +369,7 @@ public:
|
|||||||
}*/
|
}*/
|
||||||
|
|
||||||
uint32_t getNumberOfDeviceStreams() const;
|
uint32_t getNumberOfDeviceStreams() const;
|
||||||
|
int getAudioSampleRate() const { return m_basebandSink->getAudioSampleRate(); }
|
||||||
|
|
||||||
static const char * const m_channelIdURI;
|
static const char * const m_channelIdURI;
|
||||||
static const char * const m_channelId;
|
static const char * const m_channelId;
|
||||||
@ -385,6 +386,7 @@ private:
|
|||||||
QNetworkRequest m_networkRequest;
|
QNetworkRequest m_networkRequest;
|
||||||
|
|
||||||
void applySettings(const DABDemodSettings& settings, bool force = false);
|
void applySettings(const DABDemodSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DABDemodSettings& settings, bool force);
|
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DABDemodSettings& settings, bool force);
|
||||||
void webapiFormatChannelSettings(
|
void webapiFormatChannelSettings(
|
||||||
QList<QString>& channelSettingsKeys,
|
QList<QString>& channelSettingsKeys,
|
||||||
@ -395,7 +397,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_DABDEMOD_H
|
#endif // INCLUDE_DABDEMOD_H
|
||||||
|
@ -74,6 +74,7 @@ public:
|
|||||||
void setChannel(ChannelAPI *channel);
|
void setChannel(ChannelAPI *channel);
|
||||||
double getMagSq() const { return m_sink.getMagSq(); }
|
double getMagSq() const { return m_sink.getMagSq(); }
|
||||||
bool isRunning() const { return m_running; }
|
bool isRunning() const { return m_running; }
|
||||||
|
int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SampleSinkFifo m_sampleFifo;
|
SampleSinkFifo m_sampleFifo;
|
||||||
|
@ -640,6 +640,19 @@ void DABDemodSink::applyAudioSampleRate(int sampleRate)
|
|||||||
|
|
||||||
m_audioFifo.setSize(sampleRate);
|
m_audioFifo.setSize(sampleRate);
|
||||||
|
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(m_channel, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(m_channel, sampleRate);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_audioSampleRate = sampleRate;
|
m_audioSampleRate = sampleRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,6 +69,7 @@ DSDDemod::DSDDemod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
DSDDemod::~DSDDemod()
|
DSDDemod::~DSDDemod()
|
||||||
@ -134,6 +135,13 @@ bool DSDDemod::handleMessage(const Message& cmd)
|
|||||||
m_basebandSink->getInputMessageQueue()->push(rep);
|
m_basebandSink->getInputMessageQueue()->push(rep);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "DSDDemod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -284,6 +292,25 @@ bool DSDDemod::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DSDDemod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
getAudioSampleRate()
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int DSDDemod::webapiSettingsGet(
|
int DSDDemod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -647,3 +674,15 @@ void DSDDemod::networkManagerFinished(QNetworkReply *reply)
|
|||||||
|
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DSDDemod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -138,6 +138,7 @@ private:
|
|||||||
static const int m_udpBlockSize;
|
static const int m_udpBlockSize;
|
||||||
|
|
||||||
void applySettings(const DSDDemodSettings& settings, bool force = false);
|
void applySettings(const DSDDemodSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DSDDemodSettings& settings, bool force);
|
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DSDDemodSettings& settings, bool force);
|
||||||
void sendChannelSettings(
|
void sendChannelSettings(
|
||||||
@ -155,7 +156,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_DSDDEMOD_H
|
#endif // INCLUDE_DSDDEMOD_H
|
||||||
|
@ -68,6 +68,7 @@ NFMDemod::NFMDemod(DeviceAPI *devieAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
NFMDemod::~NFMDemod()
|
NFMDemod::~NFMDemod()
|
||||||
@ -132,6 +133,13 @@ bool NFMDemod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "NFMDemod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -269,6 +277,25 @@ bool NFMDemod::deserialize(const QByteArray& data)
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NFMDemod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
getAudioSampleRate()
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int NFMDemod::webapiSettingsGet(
|
int NFMDemod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -583,3 +610,15 @@ void NFMDemod::networkManagerFinished(QNetworkReply *reply)
|
|||||||
|
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NFMDemod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -138,6 +138,7 @@ private:
|
|||||||
static const int m_udpBlockSize;
|
static const int m_udpBlockSize;
|
||||||
|
|
||||||
void applySettings(const NFMDemodSettings& settings, bool force = false);
|
void applySettings(const NFMDemodSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const NFMDemodSettings& settings, bool force);
|
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const NFMDemodSettings& settings, bool force);
|
||||||
void sendChannelSettings(
|
void sendChannelSettings(
|
||||||
@ -155,6 +156,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_NFMDEMOD_H
|
#endif // INCLUDE_NFMDEMOD_H
|
||||||
|
@ -64,6 +64,7 @@ PacketDemod::PacketDemod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
PacketDemod::~PacketDemod()
|
PacketDemod::~PacketDemod()
|
||||||
@ -177,6 +178,13 @@ bool PacketDemod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "PacketDemod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -243,6 +251,25 @@ void PacketDemod::applySettings(const PacketDemodSettings& settings, bool force)
|
|||||||
m_settings = settings;
|
m_settings = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PacketDemod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QByteArray PacketDemod::serialize() const
|
QByteArray PacketDemod::serialize() const
|
||||||
{
|
{
|
||||||
return m_settings.serialize();
|
return m_settings.serialize();
|
||||||
@ -470,3 +497,15 @@ void PacketDemod::networkManagerFinished(QNetworkReply *reply)
|
|||||||
|
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PacketDemod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -138,6 +138,7 @@ private:
|
|||||||
QNetworkRequest m_networkRequest;
|
QNetworkRequest m_networkRequest;
|
||||||
|
|
||||||
void applySettings(const PacketDemodSettings& settings, bool force = false);
|
void applySettings(const PacketDemodSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const PacketDemodSettings& settings, bool force);
|
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const PacketDemodSettings& settings, bool force);
|
||||||
void webapiFormatChannelSettings(
|
void webapiFormatChannelSettings(
|
||||||
QList<QString>& channelSettingsKeys,
|
QList<QString>& channelSettingsKeys,
|
||||||
@ -148,6 +149,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ void PacketDemodBaseband::applySettings(const PacketDemodSettings& settings, boo
|
|||||||
{
|
{
|
||||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
|
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
|
||||||
{
|
{
|
||||||
m_channelizer->setChannelization(PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
|
m_channelizer->setChannelization(PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
|
||||||
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,6 +53,9 @@ struct PacketDemodSettings
|
|||||||
int m_columnIndexes[PACKETDEMOD_COLUMNS];//!< How the columns are ordered in the table
|
int m_columnIndexes[PACKETDEMOD_COLUMNS];//!< How the columns are ordered in the table
|
||||||
int m_columnSizes[PACKETDEMOD_COLUMNS]; //!< Size of the columns in the table
|
int m_columnSizes[PACKETDEMOD_COLUMNS]; //!< Size of the columns in the table
|
||||||
|
|
||||||
|
static const int PACKETDEMOD_CHANNEL_BANDWIDTH = 9600;
|
||||||
|
static const int PACKETDEMOD_CHANNEL_SAMPLE_RATE = 38400; // Must be integer multiple of m_baud=1200
|
||||||
|
|
||||||
PacketDemodSettings();
|
PacketDemodSettings();
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
|
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
PacketDemodSink::PacketDemodSink(PacketDemod *packetDemod) :
|
PacketDemodSink::PacketDemodSink(PacketDemod *packetDemod) :
|
||||||
m_packetDemod(packetDemod),
|
m_packetDemod(packetDemod),
|
||||||
m_channelSampleRate(PACKETDEMOD_CHANNEL_SAMPLE_RATE),
|
m_channelSampleRate(PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE),
|
||||||
m_channelFrequencyOffset(0),
|
m_channelFrequencyOffset(0),
|
||||||
m_magsqSum(0.0f),
|
m_magsqSum(0.0f),
|
||||||
m_magsqPeak(0.0f),
|
m_magsqPeak(0.0f),
|
||||||
@ -136,7 +136,7 @@ void PacketDemodSink::processOneSample(Complex &ci)
|
|||||||
// Look for edge
|
// Look for edge
|
||||||
if (sample != m_samplePrev)
|
if (sample != m_samplePrev)
|
||||||
{
|
{
|
||||||
m_syncCount = PACKETDEMOD_CHANNEL_SAMPLE_RATE/m_settings.m_baud/2;
|
m_syncCount = PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE/m_settings.m_baud/2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -235,7 +235,7 @@ void PacketDemodSink::processOneSample(Complex &ci)
|
|||||||
m_bitCount = 0;
|
m_bitCount = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_syncCount = PACKETDEMOD_CHANNEL_SAMPLE_RATE/m_settings.m_baud;
|
m_syncCount = PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE/m_settings.m_baud;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_samplePrev = sample;
|
m_samplePrev = sample;
|
||||||
@ -277,7 +277,7 @@ void PacketDemodSink::applyChannelSettings(int channelSampleRate, int channelFre
|
|||||||
if ((m_channelSampleRate != channelSampleRate) || force)
|
if ((m_channelSampleRate != channelSampleRate) || force)
|
||||||
{
|
{
|
||||||
m_interpolator.create(16, channelSampleRate, m_settings.m_rfBandwidth / 2.2);
|
m_interpolator.create(16, channelSampleRate, m_settings.m_rfBandwidth / 2.2);
|
||||||
m_interpolatorDistance = (Real) channelSampleRate / (Real) PACKETDEMOD_CHANNEL_SAMPLE_RATE;
|
m_interpolatorDistance = (Real) channelSampleRate / (Real) PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE;
|
||||||
m_interpolatorDistanceRemain = m_interpolatorDistance;
|
m_interpolatorDistanceRemain = m_interpolatorDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,13 +293,13 @@ void PacketDemodSink::applySettings(const PacketDemodSettings& settings, bool fo
|
|||||||
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
|
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
|
||||||
{
|
{
|
||||||
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2);
|
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2);
|
||||||
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) PACKETDEMOD_CHANNEL_SAMPLE_RATE;
|
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE;
|
||||||
m_interpolatorDistanceRemain = m_interpolatorDistance;
|
m_interpolatorDistanceRemain = m_interpolatorDistance;
|
||||||
m_lowpass.create(301, PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_rfBandwidth / 2.0f);
|
m_lowpass.create(301, PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_rfBandwidth / 2.0f);
|
||||||
}
|
}
|
||||||
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force)
|
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force)
|
||||||
{
|
{
|
||||||
m_phaseDiscri.setFMScaling(PACKETDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
|
m_phaseDiscri.setFMScaling(PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (force)
|
if (force)
|
||||||
@ -307,7 +307,7 @@ void PacketDemodSink::applySettings(const PacketDemodSettings& settings, bool fo
|
|||||||
delete[] m_f1;
|
delete[] m_f1;
|
||||||
delete[] m_f0;
|
delete[] m_f0;
|
||||||
delete[] m_corrBuf;
|
delete[] m_corrBuf;
|
||||||
m_correlationLength = PACKETDEMOD_CHANNEL_SAMPLE_RATE/settings.m_baud;
|
m_correlationLength = PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE/settings.m_baud;
|
||||||
m_f1 = new Complex[m_correlationLength]();
|
m_f1 = new Complex[m_correlationLength]();
|
||||||
m_f0 = new Complex[m_correlationLength]();
|
m_f0 = new Complex[m_correlationLength]();
|
||||||
m_corrBuf = new Complex[m_correlationLength]();
|
m_corrBuf = new Complex[m_correlationLength]();
|
||||||
@ -319,12 +319,12 @@ void PacketDemodSink::applySettings(const PacketDemodSettings& settings, bool fo
|
|||||||
{
|
{
|
||||||
m_f0[i] = Complex(cos(f0), sin(f0));
|
m_f0[i] = Complex(cos(f0), sin(f0));
|
||||||
m_f1[i] = Complex(cos(f1), sin(f1));
|
m_f1[i] = Complex(cos(f1), sin(f1));
|
||||||
f0 += 2.0f*(Real)M_PI*2200.0f/PACKETDEMOD_CHANNEL_SAMPLE_RATE;
|
f0 += 2.0f*(Real)M_PI*2200.0f/PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE;
|
||||||
f1 += 2.0f*(Real)M_PI*1200.0f/PACKETDEMOD_CHANNEL_SAMPLE_RATE;
|
f1 += 2.0f*(Real)M_PI*1200.0f/PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_lowpassF1.create(301, PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_baud * 1.1f);
|
m_lowpassF1.create(301, PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_baud * 1.1f);
|
||||||
m_lowpassF0.create(301, PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_baud * 1.1f);
|
m_lowpassF0.create(301, PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_baud * 1.1f);
|
||||||
m_samplePrev = 0;
|
m_samplePrev = 0;
|
||||||
m_syncCount = 0;
|
m_syncCount = 0;
|
||||||
m_symbolPrev = 0;
|
m_symbolPrev = 0;
|
||||||
|
@ -37,10 +37,6 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
#define PACKETDEMOD_CHANNEL_BANDWIDTH 9600
|
|
||||||
// Must be integer multiple of m_baud=1200
|
|
||||||
#define PACKETDEMOD_CHANNEL_SAMPLE_RATE 38400
|
|
||||||
|
|
||||||
class ChannelAPI;
|
class ChannelAPI;
|
||||||
class PacketDemod;
|
class PacketDemod;
|
||||||
|
|
||||||
|
@ -68,6 +68,7 @@ SSBDemod::SSBDemod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SSBDemod::~SSBDemod()
|
SSBDemod::~SSBDemod()
|
||||||
@ -132,6 +133,13 @@ bool SSBDemod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "SSBDemod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -280,6 +288,25 @@ bool SSBDemod::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SSBDemod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
getAudioSampleRate()
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int SSBDemod::webapiSettingsGet(
|
int SSBDemod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -599,3 +626,15 @@ void SSBDemod::networkManagerFinished(QNetworkReply *reply)
|
|||||||
|
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SSBDemod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -142,6 +142,7 @@ private:
|
|||||||
QNetworkRequest m_networkRequest;
|
QNetworkRequest m_networkRequest;
|
||||||
|
|
||||||
void applySettings(const SSBDemodSettings& settings, bool force = false);
|
void applySettings(const SSBDemodSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const SSBDemodSettings& settings, bool force);
|
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const SSBDemodSettings& settings, bool force);
|
||||||
void sendChannelSettings(
|
void sendChannelSettings(
|
||||||
@ -159,6 +160,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_SSBDEMOD_H
|
#endif // INCLUDE_SSBDEMOD_H
|
||||||
|
@ -69,6 +69,7 @@ WFMDemod::WFMDemod(DeviceAPI* deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
WFMDemod::~WFMDemod()
|
WFMDemod::~WFMDemod()
|
||||||
@ -134,6 +135,13 @@ bool WFMDemod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "WFMDemod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -245,6 +253,25 @@ bool WFMDemod::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WFMDemod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
getAudioSampleRate()
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int WFMDemod::webapiSettingsGet(
|
int WFMDemod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -507,3 +534,15 @@ void WFMDemod::networkManagerFinished(QNetworkReply *reply)
|
|||||||
|
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WFMDemod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -134,7 +134,7 @@ private:
|
|||||||
static const int m_udpBlockSize;
|
static const int m_udpBlockSize;
|
||||||
|
|
||||||
void applySettings(const WFMDemodSettings& settings, bool force = false);
|
void applySettings(const WFMDemodSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const WFMDemodSettings& settings, bool force);
|
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const WFMDemodSettings& settings, bool force);
|
||||||
void sendChannelSettings(
|
void sendChannelSettings(
|
||||||
@ -152,6 +152,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_WFMDEMOD_H
|
#endif // INCLUDE_WFMDEMOD_H
|
||||||
|
@ -73,6 +73,7 @@ AISMod::AISMod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
AISMod::~AISMod()
|
AISMod::~AISMod()
|
||||||
@ -134,6 +135,13 @@ bool AISMod::handleMessage(const Message& cmd)
|
|||||||
m_basebandSource->getInputMessageQueue()->push(rep);
|
m_basebandSource->getInputMessageQueue()->push(rep);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "AISMod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -340,6 +348,25 @@ bool AISMod::deserialize(const QByteArray& data)
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AISMod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
AISModSettings::AISMOD_SAMPLE_RATE
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int AISMod::webapiSettingsGet(
|
int AISMod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -822,3 +849,15 @@ void AISMod::udpRx()
|
|||||||
m_basebandSource->getInputMessageQueue()->push(msg);
|
m_basebandSource->getInputMessageQueue()->push(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AISMod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -184,6 +184,7 @@ private:
|
|||||||
QUdpSocket *m_udpSocket;
|
QUdpSocket *m_udpSocket;
|
||||||
|
|
||||||
void applySettings(const AISModSettings& settings, bool force = false);
|
void applySettings(const AISModSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AISModSettings& settings, bool force);
|
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AISModSettings& settings, bool force);
|
||||||
void sendChannelSettings(
|
void sendChannelSettings(
|
||||||
@ -204,6 +205,7 @@ private:
|
|||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
void udpRx();
|
void udpRx();
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -516,7 +516,7 @@ AISModGUI::AISModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
|
|||||||
ui->scopeGUI->changeTrigger(0, triggerData);
|
ui->scopeGUI->changeTrigger(0, triggerData);
|
||||||
ui->scopeGUI->focusOnTrigger(0); // re-focus to take changes into account in the GUI
|
ui->scopeGUI->focusOnTrigger(0); // re-focus to take changes into account in the GUI
|
||||||
|
|
||||||
m_scopeVis->setLiveRate(AISMOD_SAMPLE_RATE);
|
m_scopeVis->setLiveRate(AISModSettings::AISMOD_SAMPLE_RATE);
|
||||||
//m_scopeVis->setFreeRun(false); // FIXME: add method rather than call m_scopeVis->configure()
|
//m_scopeVis->setFreeRun(false); // FIXME: add method rather than call m_scopeVis->configure()
|
||||||
|
|
||||||
m_spectrumVis = m_aisMod->getSpectrumVis();
|
m_spectrumVis = m_aisMod->getSpectrumVis();
|
||||||
@ -524,7 +524,7 @@ AISModGUI::AISModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
|
|||||||
|
|
||||||
// Extra /2 here because SSB?
|
// Extra /2 here because SSB?
|
||||||
ui->glSpectrum->setCenterFrequency(0);
|
ui->glSpectrum->setCenterFrequency(0);
|
||||||
ui->glSpectrum->setSampleRate(AISMOD_SAMPLE_RATE);
|
ui->glSpectrum->setSampleRate(AISModSettings::AISMOD_SAMPLE_RATE);
|
||||||
ui->glSpectrum->setSsbSpectrum(true);
|
ui->glSpectrum->setSsbSpectrum(true);
|
||||||
ui->glSpectrum->setDisplayCurrent(true);
|
ui->glSpectrum->setDisplayCurrent(true);
|
||||||
ui->glSpectrum->setLsbDisplay(false);
|
ui->glSpectrum->setLsbDisplay(false);
|
||||||
|
@ -67,6 +67,10 @@ struct AISModSettings
|
|||||||
QString m_udpAddress;
|
QString m_udpAddress;
|
||||||
uint16_t m_udpPort;
|
uint16_t m_udpPort;
|
||||||
|
|
||||||
|
// Sample rate is multiple of 9600 baud rate (use even multiple so Gausian filter has odd number of taps)
|
||||||
|
// Is there any benefit to having this higher?
|
||||||
|
static const int AISMOD_SAMPLE_RATE = (9600*6);
|
||||||
|
|
||||||
AISModSettings();
|
AISModSettings();
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
|
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
#include "channel/channelapi.h"
|
#include "channel/channelapi.h"
|
||||||
|
|
||||||
AISModSource::AISModSource() :
|
AISModSource::AISModSource() :
|
||||||
m_channelSampleRate(AISMOD_SAMPLE_RATE),
|
m_channelSampleRate(AISModSettings::AISMOD_SAMPLE_RATE),
|
||||||
m_channelFrequencyOffset(0),
|
m_channelFrequencyOffset(0),
|
||||||
m_fmPhase(0.0),
|
m_fmPhase(0.0),
|
||||||
m_spectrumSink(nullptr),
|
m_spectrumSink(nullptr),
|
||||||
@ -238,7 +238,7 @@ void AISModSource::modulateSample()
|
|||||||
{
|
{
|
||||||
// Wait before retransmitting
|
// Wait before retransmitting
|
||||||
m_state = wait;
|
m_state = wait;
|
||||||
m_waitCounter = m_settings.m_repeatDelay * AISMOD_SAMPLE_RATE;
|
m_waitCounter = m_settings.m_repeatDelay * AISModSettings::AISMOD_SAMPLE_RATE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -298,17 +298,17 @@ void AISModSource::applySettings(const AISModSettings& settings, bool force)
|
|||||||
if ((settings.m_bt != m_settings.m_bt) || (settings.m_symbolSpan != m_settings.m_symbolSpan) || (settings.m_baud != m_settings.m_baud) || force)
|
if ((settings.m_bt != m_settings.m_bt) || (settings.m_symbolSpan != m_settings.m_symbolSpan) || (settings.m_baud != m_settings.m_baud) || force)
|
||||||
{
|
{
|
||||||
qDebug() << "AISModSource::applySettings: Recreating pulse shaping filter: "
|
qDebug() << "AISModSource::applySettings: Recreating pulse shaping filter: "
|
||||||
<< " SampleRate:" << AISMOD_SAMPLE_RATE
|
<< " SampleRate:" << AISModSettings::AISMOD_SAMPLE_RATE
|
||||||
<< " bt: " << settings.m_bt
|
<< " bt: " << settings.m_bt
|
||||||
<< " symbolSpan: " << settings.m_symbolSpan
|
<< " symbolSpan: " << settings.m_symbolSpan
|
||||||
<< " baud:" << settings.m_baud;
|
<< " baud:" << settings.m_baud;
|
||||||
m_pulseShape.create(settings.m_bt, settings.m_symbolSpan, AISMOD_SAMPLE_RATE/settings.m_baud);
|
m_pulseShape.create(settings.m_bt, settings.m_symbolSpan, AISModSettings::AISMOD_SAMPLE_RATE/settings.m_baud);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_settings = settings;
|
m_settings = settings;
|
||||||
|
|
||||||
// Precalculate FM sensensity and linear gain to save doing it in the loop
|
// Precalculate FM sensensity and linear gain to save doing it in the loop
|
||||||
m_samplesPerSymbol = AISMOD_SAMPLE_RATE / m_settings.m_baud;
|
m_samplesPerSymbol = AISModSettings::AISMOD_SAMPLE_RATE / m_settings.m_baud;
|
||||||
Real modIndex = m_settings.m_fmDeviation / (Real)m_settings.m_baud;
|
Real modIndex = m_settings.m_fmDeviation / (Real)m_settings.m_baud;
|
||||||
m_phaseSensitivity = 2.0f * M_PI * modIndex / (Real)m_samplesPerSymbol;
|
m_phaseSensitivity = 2.0f * M_PI * modIndex / (Real)m_samplesPerSymbol;
|
||||||
m_linearGain = powf(10.0f, m_settings.m_gain/20.0f);
|
m_linearGain = powf(10.0f, m_settings.m_gain/20.0f);
|
||||||
@ -330,8 +330,8 @@ void AISModSource::applyChannelSettings(int channelSampleRate, int channelFreque
|
|||||||
if ((m_channelSampleRate != channelSampleRate) || force)
|
if ((m_channelSampleRate != channelSampleRate) || force)
|
||||||
{
|
{
|
||||||
m_interpolatorDistanceRemain = 0;
|
m_interpolatorDistanceRemain = 0;
|
||||||
m_interpolatorDistance = (Real) AISMOD_SAMPLE_RATE / (Real) channelSampleRate;
|
m_interpolatorDistance = (Real) AISModSettings::AISMOD_SAMPLE_RATE / (Real) channelSampleRate;
|
||||||
m_interpolator.create(48, AISMOD_SAMPLE_RATE, m_settings.m_rfBandwidth / 2.2, 3.0);
|
m_interpolator.create(48, AISModSettings::AISMOD_SAMPLE_RATE, m_settings.m_rfBandwidth / 2.2, 3.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_channelSampleRate = channelSampleRate;
|
m_channelSampleRate = channelSampleRate;
|
||||||
|
@ -43,10 +43,6 @@
|
|||||||
#define AIS_TRAIN 0x55
|
#define AIS_TRAIN 0x55
|
||||||
#define AIS_FLAG 0x7e
|
#define AIS_FLAG 0x7e
|
||||||
|
|
||||||
// Sample rate is multiple of 9600 baud rate (use even multiple so Gausian filter has odd number of taps)
|
|
||||||
// Is there any benefit to having this higher?
|
|
||||||
#define AISMOD_SAMPLE_RATE (9600*6)
|
|
||||||
|
|
||||||
class ScopeVis;
|
class ScopeVis;
|
||||||
class BasebandSampleSink;
|
class BasebandSampleSink;
|
||||||
class ChannelAPI;
|
class ChannelAPI;
|
||||||
|
@ -75,6 +75,7 @@ AMMod::AMMod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
AMMod::~AMMod()
|
AMMod::~AMMod()
|
||||||
@ -176,6 +177,13 @@ bool AMMod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "AMMod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -334,6 +342,25 @@ bool AMMod::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AMMod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
getAudioSampleRate()
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int AMMod::webapiSettingsGet(
|
int AMMod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -694,3 +721,15 @@ int AMMod::getFeedbackAudioSampleRate() const
|
|||||||
{
|
{
|
||||||
return m_basebandSource->getFeedbackAudioSampleRate();
|
return m_basebandSource->getFeedbackAudioSampleRate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AMMod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -255,6 +255,7 @@ private:
|
|||||||
QNetworkRequest m_networkRequest;
|
QNetworkRequest m_networkRequest;
|
||||||
|
|
||||||
void applySettings(const AMModSettings& settings, bool force = false);
|
void applySettings(const AMModSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void openFileStream();
|
void openFileStream();
|
||||||
void seekFileStream(int seekPercentage);
|
void seekFileStream(int seekPercentage);
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
@ -275,6 +276,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,6 +76,7 @@ NFMMod::NFMMod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
NFMMod::~NFMMod()
|
NFMMod::~NFMMod()
|
||||||
@ -208,6 +209,13 @@ bool NFMMod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "NFMMod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -381,6 +389,25 @@ bool NFMMod::deserialize(const QByteArray& data)
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NFMMod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
getAudioSampleRate()
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int NFMMod::webapiSettingsGet(
|
int NFMMod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -785,3 +812,15 @@ int NFMMod::getFeedbackAudioSampleRate() const
|
|||||||
{
|
{
|
||||||
return m_basebandSource->getFeedbackAudioSampleRate();
|
return m_basebandSource->getFeedbackAudioSampleRate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NFMMod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -255,6 +255,7 @@ private:
|
|||||||
QNetworkRequest m_networkRequest;
|
QNetworkRequest m_networkRequest;
|
||||||
|
|
||||||
void applySettings(const NFMModSettings& settings, bool force = false);
|
void applySettings(const NFMModSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void openFileStream();
|
void openFileStream();
|
||||||
void seekFileStream(int seekPercentage);
|
void seekFileStream(int seekPercentage);
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
@ -275,6 +276,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -78,6 +78,7 @@ PacketMod::PacketMod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
PacketMod::~PacketMod()
|
PacketMod::~PacketMod()
|
||||||
@ -140,6 +141,13 @@ bool PacketMod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "PacketMod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -405,6 +413,25 @@ bool PacketMod::deserialize(const QByteArray& data)
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PacketMod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
getSourceChannelSampleRate()
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int PacketMod::webapiSettingsGet(
|
int PacketMod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -982,6 +1009,11 @@ uint32_t PacketMod::getNumberOfDeviceStreams() const
|
|||||||
return m_deviceAPI->getNbSinkStreams();
|
return m_deviceAPI->getNbSinkStreams();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PacketMod::getSourceChannelSampleRate() const
|
||||||
|
{
|
||||||
|
return m_basebandSource->getSourceChannelSampleRate();
|
||||||
|
}
|
||||||
|
|
||||||
void PacketMod::openUDP(const PacketModSettings& settings)
|
void PacketMod::openUDP(const PacketModSettings& settings)
|
||||||
{
|
{
|
||||||
closeUDP();
|
closeUDP();
|
||||||
@ -1012,3 +1044,15 @@ void PacketMod::udpRx()
|
|||||||
m_basebandSource->getInputMessageQueue()->push(msg);
|
m_basebandSource->getInputMessageQueue()->push(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PacketMod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -171,6 +171,7 @@ public:
|
|||||||
double getMagSq() const;
|
double getMagSq() const;
|
||||||
void setLevelMeter(QObject *levelMeter);
|
void setLevelMeter(QObject *levelMeter);
|
||||||
uint32_t getNumberOfDeviceStreams() const;
|
uint32_t getNumberOfDeviceStreams() const;
|
||||||
|
int getSourceChannelSampleRate() const;
|
||||||
|
|
||||||
static const char* const m_channelIdURI;
|
static const char* const m_channelIdURI;
|
||||||
static const char* const m_channelId;
|
static const char* const m_channelId;
|
||||||
@ -197,6 +198,7 @@ private:
|
|||||||
QUdpSocket *m_udpSocket;
|
QUdpSocket *m_udpSocket;
|
||||||
|
|
||||||
void applySettings(const PacketModSettings& settings, bool force = false);
|
void applySettings(const PacketModSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const PacketModSettings& settings, bool force);
|
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const PacketModSettings& settings, bool force);
|
||||||
void sendChannelSettings(
|
void sendChannelSettings(
|
||||||
@ -217,6 +219,7 @@ private:
|
|||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
void udpRx();
|
void udpRx();
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -67,6 +67,7 @@ public:
|
|||||||
int getChannelSampleRate() const;
|
int getChannelSampleRate() const;
|
||||||
void setSpectrumSampleSink(BasebandSampleSink* sampleSink) { m_source.setSpectrumSink(sampleSink); }
|
void setSpectrumSampleSink(BasebandSampleSink* sampleSink) { m_source.setSpectrumSink(sampleSink); }
|
||||||
void setChannel(ChannelAPI *channel);
|
void setChannel(ChannelAPI *channel);
|
||||||
|
int getSourceChannelSampleRate() const { return m_source.getChannelSampleRate(); }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
/**
|
/**
|
||||||
|
@ -71,6 +71,7 @@ public:
|
|||||||
void addTXPacket(QByteArray data);
|
void addTXPacket(QByteArray data);
|
||||||
void encodePacket(uint8_t *packet, int packet_length, uint8_t *crc_start, uint8_t *packet_end);
|
void encodePacket(uint8_t *packet, int packet_length, uint8_t *crc_start, uint8_t *packet_end);
|
||||||
void setChannel(ChannelAPI *channel) { m_channel = channel; }
|
void setChannel(ChannelAPI *channel) { m_channel = channel; }
|
||||||
|
int getChannelSampleRate() const { return m_channelSampleRate; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_channelSampleRate;
|
int m_channelSampleRate;
|
||||||
|
@ -77,6 +77,7 @@ SSBMod::SSBMod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SSBMod::~SSBMod()
|
SSBMod::~SSBMod()
|
||||||
@ -173,6 +174,13 @@ bool SSBMod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "SSBMod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -358,6 +366,25 @@ bool SSBMod::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SSBMod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
getAudioSampleRate()
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int SSBMod::webapiSettingsGet(
|
int SSBMod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -779,3 +806,15 @@ uint32_t SSBMod::getNumberOfDeviceStreams() const
|
|||||||
{
|
{
|
||||||
return m_deviceAPI->getNbSinkStreams();
|
return m_deviceAPI->getNbSinkStreams();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SSBMod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -259,6 +259,7 @@ private:
|
|||||||
QNetworkRequest m_networkRequest;
|
QNetworkRequest m_networkRequest;
|
||||||
|
|
||||||
void applySettings(const SSBModSettings& settings, bool force = false);
|
void applySettings(const SSBModSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void openFileStream();
|
void openFileStream();
|
||||||
void seekFileStream(int seekPercentage);
|
void seekFileStream(int seekPercentage);
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
@ -279,6 +280,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,6 +74,7 @@ WFMMod::WFMMod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
|
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
WFMMod::~WFMMod()
|
WFMMod::~WFMMod()
|
||||||
@ -169,6 +170,13 @@ bool WFMMod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||||
|
{
|
||||||
|
qDebug() << "WFMMod::handleMessage: MsgChannelDemodQuery";
|
||||||
|
sendSampleRateToDemodAnalyzer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -320,6 +328,25 @@ bool WFMMod::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WFMMod::sendSampleRateToDemodAnalyzer()
|
||||||
|
{
|
||||||
|
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
|
||||||
|
|
||||||
|
if (messageQueues)
|
||||||
|
{
|
||||||
|
QList<MessageQueue*>::iterator it = messageQueues->begin();
|
||||||
|
|
||||||
|
for (; it != messageQueues->end(); ++it)
|
||||||
|
{
|
||||||
|
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
|
||||||
|
this,
|
||||||
|
getAudioSampleRate()
|
||||||
|
);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int WFMMod::webapiSettingsGet(
|
int WFMMod::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
@ -689,3 +716,15 @@ int WFMMod::getFeedbackAudioSampleRate() const
|
|||||||
{
|
{
|
||||||
return m_basebandSource->getFeedbackAudioSampleRate();
|
return m_basebandSource->getFeedbackAudioSampleRate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WFMMod::handleChannelMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_channelMessageQueue.pop()) != nullptr)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message)) {
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -267,6 +267,7 @@ private:
|
|||||||
static const int m_levelNbSamples;
|
static const int m_levelNbSamples;
|
||||||
|
|
||||||
void applySettings(const WFMModSettings& settings, bool force = false);
|
void applySettings(const WFMModSettings& settings, bool force = false);
|
||||||
|
void sendSampleRateToDemodAnalyzer();
|
||||||
void openFileStream();
|
void openFileStream();
|
||||||
void seekFileStream(int seekPercentage);
|
void seekFileStream(int seekPercentage);
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
@ -287,6 +288,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void handleChannelMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "SWGFeatureActions.h"
|
#include "SWGFeatureActions.h"
|
||||||
#include "SWGDeviceState.h"
|
#include "SWGDeviceState.h"
|
||||||
|
|
||||||
|
#include "dsp/dspcommands.h"
|
||||||
#include "dsp/dspengine.h"
|
#include "dsp/dspengine.h"
|
||||||
#include "dsp/datafifo.h"
|
#include "dsp/datafifo.h"
|
||||||
#include "dsp/dspdevicesourceengine.h"
|
#include "dsp/dspdevicesourceengine.h"
|
||||||
@ -149,6 +150,8 @@ bool DemodAnalyzer::handleMessage(const Message& cmd)
|
|||||||
MsgSelectChannel& cfg = (MsgSelectChannel&) cmd;
|
MsgSelectChannel& cfg = (MsgSelectChannel&) cmd;
|
||||||
ChannelAPI *selectedChannel = cfg.getChannel();
|
ChannelAPI *selectedChannel = cfg.getChannel();
|
||||||
setChannel(selectedChannel);
|
setChannel(selectedChannel);
|
||||||
|
MainCore::MsgChannelDemodQuery *msg = MainCore::MsgChannelDemodQuery::create();
|
||||||
|
selectedChannel->getChannelMessageQueue()->push(msg);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -160,6 +163,10 @@ bool DemodAnalyzer::handleMessage(const Message& cmd)
|
|||||||
if (report.getChannelAPI() == m_selectedChannel)
|
if (report.getChannelAPI() == m_selectedChannel)
|
||||||
{
|
{
|
||||||
m_sampleRate = report.getSampleRate();
|
m_sampleRate = report.getSampleRate();
|
||||||
|
m_scopeVis.setLiveRate(m_sampleRate);
|
||||||
|
|
||||||
|
DSPSignalNotification *msg = new DSPSignalNotification(0, m_sampleRate);
|
||||||
|
m_spectrumVis.getInputMessageQueue()->push(msg);
|
||||||
|
|
||||||
if (m_dataFifo) {
|
if (m_dataFifo) {
|
||||||
m_dataFifo->setSize(2*m_sampleRate);
|
m_dataFifo->setSize(2*m_sampleRate);
|
||||||
|
@ -6,14 +6,18 @@ This plugin can be used to analyze the real demodulated signal from some Rx chan
|
|||||||
|
|
||||||
Rx plugins are:
|
Rx plugins are:
|
||||||
|
|
||||||
|
- AIS demodulator
|
||||||
- AM demodulator
|
- AM demodulator
|
||||||
|
- DAB demodulator
|
||||||
- DSD (FM digital voice) demodulator
|
- DSD (FM digital voice) demodulator
|
||||||
- NFM demodulator
|
- NFM demodulator
|
||||||
|
- Packer demodulator
|
||||||
- SSB demodulator
|
- SSB demodulator
|
||||||
- WFM demodulator
|
- WFM demodulator
|
||||||
|
|
||||||
Tx plugins are:
|
Tx plugins are:
|
||||||
|
|
||||||
|
- AIS modulator
|
||||||
- AM modulator
|
- AM modulator
|
||||||
- NFM modulator
|
- NFM modulator
|
||||||
- Packet modulator
|
- Packet modulator
|
||||||
@ -55,7 +59,7 @@ Use this combo to select which channel to use for display. Channel is selected u
|
|||||||
|
|
||||||
<h3>A.4: (Re)apply channel selection</h3>
|
<h3>A.4: (Re)apply channel selection</h3>
|
||||||
|
|
||||||
Applies or re-applies channel selection (A.3) so that the channel gets effectively connected to the analyzer and signal is displayed.
|
Applies or re-applies channel selection (A.3) so that the channel gets effectively connected to the analyzer and signal is displayed. This will update the sample rate.
|
||||||
|
|
||||||
<h3>A.5: Decimation by a power of two</h3>
|
<h3>A.5: Decimation by a power of two</h3>
|
||||||
|
|
||||||
|
@ -28,9 +28,9 @@
|
|||||||
|
|
||||||
#include "export.h"
|
#include "export.h"
|
||||||
#include "pipes/pipeendpoint.h"
|
#include "pipes/pipeendpoint.h"
|
||||||
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
class DeviceAPI;
|
class DeviceAPI;
|
||||||
class MessageQueue;
|
|
||||||
|
|
||||||
namespace SWGSDRangel
|
namespace SWGSDRangel
|
||||||
{
|
{
|
||||||
@ -64,6 +64,7 @@ public:
|
|||||||
|
|
||||||
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
|
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
|
||||||
MessageQueue *getMessageQueueToGUI() { return m_guiMessageQueue; }
|
MessageQueue *getMessageQueueToGUI() { return m_guiMessageQueue; }
|
||||||
|
MessageQueue *getChannelMessageQueue() { return &m_channelMessageQueue; } //!< Get the queue for plugin communication
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* API adapter for the channel settings GET requests
|
* API adapter for the channel settings GET requests
|
||||||
@ -130,7 +131,8 @@ public:
|
|||||||
virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const = 0;
|
virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MessageQueue *m_guiMessageQueue; //!< Input message queue to the GUI
|
MessageQueue *m_guiMessageQueue; //!< Input message queue to the GUI
|
||||||
|
MessageQueue m_channelMessageQueue; //!< Input message queue for inter plugin communication
|
||||||
|
|
||||||
private:
|
private:
|
||||||
StreamType m_streamType;
|
StreamType m_streamType;
|
||||||
|
@ -48,6 +48,7 @@ MESSAGE_CLASS_DEFINITION(MainCore::MsgDeleteFeature, Message)
|
|||||||
MESSAGE_CLASS_DEFINITION(MainCore::MsgChannelReport, Message)
|
MESSAGE_CLASS_DEFINITION(MainCore::MsgChannelReport, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(MainCore::MsgChannelSettings, Message)
|
MESSAGE_CLASS_DEFINITION(MainCore::MsgChannelSettings, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(MainCore::MsgChannelDemodReport, Message)
|
MESSAGE_CLASS_DEFINITION(MainCore::MsgChannelDemodReport, Message)
|
||||||
|
MESSAGE_CLASS_DEFINITION(MainCore::MsgChannelDemodQuery, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(MainCore::MsgMapItem, Message)
|
MESSAGE_CLASS_DEFINITION(MainCore::MsgMapItem, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(MainCore::MsgPacket, Message)
|
MESSAGE_CLASS_DEFINITION(MainCore::MsgPacket, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(MainCore::MsgTargetAzimuthElevation, Message)
|
MESSAGE_CLASS_DEFINITION(MainCore::MsgTargetAzimuthElevation, Message)
|
||||||
|
@ -441,6 +441,20 @@ public:
|
|||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SDRBASE_API MsgChannelDemodQuery : public Message {
|
||||||
|
MESSAGE_CLASS_DECLARATION
|
||||||
|
|
||||||
|
public:
|
||||||
|
static MsgChannelDemodQuery* create() {
|
||||||
|
return new MsgChannelDemodQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
MsgChannelDemodQuery() :
|
||||||
|
Message()
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
class SDRBASE_API MsgChannelDemodReport : public Message {
|
class SDRBASE_API MsgChannelDemodReport : public Message {
|
||||||
MESSAGE_CLASS_DECLARATION
|
MESSAGE_CLASS_DECLARATION
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user