mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-03-06 19:38:47 -05:00
Web API: report Rx channel info summary
This commit is contained in:
parent
5ba857f278
commit
dc50ba1249
@ -37,6 +37,7 @@ const int AMDemod::m_udpBlockSize = 512;
|
|||||||
|
|
||||||
AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) :
|
AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) :
|
||||||
m_deviceAPI(deviceAPI),
|
m_deviceAPI(deviceAPI),
|
||||||
|
m_absoluteFrequencyOffset(0),
|
||||||
m_squelchOpen(false),
|
m_squelchOpen(false),
|
||||||
m_magsqSum(0.0f),
|
m_magsqSum(0.0f),
|
||||||
m_magsqPeak(0.0f),
|
m_magsqPeak(0.0f),
|
||||||
@ -177,6 +178,7 @@ bool AMDemod::handleMessage(const Message& cmd)
|
|||||||
AMDemodSettings settings = cfg.getSettings();
|
AMDemodSettings settings = cfg.getSettings();
|
||||||
|
|
||||||
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
||||||
|
m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||||
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
||||||
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ public:
|
|||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
virtual int getDeltaFrequency() const { return m_settings.m_inputFrequencyOffset; }
|
virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; }
|
||||||
virtual void getIdentifier(QString& id) { id = objectName(); }
|
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||||
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||||
|
|
||||||
@ -121,6 +121,7 @@ private:
|
|||||||
ThreadedBasebandSampleSink* m_threadedChannelizer;
|
ThreadedBasebandSampleSink* m_threadedChannelizer;
|
||||||
DownChannelizer* m_channelizer;
|
DownChannelizer* m_channelizer;
|
||||||
|
|
||||||
|
int m_absoluteFrequencyOffset;
|
||||||
AMDemodSettings m_settings;
|
AMDemodSettings m_settings;
|
||||||
|
|
||||||
NCO m_nco;
|
NCO m_nco;
|
||||||
|
@ -40,6 +40,7 @@ const int BFMDemod::m_udpBlockSize = 512;
|
|||||||
|
|
||||||
BFMDemod::BFMDemod(DeviceSourceAPI *deviceAPI) :
|
BFMDemod::BFMDemod(DeviceSourceAPI *deviceAPI) :
|
||||||
m_deviceAPI(deviceAPI),
|
m_deviceAPI(deviceAPI),
|
||||||
|
m_absoluteFrequencyOffset(0),
|
||||||
m_audioFifo(250000),
|
m_audioFifo(250000),
|
||||||
m_settingsMutex(QMutex::Recursive),
|
m_settingsMutex(QMutex::Recursive),
|
||||||
m_pilotPLL(19000/384000, 50/384000, 0.01),
|
m_pilotPLL(19000/384000, 50/384000, 0.01),
|
||||||
@ -347,6 +348,7 @@ bool BFMDemod::handleMessage(const Message& cmd)
|
|||||||
BFMDemodSettings settings = cfg.getSettings();
|
BFMDemodSettings settings = cfg.getSettings();
|
||||||
|
|
||||||
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
||||||
|
m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||||
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
||||||
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ public:
|
|||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
virtual int getDeltaFrequency() const { return m_settings.m_inputFrequencyOffset; }
|
virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; }
|
||||||
virtual void getIdentifier(QString& id) { id = objectName(); }
|
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||||
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||||
|
|
||||||
@ -163,6 +163,7 @@ private:
|
|||||||
DownChannelizer* m_channelizer;
|
DownChannelizer* m_channelizer;
|
||||||
|
|
||||||
BFMDemodSettings m_settings;
|
BFMDemodSettings m_settings;
|
||||||
|
int m_absoluteFrequencyOffset;
|
||||||
|
|
||||||
NCO m_nco;
|
NCO m_nco;
|
||||||
Interpolator m_interpolator; //!< Interpolator between fixed demod bandwidth and audio bandwidth (rational)
|
Interpolator m_interpolator; //!< Interpolator between fixed demod bandwidth and audio bandwidth (rational)
|
||||||
|
@ -40,6 +40,7 @@ const int DSDDemod::m_udpBlockSize = 512;
|
|||||||
|
|
||||||
DSDDemod::DSDDemod(DeviceSourceAPI *deviceAPI) :
|
DSDDemod::DSDDemod(DeviceSourceAPI *deviceAPI) :
|
||||||
m_deviceAPI(deviceAPI),
|
m_deviceAPI(deviceAPI),
|
||||||
|
m_absoluteFrequencyOffset(0),
|
||||||
m_interpolatorDistance(0.0f),
|
m_interpolatorDistance(0.0f),
|
||||||
m_interpolatorDistanceRemain(0.0f),
|
m_interpolatorDistanceRemain(0.0f),
|
||||||
m_sampleCount(0),
|
m_sampleCount(0),
|
||||||
@ -349,6 +350,7 @@ bool DSDDemod::handleMessage(const Message& cmd)
|
|||||||
DSDDemodSettings settings = cfg.getSettings();
|
DSDDemodSettings settings = cfg.getSettings();
|
||||||
|
|
||||||
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
||||||
|
m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||||
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
||||||
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ public:
|
|||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
virtual int getDeltaFrequency() const { return m_settings.m_inputFrequencyOffset; }
|
virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; }
|
||||||
virtual void getIdentifier(QString& id) { id = objectName(); }
|
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||||
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||||
|
|
||||||
@ -151,12 +151,13 @@ private:
|
|||||||
RSRunning
|
RSRunning
|
||||||
};
|
};
|
||||||
|
|
||||||
DSDDemodSettings m_settings;
|
|
||||||
|
|
||||||
DeviceSourceAPI *m_deviceAPI;
|
DeviceSourceAPI *m_deviceAPI;
|
||||||
ThreadedBasebandSampleSink* m_threadedChannelizer;
|
ThreadedBasebandSampleSink* m_threadedChannelizer;
|
||||||
DownChannelizer* m_channelizer;
|
DownChannelizer* m_channelizer;
|
||||||
|
|
||||||
|
DSDDemodSettings m_settings;
|
||||||
|
int m_absoluteFrequencyOffset;
|
||||||
|
|
||||||
NCO m_nco;
|
NCO m_nco;
|
||||||
Interpolator m_interpolator;
|
Interpolator m_interpolator;
|
||||||
Real m_interpolatorDistance;
|
Real m_interpolatorDistance;
|
||||||
|
@ -66,6 +66,7 @@ LoRaDemod::LoRaDemod(DeviceSourceAPI* deviceAPI) :
|
|||||||
m_channelizer = new DownChannelizer(this);
|
m_channelizer = new DownChannelizer(this);
|
||||||
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer);
|
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer);
|
||||||
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
||||||
|
m_deviceAPI->addChannelAPI(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
LoRaDemod::~LoRaDemod()
|
LoRaDemod::~LoRaDemod()
|
||||||
@ -81,6 +82,7 @@ LoRaDemod::~LoRaDemod()
|
|||||||
if (finetune)
|
if (finetune)
|
||||||
delete [] finetune;
|
delete [] finetune;
|
||||||
|
|
||||||
|
m_deviceAPI->removeChannelAPI(this);
|
||||||
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
||||||
delete m_threadedChannelizer;
|
delete m_threadedChannelizer;
|
||||||
delete m_channelizer;
|
delete m_channelizer;
|
||||||
|
@ -21,7 +21,8 @@
|
|||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <dsp/basebandsamplesink.h>
|
#include "dsp/basebandsamplesink.h"
|
||||||
|
#include "channel/channelsinkapi.h"
|
||||||
#include "dsp/nco.h"
|
#include "dsp/nco.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "util/message.h"
|
#include "util/message.h"
|
||||||
@ -39,7 +40,7 @@ class DeviceSourceAPI;
|
|||||||
class ThreadedBasebandSampleSink;
|
class ThreadedBasebandSampleSink;
|
||||||
class DownChannelizer;
|
class DownChannelizer;
|
||||||
|
|
||||||
class LoRaDemod : public BasebandSampleSink {
|
class LoRaDemod : public BasebandSampleSink, public ChannelSinkAPI {
|
||||||
public:
|
public:
|
||||||
class MsgConfigureLoRaDemod : public Message {
|
class MsgConfigureLoRaDemod : public Message {
|
||||||
MESSAGE_CLASS_DECLARATION
|
MESSAGE_CLASS_DECLARATION
|
||||||
@ -96,6 +97,10 @@ public:
|
|||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
|
virtual int getDeltaFrequency() const { return 0; }
|
||||||
|
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||||
|
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||||
|
|
||||||
static const QString m_channelID;
|
static const QString m_channelID;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -22,6 +22,7 @@ void LoRaDemodSettings::resetToDefaults()
|
|||||||
m_bandwidthIndex = 0;
|
m_bandwidthIndex = 0;
|
||||||
m_spread = 0;
|
m_spread = 0;
|
||||||
m_rgbColor = QColor(255, 0, 255).rgb();
|
m_rgbColor = QColor(255, 0, 255).rgb();
|
||||||
|
m_title = "LoRa Demodulator";
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray LoRaDemodSettings::serialize() const
|
QByteArray LoRaDemodSettings::serialize() const
|
||||||
@ -39,6 +40,8 @@ QByteArray LoRaDemodSettings::serialize() const
|
|||||||
s.writeBlob(5, m_channelMarker->serialize());
|
s.writeBlob(5, m_channelMarker->serialize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.writeString(6, m_title);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,6 +73,8 @@ bool LoRaDemodSettings::deserialize(const QByteArray& data)
|
|||||||
m_channelMarker->deserialize(bytetmp);
|
m_channelMarker->deserialize(bytetmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
d.readString(6, &m_title, "LoRa Demodulator");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
#define PLUGINS_CHANNELRX_DEMODLORA_LORADEMODSETTINGS_H_
|
#define PLUGINS_CHANNELRX_DEMODLORA_LORADEMODSETTINGS_H_
|
||||||
|
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
class Serializable;
|
class Serializable;
|
||||||
@ -13,6 +15,7 @@ struct LoRaDemodSettings
|
|||||||
int m_bandwidthIndex;
|
int m_bandwidthIndex;
|
||||||
int m_spread;
|
int m_spread;
|
||||||
uint32_t m_rgbColor;
|
uint32_t m_rgbColor;
|
||||||
|
QString m_title;
|
||||||
|
|
||||||
Serializable *m_channelMarker;
|
Serializable *m_channelMarker;
|
||||||
Serializable *m_spectrumGUI;
|
Serializable *m_spectrumGUI;
|
||||||
|
@ -42,6 +42,7 @@ const int NFMDemod::m_udpBlockSize = 512;
|
|||||||
|
|
||||||
NFMDemod::NFMDemod(DeviceSourceAPI *devieAPI) :
|
NFMDemod::NFMDemod(DeviceSourceAPI *devieAPI) :
|
||||||
m_deviceAPI(devieAPI),
|
m_deviceAPI(devieAPI),
|
||||||
|
m_absoluteFrequencyOffset(0),
|
||||||
m_ctcssIndex(0),
|
m_ctcssIndex(0),
|
||||||
m_sampleCount(0),
|
m_sampleCount(0),
|
||||||
m_squelchCount(0),
|
m_squelchCount(0),
|
||||||
@ -77,6 +78,7 @@ NFMDemod::NFMDemod(DeviceSourceAPI *devieAPI) :
|
|||||||
m_channelizer = new DownChannelizer(this);
|
m_channelizer = new DownChannelizer(this);
|
||||||
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
|
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
|
||||||
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
||||||
|
m_deviceAPI->addChannelAPI(this);
|
||||||
|
|
||||||
applySettings(m_settings, true);
|
applySettings(m_settings, true);
|
||||||
}
|
}
|
||||||
@ -85,6 +87,7 @@ NFMDemod::~NFMDemod()
|
|||||||
{
|
{
|
||||||
DSPEngine::instance()->removeAudioSink(&m_audioFifo);
|
DSPEngine::instance()->removeAudioSink(&m_audioFifo);
|
||||||
delete m_udpBufferAudio;
|
delete m_udpBufferAudio;
|
||||||
|
m_deviceAPI->removeChannelAPI(this);
|
||||||
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
||||||
delete m_threadedChannelizer;
|
delete m_threadedChannelizer;
|
||||||
delete m_channelizer;
|
delete m_channelizer;
|
||||||
@ -345,6 +348,7 @@ bool NFMDemod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
NFMDemodSettings settings = cfg.getSettings();
|
NFMDemodSettings settings = cfg.getSettings();
|
||||||
|
|
||||||
|
m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||||
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
||||||
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
||||||
|
|
||||||
|
@ -18,10 +18,12 @@
|
|||||||
#ifndef INCLUDE_NFMDEMOD_H
|
#ifndef INCLUDE_NFMDEMOD_H
|
||||||
#define INCLUDE_NFMDEMOD_H
|
#define INCLUDE_NFMDEMOD_H
|
||||||
|
|
||||||
#include <dsp/basebandsamplesink.h>
|
|
||||||
#include <dsp/phasediscri.h>
|
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "dsp/basebandsamplesink.h"
|
||||||
|
#include "channel/channelsinkapi.h"
|
||||||
|
#include "dsp/phasediscri.h"
|
||||||
#include "dsp/nco.h"
|
#include "dsp/nco.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "dsp/lowpass.h"
|
#include "dsp/lowpass.h"
|
||||||
@ -39,7 +41,7 @@ class DeviceSourceAPI;
|
|||||||
class ThreadedBasebandSampleSink;
|
class ThreadedBasebandSampleSink;
|
||||||
class DownChannelizer;
|
class DownChannelizer;
|
||||||
|
|
||||||
class NFMDemod : public BasebandSampleSink {
|
class NFMDemod : public BasebandSampleSink, public ChannelSinkAPI {
|
||||||
public:
|
public:
|
||||||
class MsgConfigureNFMDemod : public Message {
|
class MsgConfigureNFMDemod : public Message {
|
||||||
MESSAGE_CLASS_DECLARATION
|
MESSAGE_CLASS_DECLARATION
|
||||||
@ -115,6 +117,10 @@ public:
|
|||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
|
virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; }
|
||||||
|
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||||
|
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||||
|
|
||||||
const Real *getCtcssToneSet(int& nbTones) const {
|
const Real *getCtcssToneSet(int& nbTones) const {
|
||||||
nbTones = m_ctcssDetector.getNTones();
|
nbTones = m_ctcssDetector.getNTones();
|
||||||
return m_ctcssDetector.getToneSet();
|
return m_ctcssDetector.getToneSet();
|
||||||
@ -151,6 +157,7 @@ private:
|
|||||||
DownChannelizer* m_channelizer;
|
DownChannelizer* m_channelizer;
|
||||||
|
|
||||||
NFMDemodSettings m_settings;
|
NFMDemodSettings m_settings;
|
||||||
|
int m_absoluteFrequencyOffset;
|
||||||
|
|
||||||
NCO m_nco;
|
NCO m_nco;
|
||||||
Interpolator m_interpolator;
|
Interpolator m_interpolator;
|
||||||
|
@ -224,8 +224,9 @@ void NFMDemodGUI::onMenuDialogCalled(const QPoint &p)
|
|||||||
m_settings.m_udpAddress = m_channelMarker.getUDPAddress(),
|
m_settings.m_udpAddress = m_channelMarker.getUDPAddress(),
|
||||||
m_settings.m_udpPort = m_channelMarker.getUDPSendPort(),
|
m_settings.m_udpPort = m_channelMarker.getUDPSendPort(),
|
||||||
m_settings.m_rgbColor = m_channelMarker.getColor().rgb();
|
m_settings.m_rgbColor = m_channelMarker.getColor().rgb();
|
||||||
|
m_settings.m_title = m_channelMarker.getTitle();
|
||||||
|
|
||||||
setWindowTitle(m_channelMarker.getTitle());
|
setWindowTitle(m_settings.m_title);
|
||||||
setTitleColor(m_settings.m_rgbColor);
|
setTitleColor(m_settings.m_rgbColor);
|
||||||
displayUDPAddress();
|
displayUDPAddress();
|
||||||
|
|
||||||
@ -336,6 +337,7 @@ void NFMDemodGUI::displaySettings()
|
|||||||
m_channelMarker.blockSignals(true);
|
m_channelMarker.blockSignals(true);
|
||||||
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
||||||
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
||||||
|
m_channelMarker.setTitle(m_settings.m_title);
|
||||||
m_channelMarker.blockSignals(false);
|
m_channelMarker.blockSignals(false);
|
||||||
m_channelMarker.setColor(m_settings.m_rgbColor);
|
m_channelMarker.setColor(m_settings.m_rgbColor);
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ void NFMDemodSettings::resetToDefaults()
|
|||||||
m_udpAddress = "127.0.0.1";
|
m_udpAddress = "127.0.0.1";
|
||||||
m_udpPort = 9999;
|
m_udpPort = 9999;
|
||||||
m_rgbColor = QColor(255, 0, 0).rgb();
|
m_rgbColor = QColor(255, 0, 0).rgb();
|
||||||
|
m_title = "NFM Demodulator";
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray NFMDemodSettings::serialize() const
|
QByteArray NFMDemodSettings::serialize() const
|
||||||
@ -75,6 +76,9 @@ QByteArray NFMDemodSettings::serialize() const
|
|||||||
if (m_channelMarker) {
|
if (m_channelMarker) {
|
||||||
s.writeBlob(13, m_channelMarker->serialize());
|
s.writeBlob(13, m_channelMarker->serialize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.writeString(14, m_title);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,6 +120,7 @@ bool NFMDemodSettings::deserialize(const QByteArray& data)
|
|||||||
d.readBool(10, &m_audioMute, false);
|
d.readBool(10, &m_audioMute, false);
|
||||||
d.readS32(11, &m_squelchGate, 5);
|
d.readS32(11, &m_squelchGate, 5);
|
||||||
d.readBool(12, &m_deltaSquelch, false);
|
d.readBool(12, &m_deltaSquelch, false);
|
||||||
|
d.readString(14, &m_title, "NFM Demodulator");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,7 @@ struct NFMDemodSettings
|
|||||||
QString m_udpAddress;
|
QString m_udpAddress;
|
||||||
uint16_t m_udpPort;
|
uint16_t m_udpPort;
|
||||||
quint32 m_rgbColor;
|
quint32 m_rgbColor;
|
||||||
|
QString m_title;
|
||||||
|
|
||||||
Serializable *m_channelMarker;
|
Serializable *m_channelMarker;
|
||||||
|
|
||||||
|
@ -60,8 +60,8 @@ SSBDemod::SSBDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
m_volume = 2.0;
|
m_volume = 2.0;
|
||||||
m_spanLog2 = 3;
|
m_spanLog2 = 3;
|
||||||
m_sampleRate = 96000;
|
m_sampleRate = 96000;
|
||||||
m_frequency = 0;
|
m_absoluteFrequencyOffset = 0;
|
||||||
m_nco.setFreq(m_frequency, m_sampleRate);
|
m_nco.setFreq(m_absoluteFrequencyOffset, m_sampleRate);
|
||||||
m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate();
|
m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate();
|
||||||
|
|
||||||
m_interpolator.create(16, m_sampleRate, 5000);
|
m_interpolator.create(16, m_sampleRate, 5000);
|
||||||
@ -89,6 +89,7 @@ SSBDemod::SSBDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
m_channelizer = new DownChannelizer(this);
|
m_channelizer = new DownChannelizer(this);
|
||||||
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
|
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
|
||||||
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
||||||
|
m_deviceAPI->addChannelAPI(this);
|
||||||
|
|
||||||
applySettings(m_settings, true);
|
applySettings(m_settings, true);
|
||||||
}
|
}
|
||||||
@ -100,6 +101,7 @@ SSBDemod::~SSBDemod()
|
|||||||
|
|
||||||
DSPEngine::instance()->removeAudioSink(&m_audioFifo);
|
DSPEngine::instance()->removeAudioSink(&m_audioFifo);
|
||||||
|
|
||||||
|
m_deviceAPI->removeChannelAPI(this);
|
||||||
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
||||||
delete m_threadedChannelizer;
|
delete m_threadedChannelizer;
|
||||||
delete m_channelizer;
|
delete m_channelizer;
|
||||||
@ -318,7 +320,8 @@ bool SSBDemod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
SSBDemodSettings settings = cfg.getSettings();
|
SSBDemodSettings settings = cfg.getSettings();
|
||||||
|
|
||||||
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
// These settings are set with DownChannelizer::MsgChannelizerNotificatione
|
||||||
|
m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset; // save as absolut frequency shift in baseband
|
||||||
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
||||||
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
||||||
|
|
||||||
|
@ -21,7 +21,8 @@
|
|||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <dsp/basebandsamplesink.h>
|
#include "dsp/basebandsamplesink.h"
|
||||||
|
#include "channel/channelsinkapi.h"
|
||||||
#include "dsp/ncof.h"
|
#include "dsp/ncof.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "dsp/fftfilt.h"
|
#include "dsp/fftfilt.h"
|
||||||
@ -38,7 +39,7 @@ class DeviceSourceAPI;
|
|||||||
class ThreadedBasebandSampleSink;
|
class ThreadedBasebandSampleSink;
|
||||||
class DownChannelizer;
|
class DownChannelizer;
|
||||||
|
|
||||||
class SSBDemod : public BasebandSampleSink {
|
class SSBDemod : public BasebandSampleSink, public ChannelSinkAPI {
|
||||||
public:
|
public:
|
||||||
class MsgConfigureSSBDemod : public Message {
|
class MsgConfigureSSBDemod : public Message {
|
||||||
MESSAGE_CLASS_DECLARATION
|
MESSAGE_CLASS_DECLARATION
|
||||||
@ -110,7 +111,11 @@ public:
|
|||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
double getMagSq() const { return m_magsq; }
|
virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; }
|
||||||
|
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||||
|
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||||
|
|
||||||
|
double getMagSq() const { return m_magsq; }
|
||||||
bool getAudioActive() const { return m_audioActive; }
|
bool getAudioActive() const { return m_audioActive; }
|
||||||
|
|
||||||
void getMagSqLevels(double& avg, double& peak, int& nbSamples)
|
void getMagSqLevels(double& avg, double& peak, int& nbSamples)
|
||||||
@ -232,7 +237,7 @@ private:
|
|||||||
fftfilt::cmplx m_sum;
|
fftfilt::cmplx m_sum;
|
||||||
int m_undersampleCount;
|
int m_undersampleCount;
|
||||||
int m_sampleRate;
|
int m_sampleRate;
|
||||||
int m_frequency;
|
int m_absoluteFrequencyOffset;
|
||||||
bool m_audioBinaual;
|
bool m_audioBinaual;
|
||||||
bool m_audioFlipChannels;
|
bool m_audioFlipChannels;
|
||||||
bool m_usb;
|
bool m_usb;
|
||||||
|
@ -375,6 +375,7 @@ void SSBDemodGUI::displaySettings()
|
|||||||
{
|
{
|
||||||
m_channelMarker.blockSignals(true);
|
m_channelMarker.blockSignals(true);
|
||||||
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
||||||
|
m_channelMarker.setTitle(m_settings.m_title);
|
||||||
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth * 2);
|
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth * 2);
|
||||||
m_channelMarker.setLowCutoff(m_settings.m_lowCutoff);
|
m_channelMarker.setLowCutoff(m_settings.m_lowCutoff);
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ void SSBDemodSettings::resetToDefaults()
|
|||||||
m_inputFrequencyOffset = 0;
|
m_inputFrequencyOffset = 0;
|
||||||
m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate();
|
m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate();
|
||||||
m_rgbColor = QColor(0, 255, 0).rgb();
|
m_rgbColor = QColor(0, 255, 0).rgb();
|
||||||
|
m_title = "SSB Demodulator";
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray SSBDemodSettings::serialize() const
|
QByteArray SSBDemodSettings::serialize() const
|
||||||
@ -71,6 +72,8 @@ QByteArray SSBDemodSettings::serialize() const
|
|||||||
s.writeS32(13, m_agcPowerThreshold);
|
s.writeS32(13, m_agcPowerThreshold);
|
||||||
s.writeS32(14, m_agcThresholdGate);
|
s.writeS32(14, m_agcThresholdGate);
|
||||||
s.writeBool(15, m_agcClamping);
|
s.writeBool(15, m_agcClamping);
|
||||||
|
s.writeString(16, m_title);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,6 +116,7 @@ bool SSBDemodSettings::deserialize(const QByteArray& data)
|
|||||||
d.readS32(13, &m_agcPowerThreshold, -40);
|
d.readS32(13, &m_agcPowerThreshold, -40);
|
||||||
d.readS32(14, &m_agcThresholdGate, 4);
|
d.readS32(14, &m_agcThresholdGate, 4);
|
||||||
d.readBool(15, &m_agcClamping, false);
|
d.readBool(15, &m_agcClamping, false);
|
||||||
|
d.readString(16, &m_title, "SSB Demodulator");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,7 @@ struct SSBDemodSettings
|
|||||||
QString m_udpAddress;
|
QString m_udpAddress;
|
||||||
quint16 m_udpPort;
|
quint16 m_udpPort;
|
||||||
quint32 m_rgbColor;
|
quint32 m_rgbColor;
|
||||||
|
QString m_title;
|
||||||
|
|
||||||
Serializable *m_channelMarker;
|
Serializable *m_channelMarker;
|
||||||
Serializable *m_spectrumGUI;
|
Serializable *m_spectrumGUI;
|
||||||
|
@ -37,6 +37,7 @@ const QString WFMDemod::m_channelID = "de.maintech.sdrangelove.channel.wfm";
|
|||||||
|
|
||||||
WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) :
|
WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) :
|
||||||
m_deviceAPI(deviceAPI),
|
m_deviceAPI(deviceAPI),
|
||||||
|
m_absoluteFrequencyOffset(0),
|
||||||
m_squelchOpen(false),
|
m_squelchOpen(false),
|
||||||
m_magsq(0.0f),
|
m_magsq(0.0f),
|
||||||
m_magsqSum(0.0f),
|
m_magsqSum(0.0f),
|
||||||
@ -63,6 +64,7 @@ WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) :
|
|||||||
m_channelizer = new DownChannelizer(this);
|
m_channelizer = new DownChannelizer(this);
|
||||||
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
|
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
|
||||||
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
||||||
|
m_deviceAPI->addChannelAPI(this);
|
||||||
|
|
||||||
applySettings(m_settings, true);
|
applySettings(m_settings, true);
|
||||||
}
|
}
|
||||||
@ -76,6 +78,7 @@ WFMDemod::~WFMDemod()
|
|||||||
|
|
||||||
DSPEngine::instance()->removeAudioSink(&m_audioFifo);
|
DSPEngine::instance()->removeAudioSink(&m_audioFifo);
|
||||||
|
|
||||||
|
m_deviceAPI->removeChannelAPI(this);
|
||||||
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
||||||
delete m_threadedChannelizer;
|
delete m_threadedChannelizer;
|
||||||
delete m_channelizer;
|
delete m_channelizer;
|
||||||
@ -233,6 +236,7 @@ bool WFMDemod::handleMessage(const Message& cmd)
|
|||||||
WFMDemodSettings settings = cfg.getSettings();
|
WFMDemodSettings settings = cfg.getSettings();
|
||||||
|
|
||||||
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
||||||
|
m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||||
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
||||||
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
||||||
|
|
||||||
|
@ -18,9 +18,11 @@
|
|||||||
#ifndef INCLUDE_WFMDEMOD_H
|
#ifndef INCLUDE_WFMDEMOD_H
|
||||||
#define INCLUDE_WFMDEMOD_H
|
#define INCLUDE_WFMDEMOD_H
|
||||||
|
|
||||||
#include <dsp/basebandsamplesink.h>
|
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "dsp/basebandsamplesink.h"
|
||||||
|
#include "channel/channelsinkapi.h"
|
||||||
#include "dsp/nco.h"
|
#include "dsp/nco.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "dsp/lowpass.h"
|
#include "dsp/lowpass.h"
|
||||||
@ -38,7 +40,7 @@ class ThreadedBasebandSampleSink;
|
|||||||
class DownChannelizer;
|
class DownChannelizer;
|
||||||
class DeviceSourceAPI;
|
class DeviceSourceAPI;
|
||||||
|
|
||||||
class WFMDemod : public BasebandSampleSink {
|
class WFMDemod : public BasebandSampleSink, public ChannelSinkAPI {
|
||||||
public:
|
public:
|
||||||
class MsgConfigureWFMDemod : public Message {
|
class MsgConfigureWFMDemod : public Message {
|
||||||
MESSAGE_CLASS_DECLARATION
|
MESSAGE_CLASS_DECLARATION
|
||||||
@ -95,6 +97,10 @@ public:
|
|||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
|
virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; }
|
||||||
|
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||||
|
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||||
|
|
||||||
double getMagSq() const { return m_movingAverage.average(); }
|
double getMagSq() const { return m_movingAverage.average(); }
|
||||||
bool getSquelchOpen() const { return m_squelchOpen; }
|
bool getSquelchOpen() const { return m_squelchOpen; }
|
||||||
|
|
||||||
@ -120,7 +126,9 @@ private:
|
|||||||
DeviceSourceAPI* m_deviceAPI;
|
DeviceSourceAPI* m_deviceAPI;
|
||||||
ThreadedBasebandSampleSink* m_threadedChannelizer;
|
ThreadedBasebandSampleSink* m_threadedChannelizer;
|
||||||
DownChannelizer* m_channelizer;
|
DownChannelizer* m_channelizer;
|
||||||
|
|
||||||
WFMDemodSettings m_settings;
|
WFMDemodSettings m_settings;
|
||||||
|
int m_absoluteFrequencyOffset;
|
||||||
|
|
||||||
NCO m_nco;
|
NCO m_nco;
|
||||||
Interpolator m_interpolator; //!< Interpolator between sample rate sent from DSP engine and requested RF bandwidth (rational)
|
Interpolator m_interpolator; //!< Interpolator between sample rate sent from DSP engine and requested RF bandwidth (rational)
|
||||||
|
@ -145,8 +145,9 @@ void WFMDemodGUI::onMenuDialogCalled(const QPoint &p)
|
|||||||
m_settings.m_udpAddress = m_channelMarker.getUDPAddress(),
|
m_settings.m_udpAddress = m_channelMarker.getUDPAddress(),
|
||||||
m_settings.m_udpPort = m_channelMarker.getUDPSendPort(),
|
m_settings.m_udpPort = m_channelMarker.getUDPSendPort(),
|
||||||
m_settings.m_rgbColor = m_channelMarker.getColor().rgb();
|
m_settings.m_rgbColor = m_channelMarker.getColor().rgb();
|
||||||
|
m_settings.m_title = m_channelMarker.getTitle();
|
||||||
|
|
||||||
setWindowTitle(m_channelMarker.getTitle());
|
setWindowTitle(m_settings.m_title);
|
||||||
setTitleColor(m_settings.m_rgbColor);
|
setTitleColor(m_settings.m_rgbColor);
|
||||||
displayUDPAddress();
|
displayUDPAddress();
|
||||||
|
|
||||||
@ -240,6 +241,7 @@ void WFMDemodGUI::displaySettings()
|
|||||||
m_channelMarker.blockSignals(true);
|
m_channelMarker.blockSignals(true);
|
||||||
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
||||||
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
||||||
|
m_channelMarker.setTitle(m_settings.m_title);
|
||||||
m_channelMarker.blockSignals(false);
|
m_channelMarker.blockSignals(false);
|
||||||
m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
|
m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ void WFMDemodSettings::resetToDefaults()
|
|||||||
m_udpAddress = "127.0.0.1";
|
m_udpAddress = "127.0.0.1";
|
||||||
m_udpPort = 9999;
|
m_udpPort = 9999;
|
||||||
m_rgbColor = QColor(0, 0, 255).rgb();
|
m_rgbColor = QColor(0, 0, 255).rgb();
|
||||||
|
m_title = "WFM Demodulator";
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray WFMDemodSettings::serialize() const
|
QByteArray WFMDemodSettings::serialize() const
|
||||||
@ -59,6 +60,7 @@ QByteArray WFMDemodSettings::serialize() const
|
|||||||
s.writeS32(4, m_volume*10.0);
|
s.writeS32(4, m_volume*10.0);
|
||||||
s.writeS32(5, m_squelch);
|
s.writeS32(5, m_squelch);
|
||||||
s.writeU32(7, m_rgbColor);
|
s.writeU32(7, m_rgbColor);
|
||||||
|
s.writeString(8, m_title);
|
||||||
|
|
||||||
if (m_channelMarker) {
|
if (m_channelMarker) {
|
||||||
s.writeBlob(11, m_channelMarker->serialize());
|
s.writeBlob(11, m_channelMarker->serialize());
|
||||||
@ -94,6 +96,7 @@ bool WFMDemodSettings::deserialize(const QByteArray& data)
|
|||||||
d.readS32(5, &tmp, -60);
|
d.readS32(5, &tmp, -60);
|
||||||
m_squelch = tmp;
|
m_squelch = tmp;
|
||||||
d.readU32(7, &m_rgbColor);
|
d.readU32(7, &m_rgbColor);
|
||||||
|
d.readString(8, &m_title, "WFM Demodulator");
|
||||||
|
|
||||||
d.readBlob(11, &bytetmp);
|
d.readBlob(11, &bytetmp);
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ struct WFMDemodSettings
|
|||||||
QString m_udpAddress;
|
QString m_udpAddress;
|
||||||
quint16 m_udpPort;
|
quint16 m_udpPort;
|
||||||
quint32 m_rgbColor;
|
quint32 m_rgbColor;
|
||||||
|
QString m_title;
|
||||||
|
|
||||||
Serializable *m_channelMarker;
|
Serializable *m_channelMarker;
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ const QString TCPSrc::m_channelID = "sdrangel.channel.tcpsrc";
|
|||||||
|
|
||||||
TCPSrc::TCPSrc(DeviceSourceAPI* deviceAPI) :
|
TCPSrc::TCPSrc(DeviceSourceAPI* deviceAPI) :
|
||||||
m_deviceAPI(deviceAPI),
|
m_deviceAPI(deviceAPI),
|
||||||
|
m_absoluteFrequencyOffset(0),
|
||||||
m_settingsMutex(QMutex::Recursive)
|
m_settingsMutex(QMutex::Recursive)
|
||||||
{
|
{
|
||||||
setObjectName("TCPSrc");
|
setObjectName("TCPSrc");
|
||||||
@ -64,12 +65,14 @@ TCPSrc::TCPSrc(DeviceSourceAPI* deviceAPI) :
|
|||||||
m_channelizer = new DownChannelizer(this);
|
m_channelizer = new DownChannelizer(this);
|
||||||
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
|
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
|
||||||
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
||||||
|
m_deviceAPI->addChannelAPI(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
TCPSrc::~TCPSrc()
|
TCPSrc::~TCPSrc()
|
||||||
{
|
{
|
||||||
if (TCPFilter) delete TCPFilter;
|
if (TCPFilter) delete TCPFilter;
|
||||||
|
|
||||||
|
m_deviceAPI->removeChannelAPI(this);
|
||||||
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
||||||
delete m_threadedChannelizer;
|
delete m_threadedChannelizer;
|
||||||
delete m_channelizer;
|
delete m_channelizer;
|
||||||
@ -226,6 +229,7 @@ bool TCPSrc::handleMessage(const Message& cmd)
|
|||||||
TCPSrcSettings settings = cfg.getSettings();
|
TCPSrcSettings settings = cfg.getSettings();
|
||||||
|
|
||||||
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
||||||
|
m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||||
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
||||||
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
||||||
|
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <QHostAddress>
|
#include <QHostAddress>
|
||||||
|
|
||||||
#include <dsp/basebandsamplesink.h>
|
#include "dsp/basebandsamplesink.h"
|
||||||
|
#include "channel/channelsinkapi.h"
|
||||||
#include "dsp/nco.h"
|
#include "dsp/nco.h"
|
||||||
#include "dsp/fftfilt.h"
|
#include "dsp/fftfilt.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
@ -21,7 +22,7 @@ class DeviceSourceAPI;
|
|||||||
class ThreadedBasebandSampleSink;
|
class ThreadedBasebandSampleSink;
|
||||||
class DownChannelizer;
|
class DownChannelizer;
|
||||||
|
|
||||||
class TCPSrc : public BasebandSampleSink {
|
class TCPSrc : public BasebandSampleSink, public ChannelSinkAPI {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -113,6 +114,10 @@ public:
|
|||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
|
virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; }
|
||||||
|
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||||
|
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||||
|
|
||||||
static const QString m_channelID;
|
static const QString m_channelID;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -155,11 +160,13 @@ protected:
|
|||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
TCPSrcSettings m_settings;
|
DeviceSourceAPI* m_deviceAPI;
|
||||||
DeviceSourceAPI* m_deviceAPI;
|
|
||||||
ThreadedBasebandSampleSink* m_threadedChannelizer;
|
ThreadedBasebandSampleSink* m_threadedChannelizer;
|
||||||
DownChannelizer* m_channelizer;
|
DownChannelizer* m_channelizer;
|
||||||
|
|
||||||
|
TCPSrcSettings m_settings;
|
||||||
|
int m_absoluteFrequencyOffset;
|
||||||
|
|
||||||
int m_inputSampleRate;
|
int m_inputSampleRate;
|
||||||
|
|
||||||
int m_sampleFormat;
|
int m_sampleFormat;
|
||||||
|
@ -53,16 +53,6 @@ void TCPSrcGUI::resetToDefaults()
|
|||||||
QByteArray TCPSrcGUI::serialize() const
|
QByteArray TCPSrcGUI::serialize() const
|
||||||
{
|
{
|
||||||
return m_settings.serialize();
|
return m_settings.serialize();
|
||||||
// SimpleSerializer s(1);
|
|
||||||
// s.writeS32(2, m_channelMarker.getCenterFrequency());
|
|
||||||
// s.writeS32(3, m_sampleFormat);
|
|
||||||
// s.writeReal(4, m_outputSampleRate);
|
|
||||||
// s.writeReal(5, m_rfBandwidth);
|
|
||||||
// s.writeS32(6, m_tcpPort);
|
|
||||||
// s.writeBlob(7, ui->spectrumGUI->serialize());
|
|
||||||
// s.writeS32(8, (qint32)m_boost);
|
|
||||||
// s.writeS32(9, m_channelMarker.getCenterFrequency());
|
|
||||||
// return s.final();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TCPSrcGUI::deserialize(const QByteArray& data)
|
bool TCPSrcGUI::deserialize(const QByteArray& data)
|
||||||
@ -309,6 +299,7 @@ void TCPSrcGUI::displaySettings()
|
|||||||
m_channelMarker.blockSignals(true);
|
m_channelMarker.blockSignals(true);
|
||||||
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
||||||
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
||||||
|
m_channelMarker.setTitle(m_settings.m_title);
|
||||||
m_channelMarker.blockSignals(false);
|
m_channelMarker.blockSignals(false);
|
||||||
m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
|
m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
|
||||||
|
|
||||||
|
@ -50,6 +50,7 @@ void TCPSrcSettings::resetToDefaults()
|
|||||||
m_udpPort = 9999;
|
m_udpPort = 9999;
|
||||||
m_audioPort = 9998;
|
m_audioPort = 9998;
|
||||||
m_rgbColor = QColor(225, 25, 99).rgb();
|
m_rgbColor = QColor(225, 25, 99).rgb();
|
||||||
|
m_title = "TCP Source";
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray TCPSrcSettings::serialize() const
|
QByteArray TCPSrcSettings::serialize() const
|
||||||
@ -78,6 +79,8 @@ QByteArray TCPSrcSettings::serialize() const
|
|||||||
s.writeS32(16, m_squelchdB);
|
s.writeS32(16, m_squelchdB);
|
||||||
s.writeS32(17, m_squelchGate);
|
s.writeS32(17, m_squelchGate);
|
||||||
s.writeBool(18, m_agc);
|
s.writeBool(18, m_agc);
|
||||||
|
s.writeString(19, m_title);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -134,6 +137,8 @@ bool TCPSrcSettings::deserialize(const QByteArray& data)
|
|||||||
d.readS32(16, &m_squelchdB, -60);
|
d.readS32(16, &m_squelchdB, -60);
|
||||||
d.readS32(17, &m_squelchGate, 5);
|
d.readS32(17, &m_squelchGate, 5);
|
||||||
d.readBool(18, &m_agc, false);
|
d.readBool(18, &m_agc, false);
|
||||||
|
d.readString(19, &m_title, "TCP Source");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -54,6 +54,8 @@ struct TCPSrcSettings
|
|||||||
uint16_t m_udpPort;
|
uint16_t m_udpPort;
|
||||||
uint16_t m_audioPort;
|
uint16_t m_audioPort;
|
||||||
|
|
||||||
|
QString m_title;
|
||||||
|
|
||||||
Serializable *m_channelMarker;
|
Serializable *m_channelMarker;
|
||||||
Serializable *m_spectrumGUI;
|
Serializable *m_spectrumGUI;
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ const QString UDPSrc::m_channelID = "sdrangel.channel.udpsrc";
|
|||||||
|
|
||||||
UDPSrc::UDPSrc(DeviceSourceAPI *deviceAPI) :
|
UDPSrc::UDPSrc(DeviceSourceAPI *deviceAPI) :
|
||||||
m_deviceAPI(deviceAPI),
|
m_deviceAPI(deviceAPI),
|
||||||
|
m_absoluteFrequencyOffset(0),
|
||||||
m_outMovingAverage(480, 1e-10),
|
m_outMovingAverage(480, 1e-10),
|
||||||
m_inMovingAverage(480, 1e-10),
|
m_inMovingAverage(480, 1e-10),
|
||||||
m_amMovingAverage(1200, 1e-10),
|
m_amMovingAverage(1200, 1e-10),
|
||||||
@ -96,6 +97,7 @@ UDPSrc::UDPSrc(DeviceSourceAPI *deviceAPI) :
|
|||||||
m_channelizer = new DownChannelizer(this);
|
m_channelizer = new DownChannelizer(this);
|
||||||
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
|
m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
|
||||||
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->addThreadedSink(m_threadedChannelizer);
|
||||||
|
m_deviceAPI->addChannelAPI(this);
|
||||||
|
|
||||||
applySettings(m_settings, true);
|
applySettings(m_settings, true);
|
||||||
}
|
}
|
||||||
@ -108,6 +110,7 @@ UDPSrc::~UDPSrc()
|
|||||||
delete[] m_udpAudioBuf;
|
delete[] m_udpAudioBuf;
|
||||||
if (UDPFilter) delete UDPFilter;
|
if (UDPFilter) delete UDPFilter;
|
||||||
if (m_settings.m_audioActive) DSPEngine::instance()->removeAudioSink(&m_audioFifo);
|
if (m_settings.m_audioActive) DSPEngine::instance()->removeAudioSink(&m_audioFifo);
|
||||||
|
m_deviceAPI->removeChannelAPI(this);
|
||||||
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
|
||||||
delete m_threadedChannelizer;
|
delete m_threadedChannelizer;
|
||||||
delete m_channelizer;
|
delete m_channelizer;
|
||||||
@ -353,6 +356,7 @@ bool UDPSrc::handleMessage(const Message& cmd)
|
|||||||
UDPSrcSettings settings = cfg.getSettings();
|
UDPSrcSettings settings = cfg.getSettings();
|
||||||
|
|
||||||
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
||||||
|
m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||||
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
|
||||||
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
||||||
|
|
||||||
|
@ -18,9 +18,11 @@
|
|||||||
#ifndef INCLUDE_UDPSRC_H
|
#ifndef INCLUDE_UDPSRC_H
|
||||||
#define INCLUDE_UDPSRC_H
|
#define INCLUDE_UDPSRC_H
|
||||||
|
|
||||||
#include <dsp/basebandsamplesink.h>
|
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <QHostAddress>
|
#include <QHostAddress>
|
||||||
|
|
||||||
|
#include "dsp/basebandsamplesink.h"
|
||||||
|
#include "channel/channelsinkapi.h"
|
||||||
#include "dsp/nco.h"
|
#include "dsp/nco.h"
|
||||||
#include "dsp/fftfilt.h"
|
#include "dsp/fftfilt.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
@ -39,7 +41,7 @@ class DeviceSourceAPI;
|
|||||||
class ThreadedBasebandSampleSink;
|
class ThreadedBasebandSampleSink;
|
||||||
class DownChannelizer;
|
class DownChannelizer;
|
||||||
|
|
||||||
class UDPSrc : public BasebandSampleSink {
|
class UDPSrc : public BasebandSampleSink, public ChannelSinkAPI {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -104,6 +106,10 @@ public:
|
|||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
|
virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; }
|
||||||
|
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||||
|
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||||
|
|
||||||
static const QString m_channelID;
|
static const QString m_channelID;
|
||||||
static const int udpBlockSize = 512; // UDP block size in number of bytes
|
static const int udpBlockSize = 512; // UDP block size in number of bytes
|
||||||
|
|
||||||
@ -131,12 +137,13 @@ protected:
|
|||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
UDPSrcSettings m_settings;
|
|
||||||
|
|
||||||
DeviceSourceAPI *m_deviceAPI;
|
DeviceSourceAPI *m_deviceAPI;
|
||||||
ThreadedBasebandSampleSink* m_threadedChannelizer;
|
ThreadedBasebandSampleSink* m_threadedChannelizer;
|
||||||
DownChannelizer* m_channelizer;
|
DownChannelizer* m_channelizer;
|
||||||
|
|
||||||
|
UDPSrcSettings m_settings;
|
||||||
|
int m_absoluteFrequencyOffset;
|
||||||
|
|
||||||
QUdpSocket *m_audioSocket;
|
QUdpSocket *m_audioSocket;
|
||||||
|
|
||||||
double m_magsq;
|
double m_magsq;
|
||||||
|
@ -215,6 +215,7 @@ void UDPSrcGUI::displaySettings()
|
|||||||
m_channelMarker.blockSignals(true);
|
m_channelMarker.blockSignals(true);
|
||||||
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
||||||
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
||||||
|
m_channelMarker.setTitle(m_settings.m_title);
|
||||||
m_channelMarker.blockSignals(false);
|
m_channelMarker.blockSignals(false);
|
||||||
m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
|
m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
|
||||||
|
|
||||||
@ -544,8 +545,9 @@ void UDPSrcGUI::onMenuDialogCalled(const QPoint &p)
|
|||||||
m_settings.m_udpAddress = m_channelMarker.getUDPAddress(),
|
m_settings.m_udpAddress = m_channelMarker.getUDPAddress(),
|
||||||
m_settings.m_udpPort = m_channelMarker.getUDPSendPort(),
|
m_settings.m_udpPort = m_channelMarker.getUDPSendPort(),
|
||||||
m_settings.m_rgbColor = m_channelMarker.getColor().rgb();
|
m_settings.m_rgbColor = m_channelMarker.getColor().rgb();
|
||||||
|
m_settings.m_title = m_channelMarker.getTitle();
|
||||||
|
|
||||||
setWindowTitle(m_channelMarker.getTitle());
|
setWindowTitle(m_settings.m_title);
|
||||||
setTitleColor(m_settings.m_rgbColor);
|
setTitleColor(m_settings.m_rgbColor);
|
||||||
displayUDPAddress();
|
displayUDPAddress();
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@ void UDPSrcSettings::resetToDefaults()
|
|||||||
m_udpPort = 9999;
|
m_udpPort = 9999;
|
||||||
m_audioPort = 9998;
|
m_audioPort = 9998;
|
||||||
m_rgbColor = QColor(225, 25, 99).rgb();
|
m_rgbColor = QColor(225, 25, 99).rgb();
|
||||||
|
m_title = "UDP Sample Source";
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray UDPSrcSettings::serialize() const
|
QByteArray UDPSrcSettings::serialize() const
|
||||||
@ -76,6 +77,8 @@ QByteArray UDPSrcSettings::serialize() const
|
|||||||
s.writeS32(16, m_squelchdB);
|
s.writeS32(16, m_squelchdB);
|
||||||
s.writeS32(17, m_squelchGate);
|
s.writeS32(17, m_squelchGate);
|
||||||
s.writeBool(18, m_agc);
|
s.writeBool(18, m_agc);
|
||||||
|
s.writeString(19, m_title);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -130,6 +133,8 @@ bool UDPSrcSettings::deserialize(const QByteArray& data)
|
|||||||
d.readS32(16, &m_squelchdB, -60);
|
d.readS32(16, &m_squelchdB, -60);
|
||||||
d.readS32(17, &m_squelchGate, 5);
|
d.readS32(17, &m_squelchGate, 5);
|
||||||
d.readBool(18, &m_agc, false);
|
d.readBool(18, &m_agc, false);
|
||||||
|
d.readString(19, &m_title, "UDP Sample Source");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -60,6 +60,8 @@ struct UDPSrcSettings
|
|||||||
uint16_t m_udpPort;
|
uint16_t m_udpPort;
|
||||||
uint16_t m_audioPort;
|
uint16_t m_audioPort;
|
||||||
|
|
||||||
|
QString m_title;
|
||||||
|
|
||||||
Serializable *m_channelMarker;
|
Serializable *m_channelMarker;
|
||||||
Serializable *m_spectrumGUI;
|
Serializable *m_spectrumGUI;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user