diff --git a/plugins/channelrx/demodssb/ssbdemod.cpp b/plugins/channelrx/demodssb/ssbdemod.cpp index 6f2f34586..1bbd02301 100644 --- a/plugins/channelrx/demodssb/ssbdemod.cpp +++ b/plugins/channelrx/demodssb/ssbdemod.cpp @@ -270,10 +270,11 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); } - QList *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "settings"); + QList pipes; + MainCore::instance()->getMessagePipes2().getMessagePipes(this, "settings", pipes); - if (messageQueues) { - sendChannelSettings(messageQueues, reverseAPIKeys, settings, force); + if (pipes.size() > 0) { + sendChannelSettings(pipes, reverseAPIKeys, settings, force); } m_settings = settings; @@ -581,24 +582,29 @@ void SSBDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co } void SSBDemod::sendChannelSettings( - QList *messageQueues, + const QList& pipes, QList& channelSettingsKeys, const SSBDemodSettings& settings, bool force) { - QList::iterator it = messageQueues->begin(); + qDebug("SSBDemod::sendChannelSettings: %d pipes", pipes.size()); - for (; it != messageQueues->end(); ++it) + for (const auto& pipe : pipes) { - SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); - webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); - MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create( - this, - channelSettingsKeys, - swgChannelSettings, - force - ); - (*it)->push(msg); + MessageQueue *messageQueue = qobject_cast(pipe->m_element); + + if (messageQueue) + { + SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); + webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); + MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create( + this, + channelSettingsKeys, + swgChannelSettings, + force + ); + messageQueue->push(msg); + } } } diff --git a/plugins/channelrx/demodssb/ssbdemod.h b/plugins/channelrx/demodssb/ssbdemod.h index a84220f9e..b2d878c6c 100644 --- a/plugins/channelrx/demodssb/ssbdemod.h +++ b/plugins/channelrx/demodssb/ssbdemod.h @@ -36,6 +36,7 @@ class QNetworkAccessManager; class QNetworkReply; class QThread; class DeviceAPI; +class ObjectPipe; class SSBDemod : public BasebandSampleSink, public ChannelAPI { public: @@ -148,7 +149,7 @@ private: void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); void webapiReverseSendSettings(QList& channelSettingsKeys, const SSBDemodSettings& settings, bool force); void sendChannelSettings( - QList *messageQueues, + const QList& pipes, QList& channelSettingsKeys, const SSBDemodSettings& settings, bool force diff --git a/plugins/channelrx/freqtracker/freqtracker.cpp b/plugins/channelrx/freqtracker/freqtracker.cpp index 8a9fe12f6..9a976c4fd 100644 --- a/plugins/channelrx/freqtracker/freqtracker.cpp +++ b/plugins/channelrx/freqtracker/freqtracker.cpp @@ -274,10 +274,11 @@ void FreqTracker::applySettings(const FreqTrackerSettings& settings, bool force) webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); } - QList *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "settings"); + QList pipes; + MainCore::instance()->getMessagePipes2().getMessagePipes(this, "settings", pipes); - if (messageQueues) { - sendChannelSettings(messageQueues, reverseAPIKeys, settings, force); + if (pipes.size() > 0) { + sendChannelSettings(pipes, reverseAPIKeys, settings, force); } m_settings = settings; @@ -551,24 +552,27 @@ void FreqTracker::webapiReverseSendSettings(QList& channelSettingsKeys, } void FreqTracker::sendChannelSettings( - QList *messageQueues, + const QList& pipes, QList& channelSettingsKeys, const FreqTrackerSettings& settings, bool force) { - QList::iterator it = messageQueues->begin(); - - for (; it != messageQueues->end(); ++it) + for (const auto& pipe : pipes) { - SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); - webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); - MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create( - this, - channelSettingsKeys, - swgChannelSettings, - force - ); - (*it)->push(msg); + MessageQueue *messageQueue = qobject_cast(pipe->m_element); + + if (messageQueue) + { + SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); + webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); + MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create( + this, + channelSettingsKeys, + swgChannelSettings, + force + ); + messageQueue->push(msg); + } } } diff --git a/plugins/channelrx/freqtracker/freqtracker.h b/plugins/channelrx/freqtracker/freqtracker.h index 0c2bee540..9eac693e7 100644 --- a/plugins/channelrx/freqtracker/freqtracker.h +++ b/plugins/channelrx/freqtracker/freqtracker.h @@ -33,6 +33,7 @@ class QNetworkAccessManager; class QNetworkReply; class DeviceAPI; +class ObjectPipe; class FreqTracker : public BasebandSampleSink, public ChannelAPI { public: @@ -145,7 +146,7 @@ private: void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); void webapiReverseSendSettings(QList& channelSettingsKeys, const FreqTrackerSettings& settings, bool force); void sendChannelSettings( - QList *messageQueues, + const QList& pipes, QList& channelSettingsKeys, const FreqTrackerSettings& settings, bool force diff --git a/plugins/feature/afc/afc.cpp b/plugins/feature/afc/afc.cpp index 904726c2b..b8c78656e 100644 --- a/plugins/feature/afc/afc.cpp +++ b/plugins/feature/afc/afc.cpp @@ -630,6 +630,7 @@ void AFC::trackerDeviceChange(int deviceIndex) MainCore *mainCore = MainCore::instance(); m_trackerDeviceSet = mainCore->getDeviceSets()[deviceIndex]; + m_trackerChannelAPI = nullptr; for (int i = 0; i < m_trackerDeviceSet->getNumberOfChannels(); i++) { @@ -651,12 +652,22 @@ void AFC::trackerDeviceChange(int deviceIndex) ); } + connect(pipe, SIGNAL(toBeDeleted(int, QObject*)), this, SLOT(handleTrackerMessagePipeToBeDeleted(int, QObject*))); m_trackerChannelAPI = channel; break; } } } +void AFC::handleTrackerMessagePipeToBeDeleted(int reason, QObject* object) +{ + if ((reason == 0) && ((ChannelAPI*) object == m_trackerChannelAPI)) // tracker channel has been de;eted + { + m_trackerChannelAPI = nullptr; + updateDeviceSetLists(); + } +} + void AFC::trackedDeviceChange(int deviceIndex) { qDebug("AFC::trackedDeviceChange: deviceIndex: %d", deviceIndex); @@ -667,6 +678,8 @@ void AFC::trackedDeviceChange(int deviceIndex) MainCore *mainCore = MainCore::instance(); m_trackedDeviceSet = mainCore->getDeviceSets()[deviceIndex]; + m_trackerIndexInDeviceSet = -1; + m_trackedChannelAPIs.clear(); for (int i = 0; i < m_trackedDeviceSet->getNumberOfChannels(); i++) { @@ -688,41 +701,58 @@ void AFC::trackedDeviceChange(int deviceIndex) ); m_trackerIndexInDeviceSet = i; } + + m_trackedChannelAPIs.push_back(channel); + connect(pipe, SIGNAL(toBeDeleted(int, QObject*)), this, SLOT(handleTrackedMessagePipeToBeDeleted(int, QObject*))); } } } +void AFC::handleTrackedMessagePipeToBeDeleted(int reason, QObject* object) +{ + if ((reason == 0) && m_trackedChannelAPIs.contains((ChannelAPI*) object)) + { + m_trackedChannelAPIs.removeAll((ChannelAPI*) object); + updateDeviceSetLists(); + } +} + void AFC::removeTrackerFeatureReference() { if (m_trackerChannelAPI) { - if (MainCore::instance()->existsChannel(m_trackerChannelAPI)) + ObjectPipe *pipe = MainCore::instance()->getMessagePipes2().unregisterProducerToConsumer(m_trackerChannelAPI, this, "settings"); + + if (pipe) { - qDebug("AFC::removeTrackerFeatureReference: m_trackerChannelAPI: %s", qPrintable(m_trackerChannelAPI->objectName())); - ObjectPipe *pipe = MainCore::instance()->getMessagePipes2().unregisterProducerToConsumer(m_trackerChannelAPI, this, "settings"); MessageQueue *messageQueue = qobject_cast(pipe->m_element); if (messageQueue) { disconnect(messageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessageQueue(MessageQueue*))); } } + + m_trackerChannelAPI = nullptr; } } void AFC::removeTrackedFeatureReferences() { - for (QList::iterator it = m_trackedChannelAPIs.begin(); it != m_trackedChannelAPIs.end(); ++it) + for (auto& channel : m_trackedChannelAPIs) { - ChannelAPI *channel = *it; + ObjectPipe *pipe = MainCore::instance()->getMessagePipes2().unregisterProducerToConsumer(channel, this, "settings"); - if (MainCore::instance()->existsChannel(channel)) + if (pipe) { - qDebug("AFC::removeTrackedFeatureReferences: channel: %s", qPrintable(channel->objectName())); - MainCore::instance()->getMessagePipes2().unregisterProducerToConsumer(channel, this, "settings"); - } - } + MessageQueue *messageQueue = qobject_cast(pipe->m_element); - m_trackedChannelAPIs.clear(); + if (messageQueue) { + disconnect(messageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessageQueue(MessageQueue*))); + } + } + + m_trackedChannelAPIs.removeAll(channel); + } } void AFC::handleChannelMessageQueue(MessageQueue* messageQueue) diff --git a/plugins/feature/afc/afc.h b/plugins/feature/afc/afc.h index ca8783b75..01205736f 100644 --- a/plugins/feature/afc/afc.h +++ b/plugins/feature/afc/afc.h @@ -226,6 +226,8 @@ private: private slots: void networkManagerFinished(QNetworkReply *reply); void handleChannelMessageQueue(MessageQueue* messageQueue); + void handleTrackerMessagePipeToBeDeleted(int reason, QObject* object); + void handleTrackedMessagePipeToBeDeleted(int reason, QObject* object); }; #endif // INCLUDE_FEATURE_AFC_H_