mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-04 05:30:32 -05:00 
			
		
		
		
	ADS-B: Use settings keys.
This commit is contained in:
		
							parent
							
								
									a9f25b3642
								
							
						
					
					
						commit
						28faddea1d
					
				@ -71,7 +71,7 @@ ADSBDemod::ADSBDemod(DeviceAPI *devieAPI) :
 | 
				
			|||||||
    m_worker = new ADSBDemodWorker();
 | 
					    m_worker = new ADSBDemodWorker();
 | 
				
			||||||
    m_basebandSink->setMessageQueueToWorker(m_worker->getInputMessageQueue());
 | 
					    m_basebandSink->setMessageQueueToWorker(m_worker->getInputMessageQueue());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    applySettings(m_settings, true);
 | 
					    applySettings(m_settings, QStringList(), true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    m_deviceAPI->addChannelSink(this);
 | 
					    m_deviceAPI->addChannelSink(this);
 | 
				
			||||||
    m_deviceAPI->addChannelSinkAPI(this);
 | 
					    m_deviceAPI->addChannelSinkAPI(this);
 | 
				
			||||||
@ -147,7 +147,7 @@ void ADSBDemod::start()
 | 
				
			|||||||
    m_basebandSink->startWork();
 | 
					    m_basebandSink->startWork();
 | 
				
			||||||
    m_thread->start();
 | 
					    m_thread->start();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ADSBDemodWorker::MsgConfigureADSBDemodWorker *msg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(m_settings, true);
 | 
					    ADSBDemodWorker::MsgConfigureADSBDemodWorker *msg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(m_settings, QStringList(), true);
 | 
				
			||||||
    m_worker->getInputMessageQueue()->push(msg);
 | 
					    m_worker->getInputMessageQueue()->push(msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -169,7 +169,7 @@ bool ADSBDemod::handleMessage(const Message& cmd)
 | 
				
			|||||||
        MsgConfigureADSBDemod& cfg = (MsgConfigureADSBDemod&) cmd;
 | 
					        MsgConfigureADSBDemod& cfg = (MsgConfigureADSBDemod&) cmd;
 | 
				
			||||||
        qDebug() << "ADSBDemod::handleMessage: MsgConfigureADSBDemod";
 | 
					        qDebug() << "ADSBDemod::handleMessage: MsgConfigureADSBDemod";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        applySettings(cfg.getSettings(), cfg.getForce());
 | 
					        applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -200,112 +200,12 @@ bool ADSBDemod::handleMessage(const Message& cmd)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemod::applySettings(const ADSBDemodSettings& settings, bool force)
 | 
					void ADSBDemod::applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    qDebug() << "ADSBDemod::applySettings:"
 | 
					    qDebug() << "ADSBDemod::applySettings:"
 | 
				
			||||||
            << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
 | 
					            << settings.getDebugString(settingsKeys, force)
 | 
				
			||||||
            << " m_rfBandwidth: " << settings.m_rfBandwidth
 | 
					 | 
				
			||||||
            << " 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;
 | 
					            << " force: " << 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_correlationThreshold != m_settings.m_correlationThreshold) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("correlationThreshold");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_samplesPerBit != m_settings.m_samplesPerBit) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("samplesPerBit");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_correlateFullPreamble != m_settings.m_correlateFullPreamble) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("correlateFullPreamble");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_demodModeS != m_settings.m_demodModeS) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("demodModeS");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_interpolatorPhaseSteps != m_settings.m_interpolatorPhaseSteps) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("interpolatorPhaseSteps");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_interpolatorTapsPerPhase != m_settings.m_interpolatorTapsPerPhase) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("interpolatorTapsPerPhase");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_removeTimeout != m_settings.m_removeTimeout) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("removeTimeout");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_feedEnabled != m_settings.m_feedEnabled) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("feedEnabled");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_exportClientEnabled != m_settings.m_exportClientEnabled) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("exportClientEnabled");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_exportClientHost != m_settings.m_exportClientHost) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("exportClientHost");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_exportClientPort != m_settings.m_exportClientPort) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("exportClientPort");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_exportClientFormat != m_settings.m_exportClientFormat) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("exportClientFormat");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
     if ((settings.m_exportServerEnabled != m_settings.m_exportServerEnabled) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("exportServerEnabled");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_exportServerPort != m_settings.m_exportServerPort) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("exportServerPort");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
   if ((settings.m_importEnabled != m_settings.m_importEnabled) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("importEnabled");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_importHost != m_settings.m_importHost) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("importHost");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_importUsername != m_settings.m_importUsername) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("importUsername");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_importPassword != m_settings.m_importPassword) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("importPassword");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_importParameters != m_settings.m_importParameters) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("importParameters");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_importPeriod != m_settings.m_importPeriod) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("importPeriod");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_importMinLatitude != m_settings.m_importMinLatitude) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("importMinLatitude");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_importMaxLatitude != m_settings.m_importMaxLatitude) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("importMaxLatitude");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_importMinLongitude != m_settings.m_importMinLongitude) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("importMinLongitude");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_importMaxLongitude != m_settings.m_importMaxLongitude) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("importMaxLongitude");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    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_title != m_settings.m_title) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("title");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) {
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("rfBandwidth");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (m_settings.m_streamIndex != settings.m_streamIndex)
 | 
					    if (m_settings.m_streamIndex != settings.m_streamIndex)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
 | 
					        if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
 | 
				
			||||||
@ -317,38 +217,40 @@ void ADSBDemod::applySettings(const ADSBDemodSettings& settings, bool force)
 | 
				
			|||||||
            m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
 | 
					            m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
 | 
				
			||||||
            emit streamIndexChanged(settings.m_streamIndex);
 | 
					            emit streamIndexChanged(settings.m_streamIndex);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        reverseAPIKeys.append("streamIndex");
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ADSBDemodBaseband::MsgConfigureADSBDemodBaseband *msg = ADSBDemodBaseband::MsgConfigureADSBDemodBaseband::create(settings, force);
 | 
					    ADSBDemodBaseband::MsgConfigureADSBDemodBaseband *msg = ADSBDemodBaseband::MsgConfigureADSBDemodBaseband::create(settings, settingsKeys, force);
 | 
				
			||||||
    m_basebandSink->getInputMessageQueue()->push(msg);
 | 
					    m_basebandSink->getInputMessageQueue()->push(msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ADSBDemodWorker::MsgConfigureADSBDemodWorker *workerMsg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(settings, force);
 | 
					    ADSBDemodWorker::MsgConfigureADSBDemodWorker *workerMsg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(settings, settingsKeys, force);
 | 
				
			||||||
    m_worker->getInputMessageQueue()->push(workerMsg);
 | 
					    m_worker->getInputMessageQueue()->push(workerMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (settings.m_useReverseAPI)
 | 
					    if (settings.m_useReverseAPI)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
 | 
					        bool fullUpdate = (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) ||
 | 
				
			||||||
                (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
 | 
					            settingsKeys.contains("reverseAPIAddress") ||
 | 
				
			||||||
                (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
 | 
					            settingsKeys.contains("reverseAPIPort") ||
 | 
				
			||||||
                (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
 | 
					            settingsKeys.contains("reverseAPIDeviceIndex") ||
 | 
				
			||||||
                (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
 | 
					            settingsKeys.contains("reverseAPIChannelIndex");
 | 
				
			||||||
        webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
 | 
					        webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (force) {
 | 
				
			||||||
        m_settings = settings;
 | 
					        m_settings = settings;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        m_settings.applySettings(settingsKeys, settings);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemod::setCenterFrequency(qint64 frequency)
 | 
					void ADSBDemod::setCenterFrequency(qint64 frequency)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ADSBDemodSettings settings = m_settings;
 | 
					    ADSBDemodSettings settings = m_settings;
 | 
				
			||||||
    settings.m_inputFrequencyOffset = frequency;
 | 
					    settings.m_inputFrequencyOffset = frequency;
 | 
				
			||||||
    applySettings(settings);
 | 
					    applySettings(settings, {"inputFrequencyOffset"}, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (m_guiMessageQueue) // forward to GUI if any
 | 
					    if (m_guiMessageQueue) // forward to GUI if any
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, false);
 | 
					        MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, {"inputFrequencyOffset"}, false);
 | 
				
			||||||
        m_guiMessageQueue->push(msgToGUI);
 | 
					        m_guiMessageQueue->push(msgToGUI);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -368,7 +270,7 @@ bool ADSBDemod::deserialize(const QByteArray& data)
 | 
				
			|||||||
        success = false;
 | 
					        success = false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(m_settings, true);
 | 
					    MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(m_settings, QStringList(), true);
 | 
				
			||||||
    m_inputMessageQueue.push(msg);
 | 
					    m_inputMessageQueue.push(msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return success;
 | 
					    return success;
 | 
				
			||||||
@ -404,12 +306,12 @@ int ADSBDemod::webapiSettingsPutPatch(
 | 
				
			|||||||
    ADSBDemodSettings settings = m_settings;
 | 
					    ADSBDemodSettings settings = m_settings;
 | 
				
			||||||
    webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
 | 
					    webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(settings, force);
 | 
					    MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(settings, channelSettingsKeys, force);
 | 
				
			||||||
    m_inputMessageQueue.push(msg);
 | 
					    m_inputMessageQueue.push(msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (m_guiMessageQueue) // forward to GUI if any
 | 
					    if (m_guiMessageQueue) // forward to GUI if any
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, force);
 | 
					        MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, channelSettingsKeys, force);
 | 
				
			||||||
        m_guiMessageQueue->push(msgToGUI);
 | 
					        m_guiMessageQueue->push(msgToGUI);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -661,7 +563,7 @@ void ADSBDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const ADSBDemodSettings& settings, bool force)
 | 
					void ADSBDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const ADSBDemodSettings& settings, bool force)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
 | 
					    SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
 | 
				
			||||||
    swgChannelSettings->setDirection(0); // single sink (Rx)
 | 
					    swgChannelSettings->setDirection(0); // single sink (Rx)
 | 
				
			||||||
 | 
				
			|||||||
@ -20,8 +20,6 @@
 | 
				
			|||||||
#ifndef INCLUDE_ADSBDEMOD_H
 | 
					#ifndef INCLUDE_ADSBDEMOD_H
 | 
				
			||||||
#define INCLUDE_ADSBDEMOD_H
 | 
					#define INCLUDE_ADSBDEMOD_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <vector>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <QNetworkRequest>
 | 
					#include <QNetworkRequest>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "dsp/basebandsamplesink.h"
 | 
					#include "dsp/basebandsamplesink.h"
 | 
				
			||||||
@ -44,20 +42,23 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public:
 | 
					    public:
 | 
				
			||||||
        const ADSBDemodSettings& getSettings() const { return m_settings; }
 | 
					        const ADSBDemodSettings& getSettings() const { return m_settings; }
 | 
				
			||||||
 | 
					        const QStringList& getSettingsKeys() const { return m_settingsKeys; }
 | 
				
			||||||
        bool getForce() const { return m_force; }
 | 
					        bool getForce() const { return m_force; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static MsgConfigureADSBDemod* create(const ADSBDemodSettings& settings, bool force)
 | 
					        static MsgConfigureADSBDemod* create(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new MsgConfigureADSBDemod(settings, force);
 | 
					            return new MsgConfigureADSBDemod(settings, settingsKeys, force);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
        ADSBDemodSettings m_settings;
 | 
					        ADSBDemodSettings m_settings;
 | 
				
			||||||
 | 
					        QStringList m_settingsKeys;
 | 
				
			||||||
        bool m_force;
 | 
					        bool m_force;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        MsgConfigureADSBDemod(const ADSBDemodSettings& settings, bool force) :
 | 
					        MsgConfigureADSBDemod(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force) :
 | 
				
			||||||
            Message(),
 | 
					            Message(),
 | 
				
			||||||
            m_settings(settings),
 | 
					            m_settings(settings),
 | 
				
			||||||
 | 
					            m_settingsKeys(settingsKeys),
 | 
				
			||||||
            m_force(force)
 | 
					            m_force(force)
 | 
				
			||||||
        { }
 | 
					        { }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@ -184,9 +185,9 @@ private:
 | 
				
			|||||||
    QNetworkRequest m_networkRequest;
 | 
					    QNetworkRequest m_networkRequest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	virtual bool handleMessage(const Message& cmd); //!< Processing of a message. Returns true if message has actually been processed
 | 
						virtual bool handleMessage(const Message& cmd); //!< Processing of a message. Returns true if message has actually been processed
 | 
				
			||||||
    void applySettings(const ADSBDemodSettings& settings, bool force = false);
 | 
					    void applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force = false);
 | 
				
			||||||
    void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
 | 
					    void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
 | 
				
			||||||
    void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const ADSBDemodSettings& settings, bool force);
 | 
					    void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const ADSBDemodSettings& settings, bool force);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private slots:
 | 
					private slots:
 | 
				
			||||||
    void networkManagerFinished(QNetworkReply *reply);
 | 
					    void networkManagerFinished(QNetworkReply *reply);
 | 
				
			||||||
 | 
				
			|||||||
@ -117,7 +117,7 @@ bool ADSBDemodBaseband::handleMessage(const Message& cmd)
 | 
				
			|||||||
        MsgConfigureADSBDemodBaseband& cfg = (MsgConfigureADSBDemodBaseband&) cmd;
 | 
					        MsgConfigureADSBDemodBaseband& cfg = (MsgConfigureADSBDemodBaseband&) cmd;
 | 
				
			||||||
        qDebug() << "ADSBDemodBaseband::handleMessage: MsgConfigureADSBDemodBaseband";
 | 
					        qDebug() << "ADSBDemodBaseband::handleMessage: MsgConfigureADSBDemodBaseband";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        applySettings(cfg.getSettings(), cfg.getForce());
 | 
					        applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -138,19 +138,24 @@ bool ADSBDemodBaseband::handleMessage(const Message& cmd)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodBaseband::applySettings(const ADSBDemodSettings& settings, bool force)
 | 
					void ADSBDemodBaseband::applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)
 | 
					    if (   (settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset))
 | 
				
			||||||
        || (settings.m_samplesPerBit != m_settings.m_samplesPerBit) || force)
 | 
					        || (settingsKeys.contains("samplesPerBit") && (settings.m_samplesPerBit != m_settings.m_samplesPerBit))
 | 
				
			||||||
 | 
					        || force)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        int requestedRate = ADS_B_BITS_PER_SECOND * settings.m_samplesPerBit;
 | 
					        int requestedRate = ADS_B_BITS_PER_SECOND * settings.m_samplesPerBit;
 | 
				
			||||||
        m_channelizer->setChannelization(requestedRate, settings.m_inputFrequencyOffset);
 | 
					        m_channelizer->setChannelization(requestedRate, settings.m_inputFrequencyOffset);
 | 
				
			||||||
        m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
 | 
					        m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    m_sink.applySettings(settings, force);
 | 
					    m_sink.applySettings(settings, settingsKeys, force);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (force) {
 | 
				
			||||||
        m_settings = settings;
 | 
					        m_settings = settings;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        m_settings.applySettings(settingsKeys, settings);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ADSBDemodBaseband::getChannelSampleRate() const
 | 
					int ADSBDemodBaseband::getChannelSampleRate() const
 | 
				
			||||||
 | 
				
			|||||||
@ -39,20 +39,23 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public:
 | 
					    public:
 | 
				
			||||||
        const ADSBDemodSettings& getSettings() const { return m_settings; }
 | 
					        const ADSBDemodSettings& getSettings() const { return m_settings; }
 | 
				
			||||||
 | 
					        const QStringList& getSettingsKeys() const { return m_settingsKeys; }
 | 
				
			||||||
        bool getForce() const { return m_force; }
 | 
					        bool getForce() const { return m_force; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static MsgConfigureADSBDemodBaseband* create(const ADSBDemodSettings& settings, bool force)
 | 
					        static MsgConfigureADSBDemodBaseband* create(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new MsgConfigureADSBDemodBaseband(settings, force);
 | 
					            return new MsgConfigureADSBDemodBaseband(settings, settingsKeys, force);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
        ADSBDemodSettings m_settings;
 | 
					        ADSBDemodSettings m_settings;
 | 
				
			||||||
 | 
					        QStringList m_settingsKeys;
 | 
				
			||||||
        bool m_force;
 | 
					        bool m_force;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        MsgConfigureADSBDemodBaseband(const ADSBDemodSettings& settings, bool force) :
 | 
					        MsgConfigureADSBDemodBaseband(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force) :
 | 
				
			||||||
            Message(),
 | 
					            Message(),
 | 
				
			||||||
            m_settings(settings),
 | 
					            m_settings(settings),
 | 
				
			||||||
 | 
					            m_settingsKeys(settingsKeys),
 | 
				
			||||||
            m_force(force)
 | 
					            m_force(force)
 | 
				
			||||||
        { }
 | 
					        { }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@ -80,7 +83,7 @@ private:
 | 
				
			|||||||
    QRecursiveMutex m_mutex;
 | 
					    QRecursiveMutex m_mutex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool handleMessage(const Message& cmd);
 | 
					    bool handleMessage(const Message& cmd);
 | 
				
			||||||
    void applySettings(const ADSBDemodSettings& settings, bool force = false);
 | 
					    void applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force = false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private slots:
 | 
					private slots:
 | 
				
			||||||
    void handleInputMessages();
 | 
					    void handleInputMessages();
 | 
				
			||||||
 | 
				
			|||||||
@ -81,36 +81,125 @@ ADSBDemodDisplayDialog::~ADSBDemodDisplayDialog()
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodDisplayDialog::accept()
 | 
					void ADSBDemodDisplayDialog::accept()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (m_settings->m_removeTimeout != ui->timeout->value())
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        m_settings->m_removeTimeout = ui->timeout->value();
 | 
					        m_settings->m_removeTimeout = ui->timeout->value();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("removeTimeout");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_aircraftMinZoom != ui->aircraftMinZoom->value())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_aircraftMinZoom = ui->aircraftMinZoom->value();
 | 
					        m_settings->m_aircraftMinZoom = ui->aircraftMinZoom->value();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("aircraftMinZoom");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_airportRange != ui->airportRange->value())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_airportRange = ui->airportRange->value();
 | 
					        m_settings->m_airportRange = ui->airportRange->value();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("airportRange");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_airportMinimumSize != (ADSBDemodSettings::AirportType)ui->airportSize->currentIndex())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_airportMinimumSize = (ADSBDemodSettings::AirportType)ui->airportSize->currentIndex();
 | 
					        m_settings->m_airportMinimumSize = (ADSBDemodSettings::AirportType)ui->airportSize->currentIndex();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("airportMinimumSize");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_displayHeliports != ui->heliports->isChecked())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_displayHeliports = ui->heliports->isChecked();
 | 
					        m_settings->m_displayHeliports = ui->heliports->isChecked();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("displayHeliports");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_siUnits != ui->units->currentIndex() == 0 ? false : true)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_siUnits = ui->units->currentIndex() == 0 ? false : true;
 | 
					        m_settings->m_siUnits = ui->units->currentIndex() == 0 ? false : true;
 | 
				
			||||||
 | 
					        m_settingsKeys.append("siUnits");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_displayDemodStats != ui->displayStats->isChecked())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_displayDemodStats = ui->displayStats->isChecked();
 | 
					        m_settings->m_displayDemodStats = ui->displayStats->isChecked();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("displayDemodStats");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_autoResizeTableColumns != ui->autoResizeTableColumns->isChecked())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_autoResizeTableColumns = ui->autoResizeTableColumns->isChecked();
 | 
					        m_settings->m_autoResizeTableColumns = ui->autoResizeTableColumns->isChecked();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("autoResizeTableColumns");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_aviationstackAPIKey != ui->aviationstackAPIKey->text())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_aviationstackAPIKey = ui->aviationstackAPIKey->text();
 | 
					        m_settings->m_aviationstackAPIKey = ui->aviationstackAPIKey->text();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("aviationstackAPIKey");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_checkWXAPIKey != ui->checkWXAPIKey->text())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_checkWXAPIKey = ui->checkWXAPIKey->text();
 | 
					        m_settings->m_checkWXAPIKey = ui->checkWXAPIKey->text();
 | 
				
			||||||
    m_settings->m_airspaces = QStringList();
 | 
					        m_settingsKeys.append("checkWXAPIKey");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    QStringList airspaces;
 | 
				
			||||||
    for (int i = 0; i < ui->airspaces->count(); i++)
 | 
					    for (int i = 0; i < ui->airspaces->count(); i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        QListWidgetItem *item = ui->airspaces->item(i);
 | 
					        QListWidgetItem *item = ui->airspaces->item(i);
 | 
				
			||||||
        if (item->checkState() == Qt::Checked) {
 | 
					        if (item->checkState() == Qt::Checked) {
 | 
				
			||||||
            m_settings->m_airspaces.append(item->text());
 | 
					            airspaces.append(item->text());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_airspaces != airspaces)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        m_settings->m_airspaces = airspaces;
 | 
				
			||||||
 | 
					        m_settingsKeys.append("airspaces");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_airspaceRange != ui->airspaceRange->value())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_airspaceRange = ui->airspaceRange->value();
 | 
					        m_settings->m_airspaceRange = ui->airspaceRange->value();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("airspaceRange");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_mapProvider != ui->mapProvider->currentText())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_mapProvider = ui->mapProvider->currentText();
 | 
					        m_settings->m_mapProvider = ui->mapProvider->currentText();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("mapProvider");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_mapType != (ADSBDemodSettings::MapType)ui->mapType->currentIndex())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_mapType = (ADSBDemodSettings::MapType)ui->mapType->currentIndex();
 | 
					        m_settings->m_mapType = (ADSBDemodSettings::MapType)ui->mapType->currentIndex();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("mapType");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_displayNavAids != ui->navAids->isChecked())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_displayNavAids = ui->navAids->isChecked();
 | 
					        m_settings->m_displayNavAids = ui->navAids->isChecked();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("displayNavAids");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_atcCallsigns != ui->atcCallsigns->isChecked())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_atcCallsigns = ui->atcCallsigns->isChecked();
 | 
					        m_settings->m_atcCallsigns = ui->atcCallsigns->isChecked();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("atcCallsigns");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_displayPhotos != ui->photos->isChecked())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_displayPhotos = ui->photos->isChecked();
 | 
					        m_settings->m_displayPhotos = ui->photos->isChecked();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("displayPhotos");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_verboseModelMatching != ui->verboseModelMatching->isChecked())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_verboseModelMatching = ui->verboseModelMatching->isChecked();
 | 
					        m_settings->m_verboseModelMatching = ui->verboseModelMatching->isChecked();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("verboseModelMatching");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_airfieldElevation != ui->airfieldElevation->value())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_airfieldElevation = ui->airfieldElevation->value();
 | 
					        m_settings->m_airfieldElevation = ui->airfieldElevation->value();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("airfieldElevation");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_transitionAlt != ui->transitionAltitude->value())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_transitionAlt = ui->transitionAltitude->value();
 | 
					        m_settings->m_transitionAlt = ui->transitionAltitude->value();
 | 
				
			||||||
 | 
					        m_settingsKeys.append("transitionAlt");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_tableFontName != m_fontName)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_tableFontName = m_fontName;
 | 
					        m_settings->m_tableFontName = m_fontName;
 | 
				
			||||||
 | 
					        m_settingsKeys.append("tableFontName");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (m_settings->m_tableFontSize != m_fontSize)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        m_settings->m_tableFontSize = m_fontSize;
 | 
					        m_settings->m_tableFontSize = m_fontSize;
 | 
				
			||||||
 | 
					        m_settingsKeys.append("tableFontSize");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    QDialog::accept();
 | 
					    QDialog::accept();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -28,6 +28,8 @@ public:
 | 
				
			|||||||
    explicit ADSBDemodDisplayDialog(ADSBDemodSettings *settings, QWidget* parent = 0);
 | 
					    explicit ADSBDemodDisplayDialog(ADSBDemodSettings *settings, QWidget* parent = 0);
 | 
				
			||||||
    ~ADSBDemodDisplayDialog();
 | 
					    ~ADSBDemodDisplayDialog();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const QStringList& getSettingsKeys() const { return m_settingsKeys; };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private slots:
 | 
					private slots:
 | 
				
			||||||
    void accept();
 | 
					    void accept();
 | 
				
			||||||
    void on_font_clicked();
 | 
					    void on_font_clicked();
 | 
				
			||||||
@ -35,6 +37,7 @@ private slots:
 | 
				
			|||||||
private:
 | 
					private:
 | 
				
			||||||
    Ui::ADSBDemodDisplayDialog* ui;
 | 
					    Ui::ADSBDemodDisplayDialog* ui;
 | 
				
			||||||
    ADSBDemodSettings *m_settings;
 | 
					    ADSBDemodSettings *m_settings;
 | 
				
			||||||
 | 
					    QStringList m_settingsKeys;
 | 
				
			||||||
    QString m_fontName;
 | 
					    QString m_fontName;
 | 
				
			||||||
    int m_fontSize;
 | 
					    int m_fontSize;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -146,8 +146,8 @@ void ADSBDemodGUI::destroy()
 | 
				
			|||||||
void ADSBDemodGUI::resetToDefaults()
 | 
					void ADSBDemodGUI::resetToDefaults()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_settings.resetToDefaults();
 | 
					    m_settings.resetToDefaults();
 | 
				
			||||||
    displaySettings();
 | 
					    displaySettings(QStringList(), true);
 | 
				
			||||||
    applySettings();
 | 
					    applyAllSettings();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QByteArray ADSBDemodGUI::serialize() const
 | 
					QByteArray ADSBDemodGUI::serialize() const
 | 
				
			||||||
@ -160,8 +160,8 @@ bool ADSBDemodGUI::deserialize(const QByteArray& data)
 | 
				
			|||||||
    if(m_settings.deserialize(data))
 | 
					    if(m_settings.deserialize(data))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        updateChannelList();
 | 
					        updateChannelList();
 | 
				
			||||||
        displaySettings();
 | 
					        displaySettings(QStringList(), true);
 | 
				
			||||||
        applySettings(true);
 | 
					        applyAllSettings();
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
@ -3471,10 +3471,19 @@ bool ADSBDemodGUI::handleMessage(const Message& message)
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        qDebug("ADSBDemodGUI::handleMessage: ADSBDemod::MsgConfigureADSBDemod");
 | 
					        qDebug("ADSBDemodGUI::handleMessage: ADSBDemod::MsgConfigureADSBDemod");
 | 
				
			||||||
        const ADSBDemod::MsgConfigureADSBDemod& cfg = (ADSBDemod::MsgConfigureADSBDemod&) message;
 | 
					        const ADSBDemod::MsgConfigureADSBDemod& cfg = (ADSBDemod::MsgConfigureADSBDemod&) message;
 | 
				
			||||||
 | 
					        const ADSBDemodSettings settings = cfg.getSettings();
 | 
				
			||||||
 | 
					        const QStringList settingsKeys = cfg.getSettingsKeys();
 | 
				
			||||||
 | 
					        bool force = cfg.getForce();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (force) {
 | 
				
			||||||
            m_settings = cfg.getSettings();
 | 
					            m_settings = cfg.getSettings();
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            m_settings.applySettings(settingsKeys, settings);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        blockApplySettings(true);
 | 
					        blockApplySettings(true);
 | 
				
			||||||
        m_channelMarker.updateSettings(static_cast<const ChannelMarker*>(m_settings.m_channelMarker));
 | 
					        m_channelMarker.updateSettings(static_cast<const ChannelMarker*>(m_settings.m_channelMarker));
 | 
				
			||||||
        displaySettings();
 | 
					        displaySettings(settingsKeys, force);
 | 
				
			||||||
        blockApplySettings(false);
 | 
					        blockApplySettings(false);
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -3499,7 +3508,7 @@ void ADSBDemodGUI::channelMarkerChangedByCursor()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
 | 
					    ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
 | 
				
			||||||
    m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
 | 
					    m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("inputFrequencyOffset");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::channelMarkerHighlightedByCursor()
 | 
					void ADSBDemodGUI::channelMarkerHighlightedByCursor()
 | 
				
			||||||
@ -3512,7 +3521,7 @@ void ADSBDemodGUI::on_deltaFrequency_changed(qint64 value)
 | 
				
			|||||||
    m_channelMarker.setCenterFrequency(value);
 | 
					    m_channelMarker.setCenterFrequency(value);
 | 
				
			||||||
    m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
 | 
					    m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
 | 
				
			||||||
    updateAbsoluteCenterFrequency();
 | 
					    updateAbsoluteCenterFrequency();
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("inputFrequencyOffset");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::on_rfBW_valueChanged(int value)
 | 
					void ADSBDemodGUI::on_rfBW_valueChanged(int value)
 | 
				
			||||||
@ -3521,7 +3530,7 @@ void ADSBDemodGUI::on_rfBW_valueChanged(int value)
 | 
				
			|||||||
    ui->rfBWText->setText(QString("%1M").arg(bw / 1000000.0, 0, 'f', 1));
 | 
					    ui->rfBWText->setText(QString("%1M").arg(bw / 1000000.0, 0, 'f', 1));
 | 
				
			||||||
    m_channelMarker.setBandwidth(bw);
 | 
					    m_channelMarker.setBandwidth(bw);
 | 
				
			||||||
    m_settings.m_rfBandwidth = bw;
 | 
					    m_settings.m_rfBandwidth = bw;
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("rfBandwidth");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::on_threshold_valueChanged(int value)
 | 
					void ADSBDemodGUI::on_threshold_valueChanged(int value)
 | 
				
			||||||
@ -3529,14 +3538,14 @@ void ADSBDemodGUI::on_threshold_valueChanged(int value)
 | 
				
			|||||||
    Real thresholddB = ((Real)value)/10.0f;
 | 
					    Real thresholddB = ((Real)value)/10.0f;
 | 
				
			||||||
    ui->thresholdText->setText(QString("%1").arg(thresholddB, 0, 'f', 1));
 | 
					    ui->thresholdText->setText(QString("%1").arg(thresholddB, 0, 'f', 1));
 | 
				
			||||||
    m_settings.m_correlationThreshold = thresholddB;
 | 
					    m_settings.m_correlationThreshold = thresholddB;
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("correlationThreshold");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::on_phaseSteps_valueChanged(int value)
 | 
					void ADSBDemodGUI::on_phaseSteps_valueChanged(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ui->phaseStepsText->setText(QString("%1").arg(value));
 | 
					    ui->phaseStepsText->setText(QString("%1").arg(value));
 | 
				
			||||||
    m_settings.m_interpolatorPhaseSteps = value;
 | 
					    m_settings.m_interpolatorPhaseSteps = value;
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("interpolatorPhaseSteps");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::on_tapsPerPhase_valueChanged(int value)
 | 
					void ADSBDemodGUI::on_tapsPerPhase_valueChanged(int value)
 | 
				
			||||||
@ -3544,14 +3553,14 @@ void ADSBDemodGUI::on_tapsPerPhase_valueChanged(int value)
 | 
				
			|||||||
    Real tapsPerPhase = ((Real)value)/10.0f;
 | 
					    Real tapsPerPhase = ((Real)value)/10.0f;
 | 
				
			||||||
    ui->tapsPerPhaseText->setText(QString("%1").arg(tapsPerPhase, 0, 'f', 1));
 | 
					    ui->tapsPerPhaseText->setText(QString("%1").arg(tapsPerPhase, 0, 'f', 1));
 | 
				
			||||||
    m_settings.m_interpolatorTapsPerPhase = tapsPerPhase;
 | 
					    m_settings.m_interpolatorTapsPerPhase = tapsPerPhase;
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("interpolatorTapsPerPhase");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::on_feed_clicked(bool checked)
 | 
					void ADSBDemodGUI::on_feed_clicked(bool checked)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_settings.m_feedEnabled = checked;
 | 
					    m_settings.m_feedEnabled = checked;
 | 
				
			||||||
    // Don't disable host/port - so they can be entered before connecting
 | 
					    // Don't disable host/port - so they can be entered before connecting
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("feedEnabled");
 | 
				
			||||||
    applyImportSettings();
 | 
					    applyImportSettings();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -3561,7 +3570,7 @@ void ADSBDemodGUI::on_notifications_clicked()
 | 
				
			|||||||
    if (dialog.exec() == QDialog::Accepted)
 | 
					    if (dialog.exec() == QDialog::Accepted)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        enableSpeechIfNeeded();
 | 
					        enableSpeechIfNeeded();
 | 
				
			||||||
        applySettings();
 | 
					        applySetting("notificationSettings");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -3829,19 +3838,19 @@ QAction *ADSBDemodGUI::createCheckableItem(QString &text, int idx, bool checked)
 | 
				
			|||||||
void ADSBDemodGUI::on_spb_currentIndexChanged(int value)
 | 
					void ADSBDemodGUI::on_spb_currentIndexChanged(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_settings.m_samplesPerBit = (value + 1) * 2;
 | 
					    m_settings.m_samplesPerBit = (value + 1) * 2;
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("samplesPerBi");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::on_correlateFullPreamble_clicked(bool checked)
 | 
					void ADSBDemodGUI::on_correlateFullPreamble_clicked(bool checked)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_settings.m_correlateFullPreamble = checked;
 | 
					    m_settings.m_correlateFullPreamble = checked;
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("correlateFullPreamble");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::on_demodModeS_clicked(bool checked)
 | 
					void ADSBDemodGUI::on_demodModeS_clicked(bool checked)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_settings.m_demodModeS = checked;
 | 
					    m_settings.m_demodModeS = checked;
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("demodModeS");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::on_getOSNDB_clicked()
 | 
					void ADSBDemodGUI::on_getOSNDB_clicked()
 | 
				
			||||||
@ -3897,7 +3906,7 @@ void ADSBDemodGUI::on_atcLabels_clicked(bool checked)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    m_settings.m_atcLabels = checked;
 | 
					    m_settings.m_atcLabels = checked;
 | 
				
			||||||
    m_aircraftModel.setSettings(&m_settings);
 | 
					    m_aircraftModel.setSettings(&m_settings);
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("atcLabels");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QString ADSBDemodGUI::getDataDir()
 | 
					QString ADSBDemodGUI::getDataDir()
 | 
				
			||||||
@ -3914,7 +3923,7 @@ void ADSBDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
 | 
				
			|||||||
    (void) rollDown;
 | 
					    (void) rollDown;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getRollupContents()->saveState(m_rollupState);
 | 
					    getRollupContents()->saveState(m_rollupState);
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("rollupState");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::onMenuDialogCalled(const QPoint &p)
 | 
					void ADSBDemodGUI::onMenuDialogCalled(const QPoint &p)
 | 
				
			||||||
@ -3951,6 +3960,16 @@ void ADSBDemodGUI::onMenuDialogCalled(const QPoint &p)
 | 
				
			|||||||
        setTitle(m_channelMarker.getTitle());
 | 
					        setTitle(m_channelMarker.getTitle());
 | 
				
			||||||
        setTitleColor(m_settings.m_rgbColor);
 | 
					        setTitleColor(m_settings.m_rgbColor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QStringList settingsKeys({
 | 
				
			||||||
 | 
					           "rgbColor",
 | 
				
			||||||
 | 
					           "title",
 | 
				
			||||||
 | 
					           "useReverseAPI",
 | 
				
			||||||
 | 
					           "reverseAPIAddress",
 | 
				
			||||||
 | 
					           "reverseAPIPort",
 | 
				
			||||||
 | 
					           "reverseAPIDeviceIndex",
 | 
				
			||||||
 | 
					           "reverseAPIChannelIndex"
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (m_deviceUISet->m_deviceMIMOEngine)
 | 
					        if (m_deviceUISet->m_deviceMIMOEngine)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            m_settings.m_streamIndex = dialog.getSelectedStreamIndex();
 | 
					            m_settings.m_streamIndex = dialog.getSelectedStreamIndex();
 | 
				
			||||||
@ -3959,7 +3978,7 @@ void ADSBDemodGUI::onMenuDialogCalled(const QPoint &p)
 | 
				
			|||||||
            updateIndexLabel();
 | 
					            updateIndexLabel();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        applySettings();
 | 
					        applySettings(settingsKeys);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    resetContextMenuType();
 | 
					    resetContextMenuType();
 | 
				
			||||||
@ -4000,7 +4019,7 @@ void ADSBDemodGUI::on_amDemod_currentIndexChanged(int index)
 | 
				
			|||||||
    if (index >= 0)
 | 
					    if (index >= 0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        m_settings.m_amDemod = ui->amDemod->currentText();
 | 
					        m_settings.m_amDemod = ui->amDemod->currentText();
 | 
				
			||||||
        applySettings();
 | 
					        applySetting("amDemod");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -4687,7 +4706,24 @@ void ADSBDemodGUI::feedSelect(const QPoint& p)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (dialog.exec() == QDialog::Accepted)
 | 
					    if (dialog.exec() == QDialog::Accepted)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        applySettings();
 | 
					        applySettings({
 | 
				
			||||||
 | 
					            "exportClientEnabled",
 | 
				
			||||||
 | 
					            "exportClientHost",
 | 
				
			||||||
 | 
					            "exportClientPort",
 | 
				
			||||||
 | 
					            "exportClientFormat",
 | 
				
			||||||
 | 
					            "exportServerEnabled",
 | 
				
			||||||
 | 
					            "exportServerPort",
 | 
				
			||||||
 | 
					            "importEnabled",
 | 
				
			||||||
 | 
					            "importHost",
 | 
				
			||||||
 | 
					            "importUsername",
 | 
				
			||||||
 | 
					            "importPassword",
 | 
				
			||||||
 | 
					            "importParameters",
 | 
				
			||||||
 | 
					            "importPeriod",
 | 
				
			||||||
 | 
					            "importMinLatitude",
 | 
				
			||||||
 | 
					            "importMaxLatitude",
 | 
				
			||||||
 | 
					            "importMinLongitude",
 | 
				
			||||||
 | 
					            "importMaxLongitude"
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
        applyImportSettings();
 | 
					        applyImportSettings();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -4704,8 +4740,8 @@ void ADSBDemodGUI::on_displaySettings_clicked()
 | 
				
			|||||||
        if (unitsChanged) {
 | 
					        if (unitsChanged) {
 | 
				
			||||||
            m_aircraftModel.allAircraftUpdated();
 | 
					            m_aircraftModel.allAircraftUpdated();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        displaySettings();
 | 
					        displaySettings(dialog.getSettingsKeys(), false);
 | 
				
			||||||
        applySettings();
 | 
					        applySettings(dialog.getSettingsKeys());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -5055,9 +5091,9 @@ ADSBDemodGUI::ADSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseb
 | 
				
			|||||||
    connect(MainCore::instance(), &MainCore::channelRemoved, this, &ADSBDemodGUI::updateChannelList);
 | 
					    connect(MainCore::instance(), &MainCore::channelRemoved, this, &ADSBDemodGUI::updateChannelList);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    updateChannelList();
 | 
					    updateChannelList();
 | 
				
			||||||
    displaySettings();
 | 
					    displaySettings(QStringList(), true);
 | 
				
			||||||
    makeUIConnections();
 | 
					    makeUIConnections();
 | 
				
			||||||
    applySettings(true);
 | 
					    applyAllSettings();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    connect(&m_importTimer, &QTimer::timeout, this, &ADSBDemodGUI::import);
 | 
					    connect(&m_importTimer, &QTimer::timeout, this, &ADSBDemodGUI::import);
 | 
				
			||||||
    m_networkManager = new QNetworkAccessManager();
 | 
					    m_networkManager = new QNetworkAccessManager();
 | 
				
			||||||
@ -5111,18 +5147,30 @@ ADSBDemodGUI::~ADSBDemodGUI()
 | 
				
			|||||||
    delete m_networkManager;
 | 
					    delete m_networkManager;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::applySettings(bool force)
 | 
					void ADSBDemodGUI::applySetting(const QString& settingsKey)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    applySettings({settingsKey});
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ADSBDemodGUI::applySettings(const QStringList& settingsKeys, bool force)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_settingsKeys.append(settingsKeys);
 | 
				
			||||||
    if (m_doApplySettings)
 | 
					    if (m_doApplySettings)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        qDebug() << "ADSBDemodGUI::applySettings";
 | 
					        qDebug() << "ADSBDemodGUI::applySettings";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ADSBDemod::MsgConfigureADSBDemod* message = ADSBDemod::MsgConfigureADSBDemod::create(m_settings, force);
 | 
					        ADSBDemod::MsgConfigureADSBDemod* message = ADSBDemod::MsgConfigureADSBDemod::create(m_settings, m_settingsKeys, force);
 | 
				
			||||||
        m_adsbDemod->getInputMessageQueue()->push(message);
 | 
					        m_adsbDemod->getInputMessageQueue()->push(message);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::displaySettings()
 | 
					void ADSBDemodGUI::applyAllSettings()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    applySettings(QStringList(), true);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// All settings are valid - we just use settingsKeys here to avoid updating things that are slow to update
 | 
				
			||||||
 | 
					void ADSBDemodGUI::displaySettings(const QStringList& settingsKeys, bool force)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_channelMarker.blockSignals(true);
 | 
					    m_channelMarker.blockSignals(true);
 | 
				
			||||||
    m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
 | 
					    m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
 | 
				
			||||||
@ -5175,10 +5223,15 @@ void ADSBDemodGUI::displaySettings()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    updateIndexLabel();
 | 
					    updateIndexLabel();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("tableFontName") || settingsKeys.contains("tableFontSize") || force)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        QFont font(m_settings.m_tableFontName, m_settings.m_tableFontSize);
 | 
					        QFont font(m_settings.m_tableFontName, m_settings.m_tableFontSize);
 | 
				
			||||||
        ui->adsbData->setFont(font);
 | 
					        ui->adsbData->setFont(font);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Set units in column headers
 | 
					    // Set units in column headers
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("siUnits") || force)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        if (m_settings.m_siUnits)
 | 
					        if (m_settings.m_siUnits)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            ui->adsbData->horizontalHeaderItem(ADSB_COL_ALTITUDE)->setText("Alt (m)");
 | 
					            ui->adsbData->horizontalHeaderItem(ADSB_COL_ALTITUDE)->setText("Alt (m)");
 | 
				
			||||||
@ -5201,8 +5254,11 @@ void ADSBDemodGUI::displaySettings()
 | 
				
			|||||||
            ui->adsbData->horizontalHeaderItem(ADSB_COL_HEADWIND)->setText("H Wnd (kn)");
 | 
					            ui->adsbData->horizontalHeaderItem(ADSB_COL_HEADWIND)->setText("H Wnd (kn)");
 | 
				
			||||||
            ui->adsbData->horizontalHeaderItem(ADSB_COL_WIND_SPEED)->setText("Wnd (kn)");
 | 
					            ui->adsbData->horizontalHeaderItem(ADSB_COL_WIND_SPEED)->setText("Wnd (kn)");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Order and size columns
 | 
					    // Order and size columns
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("columnSizes") || settingsKeys.contains("columnIndexes") || force)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        QHeaderView* header = ui->adsbData->horizontalHeader();
 | 
					        QHeaderView* header = ui->adsbData->horizontalHeader();
 | 
				
			||||||
        for (int i = 0; i < ADSBDEMOD_COLUMNS; i++)
 | 
					        for (int i = 0; i < ADSBDEMOD_COLUMNS; i++)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@ -5213,28 +5269,49 @@ void ADSBDemodGUI::displaySettings()
 | 
				
			|||||||
                ui->adsbData->setColumnWidth(i, m_settings.m_columnSizes[i]);
 | 
					                ui->adsbData->setColumnWidth(i, m_settings.m_columnSizes[i]);
 | 
				
			||||||
            header->moveSection(header->visualIndex(i), m_settings.m_columnIndexes[i]);
 | 
					            header->moveSection(header->visualIndex(i), m_settings.m_columnIndexes[i]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Only update airports on map if settings have changed
 | 
					    // Only update airports on map if settings have changed
 | 
				
			||||||
    if ((m_airportInfo != nullptr)
 | 
					    if ((m_airportInfo != nullptr)
 | 
				
			||||||
        && ((m_settings.m_airportRange != m_currentAirportRange)
 | 
					        && (((settingsKeys.contains("airportRange") || force) && (m_settings.m_airportRange != m_currentAirportRange))
 | 
				
			||||||
            || (m_settings.m_airportMinimumSize != m_currentAirportMinimumSize)
 | 
					            || ((settingsKeys.contains("airportMinimumSize") || force) && (m_settings.m_airportMinimumSize != m_currentAirportMinimumSize))
 | 
				
			||||||
            || (m_settings.m_displayHeliports != m_currentDisplayHeliports)))
 | 
					            || ((settingsKeys.contains("displayHeliports") || force) && (m_settings.m_displayHeliports != m_currentDisplayHeliports)))) {
 | 
				
			||||||
        updateAirports();
 | 
					        updateAirports();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("airspaces") || force) {
 | 
				
			||||||
        updateAirspaces();
 | 
					        updateAirspaces();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("displayNavAids") || settingsKeys.contains("airspaceRange") || force) {
 | 
				
			||||||
        updateNavAids();
 | 
					        updateNavAids();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!m_settings.m_displayDemodStats)
 | 
					    if (!m_settings.m_displayDemodStats)
 | 
				
			||||||
        ui->stats->setText("");
 | 
					        ui->stats->setText("");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("aviationstackAPIKey") || force) {
 | 
				
			||||||
        initFlightInformation();
 | 
					        initFlightInformation();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("checkWXAPIKey") || force) {
 | 
				
			||||||
        initAviationWeather();
 | 
					        initAviationWeather();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importPeriod")
 | 
				
			||||||
 | 
					        || settingsKeys.contains("feedEnabled")
 | 
				
			||||||
 | 
					        || settingsKeys.contains("importEnabled")
 | 
				
			||||||
 | 
					        || force) {
 | 
				
			||||||
        applyImportSettings();
 | 
					        applyImportSettings();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getRollupContents()->restoreState(m_rollupState);
 | 
					    getRollupContents()->restoreState(m_rollupState);
 | 
				
			||||||
    blockApplySettings(false);
 | 
					    blockApplySettings(false);
 | 
				
			||||||
    enableSpeechIfNeeded();
 | 
					    enableSpeechIfNeeded();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("mapProvider")
 | 
				
			||||||
 | 
					        || settingsKeys.contains("aircraftMinZoom")
 | 
				
			||||||
 | 
					        || settingsKeys.contains("mapType")
 | 
				
			||||||
 | 
					        || force)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
#ifdef __EMSCRIPTEN__
 | 
					#ifdef __EMSCRIPTEN__
 | 
				
			||||||
        // FIXME: If we don't have this delay, tile server requests get deleted
 | 
					        // FIXME: If we don't have this delay, tile server requests get deleted
 | 
				
			||||||
        QTimer::singleShot(250, [this] {
 | 
					        QTimer::singleShot(250, [this] {
 | 
				
			||||||
@ -5244,6 +5321,7 @@ void ADSBDemodGUI::displaySettings()
 | 
				
			|||||||
        applyMapSettings();
 | 
					        applyMapSettings();
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::leaveEvent(QEvent* event)
 | 
					void ADSBDemodGUI::leaveEvent(QEvent* event)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -5536,7 +5614,7 @@ void ADSBDemodGUI::photoClicked()
 | 
				
			|||||||
void ADSBDemodGUI::on_logEnable_clicked(bool checked)
 | 
					void ADSBDemodGUI::on_logEnable_clicked(bool checked)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_settings.m_logEnabled = checked;
 | 
					    m_settings.m_logEnabled = checked;
 | 
				
			||||||
    applySettings();
 | 
					    applySetting("logEnabled");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::on_logFilename_clicked()
 | 
					void ADSBDemodGUI::on_logFilename_clicked()
 | 
				
			||||||
@ -5551,7 +5629,7 @@ void ADSBDemodGUI::on_logFilename_clicked()
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            m_settings.m_logFilename = fileNames[0];
 | 
					            m_settings.m_logFilename = fileNames[0];
 | 
				
			||||||
            ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename));
 | 
					            ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename));
 | 
				
			||||||
            applySettings();
 | 
					            applySetting("logFilename");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -911,6 +911,7 @@ private:
 | 
				
			|||||||
    ChannelMarker m_channelMarker;
 | 
					    ChannelMarker m_channelMarker;
 | 
				
			||||||
    RollupState m_rollupState;
 | 
					    RollupState m_rollupState;
 | 
				
			||||||
    ADSBDemodSettings m_settings;
 | 
					    ADSBDemodSettings m_settings;
 | 
				
			||||||
 | 
					    QStringList m_settingsKeys;
 | 
				
			||||||
    qint64 m_deviceCenterFrequency;
 | 
					    qint64 m_deviceCenterFrequency;
 | 
				
			||||||
    int m_basebandSampleRate;
 | 
					    int m_basebandSampleRate;
 | 
				
			||||||
    bool m_basicSettingsShown;
 | 
					    bool m_basicSettingsShown;
 | 
				
			||||||
@ -981,8 +982,10 @@ private:
 | 
				
			|||||||
    virtual ~ADSBDemodGUI();
 | 
					    virtual ~ADSBDemodGUI();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void blockApplySettings(bool block);
 | 
					    void blockApplySettings(bool block);
 | 
				
			||||||
    void applySettings(bool force = false);
 | 
					    void applySetting(const QString& settingsKey);
 | 
				
			||||||
    void displaySettings();
 | 
					    void applySettings(const QStringList& settingsKeys, bool force = false);
 | 
				
			||||||
 | 
					    void applyAllSettings();
 | 
				
			||||||
 | 
					    void displaySettings(const QStringList& settingsKeys, bool force);
 | 
				
			||||||
    bool handleMessage(const Message& message);
 | 
					    bool handleMessage(const Message& message);
 | 
				
			||||||
    void makeUIConnections();
 | 
					    void makeUIConnections();
 | 
				
			||||||
    void updateAbsoluteCenterFrequency();
 | 
					    void updateAbsoluteCenterFrequency();
 | 
				
			||||||
 | 
				
			|||||||
@ -401,3 +401,375 @@ void ADSBDemodSettings::NotificationSettings::updateRegularExpression()
 | 
				
			|||||||
        qDebug() << "ADSBDemod: Regular expression is not valid: " << m_regExp;
 | 
					        qDebug() << "ADSBDemod: Regular expression is not valid: " << m_regExp;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ADSBDemodSettings::applySettings(const QStringList& settingsKeys, const ADSBDemodSettings& settings)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("inputFrequencyOffset")) {
 | 
				
			||||||
 | 
					        m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("rfBandwidth")) {
 | 
				
			||||||
 | 
					        m_rfBandwidth = settings.m_rfBandwidth;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("correlationThreshold")) {
 | 
				
			||||||
 | 
					        m_correlationThreshold = settings.m_correlationThreshold;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("samplesPerBit")) {
 | 
				
			||||||
 | 
					        m_samplesPerBit = settings.m_samplesPerBit;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("removeTimeout")) {
 | 
				
			||||||
 | 
					        m_removeTimeout = settings.m_removeTimeout;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("feedEnabled")) {
 | 
				
			||||||
 | 
					        m_feedEnabled = settings.m_feedEnabled;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportClientEnabled")) {
 | 
				
			||||||
 | 
					        m_exportClientEnabled = settings.m_exportClientEnabled;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportClientHost")) {
 | 
				
			||||||
 | 
					        m_exportClientHost = settings.m_exportClientHost;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportClientPort")) {
 | 
				
			||||||
 | 
					        m_exportClientPort = settings.m_exportClientPort;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportClientFormat")) {
 | 
				
			||||||
 | 
					        m_exportClientFormat = settings.m_exportClientFormat;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportServerEnabled")) {
 | 
				
			||||||
 | 
					        m_exportServerEnabled = settings.m_exportServerEnabled;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportServerPort")) {
 | 
				
			||||||
 | 
					        m_exportServerPort = settings.m_exportServerPort;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importEnabled")) {
 | 
				
			||||||
 | 
					        m_importEnabled = settings.m_importEnabled;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importHost")) {
 | 
				
			||||||
 | 
					        m_importHost = settings.m_importHost;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importUsername")) {
 | 
				
			||||||
 | 
					        m_importUsername = settings.m_importUsername;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importPassword")) {
 | 
				
			||||||
 | 
					        m_importPassword = settings.m_importPassword;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importParameters")) {
 | 
				
			||||||
 | 
					        m_importParameters = settings.m_importParameters;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importPeriod")) {
 | 
				
			||||||
 | 
					        m_importPeriod = settings.m_importPeriod;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importMinLatitude")) {
 | 
				
			||||||
 | 
					        m_importMinLatitude = settings.m_importMinLatitude;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importMaxLatitude")) {
 | 
				
			||||||
 | 
					        m_importMaxLatitude = settings.m_importMaxLatitude;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importMinLongitude")) {
 | 
				
			||||||
 | 
					        m_importMinLongitude = settings.m_importMinLongitude;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importMaxLongitude")) {
 | 
				
			||||||
 | 
					        m_importMaxLongitude = settings.m_importMaxLongitude;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("rgbColor")) {
 | 
				
			||||||
 | 
					        m_rgbColor = settings.m_rgbColor;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("title")) {
 | 
				
			||||||
 | 
					        m_title = settings.m_title;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    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("columnIndexes")) {
 | 
				
			||||||
 | 
					        std::copy(std::begin(settings.m_columnIndexes), std::end(settings.m_columnIndexes), std::begin(m_columnIndexes));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("columnSizes")) {
 | 
				
			||||||
 | 
					        std::copy(std::begin(settings.m_columnSizes), std::end(settings.m_columnIndexes), std::begin(m_columnSizes));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("airportRange")) {
 | 
				
			||||||
 | 
					        m_airportRange = settings.m_airportRange;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("airportMinimumSize")) {
 | 
				
			||||||
 | 
					        m_airportMinimumSize = settings.m_airportMinimumSize;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("displayHeliports")) {
 | 
				
			||||||
 | 
					        m_displayHeliports = settings.m_displayHeliports;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("flightPaths")) {
 | 
				
			||||||
 | 
					        m_flightPaths = settings.m_flightPaths;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("allFlightPaths")) {
 | 
				
			||||||
 | 
					        m_allFlightPaths = settings.m_allFlightPaths;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("siUnits")) {
 | 
				
			||||||
 | 
					        m_siUnits = settings.m_siUnits;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("tableFontName")) {
 | 
				
			||||||
 | 
					        m_tableFontName = settings.m_tableFontName;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("tableFontSize")) {
 | 
				
			||||||
 | 
					        m_tableFontSize = settings.m_tableFontSize;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("displayDemodStats")) {
 | 
				
			||||||
 | 
					        m_displayDemodStats = settings.m_displayDemodStats;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("correlateFullPreamble")) {
 | 
				
			||||||
 | 
					        m_correlateFullPreamble = settings.m_correlateFullPreamble;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("demodModeS")) {
 | 
				
			||||||
 | 
					        m_demodModeS = settings.m_demodModeS;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("amDemod")) {
 | 
				
			||||||
 | 
					        m_amDemod = settings.m_amDemod;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("autoResizeTableColumns")) {
 | 
				
			||||||
 | 
					        m_autoResizeTableColumns = settings.m_autoResizeTableColumns;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("interpolatorPhaseSteps")) {
 | 
				
			||||||
 | 
					        m_interpolatorPhaseSteps = settings.m_interpolatorPhaseSteps;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("interpolatorTapsPerPhase")) {
 | 
				
			||||||
 | 
					        m_interpolatorTapsPerPhase = settings.m_interpolatorTapsPerPhase;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("notificationSettings")) {
 | 
				
			||||||
 | 
					        m_notificationSettings = settings.m_notificationSettings;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("aviationstackAPIKey")) {
 | 
				
			||||||
 | 
					        m_aviationstackAPIKey = settings.m_aviationstackAPIKey;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("checkWXAPIKey")) {
 | 
				
			||||||
 | 
					        m_checkWXAPIKey = settings.m_checkWXAPIKey;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("logFilename")) {
 | 
				
			||||||
 | 
					        m_logFilename = settings.m_logFilename;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("logEnabled")) {
 | 
				
			||||||
 | 
					        m_logEnabled = settings.m_logEnabled;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("airspaces")) {
 | 
				
			||||||
 | 
					        m_airspaces = settings.m_airspaces;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("airspaceRange")) {
 | 
				
			||||||
 | 
					        m_airspaceRange = settings.m_airspaceRange;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("mapProvider")) {
 | 
				
			||||||
 | 
					        m_mapProvider = settings.m_mapProvider;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("mapType")) {
 | 
				
			||||||
 | 
					        m_mapType = settings.m_mapType;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("displayNavAids")) {
 | 
				
			||||||
 | 
					        m_displayNavAids = settings.m_displayNavAids;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("displayPhotos")) {
 | 
				
			||||||
 | 
					        m_displayPhotos = settings.m_displayPhotos;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("verboseModelMatching")) {
 | 
				
			||||||
 | 
					        m_verboseModelMatching = settings.m_verboseModelMatching;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("airfieldElevation")) {
 | 
				
			||||||
 | 
					        m_airfieldElevation = settings.m_airfieldElevation;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("aircraftMinZoom")) {
 | 
				
			||||||
 | 
					        m_aircraftMinZoom = settings.m_aircraftMinZoom;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("atcLabels")) {
 | 
				
			||||||
 | 
					        m_atcLabels = settings.m_atcLabels;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("atcCallsigns")) {
 | 
				
			||||||
 | 
					        m_atcCallsigns = settings.m_atcCallsigns;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("transitionAlt")) {
 | 
				
			||||||
 | 
					        m_transitionAlt = settings.m_transitionAlt;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString ADSBDemodSettings::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("correlationThreshold") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_correlationThreshold: " << m_correlationThreshold;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("samplesPerBit") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_samplesPerBit: " << m_samplesPerBit;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("removeTimeout") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_removeTimeout: " << m_removeTimeout;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("feedEnabled") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_feedEnabled: " << m_feedEnabled;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportClientEnabled") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_exportClientEnabled: " << m_exportClientEnabled;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportClientHost") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_exportClientHost: " << m_exportClientHost.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportClientPort") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_exportClientPort: " << m_exportClientPort;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportClientFormat") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_exportClientFormat: " << m_exportClientFormat;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportServerEnabled") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_exportServerEnabled: " << m_exportServerEnabled;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("exportServerPort") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_exportServerPort: " << m_exportServerPort;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importEnabled") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_importEnabled: " << m_importEnabled;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importHost") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_importHost: " << m_importHost.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importUsername") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_importUsername: " << m_importUsername.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importPassword") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_importPassword: " << m_importPassword.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importParameters") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_importParameters: " << m_importParameters.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importPeriod") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_importPeriod: " << m_importPeriod;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importMinLatitude") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_importMinLatitude: " << m_importMinLatitude.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importMaxLatitude") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_importMaxLatitude: " << m_importMaxLatitude.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importMinLongitude") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_importMinLongitude: " << m_importMinLongitude.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("importMaxLongitude") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_importMaxLongitude: " << m_importMaxLongitude.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("title") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_title: " << m_title.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    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("airportRange") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_airportRange: " << m_airportRange;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("airportMinimumSize") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_airportMinimumSize: " << m_airportMinimumSize;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("displayHeliports") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_displayHeliports: " << m_displayHeliports;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("flightPaths") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_flightPaths: " << m_flightPaths;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("allFlightPaths") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_allFlightPaths: " << m_allFlightPaths;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("siUnits") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_siUnits: " << m_siUnits;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("tableFontName") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_tableFontName: " << m_tableFontName.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("tableFontSize") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_tableFontSize: " << m_tableFontSize;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("displayDemodStats") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_displayDemodStats: " << m_displayDemodStats;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("correlateFullPreamble") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_correlateFullPreamble: " << m_correlateFullPreamble;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("demodModeS") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_demodModeS: " << m_demodModeS;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("amDemod") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_amDemod: " << m_amDemod.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("autoResizeTableColumns") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_autoResizeTableColumns: " << m_autoResizeTableColumns;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("interpolatorPhaseSteps") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_interpolatorPhaseSteps: " << m_interpolatorPhaseSteps;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("notificationSettings") || force) {
 | 
				
			||||||
 | 
					        //ostr << " m_notificationSettings: " << m_notificationSettings.join(",").toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("aviationstackAPIKey") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_aviationstackAPIKey: " << m_aviationstackAPIKey.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("checkWXAPIKey") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_checkWXAPIKey: " << m_checkWXAPIKey.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("logFilename") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_logFilename: " << m_logFilename.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("logEnabled") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_logEnabled: " << m_logEnabled;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("airspaces") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_airspaces: " << m_airspaces.join(",").toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("airspaceRange") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_airspaceRange: " << m_airspaceRange;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("mapProvider") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_mapProvider: " << m_mapProvider.toStdString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("mapType") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_mapType: " << m_mapType;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("displayNavAids") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_displayNavAids: " << m_displayNavAids;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("displayPhotos") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_displayPhotos: " << m_displayPhotos;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("verboseModelMatching") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_verboseModelMatching: " << m_verboseModelMatching;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("airfieldElevation") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_airfieldElevation: " << m_airfieldElevation;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("aircraftMinZoom") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_aircraftMinZoom: " << m_aircraftMinZoom;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("atcLabels") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_atcLabels: " << m_atcLabels;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("atcCallsigns") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_atcCallsigns: " << m_atcCallsigns;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (settingsKeys.contains("transitionAlt") || force) {
 | 
				
			||||||
 | 
					        ostr << " m_transitionAlt: " << m_transitionAlt;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return QString(ostr.str().c_str());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -201,6 +201,8 @@ struct ADSBDemodSettings
 | 
				
			|||||||
    bool deserialize(const QByteArray& data);
 | 
					    bool deserialize(const QByteArray& data);
 | 
				
			||||||
    QByteArray serializeNotificationSettings(QList<NotificationSettings *> notificationSettings) const;
 | 
					    QByteArray serializeNotificationSettings(QList<NotificationSettings *> notificationSettings) const;
 | 
				
			||||||
    void deserializeNotificationSettings(const QByteArray& data, QList<NotificationSettings *>& notificationSettings);
 | 
					    void deserializeNotificationSettings(const QByteArray& data, QList<NotificationSettings *>& notificationSettings);
 | 
				
			||||||
 | 
					    void applySettings(const QStringList& settingsKeys, const ADSBDemodSettings& settings);
 | 
				
			||||||
 | 
					    QString getDebugString(const QStringList& settingsKeys, bool force = false) const;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* PLUGINS_CHANNELRX_DEMODADSB_ADSBDEMODSETTINGS_H_ */
 | 
					#endif /* PLUGINS_CHANNELRX_DEMODADSB_ADSBDEMODSETTINGS_H_ */
 | 
				
			||||||
 | 
				
			|||||||
@ -37,7 +37,7 @@ ADSBDemodSink::ADSBDemodSink() :
 | 
				
			|||||||
    m_magsqCount(0),
 | 
					    m_magsqCount(0),
 | 
				
			||||||
    m_messageQueueToGUI(nullptr)
 | 
					    m_messageQueueToGUI(nullptr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    applySettings(m_settings, true);
 | 
					    applySettings(m_settings, QStringList(), true);
 | 
				
			||||||
    applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
 | 
					    applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
 | 
				
			||||||
    for (int i = 0; i < m_buffers; i++)
 | 
					    for (int i = 0; i < m_buffers; i++)
 | 
				
			||||||
        m_bufferWrite[i].release(1);
 | 
					        m_bufferWrite[i].release(1);
 | 
				
			||||||
@ -247,7 +247,7 @@ void ADSBDemodSink::applyChannelSettings(int channelSampleRate, int channelFrequ
 | 
				
			|||||||
    m_channelFrequencyOffset = channelFrequencyOffset;
 | 
					    m_channelFrequencyOffset = channelFrequencyOffset;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodSink::applySettings(const ADSBDemodSettings& settings, bool force)
 | 
					void ADSBDemodSink::applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    qDebug() << "ADSBDemodSink::applySettings:"
 | 
					    qDebug() << "ADSBDemodSink::applySettings:"
 | 
				
			||||||
            << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
 | 
					            << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
 | 
				
			||||||
@ -258,10 +258,10 @@ void ADSBDemodSink::applySettings(const ADSBDemodSettings& settings, bool force)
 | 
				
			|||||||
            << " m_samplesPerBit: " << settings.m_samplesPerBit
 | 
					            << " m_samplesPerBit: " << settings.m_samplesPerBit
 | 
				
			||||||
            << " force: " << force;
 | 
					            << " force: " << force;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth)
 | 
					    if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth))
 | 
				
			||||||
        || (settings.m_samplesPerBit != m_settings.m_samplesPerBit)
 | 
					        || (settingsKeys.contains("samplesPerBit") && (settings.m_samplesPerBit != m_settings.m_samplesPerBit))
 | 
				
			||||||
        || (settings.m_interpolatorPhaseSteps != m_settings.m_interpolatorPhaseSteps)
 | 
					        || (settingsKeys.contains("interpolatorPhaseSteps") && (settings.m_interpolatorPhaseSteps != m_settings.m_interpolatorPhaseSteps))
 | 
				
			||||||
        || (settings.m_interpolatorTapsPerPhase != m_settings.m_interpolatorTapsPerPhase)
 | 
					        || (settingsKeys.contains("interpolatorTapsPerPhase") && (settings.m_interpolatorTapsPerPhase != m_settings.m_interpolatorTapsPerPhase))
 | 
				
			||||||
        || force)
 | 
					        || force)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        m_interpolator.create(m_settings.m_interpolatorPhaseSteps, m_channelSampleRate, settings.m_rfBandwidth / 2.2,  m_settings.m_interpolatorTapsPerPhase);
 | 
					        m_interpolator.create(m_settings.m_interpolatorPhaseSteps, m_channelSampleRate, settings.m_rfBandwidth / 2.2,  m_settings.m_interpolatorTapsPerPhase);
 | 
				
			||||||
@ -269,15 +269,19 @@ void ADSBDemodSink::applySettings(const ADSBDemodSettings& settings, bool force)
 | 
				
			|||||||
        m_interpolatorDistance = (Real) m_channelSampleRate / (Real) (ADS_B_BITS_PER_SECOND * settings.m_samplesPerBit);
 | 
					        m_interpolatorDistance = (Real) m_channelSampleRate / (Real) (ADS_B_BITS_PER_SECOND * settings.m_samplesPerBit);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((settings.m_samplesPerBit != m_settings.m_samplesPerBit) || force)
 | 
					    if ((settingsKeys.contains("samplesPerBit") && (settings.m_samplesPerBit != m_settings.m_samplesPerBit)) || force)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        init(settings.m_samplesPerBit);
 | 
					        init(settings.m_samplesPerBit);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Forward to worker
 | 
					    // Forward to worker
 | 
				
			||||||
    ADSBDemodSinkWorker::MsgConfigureADSBDemodSinkWorker *msg = ADSBDemodSinkWorker::MsgConfigureADSBDemodSinkWorker::create(
 | 
					    ADSBDemodSinkWorker::MsgConfigureADSBDemodSinkWorker *msg = ADSBDemodSinkWorker::MsgConfigureADSBDemodSinkWorker::create(
 | 
				
			||||||
            settings, force);
 | 
					            settings, settingsKeys, force);
 | 
				
			||||||
    m_worker.getInputMessageQueue()->push(msg);
 | 
					    m_worker.getInputMessageQueue()->push(msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (force) {
 | 
				
			||||||
        m_settings = settings;
 | 
					        m_settings = settings;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        m_settings.applySettings(settingsKeys, settings);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -55,7 +55,7 @@ public:
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
 | 
					    void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
 | 
				
			||||||
    void applySettings(const ADSBDemodSettings& settings, bool force = false);
 | 
					    void applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force = false);
 | 
				
			||||||
    void setMessageQueueToGUI(MessageQueue *messageQueue) { m_messageQueueToGUI = messageQueue; }
 | 
					    void setMessageQueueToGUI(MessageQueue *messageQueue) { m_messageQueueToGUI = messageQueue; }
 | 
				
			||||||
    void setMessageQueueToWorker(MessageQueue *messageQueue) { m_messageQueueToWorker = messageQueue; }
 | 
					    void setMessageQueueToWorker(MessageQueue *messageQueue) { m_messageQueueToWorker = messageQueue; }
 | 
				
			||||||
    void startWorker();
 | 
					    void startWorker();
 | 
				
			||||||
 | 
				
			|||||||
@ -357,22 +357,30 @@ void ADSBDemodSinkWorker::handleInputMessages()
 | 
				
			|||||||
            MsgConfigureADSBDemodSinkWorker* cfg = (MsgConfigureADSBDemodSinkWorker*)message;
 | 
					            MsgConfigureADSBDemodSinkWorker* cfg = (MsgConfigureADSBDemodSinkWorker*)message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ADSBDemodSettings settings = cfg->getSettings();
 | 
					            ADSBDemodSettings settings = cfg->getSettings();
 | 
				
			||||||
 | 
					            QStringList settingsKeys = cfg->getSettingsKeys();
 | 
				
			||||||
            bool force = cfg->getForce();
 | 
					            bool force = cfg->getForce();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (settingsKeys.contains("correlateFullPreamble") || force)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                if (settings.m_correlateFullPreamble) {
 | 
					                if (settings.m_correlateFullPreamble) {
 | 
				
			||||||
                    m_correlationScale = 3.0;
 | 
					                    m_correlationScale = 3.0;
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    m_correlationScale = 2.0;
 | 
					                    m_correlationScale = 2.0;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if ((m_settings.m_correlationThreshold != settings.m_correlationThreshold) || force)
 | 
					            if ((settingsKeys.contains("correlationThreshold") && (m_settings.m_correlationThreshold != settings.m_correlationThreshold)) || force)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                m_correlationThresholdLinear = CalcDb::powerFromdB(settings.m_correlationThreshold);
 | 
					                m_correlationThresholdLinear = CalcDb::powerFromdB(settings.m_correlationThreshold);
 | 
				
			||||||
                m_correlationThresholdLinear /= m_correlationScale;
 | 
					                m_correlationThresholdLinear /= m_correlationScale;
 | 
				
			||||||
                qDebug() << "m_correlationThresholdLinear: " << m_correlationThresholdLinear;
 | 
					                qDebug() << "m_correlationThresholdLinear: " << m_correlationThresholdLinear;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (force) {
 | 
				
			||||||
                m_settings = settings;
 | 
					                m_settings = settings;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                m_settings.applySettings(settingsKeys, settings);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            delete message;
 | 
					            delete message;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -40,20 +40,23 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public:
 | 
					    public:
 | 
				
			||||||
        const ADSBDemodSettings& getSettings() const { return m_settings; }
 | 
					        const ADSBDemodSettings& getSettings() const { return m_settings; }
 | 
				
			||||||
 | 
					        const QStringList& getSettingsKeys() const { return m_settingsKeys; }
 | 
				
			||||||
        bool getForce() const { return m_force; }
 | 
					        bool getForce() const { return m_force; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static MsgConfigureADSBDemodSinkWorker* create(const ADSBDemodSettings& settings, bool force)
 | 
					        static MsgConfigureADSBDemodSinkWorker* create(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new MsgConfigureADSBDemodSinkWorker(settings, force);
 | 
					            return new MsgConfigureADSBDemodSinkWorker(settings, settingsKeys, force);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
        ADSBDemodSettings m_settings;
 | 
					        ADSBDemodSettings m_settings;
 | 
				
			||||||
 | 
					        QStringList m_settingsKeys;
 | 
				
			||||||
        bool m_force;
 | 
					        bool m_force;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        MsgConfigureADSBDemodSinkWorker(const ADSBDemodSettings& settings, bool force) :
 | 
					        MsgConfigureADSBDemodSinkWorker(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force) :
 | 
				
			||||||
            Message(),
 | 
					            Message(),
 | 
				
			||||||
            m_settings(settings),
 | 
					            m_settings(settings),
 | 
				
			||||||
 | 
					            m_settingsKeys(settingsKeys),
 | 
				
			||||||
            m_force(force)
 | 
					            m_force(force)
 | 
				
			||||||
        { }
 | 
					        { }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
				
			|||||||
@ -150,7 +150,7 @@ bool ADSBDemodWorker::handleMessage(const Message& message)
 | 
				
			|||||||
        QMutexLocker mutexLocker(&m_mutex);
 | 
					        QMutexLocker mutexLocker(&m_mutex);
 | 
				
			||||||
        MsgConfigureADSBDemodWorker& cfg = (MsgConfigureADSBDemodWorker&) message;
 | 
					        MsgConfigureADSBDemodWorker& cfg = (MsgConfigureADSBDemodWorker&) message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        applySettings(cfg.getSettings(), cfg.getForce());
 | 
					        applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if (ADSBDemodReport::MsgReportADSB::match(message))
 | 
					    else if (ADSBDemodReport::MsgReportADSB::match(message))
 | 
				
			||||||
@ -165,7 +165,7 @@ bool ADSBDemodWorker::handleMessage(const Message& message)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodWorker::applySettings(const ADSBDemodSettings& settings, bool force)
 | 
					void ADSBDemodWorker::applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    qDebug() << "ADSBDemodWorker::applySettings:"
 | 
					    qDebug() << "ADSBDemodWorker::applySettings:"
 | 
				
			||||||
            << " m_feedEnabled: " << settings.m_feedEnabled
 | 
					            << " m_feedEnabled: " << settings.m_feedEnabled
 | 
				
			||||||
@ -179,10 +179,10 @@ void ADSBDemodWorker::applySettings(const ADSBDemodSettings& settings, bool forc
 | 
				
			|||||||
            << " m_logFilename: " << settings.m_logFilename
 | 
					            << " m_logFilename: " << settings.m_logFilename
 | 
				
			||||||
            << " force: " << force;
 | 
					            << " force: " << force;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((settings.m_feedEnabled != m_settings.m_feedEnabled)
 | 
					    if ((settingsKeys.contains("feedEnabled") && (settings.m_feedEnabled != m_settings.m_feedEnabled))
 | 
				
			||||||
        || (settings.m_exportClientEnabled != m_settings.m_exportClientEnabled)
 | 
					        || (settingsKeys.contains("exportClientEnabled") && (settings.m_exportClientEnabled != m_settings.m_exportClientEnabled))
 | 
				
			||||||
        || (settings.m_exportClientHost != m_settings.m_exportClientHost)
 | 
					        || (settingsKeys.contains("exportClientHost") && (settings.m_exportClientHost != m_settings.m_exportClientHost))
 | 
				
			||||||
        || (settings.m_exportClientPort != m_settings.m_exportClientPort)
 | 
					        || (settingsKeys.contains("exportClientPort") && (settings.m_exportClientPort != m_settings.m_exportClientPort))
 | 
				
			||||||
        || force)
 | 
					        || force)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // Close any existing connection
 | 
					        // Close any existing connection
 | 
				
			||||||
@ -195,9 +195,9 @@ void ADSBDemodWorker::applySettings(const ADSBDemodSettings& settings, bool forc
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((settings.m_feedEnabled != m_settings.m_feedEnabled)
 | 
					    if ((settingsKeys.contains("feedEnabled") && (settings.m_feedEnabled != m_settings.m_feedEnabled))
 | 
				
			||||||
        || (settings.m_exportServerEnabled != m_settings.m_exportServerEnabled)
 | 
					        || (settingsKeys.contains("exportServerEnabled") && (settings.m_exportServerEnabled != m_settings.m_exportServerEnabled))
 | 
				
			||||||
        || (settings.m_exportServerPort != m_settings.m_exportServerPort)
 | 
					        || (settingsKeys.contains("exportServerPort") && (settings.m_exportServerPort != m_settings.m_exportServerPort))
 | 
				
			||||||
        || force)
 | 
					        || force)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (m_beastServer.isListening()) {
 | 
					        if (m_beastServer.isListening()) {
 | 
				
			||||||
@ -208,8 +208,8 @@ void ADSBDemodWorker::applySettings(const ADSBDemodSettings& settings, bool forc
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((settings.m_logEnabled != m_settings.m_logEnabled)
 | 
					    if ((settingsKeys.contains("logEnabled") && (settings.m_logEnabled != m_settings.m_logEnabled))
 | 
				
			||||||
        || (settings.m_logFilename != m_settings.m_logFilename)
 | 
					        || (settingsKeys.contains("logFilename") && (settings.m_logFilename != m_settings.m_logFilename))
 | 
				
			||||||
        || force)
 | 
					        || force)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (m_logFile.isOpen())
 | 
					        if (m_logFile.isOpen())
 | 
				
			||||||
@ -238,7 +238,11 @@ void ADSBDemodWorker::applySettings(const ADSBDemodSettings& settings, bool forc
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (force) {
 | 
				
			||||||
        m_settings = settings;
 | 
					        m_settings = settings;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        m_settings.applySettings(settingsKeys, settings);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodWorker::connected()
 | 
					void ADSBDemodWorker::connected()
 | 
				
			||||||
 | 
				
			|||||||
@ -61,20 +61,23 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public:
 | 
					    public:
 | 
				
			||||||
        const ADSBDemodSettings& getSettings() const { return m_settings; }
 | 
					        const ADSBDemodSettings& getSettings() const { return m_settings; }
 | 
				
			||||||
 | 
					        const QStringList& getSettingsKeys() const { return m_settingsKeys; }
 | 
				
			||||||
        bool getForce() const { return m_force; }
 | 
					        bool getForce() const { return m_force; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static MsgConfigureADSBDemodWorker* create(const ADSBDemodSettings& settings, bool force)
 | 
					        static MsgConfigureADSBDemodWorker* create(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new MsgConfigureADSBDemodWorker(settings, force);
 | 
					            return new MsgConfigureADSBDemodWorker(settings, settingsKeys, force);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
        ADSBDemodSettings m_settings;
 | 
					        ADSBDemodSettings m_settings;
 | 
				
			||||||
 | 
					        QStringList m_settingsKeys;
 | 
				
			||||||
        bool m_force;
 | 
					        bool m_force;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        MsgConfigureADSBDemodWorker(const ADSBDemodSettings& settings, bool force) :
 | 
					        MsgConfigureADSBDemodWorker(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force) :
 | 
				
			||||||
            Message(),
 | 
					            Message(),
 | 
				
			||||||
            m_settings(settings),
 | 
					            m_settings(settings),
 | 
				
			||||||
 | 
					            m_settingsKeys(settingsKeys),
 | 
				
			||||||
            m_force(force)
 | 
					            m_force(force)
 | 
				
			||||||
        { }
 | 
					        { }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@ -101,7 +104,7 @@ private:
 | 
				
			|||||||
    ADSBBeastServer m_beastServer;
 | 
					    ADSBBeastServer m_beastServer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool handleMessage(const Message& cmd);
 | 
					    bool handleMessage(const Message& cmd);
 | 
				
			||||||
    void applySettings(const ADSBDemodSettings& settings, bool force = false);
 | 
					    void applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force = false);
 | 
				
			||||||
    void send(const char *data, int length);
 | 
					    void send(const char *data, int length);
 | 
				
			||||||
    char *escape(char *p, char c);
 | 
					    char *escape(char *p, char c);
 | 
				
			||||||
    void handleADSB(QByteArray data, const QDateTime dateTime, float correlation);
 | 
					    void handleADSB(QByteArray data, const QDateTime dateTime, float correlation);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user