1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-02-12 20:53:42 -05:00

Merge pull request #2632 from f4exb/feature-1329

Complete "atomic settings" for channel plugins
This commit is contained in:
Edouard Griffiths 2026-02-01 20:49:50 +01:00 committed by GitHub
commit 0698aaa5e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
506 changed files with 14280 additions and 7289 deletions

View File

@ -118,7 +118,7 @@ void BeamSteeringCWMod::startSources()
m_basebandSource->getInputMessageQueue()->push(sig);
BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband *msg = BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband::create(
m_settings, true);
QStringList(), m_settings, true);
m_basebandSource->getInputMessageQueue()->push(msg);
}
@ -152,42 +152,13 @@ void BeamSteeringCWMod::feed(const SampleVector::const_iterator& begin, const Sa
(void) sinkIndex;
}
void BeamSteeringCWMod::applySettings(const BeamSteeringCWModSettings& settings, bool force)
void BeamSteeringCWMod::applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force)
{
qDebug() << "BeamSteeringCWMod::applySettings: "
<< "m_steerDegrees: " << settings.m_steerDegrees
<< "m_channelOutput: " << settings.m_channelOutput
<< "m_filterChainHash: " << settings.m_filterChainHash
<< "m_log2Interp: " << settings.m_log2Interp
<< "m_filterChainHash: " << settings.m_filterChainHash
<< "m_useReverseAPI: " << settings.m_useReverseAPI
<< "m_reverseAPIAddress: " << settings.m_reverseAPIAddress
<< "m_reverseAPIPort: " << settings.m_reverseAPIPort
<< "m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
<< "m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
<< "m_title: " << settings.m_title;
QList<QString> reverseAPIKeys;
if ((m_settings.m_steerDegrees != settings.m_steerDegrees) || force) {
reverseAPIKeys.append("steerDegrees");
}
if ((m_settings.m_channelOutput != settings.m_channelOutput) || force) {
reverseAPIKeys.append("channelOutput");
}
if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) {
reverseAPIKeys.append("filterChainHash");
}
if ((m_settings.m_log2Interp != settings.m_log2Interp) || force) {
reverseAPIKeys.append("log2Interp");
}
if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) {
reverseAPIKeys.append("filterChainHash");
}
qDebug() << "BeamSteeringCWMod::applySettings: " << settings.getDebugString(settingsKeys, force);
if (m_running)
{
BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband *msg = BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband::create(settings, force);
BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband *msg = BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband::create(settingsKeys, settings, force);
m_basebandSource->getInputMessageQueue()->push(msg);
}
@ -195,10 +166,14 @@ void BeamSteeringCWMod::applySettings(const BeamSteeringCWModSettings& settings,
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (!pipes.empty()) {
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
sendChannelSettings(pipes, settingsKeys, settings, force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
void BeamSteeringCWMod::handleInputMessages()
@ -220,7 +195,7 @@ bool BeamSteeringCWMod::handleMessage(const Message& cmd)
{
auto& cfg = (const MsgConfigureBeamSteeringCWMod&) cmd;
qDebug() << "BeamSteeringCWMod::handleMessage: MsgConfigureBeamSteeringCWMod";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
else if (DSPMIMOSignalNotification::match(cmd))
@ -274,14 +249,14 @@ bool BeamSteeringCWMod::deserialize(const QByteArray& data)
(void) data;
if (m_settings.deserialize(data))
{
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(m_settings, true);
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return true;
}
else
{
m_settings.resetToDefaults();
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(m_settings, true);
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return false;
}
@ -334,12 +309,12 @@ int BeamSteeringCWMod::webapiSettingsPutPatch(
BeamSteeringCWModSettings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(settings, force);
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(channelSettingsKeys, settings, force);
m_inputMessageQueue.push(msg);
if (getMessageQueueToGUI()) // forward to GUI if any
{
MsgConfigureBeamSteeringCWMod *msgToGUI = MsgConfigureBeamSteeringCWMod::create(settings, force);
MsgConfigureBeamSteeringCWMod *msgToGUI = MsgConfigureBeamSteeringCWMod::create(channelSettingsKeys, settings, force);
getMessageQueueToGUI()->push(msgToGUI);
}

View File

@ -45,20 +45,23 @@ public:
public:
const BeamSteeringCWModSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureBeamSteeringCWMod* create(const BeamSteeringCWModSettings& settings, bool force)
static MsgConfigureBeamSteeringCWMod* create(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force)
{
return new MsgConfigureBeamSteeringCWMod(settings, force);
return new MsgConfigureBeamSteeringCWMod(settingsKeys, settings, force);
}
private:
BeamSteeringCWModSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureBeamSteeringCWMod(const BeamSteeringCWModSettings& settings, bool force) :
MsgConfigureBeamSteeringCWMod(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -164,7 +167,7 @@ private:
uint32_t m_basebandSampleRate;
bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed
void applySettings(const BeamSteeringCWModSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force = false);
static void validateFilterChainHash(BeamSteeringCWModSettings& settings);
void calculateFrequencyOffset();
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const BeamSteeringCWModSettings& settings, bool force);

View File

@ -170,7 +170,7 @@ bool BeamSteeringCWModBaseband::handleMessage(const Message& cmd)
MsgConfigureBeamSteeringCWModBaseband& cfg = (MsgConfigureBeamSteeringCWModBaseband&) cmd;
qDebug() << "BeamSteeringCWModBaseband::handleMessage: MsgConfigureBeamSteeringCWModBaseband";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -200,9 +200,9 @@ bool BeamSteeringCWModBaseband::handleMessage(const Message& cmd)
}
}
void BeamSteeringCWModBaseband::applySettings(const BeamSteeringCWModSettings& settings, bool force)
void BeamSteeringCWModBaseband::applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force)
{
if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || (m_settings.m_log2Interp != settings.m_log2Interp) || force)
if ((settingsKeys.contains("filterChainHash") && (m_settings.m_filterChainHash != settings.m_filterChainHash)) || (settingsKeys.contains("log2Interp") && (m_settings.m_log2Interp != settings.m_log2Interp)) || force)
{
for (int i = 0; i < 2; i++)
{
@ -211,14 +211,14 @@ void BeamSteeringCWModBaseband::applySettings(const BeamSteeringCWModSettings& s
}
}
if ((m_settings.m_steerDegrees != settings.m_steerDegrees) || force)
if ((settingsKeys.contains("steerDegrees") && (m_settings.m_steerDegrees != settings.m_steerDegrees)) || force)
{
float steeringAngle = settings.m_steerDegrees / 180.0f;
steeringAngle = steeringAngle < -M_PI ? -M_PI : steeringAngle > M_PI ? M_PI : steeringAngle;
m_streamSources[1].setPhase(M_PI*cos(steeringAngle));
}
if ((m_settings.m_channelOutput != settings.m_channelOutput) || force)
if ((settingsKeys.contains("channelOutput") && (m_settings.m_channelOutput != settings.m_channelOutput)) || force)
{
if (settings.m_channelOutput == 0)
{
@ -242,5 +242,9 @@ void BeamSteeringCWModBaseband::applySettings(const BeamSteeringCWModSettings& s
}
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}

View File

@ -39,20 +39,23 @@ public:
public:
const BeamSteeringCWModSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureBeamSteeringCWModBaseband* create(const BeamSteeringCWModSettings& settings, bool force)
static MsgConfigureBeamSteeringCWModBaseband* create(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force)
{
return new MsgConfigureBeamSteeringCWModBaseband(settings, force);
return new MsgConfigureBeamSteeringCWModBaseband(settingsKeys, settings, force);
}
private:
BeamSteeringCWModSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureBeamSteeringCWModBaseband(const BeamSteeringCWModSettings& settings, bool force) :
MsgConfigureBeamSteeringCWModBaseband(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -85,7 +88,7 @@ public:
private:
void processFifo(std::vector<SampleVector>& data, unsigned int ibegin, unsigned int iend);
bool handleMessage(const Message& cmd);
void applySettings(const BeamSteeringCWModSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force = false);
BeamSteeringCWModSettings m_settings;
SampleMOFifo m_sampleMOFifo;

View File

@ -38,7 +38,7 @@ void BeamSteeringCWModGUI::resetToDefaults()
{
m_settings.resetToDefaults();
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
}
QByteArray BeamSteeringCWModGUI::serialize() const
@ -50,7 +50,7 @@ bool BeamSteeringCWModGUI::deserialize(const QByteArray& data)
{
if(m_settings.deserialize(data)) {
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
return true;
} else {
resetToDefaults();
@ -128,7 +128,7 @@ BeamSteeringCWModGUI::BeamSteeringCWModGUI(PluginAPI* pluginAPI, DeviceUISet *de
displaySettings();
makeUIConnections();
displayRateAndShift();
applySettings(true);
applySettings(QStringList(), true);
m_resizer.enableChildMouseTracking();
}
@ -142,13 +142,13 @@ void BeamSteeringCWModGUI::blockApplySettings(bool block)
m_doApplySettings = !block;
}
void BeamSteeringCWModGUI::applySettings(bool force)
void BeamSteeringCWModGUI::applySettings(const QStringList& settingsKeys, bool force)
{
if (m_doApplySettings)
{
setTitleColor(m_channelMarker.getColor());
BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod* message = BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod::create(m_settings, force);
BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod* message = BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod::create(settingsKeys, m_settings, force);
m_bsCWSource->getInputMessageQueue()->push(message);
}
}
@ -216,7 +216,7 @@ void BeamSteeringCWModGUI::onWidgetRolled(const QWidget* widget, bool rollDown)
(void) rollDown;
getRollupContents()->saveState(m_rollupState);
applySettings();
applySettings(QStringList());
}
void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p)
@ -247,7 +247,15 @@ void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p)
setTitle(m_channelMarker.getTitle());
setTitleColor(m_settings.m_rgbColor);
applySettings();
applySettings(QStringList({
"rgbColor",
"title",
"useReverseAPI",
"reverseAPIAddress",
"reverseAPIPort",
"reverseAPIDeviceIndex",
"reverseAPIChannelIndex"
}));
}
resetContextMenuType();
@ -256,7 +264,7 @@ void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p)
void BeamSteeringCWModGUI::on_channelOutput_currentIndexChanged(int index)
{
m_settings.m_channelOutput = index;
applySettings();
applySettings(QStringList("channelOutput"));
}
void BeamSteeringCWModGUI::on_interpolationFactor_currentIndexChanged(int index)
@ -275,7 +283,7 @@ void BeamSteeringCWModGUI::on_steeringDegrees_valueChanged(int value)
{
m_settings.m_steerDegrees = value;
ui->steeringDegreesText->setText(tr("%1").arg(m_settings.m_steerDegrees));
applySettings();
applySettings(QStringList("steerDegrees"));
}
void BeamSteeringCWModGUI::applyInterpolation()
@ -301,7 +309,7 @@ void BeamSteeringCWModGUI::applyPosition()
displayRateAndShift();
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList({"filterChainHash", "log2Interp"}));
}
void BeamSteeringCWModGUI::tick()

View File

@ -84,7 +84,7 @@ private:
~BeamSteeringCWModGUI() final;
void blockApplySettings(bool block);
void applySettings(bool force = false);
void applySettings(const QStringList& settingsKeys, bool force = false);
void displaySettings();
void displayRateAndShift();
bool handleMessage(const Message& message);

View File

@ -134,7 +134,95 @@ bool BeamSteeringCWModSettings::deserialize(const QByteArray& data)
}
}
void BeamSteeringCWModSettings::applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings)
{
if (settingsKeys.contains("steerDegrees")) {
m_steerDegrees = settings.m_steerDegrees;
}
if (settingsKeys.contains("rgbColor")) {
m_rgbColor = settings.m_rgbColor;
}
if (settingsKeys.contains("title")) {
m_title = settings.m_title;
}
if (settingsKeys.contains("log2Interp")) {
m_log2Interp = settings.m_log2Interp;
}
if (settingsKeys.contains("filterChainHash")) {
m_filterChainHash = settings.m_filterChainHash;
}
if (settingsKeys.contains("channelOutput")) {
m_channelOutput = settings.m_channelOutput;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress")) {
m_reverseAPIAddress = settings.m_reverseAPIAddress;
}
if (settingsKeys.contains("reverseAPIPort")) {
m_reverseAPIPort = settings.m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex")) {
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex")) {
m_workspaceIndex = settings.m_workspaceIndex;
}
if (settingsKeys.contains("geometryBytes")) {
m_geometryBytes = settings.m_geometryBytes;
}
if (settingsKeys.contains("hidden")) {
m_hidden = settings.m_hidden;
}
}
QString BeamSteeringCWModSettings::getDebugString(const QStringList& settingsKeys, bool force) const
{
std::ostringstream ostr;
if (settingsKeys.contains("steerDegrees") || force) {
ostr << " m_steerDegrees: " << m_steerDegrees;
}
if (settingsKeys.contains("rgbColor") || force) {
ostr << " m_rgbColor: " << m_rgbColor;
}
if (settingsKeys.contains("title") || force) {
ostr << " m_title: " << m_title.toStdString();
}
if (settingsKeys.contains("log2Interp") || force) {
ostr << " m_log2Interp: " << m_log2Interp;
}
if (settingsKeys.contains("filterChainHash") || force) {
ostr << " m_filterChainHash: " << m_filterChainHash;
}
if (settingsKeys.contains("channelOutput") || force) {
ostr << " m_channelOutput: " << m_channelOutput;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress") || force) {
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
}
if (settingsKeys.contains("reverseAPIPort") || force) {
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex") || force) {
ostr << " m_workspaceIndex: " << m_workspaceIndex;
}
if (settingsKeys.contains("hidden") || force) {
ostr << " m_hidden: " << m_hidden;
}
return QString(ostr.str().c_str());
}

View File

@ -52,6 +52,8 @@ struct BeamSteeringCWModSettings
void setRollupState(Serializable *RollupState) { m_rollupState = RollupState; }
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
void applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings);
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
};
#endif /* INCLUDE_BEAMSTEERINGCWMODSETTINGS_H_ */

View File

@ -156,82 +156,41 @@ void DOA2::pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned
(void) sourceIndex;
}
void DOA2::applySettings(const DOA2Settings& settings, bool force)
void DOA2::applySettings(const QStringList& settingsKeys, const DOA2Settings& settings, bool force)
{
qDebug() << "DOA2::applySettings: "
<< "m_correlationType: " << settings.m_correlationType
<< "m_filterChainHash: " << settings.m_filterChainHash
<< "m_log2Decim: " << settings.m_log2Decim
<< "m_phase: " << settings.m_phase
<< "m_antennaAz:" << settings.m_antennaAz
<< "m_basebandDistance: " << settings.m_basebandDistance
<< "m_squelchdB: " << settings.m_squelchdB
<< "m_fftAveragingIndex: "<< settings.m_fftAveragingIndex
<< "m_useReverseAPI: " << settings.m_useReverseAPI
<< "m_reverseAPIAddress: " << settings.m_reverseAPIAddress
<< "m_reverseAPIPort: " << settings.m_reverseAPIPort
<< "m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
<< "m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
<< "m_title: " << settings.m_title;
qDebug() << "DOA2::applySettings: " << settings.getDebugString(settingsKeys, force);
QList<QString> reverseAPIKeys;
if ((m_settings.m_correlationType != settings.m_correlationType) || force) {
reverseAPIKeys.append("correlationType");
}
if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) {
reverseAPIKeys.append("filterChainHash");
}
if ((m_settings.m_log2Decim != settings.m_log2Decim) || force) {
reverseAPIKeys.append("log2Decim");
}
if ((m_settings.m_phase != settings.m_phase) || force) {
reverseAPIKeys.append("phase");
}
if ((m_settings.m_title != settings.m_title) || force) {
reverseAPIKeys.append("title");
}
if ((m_settings.m_antennaAz != settings.m_antennaAz) || force) {
reverseAPIKeys.append("antennaAz");
}
if ((m_settings.m_basebandDistance != settings.m_basebandDistance) || force) {
reverseAPIKeys.append("basebandDistance");
}
if ((m_settings.m_squelchdB != settings.m_squelchdB) || force)
if ((settingsKeys.contains("squelchdB") && m_settings.m_squelchdB != settings.m_squelchdB) || force)
{
reverseAPIKeys.append("squelchdB");
if (m_running) {
m_basebandSink->setMagThreshold((float) CalcDb::powerFromdB(settings.m_squelchdB));
}
}
if ((m_settings.m_fftAveragingIndex != settings.m_fftAveragingIndex) || force)
if ((settingsKeys.contains("fftAveragingIndex") && m_settings.m_fftAveragingIndex != settings.m_fftAveragingIndex) || force)
{
reverseAPIKeys.append("m_fftAveragingIndex");
if (m_running) {
m_basebandSink->setFFTAveraging(DOA2Settings::getAveragingValue(settings.m_fftAveragingIndex));
}
}
if (m_running && ((m_settings.m_log2Decim != settings.m_log2Decim)
|| (m_settings.m_filterChainHash != settings.m_filterChainHash) || force))
if (m_running && ((settingsKeys.contains("log2Decim") && m_settings.m_log2Decim != settings.m_log2Decim)
|| (settingsKeys.contains("filterChainHash") && m_settings.m_filterChainHash != settings.m_filterChainHash) || force))
{
DOA2Baseband::MsgConfigureChannelizer *msg = DOA2Baseband::MsgConfigureChannelizer::create(
settings.m_log2Decim, settings.m_filterChainHash);
m_basebandSink->getInputMessageQueue()->push(msg);
}
if (m_running && ((m_settings.m_correlationType != settings.m_correlationType) || force))
if (m_running && ((settingsKeys.contains("correlationType") && m_settings.m_correlationType != settings.m_correlationType) || force))
{
DOA2Baseband::MsgConfigureCorrelation *msg = DOA2Baseband::MsgConfigureCorrelation::create(
settings.m_correlationType);
m_basebandSink->getInputMessageQueue()->push(msg);
}
if (m_running && ((m_settings.m_phase != settings.m_phase) || force)) {
if (m_running && ((settingsKeys.contains("phase") && m_settings.m_phase != settings.m_phase) || force)) {
m_basebandSink->setPhase(settings.m_phase);
}
@ -239,7 +198,7 @@ void DOA2::applySettings(const DOA2Settings& settings, bool force)
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (!pipes.empty()) {
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
sendChannelSettings(pipes, settingsKeys, settings, force);
}
m_settings = settings;
@ -264,7 +223,7 @@ bool DOA2::handleMessage(const Message& cmd)
{
auto& cfg = (const MsgConfigureDOA2&) cmd;
qDebug() << "DOA2::handleMessage: MsgConfigureDOA2";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
else if (DSPMIMOSignalNotification::match(cmd))
@ -320,14 +279,14 @@ bool DOA2::deserialize(const QByteArray& data)
(void) data;
if (m_settings.deserialize(data))
{
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(m_settings, true);
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return true;
}
else
{
m_settings.resetToDefaults();
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(m_settings, true);
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return false;
}
@ -400,12 +359,12 @@ int DOA2::webapiSettingsPutPatch(
DOA2Settings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(settings, force);
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(channelSettingsKeys, settings, force);
m_inputMessageQueue.push(msg);
if (getMessageQueueToGUI()) // forward to GUI if any
{
MsgConfigureDOA2 *msgToGUI = MsgConfigureDOA2::create(settings, force);
MsgConfigureDOA2 *msgToGUI = MsgConfigureDOA2::create(channelSettingsKeys, settings, force);
getMessageQueueToGUI()->push(msgToGUI);
}

View File

@ -45,20 +45,23 @@ public:
public:
const DOA2Settings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureDOA2* create(const DOA2Settings& settings, bool force)
static MsgConfigureDOA2* create(const QStringList& settingsKeys, const DOA2Settings& settings, bool force)
{
return new MsgConfigureDOA2(settings, force);
return new MsgConfigureDOA2(settingsKeys, settings, force);
}
private:
DOA2Settings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureDOA2(const DOA2Settings& settings, bool force) :
MsgConfigureDOA2(const QStringList& settingsKeys, const DOA2Settings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -175,7 +178,7 @@ private:
qint64 m_deviceCenterFrequency;
bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed
void applySettings(const DOA2Settings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const DOA2Settings& settings, bool force = false);
static void validateFilterChainHash(DOA2Settings& settings);
void calculateFrequencyOffset();
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const;

View File

@ -41,7 +41,7 @@ void DOA2GUI::resetToDefaults()
{
m_settings.resetToDefaults();
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
}
QByteArray DOA2GUI::serialize() const
@ -54,7 +54,7 @@ bool DOA2GUI::deserialize(const QByteArray& data)
if (m_settings.deserialize(data))
{
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
return true;
}
else
@ -150,7 +150,7 @@ DOA2GUI::DOA2GUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *ch
displaySettings();
makeUIConnections();
displayRateAndShift();
applySettings(true);
applySettings(QStringList(), true);
connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
@ -170,13 +170,13 @@ void DOA2GUI::blockApplySettings(bool block)
m_doApplySettings = !block;
}
void DOA2GUI::applySettings(bool force)
void DOA2GUI::applySettings(const QStringList& settingsKeys, bool force)
{
if (m_doApplySettings)
{
setTitleColor(m_channelMarker.getColor());
DOA2::MsgConfigureDOA2* message = DOA2::MsgConfigureDOA2::create(m_settings, force);
DOA2::MsgConfigureDOA2* message = DOA2::MsgConfigureDOA2::create(settingsKeys, m_settings, force);
m_doa2->getInputMessageQueue()->push(message);
}
}
@ -284,7 +284,7 @@ void DOA2GUI::onWidgetRolled(const QWidget* widget, bool rollDown)
(void) rollDown;
getRollupContents()->saveState(m_rollupState);
applySettings();
applySettings(QStringList());
}
void DOA2GUI::onMenuDialogCalled(const QPoint &p)
@ -315,7 +315,8 @@ void DOA2GUI::onMenuDialogCalled(const QPoint &p)
setTitle(m_channelMarker.getTitle());
setTitleColor(m_settings.m_rgbColor);
applySettings();
applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress",
"reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex"}));
}
resetContextMenuType();
@ -338,14 +339,14 @@ void DOA2GUI::on_phaseCorrection_valueChanged(int value)
{
m_settings.m_phase = value;
ui->phaseCorrectionText->setText(tr("%1").arg(value));
applySettings();
applySettings(QStringList({"phase"}));
}
void DOA2GUI::on_correlationType_currentIndexChanged(int index)
{
m_settings.m_correlationType = (DOA2Settings::CorrelationType) index;
updateScopeFScale();
applySettings();
applySettings(QStringList({"correlationType"}));
}
void DOA2GUI::on_antAz_valueChanged(int value)
@ -353,28 +354,28 @@ void DOA2GUI::on_antAz_valueChanged(int value)
m_settings.m_antennaAz = value;
ui->compass->setAzAnt(value);
updateDOA();
applySettings();
applySettings(QStringList({"antennaAz"}));
}
void DOA2GUI::on_baselineDistance_valueChanged(int value)
{
m_settings.m_basebandDistance = value < 1 ? 1 : value;
updateDOA();
applySettings();
applySettings(QStringList({"basebandDistance"}));
}
void DOA2GUI::on_squelch_valueChanged(int value)
{
m_settings.m_squelchdB = value;
ui->squelchText->setText(tr("%1").arg(m_settings.m_squelchdB, 3));
applySettings();
applySettings(QStringList({"squelchdB"}));
}
void DOA2GUI::on_fftAveraging_currentIndexChanged(int index)
{
qDebug("DOA2GUI::on_averaging_currentIndexChanged: %d", index);
m_settings.m_fftAveragingIndex = index;
applySettings();
applySettings(QStringList({"fftAveragingIndex"}));
setFFTAveragingTooltip();
}
@ -417,7 +418,7 @@ void DOA2GUI::applyPosition()
displayRateAndShift();
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList({"filterChainHash", "log2Decim"}));
}
void DOA2GUI::tick()

View File

@ -84,7 +84,7 @@ private:
~DOA2GUI() final;
void blockApplySettings(bool block);
void applySettings(bool force = false);
void applySettings(const QStringList& settingsKeys, bool force = false);
void applyDecimation();
void applyPosition();
void displaySettings();

View File

@ -168,6 +168,123 @@ bool DOA2Settings::deserialize(const QByteArray& data)
}
}
void DOA2Settings::applySettings(const QStringList& settingsKeys, const DOA2Settings& settings)
{
if (settingsKeys.contains("correlationType")) {
m_correlationType = settings.m_correlationType;
}
if (settingsKeys.contains("rgbColor")) {
m_rgbColor = settings.m_rgbColor;
}
if (settingsKeys.contains("title")) {
m_title = settings.m_title;
}
if (settingsKeys.contains("log2Decim")) {
m_log2Decim = settings.m_log2Decim;
}
if (settingsKeys.contains("filterChainHash")) {
m_filterChainHash = settings.m_filterChainHash;
}
if (settingsKeys.contains("phase")) {
m_phase = settings.m_phase;
}
if (settingsKeys.contains("antennaAz")) {
m_antennaAz = settings.m_antennaAz;
}
if (settingsKeys.contains("basebandDistance")) {
m_basebandDistance = settings.m_basebandDistance;
}
if (settingsKeys.contains("squelchdB")) {
m_squelchdB = settings.m_squelchdB;
}
if (settingsKeys.contains("fftAveragingIndex")) {
m_fftAveragingIndex = settings.m_fftAveragingIndex;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress")) {
m_reverseAPIAddress = settings.m_reverseAPIAddress;
}
if (settingsKeys.contains("reverseAPIPort")) {
m_reverseAPIPort = settings.m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex")) {
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex")) {
m_workspaceIndex = settings.m_workspaceIndex;
}
if (settingsKeys.contains("geometryBytes")) {
m_geometryBytes = settings.m_geometryBytes;
}
if (settingsKeys.contains("hidden")) {
m_hidden = settings.m_hidden;
}
}
QString DOA2Settings::getDebugString(const QStringList& settingsKeys, bool force) const
{
std::ostringstream ostr;
if (settingsKeys.contains("correlationType") || force) {
ostr << " m_correlationType: " << (int)m_correlationType;
}
if (settingsKeys.contains("rgbColor") || force) {
ostr << " m_rgbColor: " << m_rgbColor;
}
if (settingsKeys.contains("title") || force) {
ostr << " m_title: " << m_title.toStdString();
}
if (settingsKeys.contains("log2Decim") || force) {
ostr << " m_log2Decim: " << m_log2Decim;
}
if (settingsKeys.contains("filterChainHash") || force) {
ostr << " m_filterChainHash: " << m_filterChainHash;
}
if (settingsKeys.contains("phase") || force) {
ostr << " m_phase: " << m_phase;
}
if (settingsKeys.contains("antennaAz") || force) {
ostr << " m_antennaAz: " << m_antennaAz;
}
if (settingsKeys.contains("basebandDistance") || force) {
ostr << " m_basebandDistance: " << m_basebandDistance;
}
if (settingsKeys.contains("squelchdB") || force) {
ostr << " m_squelchdB: " << m_squelchdB;
}
if (settingsKeys.contains("fftAveragingIndex") || force) {
ostr << " m_fftAveragingIndex: " << m_fftAveragingIndex;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress") || force) {
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
}
if (settingsKeys.contains("reverseAPIPort") || force) {
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex") || force) {
ostr << " m_workspaceIndex: " << m_workspaceIndex;
}
if (settingsKeys.contains("hidden") || force) {
ostr << " m_hidden: " << m_hidden;
}
return QString(ostr.str().c_str());
}
int DOA2Settings::getAveragingValue(int averagingIndex)
{
if (averagingIndex <= 0) {

View File

@ -65,6 +65,8 @@ struct DOA2Settings
void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; }
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
void applySettings(const QStringList& settingsKeys, const DOA2Settings& settings);
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
static int getAveragingValue(int averagingIndex);
static int getAveragingIndex(int averagingValue);
static const int m_averagingMaxExponent = 5; //!< Max 1M (10 * 10^5)

View File

@ -183,7 +183,7 @@ void Interferometer::pull(SampleVector::iterator& begin, unsigned int nbSamples,
void Interferometer::applySettings(const InterferometerSettings& settings, const QList<QString>& settingsKeys, bool force)
{
qDebug() << "Interferometer::applySettings:" << settings.getDebugString(settingsKeys, force) << "force: " << force;
qDebug() << "Interferometer::applySettings:" << settings.getDebugString(settingsKeys, force);
if (m_running && (settingsKeys.contains("log2Decim")
|| settingsKeys.contains("filterChainHash") || force))

View File

@ -56,7 +56,7 @@ ChannelAnalyzer::ChannelAnalyzer(DeviceAPI *deviceAPI) :
m_basebandSink = new ChannelAnalyzerBaseband();
m_basebandSink->moveToThread(&m_thread);
applySettings(m_settings, true);
applySettings(m_settings, QStringList(), true);
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
@ -144,7 +144,7 @@ void ChannelAnalyzer::start()
m_basebandSink->getInputMessageQueue()->push(dspMsg);
ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband *msg =
ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(m_settings, true);
ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(m_settings, QStringList(), true);
m_basebandSink->getInputMessageQueue()->push(msg);
if (getMessageQueueToGUI())
@ -169,7 +169,7 @@ bool ChannelAnalyzer::handleMessage(const Message& cmd)
qDebug("ChannelAnalyzer::handleMessage: MsgConfigureChannelAnalyzer");
MsgConfigureChannelAnalyzer& cfg = (MsgConfigureChannelAnalyzer&) cmd;
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
return true;
}
@ -200,98 +200,14 @@ void ChannelAnalyzer::setCenterFrequency(qint64 frequency)
{
ChannelAnalyzerSettings settings = m_settings;
settings.m_inputFrequencyOffset = frequency;
applySettings(settings);
applySettings(settings, QStringList({"inputFrequencyOffset"}), false);
}
void ChannelAnalyzer::applySettings(const ChannelAnalyzerSettings& settings, bool force)
void ChannelAnalyzer::applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force)
{
qDebug() << "ChannelAnalyzer::applySettings:"
<< " m_rationalDownSample: " << settings.m_rationalDownSample
<< " m_rationalDownSamplerRate: " << settings.m_rationalDownSamplerRate
<< " m_rcc: " << settings.m_rrc
<< " m_rrcRolloff: " << settings.m_rrcRolloff / 100.0
<< " m_bandwidth: " << settings.m_bandwidth
<< " m_lowCutoff: " << settings.m_lowCutoff
<< " m_log2Decim: " << settings.m_log2Decim
<< " m_ssb: " << settings.m_ssb
<< " m_pll: " << settings.m_pll
<< " m_fll: " << settings.m_fll
<< " m_costasLoop: " << settings.m_costasLoop
<< " m_pllPskOrder: " << settings.m_pllPskOrder
<< " m_pllBandwidth: " << settings.m_pllBandwidth
<< " m_pllDampingFactor: " << settings.m_pllDampingFactor
<< " m_pllLoopGain: " << settings.m_pllLoopGain
<< " m_inputType: " << (int) settings.m_inputType
<< " m_useReverseAPI:" << settings.m_useReverseAPI
<< " m_reverseAPIAddress:" << settings.m_reverseAPIAddress
<< " m_reverseAPIPort:" << settings.m_reverseAPIPort
<< " m_reverseAPIDeviceIndex:" << settings.m_reverseAPIDeviceIndex
<< " m_reverseAPIChannelIndex:" << settings.m_reverseAPIChannelIndex;
qDebug() << "ChannelAnalyzer::applySettings:" << settings.getDebugString(settingsKeys, force);
QList<QString> reverseAPIKeys;
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) {
reverseAPIKeys.append("inputFrequencyOffset");
}
if ((settings.m_rationalDownSample != m_settings.m_rationalDownSample) || force) {
reverseAPIKeys.append("rationalDownSample");
}
if ((settings.m_rationalDownSamplerRate != m_settings.m_rationalDownSamplerRate) || force) {
reverseAPIKeys.append("rationalDownSamplerRate");
}
if ((settings.m_bandwidth != m_settings.m_bandwidth) || force) {
reverseAPIKeys.append("bandwidth");
}
if ((settings.m_lowCutoff != m_settings.m_lowCutoff) || force) {
reverseAPIKeys.append("lowCutoff");
}
if ((settings.m_log2Decim != m_settings.m_log2Decim) || force) {
reverseAPIKeys.append("log2Decim");
}
if ((settings.m_lowCutoff != m_settings.m_lowCutoff) || force) {
reverseAPIKeys.append("lowCutoff");
}
if ((settings.m_ssb != m_settings.m_ssb) || force) {
reverseAPIKeys.append("ssb");
}
if ((settings.m_pll != m_settings.m_pll) || force) {
reverseAPIKeys.append("pll");
}
if ((settings.m_fll != m_settings.m_fll) || force) {
reverseAPIKeys.append("fll");
}
if ((settings.m_costasLoop != m_settings.m_costasLoop) || force) {
reverseAPIKeys.append("costasLoop");
}
if ((settings.m_rrc != m_settings.m_rrc) || force) {
reverseAPIKeys.append("rrc");
}
if ((settings.m_rrcRolloff != m_settings.m_rrcRolloff) || force) {
reverseAPIKeys.append("rrcRolloff");
}
if ((settings.m_pllPskOrder != m_settings.m_pllPskOrder) || force) {
reverseAPIKeys.append("pllPskOrder");
}
if ((settings.m_pllBandwidth != m_settings.m_pllBandwidth) || force) {
reverseAPIKeys.append("pllBandwidth");
}
if ((settings.m_pllDampingFactor != m_settings.m_pllDampingFactor) || force) {
reverseAPIKeys.append("pllDampingFactor");
}
if ((settings.m_pllLoopGain != m_settings.m_pllLoopGain) || force) {
reverseAPIKeys.append("pllLoopGain");
}
if ((settings.m_inputType != m_settings.m_inputType) || force) {
reverseAPIKeys.append("inputType");
}
if ((settings.m_rgbColor != m_settings.m_rgbColor) || force) {
reverseAPIKeys.append("rgbColor");
}
if ((settings.m_title != m_settings.m_title) || force) {
reverseAPIKeys.append("title");
}
if (m_settings.m_streamIndex != settings.m_streamIndex)
if (settingsKeys.contains("streamIndex"))
{
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
{
@ -302,32 +218,34 @@ void ChannelAnalyzer::applySettings(const ChannelAnalyzerSettings& settings, boo
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
emit streamIndexChanged(settings.m_streamIndex);
}
reverseAPIKeys.append("streamIndex");
}
ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband *msg
= ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(settings, force);
= ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(settings, settingsKeys, force);
m_basebandSink->getInputMessageQueue()->push(msg);
if (settings.m_useReverseAPI)
{
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
bool fullUpdate = settingsKeys.contains("useReverseAPI")
|| settingsKeys.contains("reverseAPIAddress")
|| settingsKeys.contains("reverseAPIPort")
|| settingsKeys.contains("reverseAPIDeviceIndex")
|| settingsKeys.contains("reverseAPIChannelIndex");
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
QList<ObjectPipe*> pipes;
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (pipes.size() > 0) {
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
sendChannelSettings(pipes, settingsKeys, settings, force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int ChannelAnalyzer::webapiSettingsGet(
@ -360,13 +278,13 @@ int ChannelAnalyzer::webapiSettingsPutPatch(
ChannelAnalyzerSettings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureChannelAnalyzer *msg = MsgConfigureChannelAnalyzer::create(settings, force);
MsgConfigureChannelAnalyzer *msg = MsgConfigureChannelAnalyzer::create(settings, channelSettingsKeys, force);
m_inputMessageQueue.push(msg);
qDebug("ChannelAnalyzer::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureChannelAnalyzer *msgToGUI = MsgConfigureChannelAnalyzer::create(settings, force);
MsgConfigureChannelAnalyzer *msgToGUI = MsgConfigureChannelAnalyzer::create(settings, channelSettingsKeys, force);
m_guiMessageQueue->push(msgToGUI);
}
@ -570,7 +488,7 @@ void ChannelAnalyzer::webapiFormatChannelSettings(
}
void ChannelAnalyzer::webapiReverseSendSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
const ChannelAnalyzerSettings& settings,
bool force
)
@ -600,7 +518,7 @@ void ChannelAnalyzer::webapiReverseSendSettings(
void ChannelAnalyzer::sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
const ChannelAnalyzerSettings& settings,
bool force)
{
@ -624,7 +542,7 @@ void ChannelAnalyzer::sendChannelSettings(
}
void ChannelAnalyzer::webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const ChannelAnalyzerSettings& settings,
bool force

View File

@ -47,19 +47,22 @@ public:
public:
const ChannelAnalyzerSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureChannelAnalyzer* create(const ChannelAnalyzerSettings& settings, bool force) {
return new MsgConfigureChannelAnalyzer(settings, force);
static MsgConfigureChannelAnalyzer* create(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) {
return new MsgConfigureChannelAnalyzer(settings, settingsKeys, force);
}
private:
ChannelAnalyzerSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureChannelAnalyzer(const ChannelAnalyzerSettings& settings, bool force) :
MsgConfigureChannelAnalyzer(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -149,16 +152,16 @@ private:
QNetworkRequest m_networkRequest;
virtual bool handleMessage(const Message& cmd);
void applySettings(const ChannelAnalyzerSettings& settings, bool force = false);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const ChannelAnalyzerSettings& settings, bool force);
void applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force = false);
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const ChannelAnalyzerSettings& settings, bool force);
void sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
const ChannelAnalyzerSettings& settings,
bool force
);
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const ChannelAnalyzerSettings& settings,
bool force

View File

@ -125,7 +125,7 @@ bool ChannelAnalyzerBaseband::handleMessage(const Message& cmd)
MsgConfigureChannelAnalyzerBaseband& cfg = (MsgConfigureChannelAnalyzerBaseband&) cmd;
qDebug() << "ChannelAnalyzerBaseband::handleMessage: MsgConfigureChannelAnalyzerBaseband";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
return true;
}
@ -148,7 +148,7 @@ bool ChannelAnalyzerBaseband::handleMessage(const Message& cmd)
}
}
void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& settings, bool force)
void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force)
{
if ((settings.m_log2Decim != m_settings.m_log2Decim)
|| (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)
@ -160,7 +160,7 @@ void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& setti
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), desiredSampleRate, m_channelizer->getChannelFrequencyOffset());
}
m_sink.applySettings(settings, force);
m_sink.applySettings(settings, settingsKeys, force);
m_settings = settings;
}

View File

@ -39,20 +39,23 @@ public:
public:
const ChannelAnalyzerSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureChannelAnalyzerBaseband* create(const ChannelAnalyzerSettings& settings, bool force)
static MsgConfigureChannelAnalyzerBaseband* create(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force)
{
return new MsgConfigureChannelAnalyzerBaseband(settings, force);
return new MsgConfigureChannelAnalyzerBaseband(settings, settingsKeys, force);
}
private:
ChannelAnalyzerSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureChannelAnalyzerBaseband(const ChannelAnalyzerSettings& settings, bool force) :
MsgConfigureChannelAnalyzerBaseband(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -85,7 +88,7 @@ private:
QRecursiveMutex m_mutex;
bool handleMessage(const Message& cmd);
void applySettings(const ChannelAnalyzerSettings& settings, bool force = false);
void applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force = false);
private slots:
void handleInputMessages();

View File

@ -226,14 +226,14 @@ bool ChannelAnalyzerGUI::deserialize(const QByteArray& data)
if (m_settings.deserialize(data))
{
displaySettings();
applySettings(true); // will have true
applySettings(QStringList(), true); // will have true
return true;
}
else
{
m_settings.resetToDefaults();
displaySettings();
applySettings(true); // will have true
applySettings(QStringList(), true); // will have true
return false;
}
}
@ -291,7 +291,7 @@ void ChannelAnalyzerGUI::channelMarkerChangedByCursor()
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList({"inputFrequencyOffset"}));
}
void ChannelAnalyzerGUI::channelMarkerHighlightedByCursor()
@ -324,7 +324,7 @@ void ChannelAnalyzerGUI::on_rationalDownSamplerRate_changed(quint64 value)
{
m_settings.m_rationalDownSamplerRate = value;
setSinkSampleRate();
applySettings();
applySettings(QStringList({"rationalDownSamplerRate"}));
}
void ChannelAnalyzerGUI::on_pll_toggled(bool checked)
@ -335,7 +335,7 @@ void ChannelAnalyzerGUI::on_pll_toggled(bool checked)
m_settings.m_pll = checked;
setPLLVisibility();
applySettings();
applySettings(QStringList({"pll"}));
}
void ChannelAnalyzerGUI::on_pllType_currentIndexChanged(int index)
@ -343,7 +343,7 @@ void ChannelAnalyzerGUI::on_pllType_currentIndexChanged(int index)
m_settings.m_fll = (index == 1);
m_settings.m_costasLoop = (index == 2);
setPLLVisibility();
applySettings();
applySettings(QStringList({"fll", "costasLoop"}));
}
void ChannelAnalyzerGUI::on_pllPskOrder_currentIndexChanged(int index)
@ -352,7 +352,7 @@ void ChannelAnalyzerGUI::on_pllPskOrder_currentIndexChanged(int index)
m_settings.m_pllPskOrder = (1<<(index+1));
else
m_settings.m_pllPskOrder = (1<<index);
applySettings();
applySettings(QStringList({"pllPskOrder"}));
}
void ChannelAnalyzerGUI::on_pllBandwidth_valueChanged(int value)
@ -360,7 +360,7 @@ void ChannelAnalyzerGUI::on_pllBandwidth_valueChanged(int value)
m_settings.m_pllBandwidth = value/1000.0;
QString bandwidthStr = QString::number(m_settings.m_pllBandwidth, 'f', 3);
ui->pllBandwidthText->setText(bandwidthStr);
applySettings();
applySettings(QStringList({"pllBandwidth"}));
}
void ChannelAnalyzerGUI::on_pllDampingFactor_valueChanged(int value)
@ -368,7 +368,7 @@ void ChannelAnalyzerGUI::on_pllDampingFactor_valueChanged(int value)
m_settings.m_pllDampingFactor = value/10.0;
QString factorStr = QString::number(m_settings.m_pllDampingFactor, 'f', 1);
ui->pllDampingFactorText->setText(factorStr);
applySettings();
applySettings(QStringList({"pllDampingFactor"}));
}
void ChannelAnalyzerGUI::on_pllLoopGain_valueChanged(int value)
@ -376,14 +376,14 @@ void ChannelAnalyzerGUI::on_pllLoopGain_valueChanged(int value)
m_settings.m_pllLoopGain = value;
QString gainStr = QString::number(m_settings.m_pllLoopGain, 'f', 0);
ui->pllLoopGainText->setText(gainStr);
applySettings();
applySettings(QStringList({"pllLoopGain"}));
}
void ChannelAnalyzerGUI::on_useRationalDownsampler_toggled(bool checked)
{
m_settings.m_rationalDownSample = checked;
setSinkSampleRate();
applySettings();
applySettings(QStringList({"rationalDownSample"}));
}
void ChannelAnalyzerGUI::on_signalSelect_currentIndexChanged(int index)
@ -397,7 +397,7 @@ void ChannelAnalyzerGUI::on_signalSelect_currentIndexChanged(int index)
}
ui->scopeGUI->traceLengthChange();
applySettings();
applySettings(QStringList({"inputType"}));
}
void ChannelAnalyzerGUI::on_deltaFrequency_changed(qint64 value)
@ -405,13 +405,13 @@ void ChannelAnalyzerGUI::on_deltaFrequency_changed(qint64 value)
m_channelMarker.setCenterFrequency(value);
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList({"inputFrequencyOffset"}));
}
void ChannelAnalyzerGUI::on_rrcFilter_toggled(bool checked)
{
m_settings.m_rrc = checked;
applySettings();
applySettings(QStringList({"rrc"}));
}
void ChannelAnalyzerGUI::on_rrcRolloff_valueChanged(int value)
@ -419,7 +419,7 @@ void ChannelAnalyzerGUI::on_rrcRolloff_valueChanged(int value)
m_settings.m_rrcRolloff = value;
QString rolloffStr = QString::number(value/100.0, 'f', 2);
ui->rrcRolloffText->setText(rolloffStr);
applySettings();
applySettings(QStringList({"rrcRolloff"}));
}
void ChannelAnalyzerGUI::on_BW_valueChanged(int value)
@ -428,7 +428,7 @@ void ChannelAnalyzerGUI::on_BW_valueChanged(int value)
setFiltersUIBoundaries();
m_settings.m_bandwidth = ui->BW->value() * 100;
m_settings.m_lowCutoff = ui->lowCut->value() * 100;
applySettings();
applySettings(QStringList({"bandwidth", "lowCutoff"}));
}
void ChannelAnalyzerGUI::on_lowCut_valueChanged(int value)
@ -437,7 +437,7 @@ void ChannelAnalyzerGUI::on_lowCut_valueChanged(int value)
setFiltersUIBoundaries();
m_settings.m_bandwidth = ui->BW->value() * 100;
m_settings.m_lowCutoff = ui->lowCut->value() * 100;
applySettings();
applySettings(QStringList({"bandwidth", "lowCutoff"}));
}
void ChannelAnalyzerGUI::on_log2Decim_currentIndexChanged(int index)
@ -448,7 +448,7 @@ void ChannelAnalyzerGUI::on_log2Decim_currentIndexChanged(int index)
m_settings.m_log2Decim = index;
setSinkSampleRate();
applySettings();
applySettings(QStringList({"log2Decim"}));
}
void ChannelAnalyzerGUI::on_ssb_toggled(bool checked)
@ -460,7 +460,7 @@ void ChannelAnalyzerGUI::on_ssb_toggled(bool checked)
ui->BWLabel->setText("BP");
}
setFiltersUIBoundaries();
applySettings();
applySettings(QStringList({"ssb"}));
}
void ChannelAnalyzerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
@ -469,7 +469,7 @@ void ChannelAnalyzerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
(void) rollDown;
getRollupContents()->saveState(m_rollupState);
applySettings();
applySettings(QStringList({"rollupState"}));
}
void ChannelAnalyzerGUI::onMenuDialogCalled(const QPoint& p)
@ -514,7 +514,16 @@ void ChannelAnalyzerGUI::onMenuDialogCalled(const QPoint& p)
updateIndexLabel();
}
applySettings();
applySettings(QStringList({
"rgbColor",
"title",
"useReverseAPI",
"reverseAPIAddress",
"reverseAPIPort",
"reverseAPIDeviceIndex",
"reverseAPIChannelIndex",
"streamIndex"
}));
}
resetContextMenuType();
@ -596,7 +605,7 @@ ChannelAnalyzerGUI::ChannelAnalyzerGUI(PluginAPI* pluginAPI, DeviceUISet *device
displaySettings();
makeUIConnections();
applySettings(true);
applySettings(QStringList(), true); // will have true
DialPopup::addPopupsToChildDials(this);
m_resizer.enableChildMouseTracking();
}
@ -704,12 +713,12 @@ void ChannelAnalyzerGUI::blockApplySettings(bool block)
m_doApplySettings = !block;
}
void ChannelAnalyzerGUI::applySettings(bool force)
void ChannelAnalyzerGUI::applySettings(const QStringList& settingsKeys, bool force)
{
if (m_doApplySettings)
{
ChannelAnalyzer::MsgConfigureChannelAnalyzer* message =
ChannelAnalyzer::MsgConfigureChannelAnalyzer::create( m_settings, force);
ChannelAnalyzer::MsgConfigureChannelAnalyzer::create( m_settings, settingsKeys, force);
m_channelAnalyzer->getInputMessageQueue()->push(message);
}
}

View File

@ -92,7 +92,7 @@ private:
void setFiltersUIBoundaries();
void blockApplySettings(bool block);
void applySettings(bool force = false);
void applySettings(const QStringList& settingsKeys, bool force = false);
void displaySettings();
void displayPLLSettings();
void setPLLVisibility();

View File

@ -196,3 +196,177 @@ bool ChannelAnalyzerSettings::deserialize(const QByteArray& data)
return false;
}
}
void ChannelAnalyzerSettings::applySettings(const QStringList& settingsKeys, const ChannelAnalyzerSettings& settings)
{
if (settingsKeys.contains("inputFrequencyOffset")) {
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
}
if (settingsKeys.contains("rationalDownSample")) {
m_rationalDownSample = settings.m_rationalDownSample;
}
if (settingsKeys.contains("rationalDownSamplerRate")) {
m_rationalDownSamplerRate = settings.m_rationalDownSamplerRate;
}
if (settingsKeys.contains("bandwidth")) {
m_bandwidth = settings.m_bandwidth;
}
if (settingsKeys.contains("lowCutoff")) {
m_lowCutoff = settings.m_lowCutoff;
}
if (settingsKeys.contains("log2Decim")) {
m_log2Decim = settings.m_log2Decim;
}
if (settingsKeys.contains("ssb")) {
m_ssb = settings.m_ssb;
}
if (settingsKeys.contains("pll")) {
m_pll = settings.m_pll;
}
if (settingsKeys.contains("fll")) {
m_fll = settings.m_fll;
}
if (settingsKeys.contains("costasLoop")) {
m_costasLoop = settings.m_costasLoop;
}
if (settingsKeys.contains("rrc")) {
m_rrc = settings.m_rrc;
}
if (settingsKeys.contains("rrcRolloff")) {
m_rrcRolloff = settings.m_rrcRolloff;
}
if (settingsKeys.contains("pllPskOrder")) {
m_pllPskOrder = settings.m_pllPskOrder;
}
if (settingsKeys.contains("pllBandwidth")) {
m_pllBandwidth = settings.m_pllBandwidth;
}
if (settingsKeys.contains("pllDampingFactor")) {
m_pllDampingFactor = settings.m_pllDampingFactor;
}
if (settingsKeys.contains("pllLoopGain")) {
m_pllLoopGain = settings.m_pllLoopGain;
}
if (settingsKeys.contains("inputType")) {
m_inputType = settings.m_inputType;
}
if (settingsKeys.contains("rgbColor")) {
m_rgbColor = settings.m_rgbColor;
}
if (settingsKeys.contains("title")) {
m_title = settings.m_title;
}
if (settingsKeys.contains("streamIndex")) {
m_streamIndex = settings.m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress")) {
m_reverseAPIAddress = settings.m_reverseAPIAddress;
}
if (settingsKeys.contains("reverseAPIPort")) {
m_reverseAPIPort = settings.m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex")) {
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex")) {
m_workspaceIndex = settings.m_workspaceIndex;
}
if (settingsKeys.contains("hidden")) {
m_hidden = settings.m_hidden;
}
}
QString ChannelAnalyzerSettings::getDebugString(const QStringList& settingsKeys, bool force) const
{
std::ostringstream ostr;
if (settingsKeys.contains("inputFrequencyOffset") || force) {
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
}
if (settingsKeys.contains("rationalDownSample") || force) {
ostr << " m_rationalDownSample: " << m_rationalDownSample;
}
if (settingsKeys.contains("rationalDownSamplerRate") || force) {
ostr << " m_rationalDownSamplerRate: " << m_rationalDownSamplerRate;
}
if (settingsKeys.contains("bandwidth") || force) {
ostr << " m_bandwidth: " << m_bandwidth;
}
if (settingsKeys.contains("lowCutoff") || force) {
ostr << " m_lowCutoff: " << m_lowCutoff;
}
if (settingsKeys.contains("log2Decim") || force) {
ostr << " m_log2Decim: " << m_log2Decim;
}
if (settingsKeys.contains("ssb") || force) {
ostr << " m_ssb: " << m_ssb;
}
if (settingsKeys.contains("pll") || force) {
ostr << " m_pll: " << m_pll;
}
if (settingsKeys.contains("fll") || force) {
ostr << " m_fll: " << m_fll;
}
if (settingsKeys.contains("costasLoop") || force) {
ostr << " m_costasLoop: " << m_costasLoop;
}
if (settingsKeys.contains("rrc") || force) {
ostr << " m_rrc: " << m_rrc;
}
if (settingsKeys.contains("rrcRolloff") || force) {
ostr << " m_rrcRolloff: " << m_rrcRolloff;
}
if (settingsKeys.contains("pllPskOrder") || force) {
ostr << " m_pllPskOrder: " << m_pllPskOrder;
}
if (settingsKeys.contains("pllBandwidth") || force) {
ostr << " m_pllBandwidth: " << m_pllBandwidth;
}
if (settingsKeys.contains("pllDampingFactor") || force) {
ostr << " m_pllDampingFactor: " << m_pllDampingFactor;
}
if (settingsKeys.contains("pllLoopGain") || force) {
ostr << " m_pllLoopGain: " << m_pllLoopGain;
}
if (settingsKeys.contains("inputType") || force) {
ostr << " m_inputType: " << m_inputType;
}
if (settingsKeys.contains("rgbColor") || force) {
ostr << " m_rgbColor: " << m_rgbColor;
}
if (settingsKeys.contains("title") || force) {
ostr << " m_title: " << m_title.toStdString();
}
if (settingsKeys.contains("streamIndex") || force) {
ostr << " m_streamIndex: " << m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress") || force) {
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
}
if (settingsKeys.contains("reverseAPIPort") || force) {
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex") || force) {
ostr << " m_workspaceIndex: " << m_workspaceIndex;
}
if (settingsKeys.contains("hidden") || force) {
ostr << " m_hidden: " << m_hidden;
}
return QString(ostr.str().c_str());
}

View File

@ -75,6 +75,8 @@ struct ChannelAnalyzerSettings
void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; }
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
void applySettings(const QStringList& settingsKeys, const ChannelAnalyzerSettings& settings);
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
};

View File

@ -45,7 +45,7 @@ ChannelAnalyzerSink::ChannelAnalyzerSink() :
m_costasLoop.computeCoefficients(m_settings.m_pllBandwidth);
applyChannelSettings(m_channelSampleRate, m_sinkSampleRate, m_channelFrequencyOffset, true);
applySettings(m_settings, true);
applySettings(m_settings, QStringList(), true);
}
ChannelAnalyzerSink::~ChannelAnalyzerSink()
@ -243,26 +243,9 @@ void ChannelAnalyzerSink::setFilters(int sampleRate, float bandwidth, float lowC
RRCFilter->create_rrc_filter(bandwidth / sampleRate, m_settings.m_rrcRolloff / 100.0);
}
void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings, bool force)
void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force)
{
qDebug() << "ChannelAnalyzerSink::applySettings:"
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
<< " m_rcc: " << settings.m_rrc
<< " m_rrcRolloff: " << settings.m_rrcRolloff / 100.0
<< " m_bandwidth: " << settings.m_bandwidth
<< " m_lowCutoff: " << settings.m_lowCutoff
<< " m_log2Decim: " << settings.m_log2Decim
<< " m_rationalDownSample: " << settings.m_rationalDownSample
<< " m_rationalDownSamplerRate: " << settings.m_rationalDownSamplerRate
<< " m_ssb: " << settings.m_ssb
<< " m_pll: " << settings.m_pll
<< " m_fll: " << settings.m_fll
<< " m_costasLoop: " << settings.m_costasLoop
<< " m_pllPskOrder: " << settings.m_pllPskOrder
<< " m_pllBandwidth: " << settings.m_pllBandwidth
<< " m_pllDampingFactor: " << settings.m_pllDampingFactor
<< " m_pllLoopGain: " << settings.m_pllLoopGain
<< " m_inputType: " << (int) settings.m_inputType;
qDebug() << "ChannelAnalyzerSink::applySettings:" << settings.getDebugString(settingsKeys, force);
bool doApplySampleRate = false;
if ((settings.m_bandwidth != m_settings.m_bandwidth) ||
@ -331,7 +314,11 @@ void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings,
}
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
qDebug() << "ChannelAnalyzerSink::applySettings:"
<< " m_rationalDownSample: " << settings.m_rationalDownSample;

View File

@ -43,7 +43,7 @@ public:
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
void applyChannelSettings(int channelSampleRate, int sinkSampleRate, int channelFrequencyOffset, bool force = false);
void applySettings(const ChannelAnalyzerSettings& settings, bool force = false);
void applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force = false);
double getMagSq() const { return m_magsq; }
double getMagSqAvg() const { return (double) m_channelPowerAvg; }

View File

@ -54,7 +54,7 @@ AISDemod::AISDemod(DeviceAPI *deviceAPI) :
m_basebandSink->setChannel(this);
m_basebandSink->moveToThread(&m_thread);
applySettings(m_settings, true);
applySettings(m_settings, QStringList(), true);
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
@ -128,7 +128,7 @@ void AISDemod::start()
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
m_basebandSink->getInputMessageQueue()->push(dspMsg);
AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(m_settings, true);
AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(m_settings, QStringList(), true);
m_basebandSink->getInputMessageQueue()->push(msg);
}
@ -146,7 +146,7 @@ bool AISDemod::handleMessage(const Message& cmd)
{
MsgConfigureAISDemod& cfg = (MsgConfigureAISDemod&) cmd;
qDebug() << "AISDemod::handleMessage: MsgConfigureAISDemod";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
return true;
}
@ -251,27 +251,18 @@ void AISDemod::setCenterFrequency(qint64 frequency)
{
AISDemodSettings settings = m_settings;
settings.m_inputFrequencyOffset = frequency;
applySettings(settings, false);
applySettings(settings, QStringList({"inputFrequencyOffset"}), false);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, false);
MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, QStringList({"inputFrequencyOffset"}), false);
m_guiMessageQueue->push(msgToGUI);
}
}
void AISDemod::applySettings(const AISDemodSettings& settings, bool force)
void AISDemod::applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force)
{
qDebug() << "AISDemod::applySettings:"
<< " m_logEnabled: " << settings.m_logEnabled
<< " m_logFilename: " << settings.m_logFilename
<< " m_streamIndex: " << settings.m_streamIndex
<< " m_useReverseAPI: " << settings.m_useReverseAPI
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
<< " force: " << force;
qDebug() << "AISDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
QList<QString> reverseAPIKeys;
@ -311,7 +302,8 @@ void AISDemod::applySettings(const AISDemodSettings& settings, bool force)
if ((settings.m_useFileTime != m_settings.m_useFileTime) || force) {
reverseAPIKeys.append("useFileTime");
}
if (m_settings.m_streamIndex != settings.m_streamIndex)
if (settingsKeys.contains("streamIndex"))
{
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
{
@ -326,17 +318,18 @@ void AISDemod::applySettings(const AISDemodSettings& settings, bool force)
reverseAPIKeys.append("streamIndex");
}
AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(settings, force);
AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(settings, settingsKeys, force);
m_basebandSink->getInputMessageQueue()->push(msg);
if (settings.m_useReverseAPI)
{
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
bool fullUpdate = settingsKeys.contains("useReverseAPI") ||
settingsKeys.contains("reverseAPIAddress") ||
settingsKeys.contains("reverseAPIPort") ||
settingsKeys.contains("reverseAPIDeviceIndex") ||
settingsKeys.contains("reverseAPIChannelIndex") ||
settingsKeys.contains("reverseAPIChannelType");
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
if ((settings.m_logEnabled != m_settings.m_logEnabled)
@ -381,14 +374,14 @@ bool AISDemod::deserialize(const QByteArray& data)
{
if (m_settings.deserialize(data))
{
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, true);
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, QStringList(), true);
m_inputMessageQueue.push(msg);
return true;
}
else
{
m_settings.resetToDefaults();
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, true);
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, QStringList(), true);
m_inputMessageQueue.push(msg);
return false;
}
@ -443,13 +436,13 @@ int AISDemod::webapiSettingsPutPatch(
AISDemodSettings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(settings, force);
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(settings, channelSettingsKeys, force);
m_inputMessageQueue.push(msg);
qDebug("AISDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, force);
MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, channelSettingsKeys, force);
m_guiMessageQueue->push(msgToGUI);
}
@ -612,7 +605,7 @@ void AISDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp
}
}
void AISDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AISDemodSettings& settings, bool force)
void AISDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const AISDemodSettings& settings, bool force)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
@ -638,7 +631,7 @@ void AISDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, co
}
void AISDemod::webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const AISDemodSettings& settings,
bool force

View File

@ -52,20 +52,23 @@ public:
public:
const AISDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureAISDemod* create(const AISDemodSettings& settings, bool force)
static MsgConfigureAISDemod* create(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force)
{
return new MsgConfigureAISDemod(settings, force);
return new MsgConfigureAISDemod(settings, settingsKeys, force);
}
private:
AISDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureAISDemod(const AISDemodSettings& settings, bool force) :
MsgConfigureAISDemod(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -184,11 +187,11 @@ private:
QNetworkRequest m_networkRequest;
virtual bool handleMessage(const Message& cmd);
void applySettings(const AISDemodSettings& settings, bool force = false);
void applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AISDemodSettings& settings, bool force);
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const AISDemodSettings& settings, bool force);
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const AISDemodSettings& settings,
bool force

View File

@ -136,7 +136,7 @@ bool AISDemodBaseband::handleMessage(const Message& cmd)
MsgConfigureAISDemodBaseband& cfg = (MsgConfigureAISDemodBaseband&) cmd;
qDebug() << "AISDemodBaseband::handleMessage: MsgConfigureAISDemodBaseband";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
return true;
}
@ -156,7 +156,7 @@ bool AISDemodBaseband::handleMessage(const Message& cmd)
}
}
void AISDemodBaseband::applySettings(const AISDemodSettings& settings, bool force)
void AISDemodBaseband::applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force)
{
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
{
@ -164,9 +164,13 @@ void AISDemodBaseband::applySettings(const AISDemodSettings& settings, bool forc
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
}
m_sink.applySettings(settings, force);
m_sink.applySettings(settings, settingsKeys, force);
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
void AISDemodBaseband::setBasebandSampleRate(int sampleRate)

View File

@ -44,20 +44,23 @@ public:
public:
const AISDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureAISDemodBaseband* create(const AISDemodSettings& settings, bool force)
static MsgConfigureAISDemodBaseband* create(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force)
{
return new MsgConfigureAISDemodBaseband(settings, force);
return new MsgConfigureAISDemodBaseband(settings, settingsKeys, force);
}
private:
AISDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureAISDemodBaseband(const AISDemodSettings& settings, bool force) :
MsgConfigureAISDemodBaseband(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -92,7 +95,7 @@ private:
bool handleMessage(const Message& cmd);
void calculateOffset(AISDemodSink *sink);
void applySettings(const AISDemodSettings& settings, bool force = false);
void applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force = false);
private slots:
void handleInputMessages();

View File

@ -132,7 +132,7 @@ void AISDemodGUI::resetToDefaults()
{
m_settings.resetToDefaults();
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
}
QByteArray AISDemodGUI::serialize() const
@ -144,7 +144,7 @@ bool AISDemodGUI::deserialize(const QByteArray& data)
{
if(m_settings.deserialize(data)) {
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
return true;
} else {
resetToDefaults();
@ -548,7 +548,7 @@ void AISDemodGUI::channelMarkerChangedByCursor()
{
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
applySettings();
applySettings(QStringList({"inputFrequencyOffset"}));
}
void AISDemodGUI::channelMarkerHighlightedByCursor()
@ -561,7 +561,7 @@ void AISDemodGUI::on_deltaFrequency_changed(qint64 value)
m_channelMarker.setCenterFrequency(value);
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList({"inputFrequencyOffset"}));
}
void AISDemodGUI::on_rfBW_valueChanged(int value)
@ -570,28 +570,28 @@ void AISDemodGUI::on_rfBW_valueChanged(int value)
ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1));
m_channelMarker.setBandwidth(bw);
m_settings.m_rfBandwidth = bw;
applySettings();
applySettings(QStringList({"rfBandwidth"}));
}
void AISDemodGUI::on_fmDev_valueChanged(int value)
{
ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1));
m_settings.m_fmDeviation = value * 100.0;
applySettings();
applySettings(QStringList({"fmDeviation"}));
}
void AISDemodGUI::on_threshold_valueChanged(int value)
{
ui->thresholdText->setText(QString("%1").arg(value));
m_settings.m_correlationThreshold = value;
applySettings();
applySettings(QStringList({"correlationThreshold"}));
}
void AISDemodGUI::on_filterMMSI_editingFinished()
{
m_settings.m_filterMMSI = ui->filterMMSI->text();
filter();
applySettings();
applySettings(QStringList({"filterMMSI"}));
}
void AISDemodGUI::on_clearTable_clicked()
@ -602,25 +602,25 @@ void AISDemodGUI::on_clearTable_clicked()
void AISDemodGUI::on_udpEnabled_clicked(bool checked)
{
m_settings.m_udpEnabled = checked;
applySettings();
applySettings(QStringList({"udpEnabled"}));
}
void AISDemodGUI::on_udpAddress_editingFinished()
{
m_settings.m_udpAddress = ui->udpAddress->text();
applySettings();
applySettings(QStringList({"udpAddress"}));
}
void AISDemodGUI::on_udpPort_editingFinished()
{
m_settings.m_udpPort = ui->udpPort->text().toInt();
applySettings();
applySettings(QStringList({"udpPort"}));
}
void AISDemodGUI::on_udpFormat_currentIndexChanged(int value)
{
m_settings.m_udpFormat = (AISDemodSettings::UDPFormat)value;
applySettings();
applySettings(QStringList({"udpFormat"}));
}
void AISDemodGUI::on_messages_cellDoubleClicked(int row, int column)
@ -662,7 +662,7 @@ void AISDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
(void) rollDown;
getRollupContents()->saveState(m_rollupState);
applySettings();
applySettings(QStringList());
}
void AISDemodGUI::onMenuDialogCalled(const QPoint &p)
@ -707,7 +707,8 @@ void AISDemodGUI::onMenuDialogCalled(const QPoint &p)
updateIndexLabel();
}
applySettings();
applySettings(QStringList({"title", "rgbColor", "useReverseAPI", "reverseAPIAddress",
"reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"}));
}
resetContextMenuType();
@ -831,7 +832,7 @@ AISDemodGUI::AISDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
displaySettings();
makeUIConnections();
applySettings(true);
applySettings(QStringList(), true);
DialPopup::addPopupsToChildDials(this);
m_resizer.enableChildMouseTracking();
}
@ -864,11 +865,11 @@ void AISDemodGUI::blockApplySettings(bool block)
m_doApplySettings = !block;
}
void AISDemodGUI::applySettings(bool force)
void AISDemodGUI::applySettings(const QStringList& settingsKeys, const bool force)
{
if (m_doApplySettings)
{
AISDemod::MsgConfigureAISDemod* message = AISDemod::MsgConfigureAISDemod::create( m_settings, force);
AISDemod::MsgConfigureAISDemod* message = AISDemod::MsgConfigureAISDemod::create( m_settings, settingsKeys, force);
m_aisDemod->getInputMessageQueue()->push(message);
}
}
@ -973,13 +974,13 @@ void AISDemodGUI::on_showSlotMap_clicked(bool checked)
{
ui->slotMapWidget->setVisible(checked);
m_settings.m_showSlotMap = checked;
applySettings();
applySettings(QStringList({"showSlotMap"}));
}
void AISDemodGUI::on_logEnable_clicked(bool checked)
{
m_settings.m_logEnabled = checked;
applySettings();
applySettings(QStringList({"logEnabled"}));
}
void AISDemodGUI::on_logFilename_clicked()
@ -995,7 +996,7 @@ void AISDemodGUI::on_logFilename_clicked()
{
m_settings.m_logFilename = fileNames[0];
ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename));
applySettings();
applySettings(QStringList({"logFilename"}));
}
}
}
@ -1092,7 +1093,7 @@ void AISDemodGUI::on_logOpen_clicked()
void AISDemodGUI::on_useFileTime_toggled(bool checked)
{
m_settings.m_useFileTime = checked;
applySettings();
applySettings(QStringList({"useFileTime"}));
}
void AISDemodGUI::makeUIConnections()

View File

@ -113,7 +113,7 @@ private:
virtual ~AISDemodGUI();
void blockApplySettings(bool block);
void applySettings(bool force = false);
void applySettings(const QStringList& settingsKeys, bool force = false);
void displaySettings();
void messageReceived(const QByteArray& message, const QDateTime& dateTime, int slot, int slots);
bool handleMessage(const Message& message);

View File

@ -211,4 +211,158 @@ bool AISDemodSettings::deserialize(const QByteArray& data)
}
}
void AISDemodSettings::applySettings(const QStringList& settingsKeys, const AISDemodSettings& settings)
{
if (settingsKeys.contains("baud")) {
m_baud = settings.m_baud;
}
if (settingsKeys.contains("inputFrequencyOffset")) {
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
}
if (settingsKeys.contains("rfBandwidth")) {
m_rfBandwidth = settings.m_rfBandwidth;
}
if (settingsKeys.contains("fmDeviation")) {
m_fmDeviation = settings.m_fmDeviation;
}
if (settingsKeys.contains("correlationThreshold")) {
m_correlationThreshold = settings.m_correlationThreshold;
}
if (settingsKeys.contains("filterMMSI")) {
m_filterMMSI = settings.m_filterMMSI;
}
if (settingsKeys.contains("udpEnabled")) {
m_udpEnabled = settings.m_udpEnabled;
}
if (settingsKeys.contains("udpAddress")) {
m_udpAddress = settings.m_udpAddress;
}
if (settingsKeys.contains("udpPort")) {
m_udpPort = settings.m_udpPort;
}
if (settingsKeys.contains("udpFormat")) {
m_udpFormat = settings.m_udpFormat;
}
if (settingsKeys.contains("logFilename")) {
m_logFilename = settings.m_logFilename;
}
if (settingsKeys.contains("logEnabled")) {
m_logEnabled = settings.m_logEnabled;
}
if (settingsKeys.contains("showSlotMap")) {
m_showSlotMap = settings.m_showSlotMap;
}
if (settingsKeys.contains("useFileTime")) {
m_useFileTime = settings.m_useFileTime;
}
if (settingsKeys.contains("rgbColor")) {
m_rgbColor = settings.m_rgbColor;
}
if (settingsKeys.contains("title")) {
m_title = settings.m_title;
}
if (settingsKeys.contains("streamIndex")) {
m_streamIndex = settings.m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress")) {
m_reverseAPIAddress = settings.m_reverseAPIAddress;
}
if (settingsKeys.contains("reverseAPIPort")) {
m_reverseAPIPort = settings.m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex")) {
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex")) {
m_workspaceIndex = settings.m_workspaceIndex;
}
if (settingsKeys.contains("hidden")) {
m_hidden = settings.m_hidden;
}
}
QString AISDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
{
std::ostringstream ostr;
if (settingsKeys.contains("baud") || force) {
ostr << " m_baud: " << m_baud;
}
if (settingsKeys.contains("inputFrequencyOffset") || force) {
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
}
if (settingsKeys.contains("rfBandwidth") || force) {
ostr << " m_rfBandwidth: " << m_rfBandwidth;
}
if (settingsKeys.contains("fmDeviation") || force) {
ostr << " m_fmDeviation: " << m_fmDeviation;
}
if (settingsKeys.contains("correlationThreshold") || force) {
ostr << " m_correlationThreshold: " << m_correlationThreshold;
}
if (settingsKeys.contains("filterMMSI") || force) {
ostr << " m_filterMMSI: " << m_filterMMSI.toStdString();
}
if (settingsKeys.contains("udpEnabled") || force) {
ostr << " m_udpEnabled: " << m_udpEnabled;
}
if (settingsKeys.contains("udpAddress") || force) {
ostr << " m_udpAddress: " << m_udpAddress.toStdString();
}
if (settingsKeys.contains("udpPort") || force) {
ostr << " m_udpPort: " << m_udpPort;
}
if (settingsKeys.contains("udpFormat") || force) {
ostr << " m_udpFormat: " << m_udpFormat;
}
if (settingsKeys.contains("logFilename") || force) {
ostr << " m_logFilename: " << m_logFilename.toStdString();
}
if (settingsKeys.contains("logEnabled") || force) {
ostr << " m_logEnabled: " << m_logEnabled;
}
if (settingsKeys.contains("showSlotMap") || force) {
ostr << " m_showSlotMap: " << m_showSlotMap;
}
if (settingsKeys.contains("useFileTime") || force) {
ostr << " m_useFileTime: " << m_useFileTime;
}
if (settingsKeys.contains("rgbColor") || force) {
ostr << " m_rgbColor: " << m_rgbColor;
}
if (settingsKeys.contains("title") || force) {
ostr << " m_title: " << m_title.toStdString();
}
if (settingsKeys.contains("streamIndex") || force) {
ostr << " m_streamIndex: " << m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress") || force) {
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
}
if (settingsKeys.contains("reverseAPIPort") || force) {
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex") || force) {
ostr << " m_workspaceIndex: " << m_workspaceIndex;
}
if (settingsKeys.contains("hidden") || force) {
ostr << " m_hidden: " << m_hidden;
}
return QString(ostr.str().c_str());
}

View File

@ -80,6 +80,8 @@ struct AISDemodSettings
void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; }
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
void applySettings(const QStringList& settingsKeys, const AISDemodSettings& settings);
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
};
#endif /* INCLUDE_AISDEMODSETTINGS_H */

View File

@ -50,7 +50,7 @@ AISDemodSink::AISDemodSink(AISDemod *aisDemod) :
m_sampleBuffer[i].resize(m_sampleBufferSize);
}
applySettings(m_settings, true);
applySettings(m_settings, QStringList(), true);
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
}
@ -398,23 +398,22 @@ void AISDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
qDebug() << "AISDemodSink::applyChannelSettings: m_samplesPerSymbol: " << m_samplesPerSymbol;
}
void AISDemodSink::applySettings(const AISDemodSettings& settings, bool force)
void AISDemodSink::applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force)
{
qDebug() << "AISDemodSink::applySettings:"
<< " force: " << force;
qDebug() << "AISDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force);
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
if ((settingsKeys.contains("rfBandwidth")) || force)
{
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2);
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE;
m_interpolatorDistanceRemain = m_interpolatorDistance;
}
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force)
if ((settingsKeys.contains("fmDeviation")) || force)
{
m_phaseDiscri.setFMScaling(AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
}
if ((settings.m_baud != m_settings.m_baud) || force)
if ((settingsKeys.contains("baud")) || force)
{
m_samplesPerSymbol = AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / settings.m_baud;
qDebug() << "AISDemodSink::applySettings: m_samplesPerSymbol: " << m_samplesPerSymbol << " baud " << settings.m_baud;
@ -447,5 +446,9 @@ void AISDemodSink::applySettings(const AISDemodSettings& settings, bool force)
}
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}

View File

@ -52,7 +52,7 @@ public:
void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; }
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
void applySettings(const AISDemodSettings& settings, bool force = false);
void applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force = false);
void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; }
void setChannel(ChannelAPI *channel) { m_channel = channel; }

View File

@ -60,7 +60,7 @@ AMDemod::AMDemod(DeviceAPI *deviceAPI) :
m_lastTs(0)
{
setObjectName(m_channelId);
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
@ -140,7 +140,7 @@ void AMDemod::start()
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
m_basebandSink->getInputMessageQueue()->push(dspMsg);
AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(m_settings, true);
AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(QStringList(), m_settings, true);
m_basebandSink->getInputMessageQueue()->push(msg);
m_running = true;
@ -164,7 +164,7 @@ bool AMDemod::handleMessage(const Message& cmd)
{
MsgConfigureAMDemod& cfg = (MsgConfigureAMDemod&) cmd;
qDebug() << "AMDemod::handleMessage: MsgConfigureAMDemod";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -205,92 +205,20 @@ void AMDemod::setCenterFrequency(qint64 frequency)
{
AMDemodSettings settings = m_settings;
settings.m_inputFrequencyOffset = frequency;
applySettings(settings, false);
applySettings(QStringList("inputFrequencyOffset"), settings, false);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(settings, false);
MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(QStringList("inputFrequencyOffset"), settings, false);
m_guiMessageQueue->push(msgToGUI);
}
}
void AMDemod::applySettings(const AMDemodSettings& settings, bool force)
void AMDemod::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force)
{
qDebug() << "AMDemod::applySettings:"
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
<< " m_rfBandwidth: " << settings.m_rfBandwidth
<< " m_afBandwidth: " << settings.m_afBandwidth
<< " m_volume: " << settings.m_volume
<< " m_squelch: " << settings.m_squelch
<< " m_audioMute: " << settings.m_audioMute
<< " m_bandpassEnable: " << settings.m_bandpassEnable
<< " m_audioDeviceName: " << settings.m_audioDeviceName
<< " m_pll: " << settings.m_pll
<< " m_syncAMOperation: " << (int) settings.m_syncAMOperation
<< " m_frequencyMode: " << settings.m_frequencyMode
<< " m_frequency: " << settings.m_frequency
<< " m_snap: " << settings.m_snap
<< " m_streamIndex: " << settings.m_streamIndex
<< " m_useReverseAPI: " << settings.m_useReverseAPI
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
<< " force: " << force;
qDebug() << "AMDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
QList<QString> reverseAPIKeys;
if ((m_settings.m_rfBandwidth != settings.m_rfBandwidth) || force) {
reverseAPIKeys.append("rfBandwidth");
}
if ((m_settings.m_afBandwidth != settings.m_afBandwidth) || force) {
reverseAPIKeys.append("afBandwidth");
}
if ((m_settings.m_bandpassEnable != settings.m_bandpassEnable) || force) {
reverseAPIKeys.append("bandpassEnable");
}
if ((m_settings.m_squelch != settings.m_squelch) || force) {
reverseAPIKeys.append("squelch");
}
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) {
reverseAPIKeys.append("audioDeviceName");
}
if ((m_settings.m_pll != settings.m_pll) || force)
{
reverseAPIKeys.append("pll");
reverseAPIKeys.append("syncAMOperation");
}
if ((m_settings.m_syncAMOperation != settings.m_syncAMOperation) || force)
{
reverseAPIKeys.append("pll");
reverseAPIKeys.append("syncAMOperation");
}
if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) {
reverseAPIKeys.append("inputFrequencyOffset");
}
if ((m_settings.m_audioMute != settings.m_audioMute) || force) {
reverseAPIKeys.append("audioMute");
}
if ((m_settings.m_volume != settings.m_volume) || force) {
reverseAPIKeys.append("volume");
}
if ((m_settings.m_frequencyMode != settings.m_frequencyMode) || force) {
reverseAPIKeys.append("frequencyMode");
}
if ((m_settings.m_frequency != settings.m_frequency) || force) {
reverseAPIKeys.append("frequency");
}
if ((m_settings.m_snap != settings.m_snap) || force) {
reverseAPIKeys.append("snap");
}
if (m_settings.m_streamIndex != settings.m_streamIndex)
if (settingsKeys.contains("streamIndex"))
{
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
{
@ -301,34 +229,36 @@ void AMDemod::applySettings(const AMDemodSettings& settings, bool force)
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
emit streamIndexChanged(settings.m_streamIndex);
}
reverseAPIKeys.append("streamIndex");
}
if (m_running)
{
AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(settings, force);
AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(settingsKeys, settings, force);
m_basebandSink->getInputMessageQueue()->push(msg);
}
if (settings.m_useReverseAPI)
{
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
bool fullUpdate = (settingsKeys.contains("useReverseAPI")) ||
(settingsKeys.contains("reverseAPIAddress")) ||
(settingsKeys.contains("reverseAPIPort")) ||
(settingsKeys.contains("reverseAPIDeviceIndex")) ||
(settingsKeys.contains("reverseAPIChannelIndex"));
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
QList<ObjectPipe*> pipes;
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (pipes.size() > 0) {
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
sendChannelSettings(pipes, settingsKeys, settings, force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
QByteArray AMDemod::serialize() const
@ -340,14 +270,14 @@ bool AMDemod::deserialize(const QByteArray& data)
{
if (m_settings.deserialize(data))
{
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(m_settings, true);
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return true;
}
else
{
m_settings.resetToDefaults();
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(m_settings, true);
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return false;
}
@ -402,13 +332,13 @@ int AMDemod::webapiSettingsPutPatch(
AMDemodSettings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(settings, force);
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(channelSettingsKeys, settings, force);
m_inputMessageQueue.push(msg);
qDebug("AMDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(settings, force);
MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(channelSettingsKeys, settings, force);
m_guiMessageQueue->push(msgToGUI);
}
@ -598,7 +528,7 @@ void AMDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
response.getAmDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate());
}
void AMDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AMDemodSettings& settings, bool force)
void AMDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const AMDemodSettings& settings, bool force)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
@ -625,7 +555,7 @@ void AMDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, con
void AMDemod::sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
const AMDemodSettings& settings,
bool force)
{
@ -649,7 +579,7 @@ void AMDemod::sendChannelSettings(
}
void AMDemod::webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const AMDemodSettings& settings,
bool force

View File

@ -46,20 +46,23 @@ public:
public:
const AMDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureAMDemod* create(const AMDemodSettings& settings, bool force)
static MsgConfigureAMDemod* create(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force)
{
return new MsgConfigureAMDemod(settings, force);
return new MsgConfigureAMDemod(settingsKeys, settings, force);
}
private:
AMDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureAMDemod(const AMDemodSettings& settings, bool force) :
MsgConfigureAMDemod(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -159,18 +162,18 @@ private:
qint64 m_lastTs;
virtual bool handleMessage(const Message& cmd);
void applySettings(const AMDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AMDemodSettings& settings, bool force);
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const AMDemodSettings& settings, bool force);
void sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
const AMDemodSettings& settings,
bool force
);
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const AMDemodSettings& settings,
bool force

View File

@ -137,7 +137,7 @@ bool AMDemodBaseband::handleMessage(const Message& cmd)
MsgConfigureAMDemodBaseband& cfg = (MsgConfigureAMDemodBaseband&) cmd;
qDebug() << "AMDemodBaseband::handleMessage: MsgConfigureAMDemodBaseband";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -164,9 +164,9 @@ bool AMDemodBaseband::handleMessage(const Message& cmd)
}
}
void AMDemodBaseband::applySettings(const AMDemodSettings& settings, bool force)
void AMDemodBaseband::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force)
{
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
if ((settingsKeys.contains("inputFrequencyOffset")) || force)
{
m_channelizer.setChannelization(m_sink.getAudioSampleRate(), settings.m_inputFrequencyOffset);
m_sink.applyChannelSettings(m_channelizer.getChannelSampleRate(), m_channelizer.getChannelFrequencyOffset());
@ -178,7 +178,7 @@ void AMDemodBaseband::applySettings(const AMDemodSettings& settings, bool force)
}
}
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
if ((settingsKeys.contains("audioDeviceName")) || force)
{
AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
@ -195,9 +195,13 @@ void AMDemodBaseband::applySettings(const AMDemodSettings& settings, bool force)
}
}
m_sink.applySettings(settings, force);
m_sink.applySettings(settingsKeys, settings, force);
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int AMDemodBaseband::getChannelSampleRate() const

View File

@ -40,20 +40,23 @@ public:
public:
const AMDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureAMDemodBaseband* create(const AMDemodSettings& settings, bool force)
static MsgConfigureAMDemodBaseband* create(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force)
{
return new MsgConfigureAMDemodBaseband(settings, force);
return new MsgConfigureAMDemodBaseband(settingsKeys, settings, force);
}
private:
AMDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureAMDemodBaseband(const AMDemodSettings& settings, bool force) :
MsgConfigureAMDemodBaseband(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -89,7 +92,7 @@ private:
QRecursiveMutex m_mutex;
bool handleMessage(const Message& cmd);
void applySettings(const AMDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force = false);
private slots:
void handleInputMessages();

View File

@ -55,7 +55,7 @@ void AMDemodGUI::resetToDefaults()
{
m_settings.resetToDefaults();
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
}
QByteArray AMDemodGUI::serialize() const
@ -67,7 +67,7 @@ bool AMDemodGUI::deserialize(const QByteArray& data)
{
if(m_settings.deserialize(data)) {
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
return true;
} else {
resetToDefaults();
@ -237,7 +237,7 @@ void AMDemodGUI::on_frequencyMode_currentIndexChanged(int index)
}
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList("frequencyMode"));
}
// Calculate input frequency offset, when device center frequency changes
@ -253,7 +253,7 @@ void AMDemodGUI::calcOffset()
m_channelMarker.setCenterFrequency(offset);
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList("inputFrequencyOffset"));
}
}
@ -285,7 +285,7 @@ void AMDemodGUI::channelMarkerChangedByCursor()
ui->deltaFrequency->blockSignals(false);
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList({"inputFrequencyOffset", "frequency"}));
}
void AMDemodGUI::on_deltaFrequency_changed(qint64 value)
@ -316,7 +316,7 @@ void AMDemodGUI::on_deltaFrequency_changed(qint64 value)
m_channelMarker.setCenterFrequency(offset);
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList({"frequency", "inputFrequencyOffset"}));
}
void AMDemodGUI::on_pll_toggled(bool checked)
@ -328,19 +328,19 @@ void AMDemodGUI::on_pll_toggled(bool checked)
}
m_settings.m_pll = checked;
applySettings();
applySettings(QStringList("pll"));
}
void AMDemodGUI::on_ssb_toggled(bool checked)
{
m_settings.m_syncAMOperation = checked ? m_samUSB ? AMDemodSettings::SyncAMUSB : AMDemodSettings::SyncAMLSB : AMDemodSettings::SyncAMDSB;
applySettings();
applySettings(QStringList("syncAMOperation"));
}
void AMDemodGUI::on_bandpassEnable_toggled(bool checked)
{
m_settings.m_bandpassEnable = checked;
applySettings();
applySettings(QStringList("bandpassEnable"));
}
void AMDemodGUI::on_rfBW_valueChanged(int value)
@ -349,34 +349,34 @@ void AMDemodGUI::on_rfBW_valueChanged(int value)
m_channelMarker.setBandwidth(value * 100);
m_settings.m_rfBandwidth = value * 100;
ui->afBW->setMaximum(value);
applySettings();
applySettings(QStringList("rfBandwidth"));
}
void AMDemodGUI::on_afBW_valueChanged(int value)
{
ui->afBWText->setText(QString("%1 kHz").arg(value / 10.0, 0, 'f', 1));
m_settings.m_afBandwidth = value * 100;
applySettings();
applySettings(QStringList("afBandwidth"));
}
void AMDemodGUI::on_volume_valueChanged(int value)
{
ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1));
m_settings.m_volume = value / 10.0;
applySettings();
applySettings(QStringList("volume"));
}
void AMDemodGUI::on_squelch_valueChanged(int value)
{
ui->squelchText->setText(QString("%1 dB").arg(value));
m_settings.m_squelch = value;
applySettings();
applySettings(QStringList("squelch"));
}
void AMDemodGUI::on_audioMute_toggled(bool checked)
{
m_settings.m_audioMute = checked;
applySettings();
applySettings(QStringList("audioMute"));
}
void AMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
@ -389,7 +389,7 @@ void AMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
*/
getRollupContents()->saveState(m_rollupState);
applySettings();
applySettings(QStringList());
}
void AMDemodGUI::onMenuDialogCalled(const QPoint &p)
@ -434,7 +434,10 @@ void AMDemodGUI::onMenuDialogCalled(const QPoint &p)
updateIndexLabel();
}
applySettings();
applySettings(QStringList({"title", "rgbColor", "useReverseAPI",
"reverseAPIAddress", "reverseAPIPort",
"reverseAPIDeviceIndex", "reverseAPIChannelIndex",
"streamIndex"}));
}
resetContextMenuType();
@ -507,7 +510,7 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS
displaySettings();
makeUIConnections();
applySettings(true);
applySettings(QStringList(), true);
m_resizer.enableChildMouseTracking();
}
@ -521,11 +524,11 @@ void AMDemodGUI::blockApplySettings(bool block)
m_doApplySettings = !block;
}
void AMDemodGUI::applySettings(bool force)
void AMDemodGUI::applySettings(const QStringList& settingsKeys, bool force)
{
if (m_doApplySettings)
{
AMDemod::MsgConfigureAMDemod* message = AMDemod::MsgConfigureAMDemod::create( m_settings, force);
AMDemod::MsgConfigureAMDemod* message = AMDemod::MsgConfigureAMDemod::create(settingsKeys, m_settings, force);
m_amDemod->getInputMessageQueue()->push(message);
}
}
@ -626,7 +629,7 @@ void AMDemodGUI::audioSelect(const QPoint& p)
if (audioSelect.m_selected)
{
m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName;
applySettings();
applySettings(QStringList("audioDeviceName"));
}
}
@ -646,7 +649,7 @@ void AMDemodGUI::samSSBSelect(const QPoint& p)
if (m_settings.m_syncAMOperation != AMDemodSettings::SyncAMDSB)
{
m_settings.m_syncAMOperation = m_samUSB ? AMDemodSettings::SyncAMUSB : AMDemodSettings::SyncAMLSB;
applySettings();
applySettings(QStringList("syncAMOperation"));
}
}
}
@ -685,7 +688,7 @@ void AMDemodGUI::snapClicked()
}
displaySnap();
applySettings();
applySettings(QStringList({"snap"}));
}
void AMDemodGUI::applySnap()

View File

@ -92,7 +92,7 @@ private:
virtual ~AMDemodGUI();
void blockApplySettings(bool block);
void applySettings(bool force = false);
void applySettings(const QStringList& settingsKeys, bool force = false);
void displaySettings();
bool handleMessage(const Message& message);
void makeUIConnections();

View File

@ -178,4 +178,152 @@ bool AMDemodSettings::deserialize(const QByteArray& data)
}
}
void AMDemodSettings::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings)
{
if (settingsKeys.contains("inputFrequencyOffset")) {
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
}
if (settingsKeys.contains("rfBandwidth")) {
m_rfBandwidth = settings.m_rfBandwidth;
}
if (settingsKeys.contains("squelch")) {
m_squelch = settings.m_squelch;
}
if (settingsKeys.contains("volume")) {
m_volume = settings.m_volume;
}
if (settingsKeys.contains("audioMute")) {
m_audioMute = settings.m_audioMute;
}
if (settingsKeys.contains("bandpassEnable")) {
m_bandpassEnable = settings.m_bandpassEnable;
}
if (settingsKeys.contains("afBandwidth")) {
m_afBandwidth = settings.m_afBandwidth;
}
if (settingsKeys.contains("rgbColor")) {
m_rgbColor = settings.m_rgbColor;
}
if (settingsKeys.contains("title")) {
m_title = settings.m_title;
}
if (settingsKeys.contains("audioDeviceName")) {
m_audioDeviceName = settings.m_audioDeviceName;
}
if (settingsKeys.contains("pll")) {
m_pll = settings.m_pll;
}
if (settingsKeys.contains("syncAMOperation")) {
m_syncAMOperation = settings.m_syncAMOperation;
}
if (settingsKeys.contains("frequencyMode")) {
m_frequencyMode = settings.m_frequencyMode;
}
if (settingsKeys.contains("frequency")) {
m_frequency = settings.m_frequency;
}
if (settingsKeys.contains("snap")) {
m_snap = settings.m_snap;
}
if (settingsKeys.contains("streamIndex")) {
m_streamIndex = settings.m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress")) {
m_reverseAPIAddress = settings.m_reverseAPIAddress;
}
if (settingsKeys.contains("reverseAPIPort")) {
m_reverseAPIPort = settings.m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex")) {
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex")) {
m_workspaceIndex = settings.m_workspaceIndex;
}
if (settingsKeys.contains("hidden")) {
m_hidden = settings.m_hidden;
}
}
QString AMDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
{
std::ostringstream ostr;
if (settingsKeys.contains("inputFrequencyOffset") || force) {
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
}
if (settingsKeys.contains("rfBandwidth") || force) {
ostr << " m_rfBandwidth: " << m_rfBandwidth;
}
if (settingsKeys.contains("squelch") || force) {
ostr << " m_squelch: " << m_squelch;
}
if (settingsKeys.contains("volume") || force) {
ostr << " m_volume: " << m_volume;
}
if (settingsKeys.contains("audioMute") || force) {
ostr << " m_audioMute: " << m_audioMute;
}
if (settingsKeys.contains("bandpassEnable") || force) {
ostr << " m_bandpassEnable: " << m_bandpassEnable;
}
if (settingsKeys.contains("afBandwidth") || force) {
ostr << " m_afBandwidth: " << m_afBandwidth;
}
if (settingsKeys.contains("rgbColor") || force) {
ostr << " m_rgbColor: " << m_rgbColor;
}
if (settingsKeys.contains("title") || force) {
ostr << " m_title: " << m_title.toStdString();
}
if (settingsKeys.contains("audioDeviceName") || force) {
ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString();
}
if (settingsKeys.contains("pll") || force) {
ostr << " m_pll: " << m_pll;
}
if (settingsKeys.contains("syncAMOperation") || force) {
ostr << " m_syncAMOperation: " << m_syncAMOperation;
}
if (settingsKeys.contains("frequencyMode") || force) {
ostr << " m_frequencyMode: " << m_frequencyMode;
}
if (settingsKeys.contains("frequency") || force) {
ostr << " m_frequency: " << m_frequency;
}
if (settingsKeys.contains("snap") || force) {
ostr << " m_snap: " << m_snap;
}
if (settingsKeys.contains("streamIndex") || force) {
ostr << " m_streamIndex: " << m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress") || force) {
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
}
if (settingsKeys.contains("reverseAPIPort") || force) {
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex") || force) {
ostr << " m_workspaceIndex: " << m_workspaceIndex;
}
if (settingsKeys.contains("hidden") || force) {
ostr << " m_hidden: " << m_hidden;
}
return QString(ostr.str().c_str());
}

View File

@ -74,6 +74,8 @@ struct AMDemodSettings
void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; }
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings);
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
};

View File

@ -60,7 +60,7 @@ AMDemodSink::AMDemodSink() :
m_pll.computeCoefficients(0.05, 0.707, 1000);
m_syncAMBuffIndex = 0;
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
}
@ -264,24 +264,13 @@ void AMDemodSink::applyChannelSettings(int channelSampleRate, int channelFrequen
m_channelFrequencyOffset = channelFrequencyOffset;
}
void AMDemodSink::applySettings(const AMDemodSettings& settings, bool force)
void AMDemodSink::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force)
{
qDebug() << "AMDemodSink::applySettings:"
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
<< " m_rfBandwidth: " << settings.m_rfBandwidth
<< " m_volume: " << settings.m_volume
<< " m_squelch: " << settings.m_squelch
<< " m_audioMute: " << settings.m_audioMute
<< " m_bandpassEnable: " << settings.m_bandpassEnable
<< " m_afBandwidth: " << settings.m_afBandwidth
<< " m_audioDeviceName: " << settings.m_audioDeviceName
<< " m_pll: " << settings.m_pll
<< " m_syncAMOperation: " << (int) settings.m_syncAMOperation
<< " force: " << force;
qDebug() << "AMDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force);
if((m_settings.m_rfBandwidth != settings.m_rfBandwidth) ||
(m_settings.m_bandpassEnable != settings.m_bandpassEnable) ||
(m_settings.m_afBandwidth != settings.m_afBandwidth) || force)
if((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) ||
(settingsKeys.contains("bandpassEnable") && (settings.m_bandpassEnable != m_settings.m_bandpassEnable)) ||
(settingsKeys.contains("afBandwidth") && (settings.m_afBandwidth != m_settings.m_afBandwidth)) || force)
{
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2f);
m_interpolatorDistanceRemain = 0;
@ -291,11 +280,11 @@ void AMDemodSink::applySettings(const AMDemodSettings& settings, bool force)
DSBFilter->create_dsb_filter((2.0f * settings.m_rfBandwidth) / (float) m_audioSampleRate);
}
if ((m_settings.m_squelch != settings.m_squelch) || force) {
if ((settingsKeys.contains("squelch") && (m_settings.m_squelch != settings.m_squelch)) || force) {
m_squelchLevel = CalcDb::powerFromdB(settings.m_squelch);
}
if ((m_settings.m_pll != settings.m_pll) || force)
if ((settingsKeys.contains("pll") && (m_settings.m_pll != settings.m_pll)) || force)
{
if (settings.m_pll)
{
@ -308,11 +297,15 @@ void AMDemodSink::applySettings(const AMDemodSettings& settings, bool force)
}
}
if ((m_settings.m_syncAMOperation != settings.m_syncAMOperation) || force) {
if ((settingsKeys.contains("syncAMOperation") && (m_settings.m_syncAMOperation != settings.m_syncAMOperation)) || force) {
m_syncAMBuffIndex = 0;
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
void AMDemodSink::applyAudioSampleRate(int sampleRate)

View File

@ -43,7 +43,7 @@ public:
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
void applySettings(const AMDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force = false);
void applyAudioSampleRate(int sampleRate);
int getAudioSampleRate() const { return m_audioSampleRate; }

View File

@ -62,7 +62,7 @@ APTDemod::APTDemod(DeviceAPI *deviceAPI) :
m_basebandSink->setImagWorkerMessageQueue(m_imageWorker->getInputMessageQueue());
m_imageWorker->moveToThread(&m_imageThread);
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
@ -149,7 +149,7 @@ void APTDemod::startBasebandSink()
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
m_basebandSink->getInputMessageQueue()->push(dspMsg);
APTDemodBaseband::MsgConfigureAPTDemodBaseband *msg = APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(m_settings, true);
APTDemodBaseband::MsgConfigureAPTDemodBaseband *msg = APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(QStringList(), m_settings, true);
m_basebandSink->getInputMessageQueue()->push(msg);
}
@ -161,7 +161,7 @@ void APTDemod::startImageWorker()
m_imageWorker->startWork();
m_imageThread.start();
APTDemodImageWorker::MsgConfigureAPTDemodImageWorker *msg = APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(m_settings, true);
APTDemodImageWorker::MsgConfigureAPTDemodImageWorker *msg = APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(QStringList(), m_settings, true);
m_imageWorker->getInputMessageQueue()->push(msg);
}
@ -202,7 +202,7 @@ bool APTDemod::handleMessage(const Message& cmd)
{
MsgConfigureAPTDemod& cfg = (MsgConfigureAPTDemod&) cmd;
qDebug() << "APTDemod::handleMessage: MsgConfigureAPTDemod";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -239,116 +239,20 @@ void APTDemod::setCenterFrequency(qint64 frequency)
{
APTDemodSettings settings = m_settings;
settings.m_inputFrequencyOffset = frequency;
applySettings(settings, false);
applySettings(QStringList({"inputFrequencyOffset"}), settings, false);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(settings, false);
MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(QStringList({"inputFrequencyOffset"}), settings, false);
m_guiMessageQueue->push(msgToGUI);
}
}
void APTDemod::applySettings(const APTDemodSettings& settings, bool force)
void APTDemod::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
{
qDebug() << "APTDemod::applySettings:"
<< " m_cropNoise: " << settings.m_cropNoise
<< " m_denoise: " << settings.m_denoise
<< " m_linearEqualise: " << settings.m_linearEqualise
<< " m_histogramEqualise: " << settings.m_histogramEqualise
<< " m_precipitationOverlay: " << settings.m_precipitationOverlay
<< " m_flip: " << settings.m_flip
<< " m_channels: " << settings.m_channels
<< " m_decodeEnabled: " << settings.m_decodeEnabled
<< " m_autoSave: " << settings.m_autoSave
<< " m_autoSavePath: " << settings.m_autoSavePath
<< " m_autoSaveMinScanLines: " << settings.m_autoSaveMinScanLines
<< " m_streamIndex: " << settings.m_streamIndex
<< " m_useReverseAPI: " << settings.m_useReverseAPI
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
<< " force: " << force;
qDebug() << "APTDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
QList<QString> reverseAPIKeys;
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) {
reverseAPIKeys.append("inputFrequencyOffset");
}
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) {
reverseAPIKeys.append("rfBandwidth");
}
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) {
reverseAPIKeys.append("fmDeviation");
}
if ((settings.m_denoise != m_settings.m_denoise) || force) {
reverseAPIKeys.append("denoise");
}
if ((settings.m_linearEqualise != m_settings.m_linearEqualise) || force) {
reverseAPIKeys.append("linearEqualise");
}
if ((settings.m_histogramEqualise != m_settings.m_histogramEqualise) || force) {
reverseAPIKeys.append("histogramEqualise");
}
if ((settings.m_precipitationOverlay != m_settings.m_precipitationOverlay) || force) {
reverseAPIKeys.append("precipitationOverlay");
}
if ((settings.m_flip != m_settings.m_flip) || force) {
reverseAPIKeys.append("flip");
}
if ((settings.m_channels != m_settings.m_channels) || force) {
reverseAPIKeys.append("channels");
}
if ((settings.m_decodeEnabled != m_settings.m_decodeEnabled) || force) {
reverseAPIKeys.append("decodeEnabled");
}
if ((settings.m_autoSave != m_settings.m_autoSave) || force) {
reverseAPIKeys.append("autoSave");
}
if ((settings.m_autoSavePath != m_settings.m_autoSavePath) || force) {
reverseAPIKeys.append("autoSavePath");
}
if ((settings.m_autoSaveMinScanLines != m_settings.m_autoSaveMinScanLines) || force) {
reverseAPIKeys.append("autoSaveMinScanLines");
}
if ((settings.m_saveCombined != m_settings.m_saveCombined) || force) {
reverseAPIKeys.append("saveCombined");
}
if ((settings.m_saveSeparate != m_settings.m_saveSeparate) || force) {
reverseAPIKeys.append("saveSeparate");
}
if ((settings.m_saveProjection != m_settings.m_saveProjection) || force) {
reverseAPIKeys.append("saveProjection");
}
if ((settings.m_scanlinesPerImageUpdate != m_settings.m_scanlinesPerImageUpdate) || force) {
reverseAPIKeys.append("scanlinesPerImageUpdate");
}
if ((settings.m_transparencyThreshold != m_settings.m_transparencyThreshold) || force) {
reverseAPIKeys.append("transparencyThreshold");
}
if ((settings.m_opacityThreshold != m_settings.m_opacityThreshold) || force) {
reverseAPIKeys.append("opacityThreshold");
}
if ((settings.m_palettes != m_settings.m_palettes) || force) {
reverseAPIKeys.append("palettes");
}
if ((settings.m_palette != m_settings.m_palette) || force) {
reverseAPIKeys.append("palette");
}
if ((settings.m_horizontalPixelsPerDegree != m_settings.m_horizontalPixelsPerDegree) || force) {
reverseAPIKeys.append("horizontalPixelsPerDegree");
}
if ((settings.m_verticalPixelsPerDegree != m_settings.m_verticalPixelsPerDegree) || force) {
reverseAPIKeys.append("verticalPixelsPerDegree");
}
if ((settings.m_satTimeOffset != m_settings.m_satTimeOffset) || force) {
reverseAPIKeys.append("satTimeOffset");
}
if ((settings.m_satYaw != m_settings.m_satYaw) || force) {
reverseAPIKeys.append("satYaw");
}
if (m_settings.m_streamIndex != settings.m_streamIndex)
if (settingsKeys.contains("streamIndex"))
{
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
{
@ -359,26 +263,24 @@ void APTDemod::applySettings(const APTDemodSettings& settings, bool force)
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
emit streamIndexChanged(settings.m_streamIndex);
}
reverseAPIKeys.append("streamIndex");
}
APTDemodBaseband::MsgConfigureAPTDemodBaseband *msg
= APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(settings, force);
= APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(settingsKeys, settings, force);
m_basebandSink->getInputMessageQueue()->push(msg);
APTDemodImageWorker::MsgConfigureAPTDemodImageWorker *msgToImg
= APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(settings, force);
= APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(settingsKeys, settings, force);
m_imageWorker->getInputMessageQueue()->push(msgToImg);
if (settings.m_useReverseAPI)
{
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
bool fullUpdate = (settingsKeys.contains("useReverseAPI")) ||
(settingsKeys.contains("reverseAPIAddress")) ||
(settingsKeys.contains("reverseAPIPort")) ||
(settingsKeys.contains("reverseAPIDeviceIndex")) ||
(settingsKeys.contains("reverseAPIChannelIndex"));
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
m_settings = settings;
@ -393,14 +295,14 @@ bool APTDemod::deserialize(const QByteArray& data)
{
if (m_settings.deserialize(data))
{
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(m_settings, true);
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return true;
}
else
{
m_settings.resetToDefaults();
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(m_settings, true);
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return false;
}
@ -436,13 +338,13 @@ int APTDemod::webapiSettingsPutPatch(
APTDemodSettings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(settings, force);
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(channelSettingsKeys, settings, force);
m_inputMessageQueue.push(msg);
qDebug("APTDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(settings, force);
MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(channelSettingsKeys, settings, force);
m_guiMessageQueue->push(msgToGUI);
}
@ -645,7 +547,7 @@ void APTDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp
}
}
void APTDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const APTDemodSettings& settings, bool force)
void APTDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const APTDemodSettings& settings, bool force)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
@ -671,7 +573,7 @@ void APTDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, co
}
void APTDemod::webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const APTDemodSettings& settings,
bool force
@ -825,9 +727,9 @@ int APTDemod::webapiActionsPost(
settings.m_aosDateTime = QDateTime::fromString(*aos->getDateTime(), Qt::ISODateWithMs);
settings.m_northToSouth = aos->getNorthToSouthPass();
m_inputMessageQueue.push(MsgConfigureAPTDemod::create(settings, false));
m_inputMessageQueue.push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false));
if (m_guiMessageQueue) {
m_guiMessageQueue->push(MsgConfigureAPTDemod::create(settings, false));
m_guiMessageQueue->push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false));
}
}
@ -858,10 +760,10 @@ int APTDemod::webapiActionsPost(
// Disable decoder
APTDemodSettings settings = m_settings;
settings.m_decodeEnabled = false;
m_inputMessageQueue.push(MsgConfigureAPTDemod::create(settings, false));
m_inputMessageQueue.push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false));
if (m_guiMessageQueue) {
m_guiMessageQueue->push(MsgConfigureAPTDemod::create(settings, false));
m_guiMessageQueue->push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false));
}
}

View File

@ -48,20 +48,23 @@ public:
public:
const APTDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureAPTDemod* create(const APTDemodSettings& settings, bool force)
static MsgConfigureAPTDemod* create(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
{
return new MsgConfigureAPTDemod(settings, force);
return new MsgConfigureAPTDemod(settingsKeys, settings, force);
}
private:
APTDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureAPTDemod(const APTDemodSettings& settings, bool force) :
MsgConfigureAPTDemod(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -282,10 +285,10 @@ private:
QNetworkRequest m_networkRequest;
virtual bool handleMessage(const Message& cmd);
void applySettings(const APTDemodSettings& settings, bool force = false);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const APTDemodSettings& settings, bool force);
void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force = false);
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const APTDemodSettings& settings, bool force);
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const APTDemodSettings& settings,
bool force

View File

@ -129,7 +129,7 @@ bool APTDemodBaseband::handleMessage(const Message& cmd)
MsgConfigureAPTDemodBaseband& cfg = (MsgConfigureAPTDemodBaseband&) cmd;
qDebug() << "APTDemodBaseband::handleMessage: MsgConfigureAPTDemodBaseband";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -154,17 +154,21 @@ bool APTDemodBaseband::handleMessage(const Message& cmd)
}
}
void APTDemodBaseband::applySettings(const APTDemodSettings& settings, bool force)
void APTDemodBaseband::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
{
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
if ((settingsKeys.contains("m_inputFrequencyOffset")) || force)
{
m_channelizer->setChannelization(APTDEMOD_AUDIO_SAMPLE_RATE, settings.m_inputFrequencyOffset);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
}
m_sink.applySettings(settings, force);
m_sink.applySettings(settingsKeys, settings, force);
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
void APTDemodBaseband::setBasebandSampleRate(int sampleRate)

View File

@ -40,20 +40,23 @@ public:
public:
const APTDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureAPTDemodBaseband* create(const APTDemodSettings& settings, bool force)
static MsgConfigureAPTDemodBaseband* create(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
{
return new MsgConfigureAPTDemodBaseband(settings, force);
return new MsgConfigureAPTDemodBaseband(settingsKeys, settings, force);
}
private:
APTDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureAPTDemodBaseband(const APTDemodSettings& settings, bool force) :
MsgConfigureAPTDemodBaseband(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -85,7 +88,7 @@ private:
bool handleMessage(const Message& cmd);
void calculateOffset(APTDemodSink *sink);
void applySettings(const APTDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force = false);
private slots:
void handleInputMessages();

View File

@ -101,7 +101,7 @@ void APTDemodGUI::resetToDefaults()
{
m_settings.resetToDefaults();
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
}
QByteArray APTDemodGUI::serialize() const
@ -114,7 +114,7 @@ bool APTDemodGUI::deserialize(const QByteArray& data)
if(m_settings.deserialize(data))
{
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
return true;
} else {
resetToDefaults();
@ -296,7 +296,7 @@ void APTDemodGUI::channelMarkerChangedByCursor()
{
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
applySettings();
applySettings(QStringList("inputFrequencyOffset"), false);
}
void APTDemodGUI::channelMarkerHighlightedByCursor()
@ -309,7 +309,7 @@ void APTDemodGUI::on_deltaFrequency_changed(qint64 value)
m_channelMarker.setCenterFrequency(value);
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList("inputFrequencyOffset"), false);
}
void APTDemodGUI::on_rfBW_valueChanged(int value)
@ -318,14 +318,14 @@ void APTDemodGUI::on_rfBW_valueChanged(int value)
ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1));
m_channelMarker.setBandwidth(bw);
m_settings.m_rfBandwidth = bw;
applySettings();
applySettings(QStringList("rfBandwidth"), false);
}
void APTDemodGUI::on_fmDev_valueChanged(int value)
{
ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1));
m_settings.m_fmDeviation = value * 100.0;
applySettings();
applySettings(QStringList("fmDeviation"), false);
}
void APTDemodGUI::displayLabels()
@ -385,7 +385,7 @@ void APTDemodGUI::on_channels_currentIndexChanged(int index)
m_settings.m_precipitationOverlay = false;
}
displayLabels();
applySettings();
applySettings(QStringList("channels"), false);
}
void APTDemodGUI::on_transparencyThreshold_valueChanged(int value)
@ -394,13 +394,14 @@ void APTDemodGUI::on_transparencyThreshold_valueChanged(int value)
ui->transparencyThresholdText->setText(QString::number(m_settings.m_transparencyThreshold));
// Don't applySettings while tracking, as processing an image takes a long time
if (!ui->transparencyThreshold->isSliderDown()) {
applySettings();
applySettings(QStringList("transparencyThreshold"), false);
}
}
void APTDemodGUI::on_transparencyThreshold_sliderReleased()
{
applySettings();
m_settings.m_transparencyThreshold = ui->transparencyThreshold->value();
applySettings(QStringList("transparencyThreshold"), false);
}
void APTDemodGUI::on_opacityThreshold_valueChanged(int value)
@ -409,43 +410,44 @@ void APTDemodGUI::on_opacityThreshold_valueChanged(int value)
ui->opacityThresholdText->setText(QString::number(m_settings.m_opacityThreshold));
// Don't applySettings while tracking, as processing an image takes a long time
if (!ui->opacityThreshold->isSliderDown()) {
applySettings();
applySettings(QStringList("opacityThreshold"), false);
}
}
void APTDemodGUI::on_opacityThreshold_sliderReleased()
{
applySettings();
m_settings.m_opacityThreshold = ui->opacityThreshold->value();
applySettings(QStringList("opacityThreshold"), false);
}
void APTDemodGUI::on_cropNoise_clicked(bool checked)
{
m_settings.m_cropNoise = checked;
applySettings();
applySettings(QStringList("cropNoise"), false);
}
void APTDemodGUI::on_denoise_clicked(bool checked)
{
m_settings.m_denoise = checked;
applySettings();
applySettings(QStringList("denoise"), false);
}
void APTDemodGUI::on_linear_clicked(bool checked)
{
m_settings.m_linearEqualise = checked;
applySettings();
applySettings(QStringList("linearEqualise"), false);
}
void APTDemodGUI::on_histogram_clicked(bool checked)
{
m_settings.m_histogramEqualise = checked;
applySettings();
applySettings(QStringList("histogramEqualise"), false);
}
void APTDemodGUI::on_precipitation_clicked(bool checked)
{
m_settings.m_precipitationOverlay = checked;
applySettings();
applySettings(QStringList("precipitationOverlay"), false);
}
void APTDemodGUI::on_flip_clicked(bool checked)
@ -456,13 +458,13 @@ void APTDemodGUI::on_flip_clicked(bool checked)
} else {
ui->image->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
}
applySettings();
applySettings(QStringList("flip"), false);
}
void APTDemodGUI::on_startStop_clicked(bool checked)
{
m_settings.m_decodeEnabled = checked;
applySettings();
applySettings(QStringList("decodeEnabled"), false);
}
void APTDemodGUI::resetDecoder()
@ -490,7 +492,21 @@ void APTDemodGUI::on_showSettings_clicked()
if (dialog.exec() == QDialog::Accepted)
{
displayPalettes();
applySettings();
applySettings(QStringList({
"satelliteTrackerControl",
"satelliteName",
"autoSave",
"saveCombined",
"saveSeparate",
"saveProjection",
"autoSavePath",
"autoSaveMinScanLines",
"scanlinesPerImageUpdate",
"horizontalPixelsPerDegree",
"verticalPixelsPerDegree",
"satTimeOffset",
"satYaw",
}), false);
}
}
@ -551,7 +567,7 @@ void APTDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
(void) rollDown;
getRollupContents()->saveState(m_rollupState);
applySettings();
applySettings(QStringList(), false);
}
void APTDemodGUI::onMenuDialogCalled(const QPoint &p)
@ -596,7 +612,19 @@ void APTDemodGUI::onMenuDialogCalled(const QPoint &p)
updateIndexLabel();
}
applySettings();
applySettings(QStringList(
{
"rgbColor",
"title",
"useReverseAPI",
"reverseAPIAddress",
"reverseAPIPort",
"reverseAPIDeviceIndex",
"reverseAPIChannelIndex",
"streamIndex"
}),
false
);
}
resetContextMenuType();
@ -679,7 +707,7 @@ APTDemodGUI::APTDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
displaySettings();
makeUIConnections();
applySettings(true);
applySettings(QStringList(), true);
DialPopup::addPopupsToChildDials(this);
m_resizer.enableChildMouseTracking();
}
@ -743,11 +771,11 @@ void APTDemodGUI::blockApplySettings(bool block)
m_doApplySettings = !block;
}
void APTDemodGUI::applySettings(bool force)
void APTDemodGUI::applySettings(const QStringList& settingsKeys, bool force)
{
if (m_doApplySettings)
{
APTDemod::MsgConfigureAPTDemod* message = APTDemod::MsgConfigureAPTDemod::create( m_settings, force);
APTDemod::MsgConfigureAPTDemod* message = APTDemod::MsgConfigureAPTDemod::create(settingsKeys, m_settings, force);
m_aptDemod->getInputMessageQueue()->push(message);
}
}

View File

@ -121,7 +121,7 @@ private:
virtual ~APTDemodGUI();
void blockApplySettings(bool block);
void applySettings(bool force = false);
void applySettings(const QStringList& settingsKeys, bool force = false);
void displaySettings();
void displayPalettes();
void displayLabels();

View File

@ -49,20 +49,23 @@ public:
public:
const APTDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureAPTDemodImageWorker* create(const APTDemodSettings& settings, bool force)
static MsgConfigureAPTDemodImageWorker* create(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
{
return new MsgConfigureAPTDemodImageWorker(settings, force);
return new MsgConfigureAPTDemodImageWorker(settingsKeys, settings, force);
}
private:
APTDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureAPTDemodImageWorker(const APTDemodSettings& settings, bool force) :
MsgConfigureAPTDemodImageWorker(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};

View File

@ -218,4 +218,260 @@ bool APTDemodSettings::deserialize(const QByteArray& data)
}
}
void APTDemodSettings::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings)
{
if (settingsKeys.contains("inputFrequencyOffset")) {
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
}
if (settingsKeys.contains("rfBandwidth")) {
m_rfBandwidth = settings.m_rfBandwidth;
}
if (settingsKeys.contains("fmDeviation")) {
m_fmDeviation = settings.m_fmDeviation;
}
if (settingsKeys.contains("cropNoise")) {
m_cropNoise = settings.m_cropNoise;
}
if (settingsKeys.contains("denoise")) {
m_denoise = settings.m_denoise;
}
if (settingsKeys.contains("linearEqualise")) {
m_linearEqualise = settings.m_linearEqualise;
}
if (settingsKeys.contains("histogramEqualise")) {
m_histogramEqualise = settings.m_histogramEqualise;
}
if (settingsKeys.contains("precipitationOverlay")) {
m_precipitationOverlay = settings.m_precipitationOverlay;
}
if (settingsKeys.contains("flip")) {
m_flip = settings.m_flip;
}
if (settingsKeys.contains("channels")) {
m_channels = settings.m_channels;
}
if (settingsKeys.contains("decodeEnabled")) {
m_decodeEnabled = settings.m_decodeEnabled;
}
if (settingsKeys.contains("satelliteTrackerControl")) {
m_satelliteTrackerControl = settings.m_satelliteTrackerControl;
}
if (settingsKeys.contains("satelliteName")) {
m_satelliteName = settings.m_satelliteName;
}
if (settingsKeys.contains("autoSave")) {
m_autoSave = settings.m_autoSave;
}
if (settingsKeys.contains("autoSavePath")) {
m_autoSavePath = settings.m_autoSavePath;
}
if (settingsKeys.contains("autoSaveMinScanLines")) {
m_autoSaveMinScanLines = settings.m_autoSaveMinScanLines;
}
if (settingsKeys.contains("saveCombined")) {
m_saveCombined = settings.m_saveCombined;
}
if (settingsKeys.contains("saveSeparate")) {
m_saveSeparate = settings.m_saveSeparate;
}
if (settingsKeys.contains("saveProjection")) {
m_saveProjection = settings.m_saveProjection;
}
if (settingsKeys.contains("scanlinesPerImageUpdate")) {
m_scanlinesPerImageUpdate = settings.m_scanlinesPerImageUpdate;
}
if (settingsKeys.contains("transparencyThreshold")) {
m_transparencyThreshold = settings.m_transparencyThreshold;
}
if (settingsKeys.contains("opacityThreshold")) {
m_opacityThreshold = settings.m_opacityThreshold;
}
if (settingsKeys.contains("palettes")) {
m_palettes = settings.m_palettes;
}
if (settingsKeys.contains("palette")) {
m_palette = settings.m_palette;
}
if (settingsKeys.contains("horizontalPixelsPerDegree")) {
m_horizontalPixelsPerDegree = settings.m_horizontalPixelsPerDegree;
}
if (settingsKeys.contains("verticalPixelsPerDegree")) {
m_verticalPixelsPerDegree = settings.m_verticalPixelsPerDegree;
}
if (settingsKeys.contains("satTimeOffset")) {
m_satTimeOffset = settings.m_satTimeOffset;
}
if (settingsKeys.contains("satYaw")) {
m_satYaw = settings.m_satYaw;
}
if (settingsKeys.contains("rgbColor")) {
m_rgbColor = settings.m_rgbColor;
}
if (settingsKeys.contains("title")) {
m_title = settings.m_title;
}
if (settingsKeys.contains("streamIndex")) {
m_streamIndex = settings.m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress")) {
m_reverseAPIAddress = settings.m_reverseAPIAddress;
}
if (settingsKeys.contains("reverseAPIPort")) {
m_reverseAPIPort = settings.m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex")) {
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex")) {
m_workspaceIndex = settings.m_workspaceIndex;
}
if (settingsKeys.contains("hidden")) {
m_hidden = settings.m_hidden;
}
if (settingsKeys.contains("tle")) {
m_tle = settings.m_tle;
}
if (settingsKeys.contains("aosDateTime")) {
m_aosDateTime = settings.m_aosDateTime;
}
if (settingsKeys.contains("northToSouth")) {
m_northToSouth = settings.m_northToSouth;
}
}
QString APTDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
{
std::ostringstream ostr;
if (settingsKeys.contains("inputFrequencyOffset") || force) {
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
}
if (settingsKeys.contains("rfBandwidth") || force) {
ostr << " m_rfBandwidth: " << m_rfBandwidth;
}
if (settingsKeys.contains("fmDeviation") || force) {
ostr << " m_fmDeviation: " << m_fmDeviation;
}
if (settingsKeys.contains("cropNoise") || force) {
ostr << " m_cropNoise: " << m_cropNoise;
}
if (settingsKeys.contains("denoise") || force) {
ostr << " m_denoise: " << m_denoise;
}
if (settingsKeys.contains("linearEqualise") || force) {
ostr << " m_linearEqualise: " << m_linearEqualise;
}
if (settingsKeys.contains("histogramEqualise") || force) {
ostr << " m_histogramEqualise: " << m_histogramEqualise;
}
if (settingsKeys.contains("precipitationOverlay") || force) {
ostr << " m_precipitationOverlay: " << m_precipitationOverlay;
}
if (settingsKeys.contains("flip") || force) {
ostr << " m_flip: " << m_flip;
}
if (settingsKeys.contains("channels") || force) {
ostr << " m_channels: " << m_channels;
}
if (settingsKeys.contains("decodeEnabled") || force) {
ostr << " m_decodeEnabled: " << m_decodeEnabled;
}
if (settingsKeys.contains("satelliteTrackerControl") || force) {
ostr << " m_satelliteTrackerControl: " << m_satelliteTrackerControl;
}
if (settingsKeys.contains("satelliteName") || force) {
ostr << " m_satelliteName: " << m_satelliteName.toStdString();
}
if (settingsKeys.contains("autoSave") || force) {
ostr << " m_autoSave: " << m_autoSave;
}
if (settingsKeys.contains("autoSavePath") || force) {
ostr << " m_autoSavePath: " << m_autoSavePath.toStdString();
}
if (settingsKeys.contains("autoSaveMinScanLines") || force) {
ostr << " m_autoSaveMinScanLines: " << m_autoSaveMinScanLines;
}
if (settingsKeys.contains("saveCombined") || force) {
ostr << " m_saveCombined: " << m_saveCombined;
}
if (settingsKeys.contains("saveSeparate") || force) {
ostr << " m_saveSeparate: " << m_saveSeparate;
}
if (settingsKeys.contains("saveProjection") || force) {
ostr << " m_saveProjection: " << m_saveProjection;
}
if (settingsKeys.contains("scanlinesPerImageUpdate") || force) {
ostr << " m_scanlinesPerImageUpdate: " << m_scanlinesPerImageUpdate;
}
if (settingsKeys.contains("transparencyThreshold") || force) {
ostr << " m_transparencyThreshold: " << m_transparencyThreshold;
}
if (settingsKeys.contains("opacityThreshold") || force) {
ostr << " m_opacityThreshold: " << m_opacityThreshold;
}
if (settingsKeys.contains("palettes") || force) {
ostr << " m_palettes: " << m_palettes.join(";").toStdString();
}
if (settingsKeys.contains("palette") || force) {
ostr << " m_palette: " << m_palette;
}
if (settingsKeys.contains("horizontalPixelsPerDegree") || force) {
ostr << " m_horizontalPixelsPerDegree: " << m_horizontalPixelsPerDegree;
}
if (settingsKeys.contains("verticalPixelsPerDegree") || force) {
ostr << " m_verticalPixelsPerDegree: " << m_verticalPixelsPerDegree;
}
if (settingsKeys.contains("satTimeOffset") || force) {
ostr << " m_satTimeOffset: " << m_satTimeOffset;
}
if (settingsKeys.contains("satYaw") || force) {
ostr << " m_satYaw: " << m_satYaw;
}
if (settingsKeys.contains("rgbColor") || force) {
ostr << " m_rgbColor: " << m_rgbColor;
}
if (settingsKeys.contains("title") || force) {
ostr << " m_title: " << m_title.toStdString();
}
if (settingsKeys.contains("streamIndex") || force) {
ostr << " m_streamIndex: " << m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress") || force) {
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
}
if (settingsKeys.contains("reverseAPIPort") || force) {
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex") || force) {
ostr << " m_workspaceIndex: " << m_workspaceIndex;
}
if (settingsKeys.contains("hidden") || force) {
ostr << " m_hidden: " << m_hidden;
}
if (settingsKeys.contains("tle") || force) {
ostr << " m_tle: " << m_tle.toStdString();
}
if (settingsKeys.contains("aosDateTime") || force) {
ostr << " m_aosDateTime: " << m_aosDateTime.toString().toStdString();
}
if (settingsKeys.contains("northToSouth") || force) {
ostr << " m_northToSouth: " << m_northToSouth;
}
return QString(ostr.str().c_str());
}

View File

@ -81,6 +81,8 @@ struct APTDemodSettings
void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; }
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings);
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
};
#endif /* INCLUDE_APTDEMODSETTINGS_H */

View File

@ -35,7 +35,7 @@ APTDemodSink::APTDemodSink() :
m_magsq = 0.0;
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
m_samplesLength = APTDEMOD_AUDIO_SAMPLE_RATE * APT_MAX_HEIGHT / 2; // APT broadcasts at 2 lines per second
@ -176,25 +176,30 @@ void APTDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
m_channelFrequencyOffset = channelFrequencyOffset;
}
void APTDemodSink::applySettings(const APTDemodSettings& settings, bool force)
void APTDemodSink::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
{
qDebug() << "APTDemodSink::applySettings:"
<< " m_rfBandwidth: " << settings.m_rfBandwidth
<< " m_fmDeviation: " << settings.m_fmDeviation
<< " m_decodeEnabled: " << settings.m_decodeEnabled
<< " force: " << force;
qDebug() << "APTDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force);
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
if (settingsKeys.contains("decodeEnabled") || force)
{
m_settings.m_decodeEnabled = settings.m_decodeEnabled;
}
if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force)
{
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth, 2.2);
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) APTDEMOD_AUDIO_SAMPLE_RATE;
m_interpolatorDistanceRemain = m_interpolatorDistance;
}
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force)
if ((settingsKeys.contains("fmDeviation") && (settings.m_fmDeviation != m_settings.m_fmDeviation)) || force)
{
m_phaseDiscri.setFMScaling(APTDEMOD_AUDIO_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}

View File

@ -50,7 +50,7 @@ public:
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
void applySettings(const APTDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force = false);
void setImageWorkerMessageQueue(MessageQueue *messageQueue) { m_imageWorkerMessageQueue = messageQueue; }
double getMagSq() const { return m_magsq; }

View File

@ -50,7 +50,7 @@ ATVDemod::ATVDemod(DeviceAPI *deviceAPI) :
);
m_basebandSink->moveToThread(&m_thread);
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
@ -106,7 +106,7 @@ void ATVDemod::start()
DSPSignalNotification* notifToSink = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
m_basebandSink->getInputMessageQueue()->push(notifToSink);
ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(m_settings, true);
ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(QStringList(), m_settings, true);
m_basebandSink->getInputMessageQueue()->push(msg);
}
@ -129,7 +129,7 @@ bool ATVDemod::handleMessage(const Message& cmd)
if (MsgConfigureATVDemod::match(cmd))
{
MsgConfigureATVDemod& cfg = (MsgConfigureATVDemod&) cmd;
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -161,41 +161,20 @@ void ATVDemod::setCenterFrequency(qint64 frequency)
{
ATVDemodSettings settings = m_settings;
settings.m_inputFrequencyOffset = frequency;
applySettings(settings, false);
applySettings(QStringList("inputFrequencyOffset"), settings, false);
if (getMessageQueueToGUI())
{
MsgConfigureATVDemod *msg = MsgConfigureATVDemod::create(settings, false);
MsgConfigureATVDemod *msg = MsgConfigureATVDemod::create(QStringList("inputFrequencyOffset"), settings, false);
getMessageQueueToGUI()->push(msg);
}
}
void ATVDemod::applySettings(const ATVDemodSettings& settings, bool force)
void ATVDemod::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force)
{
qDebug() << "ATVDemod::applySettings:"
<< "m_inputFrequencyOffset:" << settings.m_inputFrequencyOffset
<< "m_bfoFrequency:" << settings.m_bfoFrequency
<< "m_atvModulation:" << settings.m_atvModulation
<< "m_fmDeviation:" << settings.m_fmDeviation
<< "m_fftFiltering:" << settings.m_fftFiltering
<< "m_fftOppBandwidth:" << settings.m_fftOppBandwidth
<< "m_fftBandwidth:" << settings.m_fftBandwidth
<< "m_nbLines:" << settings.m_nbLines
<< "m_fps:" << settings.m_fps
<< "m_atvStd:" << settings.m_atvStd
<< "m_hSync:" << settings.m_hSync
<< "m_vSync:" << settings.m_vSync
<< "m_invertVideo:" << settings.m_invertVideo
<< "m_halfFrames:" << settings.m_halfFrames
<< "m_levelSynchroTop:" << settings.m_levelSynchroTop
<< "m_levelBlack:" << settings.m_levelBlack
<< "m_rgbColor:" << settings.m_rgbColor
<< "m_title:" << settings.m_title
<< "m_udpAddress:" << settings.m_udpAddress
<< "m_udpPort:" << settings.m_udpPort
<< "force:" << force;
qDebug() << "ATVDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
if (m_settings.m_streamIndex != settings.m_streamIndex)
if (settingsKeys.contains("m_streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex)
{
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
{
@ -208,10 +187,14 @@ void ATVDemod::applySettings(const ATVDemodSettings& settings, bool force)
}
}
ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(settings, force);
ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(settingsKeys, settings, force);
m_basebandSink->getInputMessageQueue()->push(msg);
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
void ATVDemod::handleIndexInDeviceSetChanged(int index)

View File

@ -43,20 +43,23 @@ public:
public:
const ATVDemodSettings& getSettings() const { return m_settings; }
bool getForce() const { return m_force; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
static MsgConfigureATVDemod* create(const ATVDemodSettings& settings, bool force)
static MsgConfigureATVDemod* create(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force)
{
return new MsgConfigureATVDemod(settings, force);
return new MsgConfigureATVDemod(settingsKeys, settings, force);
}
private:
ATVDemodSettings m_settings;
bool m_force;
QStringList m_settingsKeys;
MsgConfigureATVDemod(const ATVDemodSettings& settings, bool force) :
MsgConfigureATVDemod(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_force(force)
m_force(force),
m_settingsKeys(settingsKeys)
{ }
};
@ -112,7 +115,7 @@ private:
int m_basebandSampleRate; //!< sample rate stored from device message used when starting baseband sink
virtual bool handleMessage(const Message& cmd);
void applySettings(const ATVDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force = false);
private slots:
void handleIndexInDeviceSetChanged(int index);

View File

@ -126,7 +126,7 @@ bool ATVDemodBaseband::handleMessage(const Message& cmd)
MsgConfigureATVDemodBaseband& cfg = (MsgConfigureATVDemodBaseband&) cmd;
qDebug() << "ATVDemodBaseband::handleMessage: MsgConfigureATVDemodBaseband";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -147,18 +147,18 @@ bool ATVDemodBaseband::handleMessage(const Message& cmd)
}
}
void ATVDemodBaseband::applySettings(const ATVDemodSettings& settings, bool force)
void ATVDemodBaseband::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force)
{
qDebug("ATVDemodBaseband::applySettings");
qDebug() << "ATVDemodBaseband::applySettings" << settings.getDebugString(settingsKeys, force);
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)|| force)
if ((settingsKeys.contains("m_inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force)
{
unsigned int desiredSampleRate = m_channelizer->getBasebandSampleRate();
m_channelizer->setChannelization(desiredSampleRate, settings.m_inputFrequencyOffset);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
}
m_sink.applySettings(settings, force);
m_sink.applySettings(settingsKeys, settings, force);
m_settings = settings;
}

View File

@ -41,20 +41,23 @@ public:
public:
const ATVDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureATVDemodBaseband* create(const ATVDemodSettings& settings, bool force)
static MsgConfigureATVDemodBaseband* create(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force)
{
return new MsgConfigureATVDemodBaseband(settings, force);
return new MsgConfigureATVDemodBaseband(settingsKeys, settings, force);
}
private:
ATVDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureATVDemodBaseband(const ATVDemodSettings& settings, bool force) :
MsgConfigureATVDemodBaseband(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -87,7 +90,7 @@ private:
QRecursiveMutex m_mutex;
bool handleMessage(const Message& cmd);
void applySettings(const ATVDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force = false);
private slots:
void handleInputMessages();

View File

@ -55,7 +55,7 @@ void ATVDemodGUI::resetToDefaults()
{
m_settings.resetToDefaults();
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
}
QByteArray ATVDemodGUI::serialize() const
@ -68,14 +68,14 @@ bool ATVDemodGUI::deserialize(const QByteArray& data)
if(m_settings.deserialize(data))
{
displaySettings();
applySettings(true); // will have true
applySettings(QStringList(), true); // will have true
return true;
}
else
{
m_settings.resetToDefaults();
displaySettings();
applySettings(true); // will have true
applySettings(QStringList(), true); // will have true
return false;
}
}
@ -184,7 +184,7 @@ void ATVDemodGUI::channelMarkerChangedByCursor()
qDebug("ATVDemodGUI::channelMarkerChangedByCursor");
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
applySettings();
applySettings(QStringList("inputFrequencyOffset"), false);
}
void ATVDemodGUI::channelMarkerHighlightedByCursor()
@ -247,7 +247,16 @@ void ATVDemodGUI::onMenuDialogCalled(const QPoint &p)
updateIndexLabel();
}
applySettings();
applySettings(QStringList({
"rgbColor",
"title",
"useReverseAPI",
"reverseAPIAddress",
"reverseAPIPort",
"reverseAPIDeviceIndex",
"reverseAPIChannelIndex"
}),
false);
}
resetContextMenuType();
@ -259,7 +268,7 @@ void ATVDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
(void) rollDown;
getRollupContents()->saveState(m_rollupState);
applySettings();
applySettings(QStringList(), false);
}
ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* objParent) :
@ -343,13 +352,13 @@ ATVDemodGUI::~ATVDemodGUI()
delete ui;
}
void ATVDemodGUI::applySettings(bool force)
void ATVDemodGUI::applySettings(const QStringList& settingsKeys, bool force)
{
qDebug() << "ATVDemodGUI::applySettings: " << force << " m_doApplySettings: " << m_doApplySettings;
if (m_doApplySettings)
{
ATVDemod::MsgConfigureATVDemod *msg = ATVDemod::MsgConfigureATVDemod::create(m_settings, force);
ATVDemod::MsgConfigureATVDemod *msg = ATVDemod::MsgConfigureATVDemod::create(settingsKeys, m_settings, force);
m_atvDemod->getInputMessageQueue()->push(msg);
}
}
@ -459,58 +468,58 @@ void ATVDemodGUI::on_synchLevel_valueChanged(int value)
{
ui->synchLevelText->setText(QString("%1 mV").arg(value));
m_settings.m_levelSynchroTop = value / 1000.0f;
applySettings();
applySettings(QStringList("levelSynchroTop"), false);
}
void ATVDemodGUI::on_blackLevel_valueChanged(int value)
{
ui->blackLevelText->setText(QString("%1 mV").arg(value));
m_settings.m_levelBlack = value / 1000.0f;
applySettings();
applySettings(QStringList("levelBlack"), false);
}
void ATVDemodGUI::on_hSync_clicked()
{
m_settings.m_hSync = ui->hSync->isChecked();
applySettings();
applySettings(QStringList("hSync"), false);
}
void ATVDemodGUI::on_vSync_clicked()
{
m_settings.m_vSync = ui->vSync->isChecked();
applySettings();
applySettings(QStringList("vSync"), false);
}
void ATVDemodGUI::on_invertVideo_clicked()
{
m_settings.m_invertVideo = ui->invertVideo->isChecked();
applySettings();
applySettings(QStringList("invertVideo"), false);
}
void ATVDemodGUI::on_halfImage_clicked()
{
m_settings.m_halfFrames = ui->halfImage->isChecked();
applySettings();
applySettings(QStringList("halfFrames"), false);
}
void ATVDemodGUI::on_nbLines_currentIndexChanged(int index)
{
m_settings.m_nbLines = ATVDemodSettings::getNumberOfLines(index);
applySampleRate();
applySettings();
applySettings(QStringList("nbLines"), false);
}
void ATVDemodGUI::on_fps_currentIndexChanged(int index)
{
m_settings.m_fps = ATVDemodSettings::getFps(index);
applySampleRate();
applySettings();
applySettings(QStringList("fps"), false);
}
void ATVDemodGUI::on_standard_currentIndexChanged(int index)
{
m_settings.m_atvStd = (ATVDemodSettings::ATVStd) index;
applySettings();
applySettings(QStringList("atvStd"), false);
}
void ATVDemodGUI::on_reset_clicked(bool checked)
@ -524,7 +533,7 @@ void ATVDemodGUI::on_modulation_currentIndexChanged(int index)
m_settings.m_atvModulation = (ATVDemodSettings::ATVModulation) index;
setRFFiltersSlidersRange(m_basebandSampleRate);
setChannelMarkerBandwidth();
applySettings();
applySettings(QStringList("atvModulation"), false);
}
void ATVDemodGUI::on_rfBW_valueChanged(int value)
@ -532,7 +541,7 @@ void ATVDemodGUI::on_rfBW_valueChanged(int value)
m_settings.m_fftBandwidth = value * m_rfSliderDivisor;
ui->rfBWText->setText(QString("%1k").arg((value * m_rfSliderDivisor) / 1000.0, 0, 'f', 0));
setChannelMarkerBandwidth();
applySettings();
applySettings(QStringList("fftBandwidth"), false);
}
void ATVDemodGUI::on_rfOppBW_valueChanged(int value)
@ -540,7 +549,7 @@ void ATVDemodGUI::on_rfOppBW_valueChanged(int value)
m_settings.m_fftOppBandwidth = value * m_rfSliderDivisor;
ui->rfOppBWText->setText(QString("%1k").arg((value * m_rfSliderDivisor) / 1000.0, 0, 'f', 0));
setChannelMarkerBandwidth();
applySettings();
applySettings(QStringList("fftOppBandwidth"), false);
}
void ATVDemodGUI::on_rfFiltering_toggled(bool checked)
@ -548,7 +557,7 @@ void ATVDemodGUI::on_rfFiltering_toggled(bool checked)
m_settings.m_fftFiltering = checked;
setRFFiltersSlidersRange(m_basebandSampleRate);
setChannelMarkerBandwidth();
applySettings();
applySettings(QStringList("fftFiltering"), false);
}
void ATVDemodGUI::on_deltaFrequency_changed(qint64 value)
@ -556,21 +565,21 @@ void ATVDemodGUI::on_deltaFrequency_changed(qint64 value)
m_settings.m_inputFrequencyOffset = value;
m_channelMarker.setCenterFrequency(value);
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList("inputFrequencyOffset"), false);
}
void ATVDemodGUI::on_bfo_valueChanged(int value)
{
m_settings.m_bfoFrequency = value;
ui->bfoText->setText(QString("%1").arg(value * 1.0, 0, 'f', 0));
applySettings();
applySettings(QStringList("bfoFrequency"), false);
}
void ATVDemodGUI::on_fmDeviation_valueChanged(int value)
{
m_settings.m_fmDeviation = value / 1000.0f;
ui->fmDeviationText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1));
applySettings();
applySettings(QStringList("fmDeviation"), false);
}
void ATVDemodGUI::on_amScaleFactor_valueChanged(int value)
@ -578,7 +587,7 @@ void ATVDemodGUI::on_amScaleFactor_valueChanged(int value)
m_settings.m_amScalingFactor = value;
ui->amScaleFactor->setValue(m_settings.m_amScalingFactor);
ui->amScaleFactorText->setText(QString("%1").arg(m_settings.m_amScalingFactor));
applySettings();
applySettings(QStringList("amScalingFactor"), false);
}
void ATVDemodGUI::on_amScaleOffset_valueChanged(int value)
@ -586,7 +595,7 @@ void ATVDemodGUI::on_amScaleOffset_valueChanged(int value)
m_settings.m_amOffsetFactor = value;
ui->amScaleOffset->setValue(m_settings.m_amOffsetFactor);
ui->amScaleOffsetText->setText(QString("%1").arg(m_settings.m_amOffsetFactor));
applySettings();
applySettings(QStringList("amOffsetFactor"), false);
}
void ATVDemodGUI::on_screenTabWidget_currentChanged(int index)

View File

@ -91,7 +91,7 @@ private:
explicit ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* objParent = 0);
virtual ~ATVDemodGUI();
void applySettings(bool force = false);
void applySettings(const QStringList& settingsKeys, bool force = false);
void displaySettings();
void displayRFBandwidths();
void applySampleRate();

View File

@ -343,6 +343,198 @@ int ATVDemodSettings::getNumberOfLinesIndex(int nbLines)
}
}
void ATVDemodSettings::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings)
{
if (settingsKeys.contains("inputFrequencyOffset")) {
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
}
if (settingsKeys.contains("bfoFrequency")) {
m_bfoFrequency = settings.m_bfoFrequency;
}
if (settingsKeys.contains("atvModulation")) {
m_atvModulation = settings.m_atvModulation;
}
if (settingsKeys.contains("fmDeviation")) {
m_fmDeviation = settings.m_fmDeviation;
}
if (settingsKeys.contains("amScalingFactor")) {
m_amScalingFactor = settings.m_amScalingFactor;
}
if (settingsKeys.contains("amOffsetFactor")) {
m_amOffsetFactor = settings.m_amOffsetFactor;
}
if (settingsKeys.contains("fftFiltering")) {
m_fftFiltering = settings.m_fftFiltering;
}
if (settingsKeys.contains("fftOppBandwidth")) {
m_fftOppBandwidth = settings.m_fftOppBandwidth;
}
if (settingsKeys.contains("fftBandwidth")) {
m_fftBandwidth = settings.m_fftBandwidth;
}
if (settingsKeys.contains("nbLines")) {
m_nbLines = settings.m_nbLines;
}
if (settingsKeys.contains("fps")) {
m_fps = settings.m_fps;
}
if (settingsKeys.contains("atvStd")) {
m_atvStd = settings.m_atvStd;
}
if (settingsKeys.contains("hSync")) {
m_hSync = settings.m_hSync;
}
if (settingsKeys.contains("vSync")) {
m_vSync = settings.m_vSync;
}
if (settingsKeys.contains("invertVideo")) {
m_invertVideo = settings.m_invertVideo;
}
if (settingsKeys.contains("halfFrames")) {
m_halfFrames = settings.m_halfFrames;
}
if (settingsKeys.contains("levelSynchroTop")) {
m_levelSynchroTop = settings.m_levelSynchroTop;
}
if (settingsKeys.contains("levelBlack")) {
m_levelBlack = settings.m_levelBlack;
}
if (settingsKeys.contains("rgbColor")) {
m_rgbColor = settings.m_rgbColor;
}
if (settingsKeys.contains("title")) {
m_title = settings.m_title;
}
if (settingsKeys.contains("udpAddress")) {
m_udpAddress = settings.m_udpAddress;
}
if (settingsKeys.contains("udpPort")) {
m_udpPort = settings.m_udpPort;
}
if (settingsKeys.contains("streamIndex")) {
m_streamIndex = settings.m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress")) {
m_reverseAPIAddress = settings.m_reverseAPIAddress;
}
if (settingsKeys.contains("reverseAPIPort")) {
m_reverseAPIPort = settings.m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex")) {
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex")) {
m_workspaceIndex = settings.m_workspaceIndex;
}
if (settingsKeys.contains("hidden")) {
m_hidden = settings.m_hidden;
}
}
QString ATVDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
{
std::ostringstream ostr;
if (settingsKeys.contains("inputFrequencyOffset") || force) {
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
}
if (settingsKeys.contains("bfoFrequency") || force) {
ostr << " m_bfoFrequency: " << m_bfoFrequency;
}
if (settingsKeys.contains("atvModulation") || force) {
ostr << " m_atvModulation: " << m_atvModulation;
}
if (settingsKeys.contains("fmDeviation") || force) {
ostr << " m_fmDeviation: " << m_fmDeviation;
}
if (settingsKeys.contains("amScalingFactor") || force) {
ostr << " m_amScalingFactor: " << m_amScalingFactor;
}
if (settingsKeys.contains("amOffsetFactor") || force) {
ostr << " m_amOffsetFactor: " << m_amOffsetFactor;
}
if (settingsKeys.contains("fftFiltering") || force) {
ostr << " m_fftFiltering: " << m_fftFiltering;
}
if (settingsKeys.contains("fftOppBandwidth") || force) {
ostr << " m_fftOppBandwidth: " << m_fftOppBandwidth;
}
if (settingsKeys.contains("fftBandwidth") || force) {
ostr << " m_fftBandwidth: " << m_fftBandwidth;
}
if (settingsKeys.contains("nbLines") || force) {
ostr << " m_nbLines: " << m_nbLines;
}
if (settingsKeys.contains("fps") || force) {
ostr << " m_fps: " << m_fps;
}
if (settingsKeys.contains("atvStd") || force) {
ostr << " m_atvStd: " << m_atvStd;
}
if (settingsKeys.contains("hSync") || force) {
ostr << " m_hSync: " << m_hSync;
}
if (settingsKeys.contains("vSync") || force) {
ostr << " m_vSync: " << m_vSync;
}
if (settingsKeys.contains("invertVideo") || force) {
ostr << " m_invertVideo: " << m_invertVideo;
}
if (settingsKeys.contains("halfFrames") || force) {
ostr << " m_halfFrames: " << m_halfFrames;
}
if (settingsKeys.contains("levelSynchroTop") || force) {
ostr << " m_levelSynchroTop: " << m_levelSynchroTop;
}
if (settingsKeys.contains("levelBlack") || force) {
ostr << " m_levelBlack: " << m_levelBlack;
}
if (settingsKeys.contains("rgbColor") || force) {
ostr << " m_rgbColor: " << m_rgbColor;
}
if (settingsKeys.contains("title") || force) {
ostr << " m_title: " << m_title.toStdString();
}
if (settingsKeys.contains("udpAddress") || force) {
ostr << " m_udpAddress: " << m_udpAddress.toStdString();
}
if (settingsKeys.contains("udpPort") || force) {
ostr << " m_udpPort: " << m_udpPort;
}
if (settingsKeys.contains("streamIndex") || force) {
ostr << " m_streamIndex: " << m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress") || force) {
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
}
if (settingsKeys.contains("reverseAPIPort") || force) {
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex") || force) {
ostr << " m_workspaceIndex: " << m_workspaceIndex;
}
if (settingsKeys.contains("hidden") || force) {
ostr << " m_hidden: " << m_hidden;
}
return QString(ostr.str().c_str());
}
float ATVDemodSettings::getNominalLineTime(int nbLines, int fps)
{
return 1.0f / ((float) nbLines * (float) fps);

View File

@ -91,6 +91,8 @@ struct ATVDemodSettings
void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; }
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings);
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
int getRFSliderDivisor(unsigned int sampleRate);

View File

@ -70,7 +70,7 @@ ATVDemodSink::ATVDemodSink() :
m_objPhaseDiscri.setFMScaling(1.0f);
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
}
@ -465,33 +465,11 @@ void ATVDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
m_channelFrequencyOffset = channelFrequencyOffset;
}
void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force)
void ATVDemodSink::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force)
{
qDebug() << "ATVDemodSink::applySettings:"
<< "m_inputFrequencyOffset:" << settings.m_inputFrequencyOffset
<< "m_bfoFrequency:" << settings.m_bfoFrequency
<< "m_atvModulation:" << settings.m_atvModulation
<< "m_fmDeviation:" << settings.m_fmDeviation
<< "m_fftFiltering:" << settings.m_fftFiltering
<< "m_fftOppBandwidth:" << settings.m_fftOppBandwidth
<< "m_fftBandwidth:" << settings.m_fftBandwidth
<< "m_nbLines:" << settings.m_nbLines
<< "m_fps:" << settings.m_fps
<< "m_atvStd:" << settings.m_atvStd
<< "m_hSync:" << settings.m_hSync
<< "m_vSync:" << settings.m_vSync
<< "m_invertVideo:" << settings.m_invertVideo
<< "m_halfFrames:" << settings.m_halfFrames
<< "m_levelSynchroTop:" << settings.m_levelSynchroTop
<< "m_levelBlack:" << settings.m_levelBlack
<< "m_rgbColor:" << settings.m_rgbColor
<< "m_title:" << settings.m_title
<< "m_udpAddress:" << settings.m_udpAddress
<< "m_udpPort:" << settings.m_udpPort
<< "force:" << force;
qDebug() << "ATVDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force);
if ((settings.m_fftBandwidth != m_settings.m_fftBandwidth)
|| (settings.m_fftOppBandwidth != m_settings.m_fftOppBandwidth) || force)
if (settingsKeys.contains("fftBandwidth") || settingsKeys.contains("fftOppBandwidth") || force)
{
m_DSBFilter->create_asym_filter(
settings.m_fftOppBandwidth / (float) m_channelSampleRate,
@ -501,7 +479,7 @@ void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force)
m_DSBFilterBufferIndex = 0;
}
if ((settings.m_bfoFrequency != m_settings.m_bfoFrequency) || force)
if (settingsKeys.contains("bfoFrequency") || force)
{
m_bfoPLL.configure((float) settings.m_bfoFrequency / (float) m_channelSampleRate,
100.0 / m_channelSampleRate,
@ -509,9 +487,7 @@ void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force)
m_bfoFilter.setFrequencies(m_channelSampleRate, settings.m_bfoFrequency);
}
if ((settings.m_nbLines != m_settings.m_nbLines)
|| (settings.m_fps != m_settings.m_fps)
|| (settings.m_atvStd != m_settings.m_atvStd) || force)
if (settingsKeys.contains("nbLines") || settingsKeys.contains("fps") || settingsKeys.contains("atvStd") || force)
{
unsigned int samplesPerLineNom;
ATVDemodSettings::getBaseValues(m_channelSampleRate, settings.m_nbLines * settings.m_fps, samplesPerLineNom);
@ -539,13 +515,17 @@ void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force)
m_fieldIndex = 0;
}
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) {
if (settingsKeys.contains("fmDeviation") || force) {
m_objPhaseDiscri.setFMScaling(1.0f / settings.m_fmDeviation);
}
if ((settings.m_levelBlack != m_settings.m_levelBlack) || force) {
if (settingsKeys.contains("levelBlack") || force) {
m_sampleRangeCorrection = 255.0f / (1.0f - m_settings.m_levelBlack);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}

View File

@ -54,7 +54,7 @@ public:
void setVideoTabIndex(int videoTabIndex) { m_videoTabIndex = videoTabIndex; }
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
void applySettings(const ATVDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force = false);
private:
struct ATVConfigPrivate

View File

@ -58,7 +58,7 @@ BFMDemod::BFMDemod(DeviceAPI *deviceAPI) :
m_basebandSampleRate(0)
{
setObjectName(m_channelId);
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
@ -140,7 +140,7 @@ void BFMDemod::start()
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, 0);
m_basebandSink->getInputMessageQueue()->push(dspMsg);
BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(m_settings, true);
BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(QStringList(), m_settings, true);
m_basebandSink->getInputMessageQueue()->push(msg);
SpectrumSettings spectrumSettings = m_spectrumVis.getSettings();
@ -170,7 +170,7 @@ bool BFMDemod::handleMessage(const Message& cmd)
MsgConfigureBFMDemod& cfg = (MsgConfigureBFMDemod&) cmd;
qDebug() << "BFMDemod::handleMessage: MsgConfigureBFMDemod";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -202,73 +202,20 @@ void BFMDemod::setCenterFrequency(qint64 frequency)
{
BFMDemodSettings settings = m_settings;
settings.m_inputFrequencyOffset = frequency;
applySettings(settings, false);
applySettings(QStringList({"inputFrequencyOffset"}), settings, false);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(settings, false);
MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(QStringList({"inputFrequencyOffset"}), settings, false);
m_guiMessageQueue->push(msgToGUI);
}
}
void BFMDemod::applySettings(const BFMDemodSettings& settings, bool force)
void BFMDemod::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force)
{
qDebug() << "BFMDemod::applySettings: MsgConfigureBFMDemod:"
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
<< " m_rfBandwidth: " << settings.m_rfBandwidth
<< " m_afBandwidth: " << settings.m_afBandwidth
<< " m_deEmphasis: " << settings.getDeEmphasisTimeConstant()
<< " m_volume: " << settings.m_volume
<< " m_squelch: " << settings.m_squelch
<< " m_audioStereo: " << settings.m_audioStereo
<< " m_lsbStereo: " << settings.m_lsbStereo
<< " m_showPilot: " << settings.m_showPilot
<< " m_rdsActive: " << settings.m_rdsActive
<< " m_audioDeviceName: " << settings.m_audioDeviceName
<< " m_streamIndex: " << settings.m_streamIndex
<< " m_useReverseAPI: " << settings.m_useReverseAPI
<< " force: " << force;
qDebug() << "BFMDemod::applySettings: MsgConfigureBFMDemod:" << settings.getDebugString(settingsKeys, force);
QList<QString> reverseAPIKeys;
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) {
reverseAPIKeys.append("inputFrequencyOffset");
}
if ((settings.m_volume != m_settings.m_volume) || force) {
reverseAPIKeys.append("volume");
}
if ((settings.m_audioMute != m_settings.m_audioMute) || force) {
reverseAPIKeys.append("audioMute");
}
if ((settings.m_audioStereo != m_settings.m_audioStereo) || force) {
reverseAPIKeys.append("audioStereo");
}
if ((settings.m_lsbStereo != m_settings.m_lsbStereo) || force) {
reverseAPIKeys.append("lsbStereo");
}
if ((settings.m_showPilot != m_settings.m_showPilot) || force) {
reverseAPIKeys.append("showPilot");
}
if ((settings.m_rdsActive != m_settings.m_rdsActive) || force) {
reverseAPIKeys.append("rdsActive");
}
if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || force) {
reverseAPIKeys.append("afBandwidth");
}
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) {
reverseAPIKeys.append("rfBandwidth");
}
if ((settings.m_deEmphasis != m_settings.m_deEmphasis) || force) {
reverseAPIKeys.append("deEmphasis");
}
if ((settings.m_squelch != m_settings.m_squelch) || force) {
reverseAPIKeys.append("squelch");
}
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) {
reverseAPIKeys.append("audioDeviceName");
}
if (m_settings.m_streamIndex != settings.m_streamIndex)
if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex))
{
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
{
@ -279,34 +226,36 @@ void BFMDemod::applySettings(const BFMDemodSettings& settings, bool force)
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
emit streamIndexChanged(settings.m_streamIndex);
}
reverseAPIKeys.append("streamIndex");
}
if (m_running)
{
BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(settings, force);
BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(settingsKeys, settings, force);
m_basebandSink->getInputMessageQueue()->push(msg);
}
if (settings.m_useReverseAPI)
{
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) ||
(settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) ||
(settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) ||
(settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) ||
(settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex));
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
QList<ObjectPipe*> pipes;
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (pipes.size() > 0) {
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
sendChannelSettings(pipes, settingsKeys, settings, force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
QByteArray BFMDemod::serialize() const
@ -318,14 +267,14 @@ bool BFMDemod::deserialize(const QByteArray& data)
{
if (m_settings.deserialize(data))
{
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(m_settings, true);
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return true;
}
else
{
m_settings.resetToDefaults();
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(m_settings, true);
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return false;
}
@ -361,13 +310,13 @@ int BFMDemod::webapiSettingsPutPatch(
BFMDemodSettings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(settings, force);
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(channelSettingsKeys, settings, force);
m_inputMessageQueue.push(msg);
qDebug("BFMDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(settings, force);
MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(channelSettingsKeys, settings, force);
m_guiMessageQueue->push(msgToGUI);
}
@ -609,7 +558,7 @@ void BFMDemod::webapiFormatRDSReport(SWGSDRangel::SWGRDSReport *report)
}
}
void BFMDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const BFMDemodSettings& settings, bool force)
void BFMDemod::webapiReverseSendSettings(const QStringList& channelSettingsKeys, const BFMDemodSettings& settings, bool force)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
@ -636,7 +585,7 @@ void BFMDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, co
void BFMDemod::sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QStringList& channelSettingsKeys,
const BFMDemodSettings& settings,
bool force)
{
@ -660,7 +609,7 @@ void BFMDemod::sendChannelSettings(
}
void BFMDemod::webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const BFMDemodSettings& settings,
bool force

View File

@ -52,20 +52,23 @@ public:
public:
const BFMDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureBFMDemod* create(const BFMDemodSettings& settings, bool force)
static MsgConfigureBFMDemod* create(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force)
{
return new MsgConfigureBFMDemod(settings, force);
return new MsgConfigureBFMDemod(settingsKeys, settings, force);
}
private:
BFMDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureBFMDemod(const BFMDemodSettings& settings, bool force) :
MsgConfigureBFMDemod(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -173,19 +176,19 @@ private:
QNetworkRequest m_networkRequest;
virtual bool handleMessage(const Message& cmd);
void applySettings(const BFMDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force = false);
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiFormatRDSReport(SWGSDRangel::SWGRDSReport *report);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const BFMDemodSettings& settings, bool force);
void webapiReverseSendSettings(const QStringList& channelSettingsKeys, const BFMDemodSettings& settings, bool force);
void sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QStringList& channelSettingsKeys,
const BFMDemodSettings& settings,
bool force
);
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const BFMDemodSettings& settings,
bool force

View File

@ -143,7 +143,7 @@ bool BFMDemodBaseband::handleMessage(const Message& cmd)
MsgConfigureBFMDemodBaseband& cfg = (MsgConfigureBFMDemodBaseband&) cmd;
qDebug() << "BFMDemodBaseband::handleMessage: MsgConfigureBFMDemodBaseband";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -182,10 +182,10 @@ bool BFMDemodBaseband::handleMessage(const Message& cmd)
}
}
void BFMDemodBaseband::applySettings(const BFMDemodSettings& settings, bool force)
void BFMDemodBaseband::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force)
{
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth)
|| (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth))
|| (settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force)
{
m_channelizer->setChannelization(BFMDemodSettings::requiredBW(settings.m_rfBandwidth), settings.m_inputFrequencyOffset);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
@ -209,7 +209,7 @@ void BFMDemodBaseband::applySettings(const BFMDemodSettings& settings, bool forc
}
}
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force)
{
AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
@ -223,9 +223,13 @@ void BFMDemodBaseband::applySettings(const BFMDemodSettings& settings, bool forc
}
}
m_sink.applySettings(settings, force);
m_sink.applySettings(settingsKeys, settings, force);
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int BFMDemodBaseband::getChannelSampleRate() const

View File

@ -41,20 +41,23 @@ public:
public:
const BFMDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureBFMDemodBaseband* create(const BFMDemodSettings& settings, bool force)
static MsgConfigureBFMDemodBaseband* create(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force)
{
return new MsgConfigureBFMDemodBaseband(settings, force);
return new MsgConfigureBFMDemodBaseband(settingsKeys, settings, force);
}
private:
BFMDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureBFMDemodBaseband(const BFMDemodSettings& settings, bool force) :
MsgConfigureBFMDemodBaseband(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -103,7 +106,7 @@ private:
MessageQueue *getMessageQueueToGUI() { return m_messageQueueToGUI; }
bool handleMessage(const Message& cmd);
void applySettings(const BFMDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force = false);
private slots:
void handleInputMessages();

View File

@ -72,7 +72,7 @@ void BFMDemodGUI::resetToDefaults()
ui->g14AltFrequencies->setEnabled(false);
blockApplySettings(false);
applySettings();
applySettings(QStringList(), true);
}
QByteArray BFMDemodGUI::serialize() const
@ -84,7 +84,7 @@ bool BFMDemodGUI::deserialize(const QByteArray& data)
{
if(m_settings.deserialize(data)) {
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
return true;
} else {
resetToDefaults();
@ -148,7 +148,7 @@ void BFMDemodGUI::channelMarkerChangedByCursor()
{
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
applySettings();
applySettings(QStringList({"inputFrequencyOffset"}));
}
void BFMDemodGUI::channelMarkerHighlightedByCursor()
@ -161,7 +161,7 @@ void BFMDemodGUI::on_deltaFrequency_changed(qint64 value)
m_channelMarker.setCenterFrequency(value);
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList({"inputFrequencyOffset"}));
}
void BFMDemodGUI::on_rfBW_valueChanged(int value)
@ -169,40 +169,40 @@ void BFMDemodGUI::on_rfBW_valueChanged(int value)
ui->rfBWText->setText(QString("%1 kHz").arg(BFMDemodSettings::getRFBW(value) / 1000.0));
m_channelMarker.setBandwidth(BFMDemodSettings::getRFBW(value));
m_settings.m_rfBandwidth = BFMDemodSettings::getRFBW(value);
applySettings();
applySettings(QStringList({"rfBandwidth"}));
}
void BFMDemodGUI::on_afBW_valueChanged(int value)
{
ui->afBWText->setText(QString("%1 kHz").arg(value));
m_settings.m_afBandwidth = value * 1000.0;
applySettings();
applySettings(QStringList({"afBandwidth"}));
}
void BFMDemodGUI::on_deEmphasis_currentIndexChanged(int index)
{
m_settings.m_deEmphasis = static_cast<BFMDemodSettings::DeEmphasis>(index);
applySettings();
applySettings(QStringList({"deEmphasis"}));
}
void BFMDemodGUI::on_volume_valueChanged(int value)
{
ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1));
m_settings.m_volume = value / 10.0;
applySettings();
applySettings(QStringList({"volume"}));
}
void BFMDemodGUI::on_squelch_valueChanged(int value)
{
ui->squelchText->setText(QString("%1 dB").arg(value));
m_settings.m_squelch = value;
applySettings();
applySettings(QStringList({"squelch"}));
}
void BFMDemodGUI::on_audioMute_toggled(bool mute)
{
m_settings.m_audioMute = mute;
applySettings();
applySettings(QStringList({"audioMute"}));
}
void BFMDemodGUI::on_audioStereo_toggled(bool stereo)
@ -213,25 +213,25 @@ void BFMDemodGUI::on_audioStereo_toggled(bool stereo)
}
m_settings.m_audioStereo = stereo;
applySettings();
applySettings(QStringList({"audioStereo"}));
}
void BFMDemodGUI::on_lsbStereo_toggled(bool lsb)
{
m_settings.m_lsbStereo = lsb;
applySettings();
applySettings(QStringList({"lsbStereo"}));
}
void BFMDemodGUI::on_showPilot_clicked()
{
m_settings.m_showPilot = ui->showPilot->isChecked();
applySettings();
applySettings(QStringList({"showPilot"}));
}
void BFMDemodGUI::on_rds_clicked()
{
m_settings.m_rdsActive = ui->rds->isChecked();
applySettings();
applySettings(QStringList({"rdsActive"}));
}
void BFMDemodGUI::on_clearData_clicked(bool checked)
@ -339,7 +339,7 @@ void BFMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
(void) rollDown;
getRollupContents()->saveState(m_rollupState);
applySettings();
applySettings(QStringList());
}
void BFMDemodGUI::onMenuDialogCalled(const QPoint &p)
@ -384,7 +384,9 @@ void BFMDemodGUI::onMenuDialogCalled(const QPoint &p)
updateIndexLabel();
}
applySettings();
applySettings(QStringList({"title", "rgbColor", "useReverseAPI",
"reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex",
"reverseAPIChannelIndex", "streamIndex"}));
}
resetContextMenuType();
@ -472,7 +474,7 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
rdsUpdate(true);
displaySettings();
makeUIConnections();
applySettings(true);
applySettings(QStringList(), true);
m_resizer.enableChildMouseTracking();
}
@ -486,11 +488,11 @@ void BFMDemodGUI::blockApplySettings(bool block)
m_doApplySettings = !block;
}
void BFMDemodGUI::applySettings(bool force)
void BFMDemodGUI::applySettings(const QStringList& channelSettingsKeys, bool force)
{
if (m_doApplySettings)
{
BFMDemod::MsgConfigureBFMDemod* msgConfig = BFMDemod::MsgConfigureBFMDemod::create( m_settings, force);
BFMDemod::MsgConfigureBFMDemod* msgConfig = BFMDemod::MsgConfigureBFMDemod::create(channelSettingsKeys, m_settings, force);
m_bfmDemod->getInputMessageQueue()->push(msgConfig);
}
}
@ -562,7 +564,7 @@ void BFMDemodGUI::audioSelect(const QPoint& p)
if (audioSelect.m_selected)
{
m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName;
applySettings();
applySettings(QStringList({"audioDeviceName"}));
}
}

View File

@ -91,7 +91,7 @@ private:
virtual ~BFMDemodGUI();
void blockApplySettings(bool block);
void applySettings(bool force = false);
void applySettings(const QStringList& settingsKeys, bool force = false);
void displaySettings();
void rdsUpdate(bool force);
void rdsUpdateFixedFields();

View File

@ -195,6 +195,150 @@ bool BFMDemodSettings::deserialize(const QByteArray& data)
}
}
void BFMDemodSettings::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings)
{
if (settingsKeys.contains("inputFrequencyOffset")) {
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
}
if (settingsKeys.contains("rfBandwidth")) {
m_rfBandwidth = settings.m_rfBandwidth;
}
if (settingsKeys.contains("afBandwidth")) {
m_afBandwidth = settings.m_afBandwidth;
}
if (settingsKeys.contains("volume")) {
m_volume = settings.m_volume;
}
if (settingsKeys.contains("squelch")) {
m_squelch = settings.m_squelch;
}
if (settingsKeys.contains("audioMute")) {
m_audioMute = settings.m_audioMute;
}
if (settingsKeys.contains("audioStereo")) {
m_audioStereo = settings.m_audioStereo;
}
if (settingsKeys.contains("lsbStereo")) {
m_lsbStereo = settings.m_lsbStereo;
}
if (settingsKeys.contains("showPilot")) {
m_showPilot = settings.m_showPilot;
}
if (settingsKeys.contains("rdsActive")) {
m_rdsActive = settings.m_rdsActive;
}
if (settingsKeys.contains("deEmphasis")) {
m_deEmphasis = settings.m_deEmphasis;
}
if (settingsKeys.contains("rgbColor")) {
m_rgbColor = settings.m_rgbColor;
}
if (settingsKeys.contains("title")) {
m_title = settings.m_title;
}
if (settingsKeys.contains("audioDeviceName")) {
m_audioDeviceName = settings.m_audioDeviceName;
}
if (settingsKeys.contains("streamIndex")) {
m_streamIndex = settings.m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress")) {
m_reverseAPIAddress = settings.m_reverseAPIAddress;
}
if (settingsKeys.contains("reverseAPIPort")) {
m_reverseAPIPort = settings.m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex")) {
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex")) {
m_workspaceIndex = settings.m_workspaceIndex;
}
if (settingsKeys.contains("hidden")) {
m_hidden = settings.m_hidden;
}
}
QString BFMDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
{
std::ostringstream ostr;
if (settingsKeys.contains("inputFrequencyOffset") || force) {
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
}
if (settingsKeys.contains("rfBandwidth") || force) {
ostr << " m_rfBandwidth: " << m_rfBandwidth;
}
if (settingsKeys.contains("afBandwidth") || force) {
ostr << " m_afBandwidth: " << m_afBandwidth;
}
if (settingsKeys.contains("volume") || force) {
ostr << " m_volume: " << m_volume;
}
if (settingsKeys.contains("squelch") || force) {
ostr << " m_squelch: " << m_squelch;
}
if (settingsKeys.contains("audioMute") || force) {
ostr << " m_audioMute: " << m_audioMute;
}
if (settingsKeys.contains("audioStereo") || force) {
ostr << " m_audioStereo: " << m_audioStereo;
}
if (settingsKeys.contains("lsbStereo") || force) {
ostr << " m_lsbStereo: " << m_lsbStereo;
}
if (settingsKeys.contains("showPilot") || force) {
ostr << " m_showPilot: " << m_showPilot;
}
if (settingsKeys.contains("rdsActive") || force) {
ostr << " m_rdsActive: " << m_rdsActive;
}
if (settingsKeys.contains("deEmphasis") || force) {
ostr << " m_deEmphasis: " << m_deEmphasis;
}
if (settingsKeys.contains("rgbColor") || force) {
ostr << " m_rgbColor: " << m_rgbColor;
}
if (settingsKeys.contains("title") || force) {
ostr << " m_title: " << m_title.toStdString();
}
if (settingsKeys.contains("audioDeviceName") || force) {
ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString();
}
if (settingsKeys.contains("streamIndex") || force) {
ostr << " m_streamIndex: " << m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress") || force) {
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
}
if (settingsKeys.contains("reverseAPIPort") || force) {
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex") || force) {
ostr << " m_workspaceIndex: " << m_workspaceIndex;
}
if (settingsKeys.contains("hidden") || force) {
ostr << " m_hidden: " << m_hidden;
}
return QString(ostr.str().c_str());
}
int BFMDemodSettings::getRFBW(int index)
{
if (index < 0) {

View File

@ -71,6 +71,8 @@ struct BFMDemodSettings
void setSpectrumGUI(Serializable *spectrumGUI) { m_spectrumGUI = spectrumGUI; }
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
void applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings);
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
static int getRFBW(int index);
static int getRFBWIndex(int rfbw);

View File

@ -76,7 +76,7 @@ BFMDemodSink::BFMDemodSink() :
m_demodBuffer.resize(1<<13);
m_demodBufferFill = 0;
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
}
@ -331,37 +331,23 @@ void BFMDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
m_channelFrequencyOffset = channelFrequencyOffset;
}
void BFMDemodSink::applySettings(const BFMDemodSettings& settings, bool force)
void BFMDemodSink::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force)
{
qDebug() << "BFMDemodSink::applySettings: MsgConfigureBFMDemod:"
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
<< " m_rfBandwidth: " << settings.m_rfBandwidth
<< " m_afBandwidth: " << settings.m_afBandwidth
<< " m_deEmphasis: " << settings.getDeEmphasisTimeConstant()
<< " m_volume: " << settings.m_volume
<< " m_squelch: " << settings.m_squelch
<< " m_audioStereo: " << settings.m_audioStereo
<< " m_lsbStereo: " << settings.m_lsbStereo
<< " m_showPilot: " << settings.m_showPilot
<< " m_rdsActive: " << settings.m_rdsActive
<< " m_audioDeviceName: " << settings.m_audioDeviceName
<< " m_streamIndex: " << settings.m_streamIndex
<< " m_useReverseAPI: " << settings.m_useReverseAPI
<< " force: " << force;
qDebug() << "BFMDemodSink::applySettings: MsgConfigureBFMDemod:" << settings.getDebugString(settingsKeys, force);
if ((settings.m_audioStereo && (settings.m_audioStereo != m_settings.m_audioStereo)) || force)
if ((settingsKeys.contains("audioStereo") && (settings.m_audioStereo != m_settings.m_audioStereo)) || force)
{
m_pilotPLL.configure(19000.0/m_channelSampleRate, 50.0/m_channelSampleRate, 0.01);
applyAudioSampleRate(m_audioSampleRate); // re-apply audio sample rate to reconfigure interpolators
}
if ((settings.getDeEmphasisTimeConstant() != m_settings.getDeEmphasisTimeConstant()) || force)
if ((settingsKeys.contains("deEmphasis") && (settings.getDeEmphasisTimeConstant() != m_settings.getDeEmphasisTimeConstant())) || force)
{
m_deemphasisFilterX.configure(settings.getDeEmphasisTimeConstant() * m_audioSampleRate);
m_deemphasisFilterY.configure(settings.getDeEmphasisTimeConstant() * m_audioSampleRate);
}
if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || force)
if ((settingsKeys.contains("afBandwidth") && (settings.m_afBandwidth != m_settings.m_afBandwidth)) || force)
{
m_interpolator.create(16, m_channelSampleRate, settings.m_afBandwidth);
m_interpolatorDistanceRemain = (Real) m_channelSampleRate / m_audioSampleRate;
@ -378,7 +364,7 @@ void BFMDemodSink::applySettings(const BFMDemodSettings& settings, bool force)
m_lowpass.create(21, m_audioSampleRate, settings.m_afBandwidth);
}
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force)
{
Real lowCut = -(settings.m_rfBandwidth / 2.0) / m_channelSampleRate;
Real hiCut = (settings.m_rfBandwidth / 2.0) / m_channelSampleRate;
@ -386,7 +372,7 @@ void BFMDemodSink::applySettings(const BFMDemodSettings& settings, bool force)
m_phaseDiscri.setFMScaling(m_channelSampleRate / m_fmExcursion);
}
if ((settings.m_squelch != m_settings.m_squelch) || force) {
if ((settingsKeys.contains("squelch") && (settings.m_squelch != m_settings.m_squelch)) || force) {
m_squelchLevel = std::pow(10.0, settings.m_squelch / 10.0);
}

View File

@ -84,7 +84,7 @@ public:
RDSParser& getRDSParser() { return m_rdsParser; }
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
void applySettings(const BFMDemodSettings& settings, bool force = false);
void applySettings(const QStringList& keys, const BFMDemodSettings& settings, bool force = false);
AudioFifo *getAudioFifo() { return &m_audioFifo; }
void setAudioFifoLabel(const QString& label) { m_audioFifo.setLabel(label); }

View File

@ -69,7 +69,7 @@ DABDemod::DABDemod(DeviceAPI *deviceAPI) :
m_basebandSink->setChannel(this);
m_basebandSink->moveToThread(&m_thread);
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
@ -143,7 +143,7 @@ void DABDemod::start()
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
m_basebandSink->getInputMessageQueue()->push(dspMsg);
DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(m_settings, true);
DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(QStringList(), m_settings, true);
m_basebandSink->getInputMessageQueue()->push(msg);
}
@ -161,7 +161,7 @@ bool DABDemod::handleMessage(const Message& cmd)
{
MsgConfigureDABDemod& cfg = (MsgConfigureDABDemod&) cmd;
qDebug() << "DABDemod::handleMessage: MsgConfigureDABDemod";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -313,25 +313,18 @@ void DABDemod::setCenterFrequency(qint64 frequency)
{
DABDemodSettings settings = m_settings;
settings.m_inputFrequencyOffset = frequency;
applySettings(settings, false);
applySettings(QStringList({"inputFrequencyOffset"}), settings, false);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(settings, false);
MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(QStringList({"inputFrequencyOffset"}), settings, false);
m_guiMessageQueue->push(msgToGUI);
}
}
void DABDemod::applySettings(const DABDemodSettings& settings, bool force)
void DABDemod::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force)
{
qDebug() << "DABDemod::applySettings:"
<< " m_streamIndex: " << settings.m_streamIndex
<< " m_useReverseAPI: " << settings.m_useReverseAPI
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
<< " force: " << force;
qDebug() << "DABDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
QList<QString> reverseAPIKeys;
@ -353,7 +346,7 @@ void DABDemod::applySettings(const DABDemodSettings& settings, bool force)
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) {
reverseAPIKeys.append("audioDeviceName");
}
if (m_settings.m_streamIndex != settings.m_streamIndex)
if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex))
{
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
{
@ -368,17 +361,17 @@ void DABDemod::applySettings(const DABDemodSettings& settings, bool force)
reverseAPIKeys.append("streamIndex");
}
DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(settings, force);
DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(settingsKeys, settings, force);
m_basebandSink->getInputMessageQueue()->push(msg);
if (settings.m_useReverseAPI)
if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI)
{
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) ||
(settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) ||
(settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) ||
(settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) ||
(settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex));
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
m_settings = settings;
@ -393,14 +386,14 @@ bool DABDemod::deserialize(const QByteArray& data)
{
if (m_settings.deserialize(data))
{
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(m_settings, true);
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return true;
}
else
{
m_settings.resetToDefaults();
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(m_settings, true);
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return false;
}
@ -455,13 +448,13 @@ int DABDemod::webapiSettingsPutPatch(
DABDemodSettings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(settings, force);
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(channelSettingsKeys, settings, force);
m_inputMessageQueue.push(msg);
qDebug("DABDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(settings, force);
MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(channelSettingsKeys, settings, force);
m_guiMessageQueue->push(msgToGUI);
}
@ -583,7 +576,7 @@ void DABDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp
}
}
void DABDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DABDemodSettings& settings, bool force)
void DABDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DABDemodSettings& settings, bool force)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
@ -609,7 +602,7 @@ void DABDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, co
}
void DABDemod::webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const DABDemodSettings& settings,
bool force

View File

@ -44,19 +44,22 @@ public:
public:
const DABDemodSettings& getSettings() const { return m_settings; }
bool getForce() const { return m_force; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
static MsgConfigureDABDemod* create(const DABDemodSettings& settings, bool force)
static MsgConfigureDABDemod* create(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force)
{
return new MsgConfigureDABDemod(settings, force);
return new MsgConfigureDABDemod(settingsKeys, settings, force);
}
private:
DABDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureDABDemod(const DABDemodSettings& settings, bool force) :
MsgConfigureDABDemod(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -411,11 +414,11 @@ private:
QNetworkRequest m_networkRequest;
virtual bool handleMessage(const Message& cmd);
void applySettings(const DABDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DABDemodSettings& settings, bool force);
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DABDemodSettings& settings, bool force);
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const DABDemodSettings& settings,
bool force

View File

@ -138,7 +138,7 @@ bool DABDemodBaseband::handleMessage(const Message& cmd)
MsgConfigureDABDemodBaseband& cfg = (MsgConfigureDABDemodBaseband&) cmd;
qDebug() << "DABDemodBaseband::handleMessage: MsgConfigureDABDemodBaseband";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -174,15 +174,15 @@ bool DABDemodBaseband::handleMessage(const Message& cmd)
}
}
void DABDemodBaseband::applySettings(const DABDemodSettings& settings, bool force)
void DABDemodBaseband::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force)
{
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force)
{
m_channelizer->setChannelization(DABDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
}
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force)
{
AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
@ -196,9 +196,13 @@ void DABDemodBaseband::applySettings(const DABDemodSettings& settings, bool forc
m_sink.applyAudioSampleRate(audioSampleRate);
}
}
m_sink.applySettings(settings, force);
m_sink.applySettings(settingsKeys, settings, force);
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
void DABDemodBaseband::setBasebandSampleRate(int sampleRate)

View File

@ -42,20 +42,23 @@ public:
public:
const DABDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureDABDemodBaseband* create(const DABDemodSettings& settings, bool force)
static MsgConfigureDABDemodBaseband* create(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force)
{
return new MsgConfigureDABDemodBaseband(settings, force);
return new MsgConfigureDABDemodBaseband(settingsKeys, settings, force);
}
private:
DABDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureDABDemodBaseband(const DABDemodSettings& settings, bool force) :
MsgConfigureDABDemodBaseband(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -89,7 +92,7 @@ private:
QRecursiveMutex m_mutex;
bool handleMessage(const Message& cmd);
void applySettings(const DABDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force = false);
private slots:
void handleInputMessages();

View File

@ -122,7 +122,7 @@ void DABDemodGUI::resetToDefaults()
{
m_settings.resetToDefaults();
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
}
QByteArray DABDemodGUI::serialize() const
@ -134,7 +134,7 @@ bool DABDemodGUI::deserialize(const QByteArray& data)
{
if(m_settings.deserialize(data)) {
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
return true;
} else {
resetToDefaults();
@ -203,7 +203,7 @@ void DABDemodGUI::on_programs_cellDoubleClicked(int row, int column)
double centreFreq = frequencyInHz-m_settings.m_inputFrequencyOffset;
ChannelWebAPIUtils::setCenterFrequency(m_dabDemod->getDeviceSetIndex(), centreFreq);
clearProgram();
applySettings();
applySettings(QStringList({"program"}));
}
// Ensemble name can sometimes be decoded after program name, so we
@ -365,7 +365,7 @@ void DABDemodGUI::channelMarkerChangedByCursor()
{
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
applySettings();
applySettings(QStringList({"inputFrequencyOffset"}));
}
void DABDemodGUI::channelMarkerHighlightedByCursor()
@ -378,20 +378,20 @@ void DABDemodGUI::on_deltaFrequency_changed(qint64 value)
m_channelMarker.setCenterFrequency(value);
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList({"inputFrequencyOffset"}));
}
void DABDemodGUI::on_audioMute_toggled(bool checked)
{
m_settings.m_audioMute = checked;
applySettings();
applySettings(QStringList({"audioMute"}));
}
void DABDemodGUI::on_volume_valueChanged(int value)
{
ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1));
m_settings.m_volume = value / 10.0;
applySettings();
applySettings(QStringList({"volume"}));
}
void DABDemodGUI::on_rfBW_valueChanged(int value)
@ -400,14 +400,14 @@ void DABDemodGUI::on_rfBW_valueChanged(int value)
ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1));
m_channelMarker.setBandwidth(bw);
m_settings.m_rfBandwidth = bw;
applySettings();
applySettings(QStringList({"rfBandwidth"}));
}
void DABDemodGUI::on_filter_editingFinished()
{
m_settings.m_filter = ui->filter->text();
filter();
applySettings();
applySettings(QStringList({"filter"}));
}
void DABDemodGUI::on_clearTable_clicked()
@ -446,7 +446,7 @@ void DABDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
(void) rollDown;
getRollupContents()->saveState(m_rollupState);
applySettings();
applySettings(QStringList());
}
void DABDemodGUI::onMenuDialogCalled(const QPoint &p)
@ -491,7 +491,9 @@ void DABDemodGUI::onMenuDialogCalled(const QPoint &p)
updateIndexLabel();
}
applySettings();
applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress",
"reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex",
"streamIndex"}));
}
resetContextMenuType();
@ -574,7 +576,7 @@ DABDemodGUI::DABDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
displaySettings();
makeUIConnections();
applySettings(true);
applySettings(QStringList(), true);
m_resizer.enableChildMouseTracking();
}
@ -588,11 +590,11 @@ void DABDemodGUI::blockApplySettings(bool block)
m_doApplySettings = !block;
}
void DABDemodGUI::applySettings(bool force)
void DABDemodGUI::applySettings(const QStringList& channelSettingsKeys, bool force)
{
if (m_doApplySettings)
{
DABDemod::MsgConfigureDABDemod* message = DABDemod::MsgConfigureDABDemod::create( m_settings, force);
DABDemod::MsgConfigureDABDemod* message = DABDemod::MsgConfigureDABDemod::create(channelSettingsKeys, m_settings, force);
m_dabDemod->getInputMessageQueue()->push(message);
}
}
@ -706,7 +708,7 @@ void DABDemodGUI::audioSelect(const QPoint& p)
if (audioSelect.m_selected)
{
m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName;
applySettings();
applySettings(QStringList({"audioDeviceName"}));
}
}
@ -796,4 +798,3 @@ void DABDemodGUI::on_findOnMap_clicked()
qDebug() << "Finding " << id;
FeatureWebAPIUtils::mapFind(id);
}

View File

@ -90,7 +90,7 @@ private:
virtual ~DABDemodGUI();
void blockApplySettings(bool block);
void applySettings(bool force = false);
void applySettings(const QStringList& channelSettingsKeys, bool force = false);
void displaySettings();
void updateEnsembleName(const QString& ensemble);
int findProgramRowById(int id);

View File

@ -175,4 +175,116 @@ bool DABDemodSettings::deserialize(const QByteArray& data)
}
}
void DABDemodSettings::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings)
{
if (settingsKeys.contains("inputFrequencyOffset")) {
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
}
if (settingsKeys.contains("rfBandwidth")) {
m_rfBandwidth = settings.m_rfBandwidth;
}
if (settingsKeys.contains("filter")) {
m_filter = settings.m_filter;
}
if (settingsKeys.contains("program")) {
m_program = settings.m_program;
}
if (settingsKeys.contains("volume")) {
m_volume = settings.m_volume;
}
if (settingsKeys.contains("audioMute")) {
m_audioMute = settings.m_audioMute;
}
if (settingsKeys.contains("rgbColor")) {
m_rgbColor = settings.m_rgbColor;
}
if (settingsKeys.contains("title")) {
m_title = settings.m_title;
}
if (settingsKeys.contains("audioDeviceName")) {
m_audioDeviceName = settings.m_audioDeviceName;
}
if (settingsKeys.contains("streamIndex")) {
m_streamIndex = settings.m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress")) {
m_reverseAPIAddress = settings.m_reverseAPIAddress;
}
if (settingsKeys.contains("reverseAPIPort")) {
m_reverseAPIPort = settings.m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex")) {
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex")) {
m_workspaceIndex = settings.m_workspaceIndex;
}
if (settingsKeys.contains("hidden")) {
m_hidden = settings.m_hidden;
}
}
QString DABDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
{
std::ostringstream ostr;
if (settingsKeys.contains("inputFrequencyOffset") || force) {
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
}
if (settingsKeys.contains("rfBandwidth") || force) {
ostr << " m_rfBandwidth: " << m_rfBandwidth;
}
if (settingsKeys.contains("filter") || force) {
ostr << " m_filter: " << m_filter.toStdString();
}
if (settingsKeys.contains("program") || force) {
ostr << " m_program: " << m_program.toStdString();
}
if (settingsKeys.contains("volume") || force) {
ostr << " m_volume: " << m_volume;
}
if (settingsKeys.contains("audioMute") || force) {
ostr << " m_audioMute: " << m_audioMute;
}
if (settingsKeys.contains("rgbColor") || force) {
ostr << " m_rgbColor: " << m_rgbColor;
}
if (settingsKeys.contains("title") || force) {
ostr << " m_title: " << m_title.toStdString();
}
if (settingsKeys.contains("audioDeviceName") || force) {
ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString();
}
if (settingsKeys.contains("streamIndex") || force) {
ostr << " m_streamIndex: " << m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress") || force) {
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
}
if (settingsKeys.contains("reverseAPIPort") || force) {
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex") || force) {
ostr << " m_workspaceIndex: " << m_workspaceIndex;
}
if (settingsKeys.contains("hidden") || force) {
ostr << " m_hidden: " << m_hidden;
}
return QString(ostr.str().c_str());
}

View File

@ -64,6 +64,8 @@ struct DABDemodSettings
void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; }
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings);
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
};
#endif /* INCLUDE_DABDEMODSETTINGS_H */

View File

@ -507,7 +507,7 @@ DABDemodSink::DABDemodSink() :
m_demodBuffer.resize(1<<13);
m_demodBufferFill = 0;
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
m_api.dabMode = 1; // Latest DAB spec only has mode 1
@ -613,19 +613,18 @@ void DABDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
m_channelFrequencyOffset = channelFrequencyOffset;
}
void DABDemodSink::applySettings(const DABDemodSettings& settings, bool force)
void DABDemodSink::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force)
{
qDebug() << "DABDemodSink::applySettings:"
<< " force: " << force;
qDebug() << "DABDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force);
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force)
{
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2);
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) DABDEMOD_CHANNEL_SAMPLE_RATE;
m_interpolatorDistanceRemain = m_interpolatorDistance;
}
if ((settings.m_program != m_settings.m_program) || force)
if ((settingsKeys.contains("program") && (settings.m_program != m_settings.m_program)) || force)
{
if (!settings.m_program.isEmpty()) {
setProgram(settings.m_program);

View File

@ -49,7 +49,7 @@ public:
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
void applySettings(const DABDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force = false);
void applyAudioSampleRate(int sampleRate);
void applyDABAudioSampleRate(int sampleRate);
int getAudioSampleRate() const { return m_audioSampleRate; }

View File

@ -53,7 +53,7 @@ DATVDemod::DATVDemod(DeviceAPI *deviceAPI) :
m_basebandSink = new DATVDemodBaseband();
m_basebandSink->moveToThread(&m_thread);
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
@ -123,7 +123,7 @@ void DATVDemod::start()
m_basebandSink->startWork();
m_thread.start();
DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(m_settings, true);
DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(QStringList(), m_settings, true);
m_basebandSink->getInputMessageQueue()->push(msg);
}
@ -141,7 +141,7 @@ bool DATVDemod::handleMessage(const Message& cmd)
{
MsgConfigureDATVDemod& objCfg = (MsgConfigureDATVDemod&) cmd;
qDebug() << "DATVDemod::handleMessage: MsgConfigureDATVDemod";
applySettings(objCfg.getSettings(), objCfg.getForce());
applySettings(objCfg.getSettingsKeys(), objCfg.getSettings(), objCfg.getForce());
return true;
}
@ -172,104 +172,21 @@ void DATVDemod::setCenterFrequency(qint64 frequency)
{
DATVDemodSettings settings = m_settings;
settings.m_centerFrequency = frequency;
applySettings(settings, false);
applySettings(QStringList("centerFrequency"), settings, false);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(settings, false);
MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(QStringList("centerFrequency"), settings, false);
m_guiMessageQueue->push(msgToGUI);
}
}
void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force)
void DATVDemod::applySettings(const QList<QString>& settingsKeys, const DATVDemodSettings& settings, bool force)
{
QString debugMsg = tr("DATVDemod::applySettings: force: %1").arg(force);
settings.debug(debugMsg);
QList<QString> reverseAPIKeys;
if (settings.m_rgbColor != m_settings.m_rgbColor) {
reverseAPIKeys.append("rgbColor");
}
if (settings.m_title != m_settings.m_title) {
reverseAPIKeys.append("title");
}
if (settings.m_rfBandwidth != m_settings.m_rfBandwidth) {
reverseAPIKeys.append("rfBandwidth");
}
if (settings.m_centerFrequency != m_settings.m_centerFrequency) {
reverseAPIKeys.append("centerFrequency");
}
if (settings.m_standard != m_settings.m_standard) {
reverseAPIKeys.append("standard");
}
if (settings.m_modulation != m_settings.m_modulation) {
reverseAPIKeys.append("modulation");
}
if (settings.m_fec != m_settings.m_fec) {
reverseAPIKeys.append("fec");
}
if (settings.m_softLDPC != m_settings.m_softLDPC) {
reverseAPIKeys.append("softLDPC");
}
if (settings.m_softLDPCMaxTrials != m_settings.m_softLDPCMaxTrials) {
reverseAPIKeys.append("softLDPCMaxTrials");
}
if (settings.m_maxBitflips != m_settings.m_maxBitflips) {
reverseAPIKeys.append("maxBitflips");
}
if (settings.m_audioMute != m_settings.m_audioMute) {
reverseAPIKeys.append("audioMute");
}
if (settings.m_audioDeviceName != m_settings.m_audioDeviceName) {
reverseAPIKeys.append("audioDeviceName");
}
if (settings.m_symbolRate != m_settings.m_symbolRate) {
reverseAPIKeys.append("symbolRate");
}
if (settings.m_notchFilters != m_settings.m_notchFilters) {
reverseAPIKeys.append("notchFilters");
}
if (settings.m_allowDrift != m_settings.m_allowDrift) {
reverseAPIKeys.append("allowDrift");
}
if (settings.m_fastLock != m_settings.m_fastLock) {
reverseAPIKeys.append("fastLock");
}
if (settings.m_filter != m_settings.m_filter) {
reverseAPIKeys.append("filter");
}
if (settings.m_hardMetric != m_settings.m_hardMetric) {
reverseAPIKeys.append("hardMetric");
}
if (settings.m_rollOff != m_settings.m_rollOff) {
reverseAPIKeys.append("rollOff");
}
if (settings.m_viterbi != m_settings.m_viterbi) {
reverseAPIKeys.append("viterbi");
}
if (settings.m_excursion != m_settings.m_excursion) {
reverseAPIKeys.append("excursion");
}
if (settings.m_audioVolume != m_settings.m_audioVolume) {
reverseAPIKeys.append("audioVolume");
}
if (settings.m_videoMute != m_settings.m_videoMute) {
reverseAPIKeys.append("videoMute");
}
if (settings.m_udpTSAddress != m_settings.m_udpTSAddress) {
reverseAPIKeys.append("udpTSAddress");
}
if (settings.m_udpTSPort != m_settings.m_udpTSPort) {
reverseAPIKeys.append("udpTSPort");
}
if (settings.m_udpTS != m_settings.m_udpTS) {
reverseAPIKeys.append("udpTS");
}
if (settings.m_playerEnable != m_settings.m_playerEnable) {
reverseAPIKeys.append("playerEnable");
}
if (m_settings.m_streamIndex != settings.m_streamIndex)
if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex))
{
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
{
@ -280,28 +197,26 @@ void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force)
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
emit streamIndexChanged(settings.m_streamIndex);
}
reverseAPIKeys.append("streamIndex");
}
DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(settings, force);
DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(settingsKeys, settings, force);
m_basebandSink->getInputMessageQueue()->push(msg);
if (settings.m_useReverseAPI)
{
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (settings.m_useReverseAPI != m_settings.m_useReverseAPI)) && settings.m_useReverseAPI) ||
(settingsKeys.contains("reverseAPIAddress") && (settings.m_reverseAPIAddress != m_settings.m_reverseAPIAddress)) ||
(settingsKeys.contains("reverseAPIPort") && (settings.m_reverseAPIPort != m_settings.m_reverseAPIPort)) ||
(settingsKeys.contains("reverseAPIDeviceIndex") && (settings.m_reverseAPIDeviceIndex != m_settings.m_reverseAPIDeviceIndex)) ||
(settingsKeys.contains("reverseAPIChannelIndex") && (settings.m_reverseAPIChannelIndex != m_settings.m_reverseAPIChannelIndex));
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
QList<ObjectPipe*> pipes;
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (pipes.size() > 0) {
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
sendChannelSettings(pipes, settingsKeys, settings, force);
}
m_settings = settings;
@ -353,14 +268,14 @@ int DATVDemod::webapiSettingsPutPatch(
DATVDemodSettings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureDATVDemod *msg = MsgConfigureDATVDemod::create(settings, force);
MsgConfigureDATVDemod *msg = MsgConfigureDATVDemod::create(channelSettingsKeys, settings, force);
m_inputMessageQueue.push(msg);
qDebug("DATVDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(settings, force);
MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(channelSettingsKeys, settings, force);
m_guiMessageQueue->push(msgToGUI);
}
@ -589,7 +504,7 @@ void DATVDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons
void DATVDemod::sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
const DATVDemodSettings& settings,
bool force)
{
@ -613,7 +528,7 @@ void DATVDemod::sendChannelSettings(
}
void DATVDemod::webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const DATVDemodSettings& settings,
bool force
@ -728,7 +643,7 @@ void DATVDemod::webapiFormatChannelSettings(
}
}
void DATVDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DATVDemodSettings& settings, bool force)
void DATVDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DATVDemodSettings& settings, bool force)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);

View File

@ -142,20 +142,23 @@ public:
public:
const DATVDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureDATVDemod* create(const DATVDemodSettings& settings, bool force)
static MsgConfigureDATVDemod* create(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force)
{
return new MsgConfigureDATVDemod(settings, force);
return new MsgConfigureDATVDemod(settingsKeys, settings, force);
}
private:
DATVDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureDATVDemod(const DATVDemodSettings& settings, bool force) :
MsgConfigureDATVDemod(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -170,17 +173,17 @@ private:
QNetworkRequest m_networkRequest;
virtual bool handleMessage(const Message& cmd);
void applySettings(const DATVDemodSettings& settings, bool force = false);
void applySettings(const QList<QString>& settingsKeys, const DATVDemodSettings& settings, bool force = false);
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DATVDemodSettings& settings, bool force);
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DATVDemodSettings& settings, bool force);
void sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
const DATVDemodSettings& settings,
bool force
);
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const DATVDemodSettings& settings,
bool force

View File

@ -128,7 +128,7 @@ bool DATVDemodBaseband::handleMessage(const Message& cmd)
MsgConfigureDATVDemodBaseband& cfg = (MsgConfigureDATVDemodBaseband&) cmd;
qDebug() << "DATVDemodBaseband::handleMessage: MsgConfigureDATVDemodBaseband";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -149,12 +149,12 @@ bool DATVDemodBaseband::handleMessage(const Message& cmd)
}
}
void DATVDemodBaseband::applySettings(const DATVDemodSettings& settings, bool force)
void DATVDemodBaseband::applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force)
{
qDebug("DATVDemodBaseband::applySettings");
qDebug() << "DATVDemodBaseband::applySettings" << settings.getDebugString(settingsKeys, force);
if ((settings.m_centerFrequency != m_settings.m_centerFrequency) ||
(settings.m_symbolRate != m_settings.m_symbolRate) || force)
if ((settingsKeys.contains("centerFrequency") && (settings.m_centerFrequency != m_settings.m_centerFrequency)) ||
(settingsKeys.contains("symbolRate") && (settings.m_symbolRate != m_settings.m_symbolRate)) || force)
{
unsigned int desiredSampleRate = 2 * settings.m_symbolRate; // m_channelizer->getBasebandSampleRate();
m_channelizer->setChannelization(desiredSampleRate, settings.m_centerFrequency);
@ -162,15 +162,20 @@ void DATVDemodBaseband::applySettings(const DATVDemodSettings& settings, bool fo
m_sink->applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
}
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force)
{
AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
audioDeviceManager->addAudioSink(m_sink->getAudioFifo(), getInputMessageQueue(), audioDeviceIndex);
}
m_sink->applySettings(settings, force);
m_settings = settings;
m_sink->applySettings(settingsKeys, settings, force);
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int DATVDemodBaseband::getChannelSampleRate() const

View File

@ -41,20 +41,23 @@ public:
public:
const DATVDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureDATVDemodBaseband* create(const DATVDemodSettings& settings, bool force)
static MsgConfigureDATVDemodBaseband* create(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force)
{
return new MsgConfigureDATVDemodBaseband(settings, force);
return new MsgConfigureDATVDemodBaseband(settingsKeys, settings, force);
}
private:
DATVDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureDATVDemodBaseband(const DATVDemodSettings& settings, bool force) :
MsgConfigureDATVDemodBaseband(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -106,7 +109,7 @@ private:
QRecursiveMutex m_mutex;
bool handleMessage(const Message& cmd);
void applySettings(const DATVDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force = false);
private slots:
void handleInputMessages();

View File

@ -73,7 +73,7 @@ void DATVDemodGUI::resetToDefaults()
{
m_settings.resetToDefaults();
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
}
QByteArray DATVDemodGUI::serialize() const
@ -86,7 +86,7 @@ bool DATVDemodGUI::deserialize(const QByteArray& arrData)
if (m_settings.deserialize(arrData))
{
displaySettings();
applySettings(true);
applySettings(QStringList(), true);
return true;
}
else
@ -150,7 +150,7 @@ void DATVDemodGUI::channelMarkerChangedByCursor()
{
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
m_settings.m_centerFrequency = m_channelMarker.getCenterFrequency();
applySettings();
applySettings(QStringList("centerFrequency"));
}
void DATVDemodGUI::channelMarkerHighlightedByCursor()
@ -165,7 +165,7 @@ void DATVDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
(void) rollDown;
getRollupContents()->saveState(m_rollupState);
applySettings();
applySettings(QStringList());
}
void DATVDemodGUI::onMenuDialogCalled(const QPoint &p)
@ -210,7 +210,10 @@ void DATVDemodGUI::onMenuDialogCalled(const QPoint &p)
updateIndexLabel();
}
applySettings();
applySettings(QStringList({"title", "color",
"useReverseAPI", "reverseAPIAddress", "reverseAPIPort",
"reverseAPIDeviceIndex", "reverseAPIChannelIndex",
"streamIndex"}));
}
resetContextMenuType();
@ -481,7 +484,7 @@ void DATVDemodGUI::displaySystemConfiguration()
ui->cmbFEC->blockSignals(false);
}
void DATVDemodGUI::applySettings(bool force)
void DATVDemodGUI::applySettings(const QStringList& settingsKeys, const bool force)
{
if (m_blnDoApplySettings)
{
@ -492,7 +495,7 @@ void DATVDemodGUI::applySettings(bool force)
QString msg = tr("DATVDemodGUI::applySettings: force: %1").arg(force ? "true" : "false");
m_settings.debug(msg);
DATVDemod::MsgConfigureDATVDemod* message = DATVDemod::MsgConfigureDATVDemod::create(m_settings, force);
DATVDemod::MsgConfigureDATVDemod* message = DATVDemod::MsgConfigureDATVDemod::create(settingsKeys, m_settings, force);
m_datvDemod->getInputMessageQueue()->push(message);
}
}
@ -524,7 +527,7 @@ void DATVDemodGUI::audioSelect(const QPoint& p)
if (audioSelect.m_selected)
{
m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName;
applySettings();
applySettings(QStringList("audioDeviceName"));
}
}
@ -538,7 +541,7 @@ void DATVDemodGUI::ldpcToolSelect(const QPoint& p)
if (ldpcDialog.exec() == QDialog::Accepted)
{
m_settings.m_softLDPCMaxTrials = ldpcDialog.getMaxTrials();
applySettings();
applySettings(QStringList("softLDPCMaxTrials"));
}
}
@ -683,7 +686,7 @@ void DATVDemodGUI::on_cmbStandard_currentIndexChanged(int index)
m_settings.validateSystemConfiguration();
displaySystemConfiguration();
applySettings();
applySettings(QStringList("standard"));
}
void DATVDemodGUI::on_cmbModulation_currentIndexChanged(int arg1)
@ -693,7 +696,7 @@ void DATVDemodGUI::on_cmbModulation_currentIndexChanged(int arg1)
m_settings.m_modulation = DATVDemodSettings::getModulationFromStr(strModulation);
m_settings.validateSystemConfiguration();
displaySystemConfiguration();
applySettings(QStringList("modulation"));
//Viterbi only for BPSK and QPSK
if ((m_settings.m_modulation != DATVDemodSettings::BPSK)
&& (m_settings.m_modulation != DATVDemodSettings::QPSK))
@ -701,7 +704,7 @@ void DATVDemodGUI::on_cmbModulation_currentIndexChanged(int arg1)
ui->chkViterbi->setChecked(false);
}
applySettings();
applySettings(QStringList("modulation"));
}
void DATVDemodGUI::on_cmbFEC_currentIndexChanged(int arg1)
@ -709,31 +712,31 @@ void DATVDemodGUI::on_cmbFEC_currentIndexChanged(int arg1)
(void) arg1;
QString strFEC = ui->cmbFEC->currentText();
m_settings.m_fec = DATVDemodSettings::getCodeRateFromStr(strFEC);
applySettings();
applySettings(QStringList("fec"));
}
void DATVDemodGUI::on_softLDPC_clicked()
{
m_settings.m_softLDPC = ui->softLDPC->isChecked();
applySettings();
applySettings(QStringList("softLDPC"));
}
void DATVDemodGUI::on_maxBitflips_valueChanged(int value)
{
m_settings.m_maxBitflips = value;
applySettings();
applySettings(QStringList("maxBitflips"));
}
void DATVDemodGUI::on_chkViterbi_clicked()
{
m_settings.m_viterbi = ui->chkViterbi->isChecked();
applySettings();
applySettings(QStringList("viterbi"));
}
void DATVDemodGUI::on_chkHardMetric_clicked()
{
m_settings.m_hardMetric = ui->chkHardMetric->isChecked();
applySettings();
applySettings(QStringList("hardMetric"));
}
void DATVDemodGUI::on_resetDefaults_clicked()
@ -747,7 +750,7 @@ void DATVDemodGUI::on_spiSymbolRate_valueChanged(int value)
ui->datvStdSR->blockSignals(true);
ui->datvStdSR->setValue(indexFromSymbolRate(value));
ui->datvStdSR->blockSignals(false);
applySettings();
applySettings(QStringList("symbolRate"));
}
void DATVDemodGUI::on_datvStdSR_valueChanged(int value)
@ -761,19 +764,19 @@ void DATVDemodGUI::on_datvStdSR_valueChanged(int value)
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
ui->rfBandwidth->blockSignals(false);
ui->spiSymbolRate->blockSignals(false);
applySettings();
applySettings(QStringList({"symbolRate", "rfBandwidth"}));
}
void DATVDemodGUI::on_spiNotchFilters_valueChanged(int value)
{
m_settings.m_notchFilters = value;
applySettings();
applySettings(QStringList("notchFilters"));
}
void DATVDemodGUI::on_chkAllowDrift_clicked()
{
m_settings.m_allowDrift = ui->chkAllowDrift->isChecked();
applySettings();
applySettings(QStringList("allowDrift"));
}
void DATVDemodGUI::on_fullScreen_clicked()
@ -819,45 +822,45 @@ void DATVDemodGUI::on_deltaFrequency_changed(qint64 value)
m_channelMarker.setCenterFrequency(value);
m_settings.m_centerFrequency = m_channelMarker.getCenterFrequency();
updateAbsoluteCenterFrequency();
applySettings();
applySettings(QStringList("centerFrequency"));
}
void DATVDemodGUI::on_rfBandwidth_changed(qint64 value)
{
m_channelMarker.setBandwidth(value);
m_settings.m_rfBandwidth = m_channelMarker.getBandwidth();
applySettings();
applySettings(QStringList("rfBandwidth"));
}
void DATVDemodGUI::on_chkFastlock_clicked()
{
m_settings.m_fastLock = ui->chkFastlock->isChecked();
applySettings();
applySettings(QStringList("fastLock"));
}
void DATVDemodGUI::on_audioMute_toggled(bool checked)
{
m_settings.m_audioMute = checked;
applySettings();
applySettings(QStringList("audioMute"));
}
void DATVDemodGUI::on_videoMute_toggled(bool checked)
{
m_settings.m_videoMute = checked;
applySettings();
applySettings(QStringList("videoMute"));
}
void DATVDemodGUI::on_audioVolume_valueChanged(int value)
{
ui->audioVolumeText->setText(tr("%1").arg(value));
m_settings.m_audioVolume = value;
applySettings();
applySettings(QStringList("audioVolume"));
}
void DATVDemodGUI::on_udpTS_clicked(bool checked)
{
m_settings.m_udpTS = checked;
applySettings();
applySettings(QStringList("udpTS"));
}
void DATVDemodGUI::on_StreamMetaDataChanged(DataTSMetaData2 *objMetaData)
@ -907,7 +910,7 @@ void DATVDemodGUI::on_playerEnable_clicked()
connect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
}
applySettings();
applySettings(QStringList("playerEnable"));
}
void DATVDemodGUI::displayRRCParameters(bool blnVisible)
@ -929,25 +932,25 @@ void DATVDemodGUI::on_cmbFilter_currentIndexChanged(int index)
}
displayRRCParameters(index == 2);
applySettings();
applySettings(QStringList("filter"));
}
void DATVDemodGUI::on_spiRollOff_valueChanged(int value)
{
m_settings.m_rollOff = ((float) value) / 100.0f;
applySettings();
applySettings(QStringList("rollOff"));
}
void DATVDemodGUI::on_spiExcursion_valueChanged(int value)
{
m_settings.m_excursion = value;
applySettings();
applySettings(QStringList("excursion"));
}
void DATVDemodGUI::on_udpTSAddress_editingFinished()
{
m_settings.m_udpTSAddress = ui->udpTSAddress->text();
applySettings();
applySettings(QStringList("udpTSAddress"));
}
void DATVDemodGUI::on_udpTSPort_editingFinished()
@ -961,7 +964,7 @@ void DATVDemodGUI::on_udpTSPort_editingFinished()
m_settings.m_udpTSPort = udpPort;
ui->udpTSPort->setText(tr("%1").arg(udpPort));
applySettings();
applySettings(QStringList("udpTSPort"));
}
void DATVDemodGUI::makeUIConnections()

View File

@ -143,7 +143,7 @@ private:
virtual ~DATVDemodGUI();
void blockApplySettings(bool blnBlock);
void applySettings(bool force = false);
void applySettings(const QStringList& settingsKeys, bool force = false);
void displaySettings();
void displaySystemConfiguration();
QString formatBytes(qint64 intBytes);

View File

@ -349,6 +349,228 @@ void DATVDemodSettings::validateSystemConfiguration()
}
}
void DATVDemodSettings::applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings)
{
if (settingsKeys.contains("rgbColor")) {
m_rgbColor = settings.m_rgbColor;
}
if (settingsKeys.contains("title")) {
m_title = settings.m_title;
}
if (settingsKeys.contains("rfBandwidth")) {
m_rfBandwidth = settings.m_rfBandwidth;
}
if (settingsKeys.contains("centerFrequency")) {
m_centerFrequency = settings.m_centerFrequency;
}
if (settingsKeys.contains("standard")) {
m_standard = settings.m_standard;
}
if (settingsKeys.contains("modulation")) {
m_modulation = settings.m_modulation;
}
if (settingsKeys.contains("fec")) {
m_fec = settings.m_fec;
}
if (settingsKeys.contains("softLDPC")) {
m_softLDPC = settings.m_softLDPC;
}
if (settingsKeys.contains("softLDPCMaxTrials")) {
m_softLDPCMaxTrials = settings.m_softLDPCMaxTrials;
}
if (settingsKeys.contains("maxBitflips")) {
m_maxBitflips = settings.m_maxBitflips;
}
if (settingsKeys.contains("audioMute")) {
m_audioMute = settings.m_audioMute;
}
if (settingsKeys.contains("audioDeviceName")) {
m_audioDeviceName = settings.m_audioDeviceName;
}
if (settingsKeys.contains("symbolRate")) {
m_symbolRate = settings.m_symbolRate;
}
if (settingsKeys.contains("notchFilters")) {
m_notchFilters = settings.m_notchFilters;
}
if (settingsKeys.contains("allowDrift")) {
m_allowDrift = settings.m_allowDrift;
}
if (settingsKeys.contains("fastLock")) {
m_fastLock = settings.m_fastLock;
}
if (settingsKeys.contains("filter")) {
m_filter = settings.m_filter;
}
if (settingsKeys.contains("hardMetric")) {
m_hardMetric = settings.m_hardMetric;
}
if (settingsKeys.contains("rollOff")) {
m_rollOff = settings.m_rollOff;
}
if (settingsKeys.contains("viterbi")) {
m_viterbi = settings.m_viterbi;
}
if (settingsKeys.contains("excursion")) {
m_excursion = settings.m_excursion;
}
if (settingsKeys.contains("audioVolume")) {
m_audioVolume = settings.m_audioVolume;
}
if (settingsKeys.contains("videoMute")) {
m_videoMute = settings.m_videoMute;
}
if (settingsKeys.contains("udpTSAddress")) {
m_udpTSAddress = settings.m_udpTSAddress;
}
if (settingsKeys.contains("udpTSPort")) {
m_udpTSPort = settings.m_udpTSPort;
}
if (settingsKeys.contains("udpTS")) {
m_udpTS = settings.m_udpTS;
}
if (settingsKeys.contains("playerEnable")) {
m_playerEnable = settings.m_playerEnable;
}
if (settingsKeys.contains("streamIndex")) {
m_streamIndex = settings.m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress")) {
m_reverseAPIAddress = settings.m_reverseAPIAddress;
}
if (settingsKeys.contains("reverseAPIPort")) {
m_reverseAPIPort = settings.m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex")) {
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex")) {
m_workspaceIndex = settings.m_workspaceIndex;
}
if (settingsKeys.contains("hidden")) {
m_hidden = settings.m_hidden;
}
}
QString DATVDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
{
std::ostringstream ostr;
if (settingsKeys.contains("rgbColor") || force) {
ostr << " m_rgbColor: " << m_rgbColor;
}
if (settingsKeys.contains("title") || force) {
ostr << " m_title: " << m_title.toStdString();
}
if (settingsKeys.contains("rfBandwidth") || force) {
ostr << " m_rfBandwidth: " << m_rfBandwidth;
}
if (settingsKeys.contains("centerFrequency") || force) {
ostr << " m_centerFrequency: " << m_centerFrequency;
}
if (settingsKeys.contains("standard") || force) {
ostr << " m_standard: " << m_standard;
}
if (settingsKeys.contains("modulation") || force) {
ostr << " m_modulation: " << m_modulation;
}
if (settingsKeys.contains("fec") || force) {
ostr << " m_fec: " << m_fec;
}
if (settingsKeys.contains("softLDPC") || force) {
ostr << " m_softLDPC: " << m_softLDPC;
}
if (settingsKeys.contains("softLDPCMaxTrials") || force) {
ostr << " m_softLDPCMaxTrials: " << m_softLDPCMaxTrials;
}
if (settingsKeys.contains("maxBitflips") || force) {
ostr << " m_maxBitflips: " << m_maxBitflips;
}
if (settingsKeys.contains("audioMute") || force) {
ostr << " m_audioMute: " << m_audioMute;
}
if (settingsKeys.contains("audioDeviceName") || force) {
ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString();
}
if (settingsKeys.contains("symbolRate") || force) {
ostr << " m_symbolRate: " << m_symbolRate;
}
if (settingsKeys.contains("notchFilters") || force) {
ostr << " m_notchFilters: " << m_notchFilters;
}
if (settingsKeys.contains("allowDrift") || force) {
ostr << " m_allowDrift: " << m_allowDrift;
}
if (settingsKeys.contains("fastLock") || force) {
ostr << " m_fastLock: " << m_fastLock;
}
if (settingsKeys.contains("filter") || force) {
ostr << " m_filter: " << m_filter;
}
if (settingsKeys.contains("hardMetric") || force) {
ostr << " m_hardMetric: " << m_hardMetric;
}
if (settingsKeys.contains("rollOff") || force) {
ostr << " m_rollOff: " << m_rollOff;
}
if (settingsKeys.contains("viterbi") || force) {
ostr << " m_viterbi: " << m_viterbi;
}
if (settingsKeys.contains("excursion") || force) {
ostr << " m_excursion: " << m_excursion;
}
if (settingsKeys.contains("audioVolume") || force) {
ostr << " m_audioVolume: " << m_audioVolume;
}
if (settingsKeys.contains("videoMute") || force) {
ostr << " m_videoMute: " << m_videoMute;
}
if (settingsKeys.contains("udpTSAddress") || force) {
ostr << " m_udpTSAddress: " << m_udpTSAddress.toStdString();
}
if (settingsKeys.contains("udpTSPort") || force) {
ostr << " m_udpTSPort: " << m_udpTSPort;
}
if (settingsKeys.contains("udpTS") || force) {
ostr << " m_udpTS: " << m_udpTS;
}
if (settingsKeys.contains("playerEnable") || force) {
ostr << " m_playerEnable: " << m_playerEnable;
}
if (settingsKeys.contains("streamIndex") || force) {
ostr << " m_streamIndex: " << m_streamIndex;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}
if (settingsKeys.contains("reverseAPIAddress") || force) {
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
}
if (settingsKeys.contains("reverseAPIPort") || force) {
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
}
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
}
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
}
if (settingsKeys.contains("workspaceIndex") || force) {
ostr << " m_workspaceIndex: " << m_workspaceIndex;
}
if (settingsKeys.contains("hidden") || force) {
ostr << " m_hidden: " << m_hidden;
}
return QString(ostr.str().c_str());
}
DATVDemodSettings::DATVModulation DATVDemodSettings::getModulationFromStr(const QString& str)
{
if (str == "BPSK") {
@ -591,4 +813,3 @@ DATVDemodSettings::DATVModulation DATVDemodSettings::getModulationFromLeanDVBCod
return DATVDemodSettings::DATVModulation::MOD_UNSET;
}
}

View File

@ -125,6 +125,8 @@ struct DATVDemodSettings
void debug(const QString& msg) const;
bool isDifferent(const DATVDemodSettings& other); // true if a change of settings should trigger DVB framework config update
void validateSystemConfiguration();
void applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings);
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
static DATVModulation getModulationFromStr(const QString& str);
static DATVCodeRate getCodeRateFromStr(const QString& str);

View File

@ -31,6 +31,9 @@
#include <QMutexLocker>
#include "datvdemodreport.h"
#ifndef SERVER_MODE
#include "datvideorender.h"
#endif
const unsigned int DATVDemodSink::m_rfFilterFftLength = 512;
@ -68,9 +71,11 @@ DATVDemodSink::~DATVDemodSink()
stopVideo();
CleanUpDATVFramework();
#ifndef SERVER_MODE
if (m_videoThread) {
delete m_videoThread;
}
#endif
}
void DATVDemodSink::stopVideo()
@ -100,6 +105,8 @@ void DATVDemodSink::SetVideoRender(DATVideoRender *screen)
m_videoRender->setAudioFIFO(&m_audioFifo);
m_videoThread = new DATVideoRenderThread(m_videoRender, m_videoStream);
m_videoThread->setObjectName("vtDATVDemodSink");
#else
(void) screen;
#endif
}
@ -1372,11 +1379,11 @@ void DATVDemodSink::applyChannelSettings(int channelSampleRate, int channelFrequ
m_settings.m_centerFrequency = channelFrequencyOffset;
if (callApplySettings) {
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
}
}
void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
void DATVDemodSink::applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force)
{
QString msg = QObject::tr("DATVDemodSink::applySettings: force: %1").arg(force);
settings.debug(msg);
@ -1388,21 +1395,21 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
}
#ifndef SERVER_MODE
if ((settings.m_audioVolume) != (m_settings.m_audioVolume) || force)
if ((settingsKeys.contains("audioVolume") && (settings.m_audioVolume != m_settings.m_audioVolume)) || force)
{
if (m_videoRender) {
m_videoRender->setAudioVolume(settings.m_audioVolume);
}
}
if ((settings.m_audioMute) != (m_settings.m_audioMute) || force)
if ((settingsKeys.contains("audioMute") && (settings.m_audioMute != m_settings.m_audioMute)) || force)
{
if (m_videoRender) {
m_videoRender->setAudioMute(settings.m_audioMute);
}
}
if ((settings.m_videoMute) != (m_settings.m_videoMute) || force)
if ((settingsKeys.contains("videoMute") && (settings.m_videoMute != m_settings.m_videoMute)) || force)
{
if (m_videoRender) {
m_videoRender->setVideoMute(settings.m_videoMute);
@ -1410,9 +1417,9 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
}
#endif
if ((m_settings.m_rfBandwidth != settings.m_rfBandwidth)
|| (m_settings.m_symbolRate != settings.m_symbolRate)
|| (m_settings.m_centerFrequency != settings.m_centerFrequency) || force)
if (settingsKeys.contains("rfBandwidth") ||
settingsKeys.contains("symbolRate") ||
settingsKeys.contains("centerFrequency") || force)
{
m_interpolator.create(m_interpolatorPhaseSteps, m_channelSampleRate, settings.m_rfBandwidth / 2.2, m_interpolatorTapsPerPhase);
m_interpolatorDistanceRemain = 0;
@ -1420,7 +1427,7 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
m_nco.setFreq(-(float) settings.m_centerFrequency, (float) m_channelSampleRate);
}
if ((m_settings.m_udpTS != settings.m_udpTS) || force)
if ((settingsKeys.contains("udpTS") && (m_settings.m_udpTS != settings.m_udpTS)) || force)
{
m_udpStream.setActive(settings.m_udpTS);
@ -1429,17 +1436,17 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
}
}
if ((m_settings.m_symbolRate != settings.m_symbolRate) || force) {
if ((settingsKeys.contains("symbolRate") && (m_settings.m_symbolRate != settings.m_symbolRate)) || force) {
if (r_videoplayer) {
r_videoplayer->setSymbolRate(settings.m_symbolRate);
}
}
if ((m_settings.m_udpTSAddress != settings.m_udpTSAddress) || force) {
if ((settingsKeys.contains("udpTSAddress") && (m_settings.m_udpTSAddress != settings.m_udpTSAddress)) || force) {
m_udpStream.setAddress(settings.m_udpTSAddress);
}
if ((m_settings.m_udpTSPort != settings.m_udpTSPort) || force) {
if ((settingsKeys.contains("udpTSPort") && (m_settings.m_udpTSPort != settings.m_udpTSPort)) || force) {
m_udpStream.setPort(settings.m_udpTSPort);
}
@ -1447,7 +1454,11 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
m_blnNeedConfigUpdate = true;
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int DATVDemodSink::getLeanDVBCodeRateFromDATV(DATVDemodSettings::DATVCodeRate datvCodeRate)

View File

@ -115,7 +115,7 @@ public:
return r_cnrMeter ? r_cnrMeter->m_nbAvg : 1;
}
void applySettings(const DATVDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force = false);
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
private:
@ -316,7 +316,7 @@ private:
leansdr::datvvideoplayer<leansdr::tspacket> *r_videoplayer;
//CONSTELLATION
#ifndef SERVER_MODE
#ifndef SERVER_MODE
leansdr::datvconstellation<leansdr::f32> *r_scope_symbols;
leansdr::datvdvbs2constellation<leansdr::f32> *r_scope_symbols_dvbs2;
#endif

View File

@ -58,7 +58,7 @@ DSCDemod::DSCDemod(DeviceAPI *deviceAPI) :
m_basebandSink->setChannel(this);
m_basebandSink->moveToThread(&m_thread);
applySettings(m_settings, true);
applySettings(QStringList(), m_settings, true);
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
@ -132,7 +132,7 @@ void DSCDemod::start()
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
m_basebandSink->getInputMessageQueue()->push(dspMsg);
DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(m_settings, true);
DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(QStringList(), m_settings, true);
m_basebandSink->getInputMessageQueue()->push(msg);
}
@ -150,7 +150,7 @@ bool DSCDemod::handleMessage(const Message& cmd)
{
MsgConfigureDSCDemod& cfg = (MsgConfigureDSCDemod&) cmd;
qDebug() << "DSCDemod::handleMessage: MsgConfigureDSCDemod";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -257,64 +257,20 @@ void DSCDemod::setCenterFrequency(qint64 frequency)
{
DSCDemodSettings settings = m_settings;
settings.m_inputFrequencyOffset = frequency;
applySettings(settings, false);
applySettings(QStringList("inputFrequencyOffset"), settings, false);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(settings, false);
MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(QStringList("inputFrequencyOffset"), settings, false);
m_guiMessageQueue->push(msgToGUI);
}
}
void DSCDemod::applySettings(const DSCDemodSettings& settings, bool force)
void DSCDemod::applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force)
{
qDebug() << "DSCDemod::applySettings:"
<< " m_logEnabled: " << settings.m_logEnabled
<< " m_logFilename: " << settings.m_logFilename
<< " m_streamIndex: " << settings.m_streamIndex
<< " m_useReverseAPI: " << settings.m_useReverseAPI
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
<< " force: " << force;
qDebug() << "DSCDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
QList<QString> reverseAPIKeys;
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) {
reverseAPIKeys.append("inputFrequencyOffset");
}
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) {
reverseAPIKeys.append("rfBandwidth");
}
if ((settings.m_filterInvalid != m_settings.m_filterInvalid) || force) {
reverseAPIKeys.append("filterInvalid");
}
if ((settings.m_filterColumn != m_settings.m_filterColumn) || force) {
reverseAPIKeys.append("filterColumn");
}
if ((settings.m_filter != m_settings.m_filter) || force) {
reverseAPIKeys.append("filter");
}
if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) {
reverseAPIKeys.append("udpEnabled");
}
if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) {
reverseAPIKeys.append("udpAddress");
}
if ((settings.m_udpPort != m_settings.m_udpPort) || force) {
reverseAPIKeys.append("udpPort");
}
if ((settings.m_logFilename != m_settings.m_logFilename) || force) {
reverseAPIKeys.append("logFilename");
}
if ((settings.m_logEnabled != m_settings.m_logEnabled) || force) {
reverseAPIKeys.append("logEnabled");
}
if ((settings.m_useFileTime != m_settings.m_useFileTime) || force) {
reverseAPIKeys.append("useFileTime");
}
if (m_settings.m_streamIndex != settings.m_streamIndex)
if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex))
{
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
{
@ -325,25 +281,23 @@ void DSCDemod::applySettings(const DSCDemodSettings& settings, bool force)
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
emit streamIndexChanged(settings.m_streamIndex);
}
reverseAPIKeys.append("streamIndex");
}
DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(settings, force);
DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(settingsKeys, settings, force);
m_basebandSink->getInputMessageQueue()->push(msg);
if (settings.m_useReverseAPI)
{
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (settings.m_useReverseAPI != m_settings.m_useReverseAPI)) && settings.m_useReverseAPI) ||
(settingsKeys.contains("reverseAPIAddress") && (settings.m_reverseAPIAddress != m_settings.m_reverseAPIAddress)) ||
(settingsKeys.contains("reverseAPIPort") && (settings.m_reverseAPIPort != m_settings.m_reverseAPIPort)) ||
(settingsKeys.contains("reverseAPIDeviceIndex") && (settings.m_reverseAPIDeviceIndex != m_settings.m_reverseAPIDeviceIndex)) ||
(settingsKeys.contains("reverseAPIChannelIndex") && (settings.m_reverseAPIChannelIndex != m_settings.m_reverseAPIChannelIndex));
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
if ((settings.m_logEnabled != m_settings.m_logEnabled)
|| (settings.m_logFilename != m_settings.m_logFilename)
if ((settingsKeys.contains("logEnabled") && (settings.m_logEnabled != m_settings.m_logEnabled))
|| (settingsKeys.contains("logFilename") && (settings.m_logFilename != m_settings.m_logFilename))
|| force)
{
if (m_logFile.isOpen())
@ -372,7 +326,11 @@ void DSCDemod::applySettings(const DSCDemodSettings& settings, bool force)
}
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
void DSCDemod::sendSampleRateToDemodAnalyzer()
@ -403,14 +361,14 @@ bool DSCDemod::deserialize(const QByteArray& data)
{
if (m_settings.deserialize(data))
{
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(m_settings, true);
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return true;
}
else
{
m_settings.resetToDefaults();
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(m_settings, true);
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(QStringList(), m_settings, true);
m_inputMessageQueue.push(msg);
return false;
}
@ -446,13 +404,13 @@ int DSCDemod::webapiSettingsPutPatch(
DSCDemodSettings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(settings, force);
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(channelSettingsKeys, settings, force);
m_inputMessageQueue.push(msg);
qDebug("DSCDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(settings, force);
MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(channelSettingsKeys, settings, force);
m_guiMessageQueue->push(msgToGUI);
}
@ -631,7 +589,7 @@ void DSCDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response
response.getDscDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate());
}
void DSCDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DSCDemodSettings& settings, bool force)
void DSCDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DSCDemodSettings& settings, bool force)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
@ -657,7 +615,7 @@ void DSCDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, co
}
void DSCDemod::webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const DSCDemodSettings& settings,
bool force

View File

@ -53,20 +53,23 @@ public:
public:
const DSCDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureDSCDemod* create(const DSCDemodSettings& settings, bool force)
static MsgConfigureDSCDemod* create(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force)
{
return new MsgConfigureDSCDemod(settings, force);
return new MsgConfigureDSCDemod(settingsKeys, settings, force);
}
private:
DSCDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureDSCDemod(const DSCDemodSettings& settings, bool force) :
MsgConfigureDSCDemod(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -184,11 +187,11 @@ private:
QNetworkRequest m_networkRequest;
virtual bool handleMessage(const Message& cmd);
void applySettings(const DSCDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DSCDemodSettings& settings, bool force);
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DSCDemodSettings& settings, bool force);
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const DSCDemodSettings& settings,
bool force
@ -202,4 +205,3 @@ private slots:
};
#endif // INCLUDE_DSCDEMOD_H

View File

@ -136,7 +136,7 @@ bool DSCDemodBaseband::handleMessage(const Message& cmd)
MsgConfigureDSCDemodBaseband& cfg = (MsgConfigureDSCDemodBaseband&) cmd;
qDebug() << "DSCDemodBaseband::handleMessage: MsgConfigureDSCDemodBaseband";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
return true;
}
@ -157,17 +157,21 @@ bool DSCDemodBaseband::handleMessage(const Message& cmd)
}
}
void DSCDemodBaseband::applySettings(const DSCDemodSettings& settings, bool force)
void DSCDemodBaseband::applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force)
{
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force)
{
m_channelizer->setChannelization(DSCDemodSettings::DSCDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
}
m_sink.applySettings(settings, force);
m_sink.applySettings(settingsKeys, settings, force);
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int DSCDemodBaseband::getChannelSampleRate() const
@ -180,4 +184,3 @@ void DSCDemodBaseband::setBasebandSampleRate(int sampleRate)
m_channelizer->setBasebandSampleRate(sampleRate);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
}

View File

@ -44,20 +44,23 @@ public:
public:
const DSCDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureDSCDemodBaseband* create(const DSCDemodSettings& settings, bool force)
static MsgConfigureDSCDemodBaseband* create(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force)
{
return new MsgConfigureDSCDemodBaseband(settings, force);
return new MsgConfigureDSCDemodBaseband(settingsKeys, settings, force);
}
private:
DSCDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureDSCDemodBaseband(const DSCDemodSettings& settings, bool force) :
MsgConfigureDSCDemodBaseband(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -93,7 +96,7 @@ private:
bool handleMessage(const Message& cmd);
void calculateOffset(DSCDemodSink *sink);
void applySettings(const DSCDemodSettings& settings, bool force = false);
void applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force = false);
private slots:
void handleInputMessages();
@ -101,4 +104,3 @@ private slots:
};
#endif // INCLUDE_DSCDEMODBASEBAND_H

Some files were not shown because too many files have changed in this diff Show More