mirror of
https://github.com/f4exb/sdrangel.git
synced 2026-06-02 22:14:45 -04:00
Interferometer: list local input devices and make update settings atomic
This commit is contained in:
@@ -28,6 +28,9 @@
|
||||
#include "device/deviceapi.h"
|
||||
#include "dsp/hbfilterchainconverter.h"
|
||||
#include "dsp/dspcommands.h"
|
||||
#include "dsp/dspdevicesourceengine.h"
|
||||
#include "dsp/devicesamplesource.h"
|
||||
#include "device/deviceset.h"
|
||||
#include "maincore.h"
|
||||
|
||||
#include "interferometerbaseband.h"
|
||||
@@ -35,6 +38,7 @@
|
||||
|
||||
MESSAGE_CLASS_DEFINITION(Interferometer::MsgConfigureInterferometer, Message)
|
||||
MESSAGE_CLASS_DEFINITION(Interferometer::MsgBasebandNotification, Message)
|
||||
MESSAGE_CLASS_DEFINITION(Interferometer::MsgReportDevices, Message)
|
||||
|
||||
const char* const Interferometer::m_channelIdURI = "sdrangel.channel.interferometer";
|
||||
const char* const Interferometer::m_channelId = "Interferometer";
|
||||
@@ -63,6 +67,20 @@ Interferometer::Interferometer(DeviceAPI *deviceAPI) :
|
||||
this,
|
||||
&Interferometer::networkManagerFinished
|
||||
);
|
||||
// Update device list when devices are added or removed
|
||||
QObject::connect(
|
||||
MainCore::instance(),
|
||||
&MainCore::deviceSetAdded,
|
||||
this,
|
||||
&Interferometer::updateDeviceSetList
|
||||
);
|
||||
QObject::connect(
|
||||
MainCore::instance(),
|
||||
&MainCore::deviceSetRemoved,
|
||||
this,
|
||||
&Interferometer::updateDeviceSetList
|
||||
);
|
||||
updateDeviceSetList();
|
||||
startSinks();
|
||||
}
|
||||
|
||||
@@ -155,62 +173,30 @@ void Interferometer::pull(SampleVector::iterator& begin, unsigned int nbSamples,
|
||||
(void) sourceIndex;
|
||||
}
|
||||
|
||||
void Interferometer::applySettings(const InterferometerSettings& settings, bool force)
|
||||
void Interferometer::applySettings(const InterferometerSettings& settings, const QList<QString>& settingsKeys, bool force)
|
||||
{
|
||||
qDebug() << "Interferometer::applySettings: "
|
||||
<< "m_correlationType: " << settings.m_correlationType
|
||||
<< "m_filterChainHash: " << settings.m_filterChainHash
|
||||
<< "m_log2Decim: " << settings.m_log2Decim
|
||||
<< "m_phase: " << settings.m_phase
|
||||
<< "m_gain: " << settings.m_gain / 10.0
|
||||
<< "m_useReverseAPI: " << settings.m_useReverseAPI
|
||||
<< "m_reverseAPIAddress: " << settings.m_reverseAPIAddress
|
||||
<< "m_reverseAPIPort: " << settings.m_reverseAPIPort
|
||||
<< "m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
|
||||
<< "m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
|
||||
<< "m_title: " << settings.m_title;
|
||||
qDebug() << "LocalSink::applySettings:" << settings.getDebugString(settingsKeys, force) << "force: " << force;
|
||||
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
if ((m_settings.m_correlationType != settings.m_correlationType) || force) {
|
||||
reverseAPIKeys.append("correlationType");
|
||||
}
|
||||
if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) {
|
||||
reverseAPIKeys.append("filterChainHash");
|
||||
}
|
||||
if ((m_settings.m_log2Decim != settings.m_log2Decim) || force) {
|
||||
reverseAPIKeys.append("log2Decim");
|
||||
}
|
||||
if ((m_settings.m_phase != settings.m_phase) || force) {
|
||||
reverseAPIKeys.append("phase");
|
||||
}
|
||||
if ((m_settings.m_phase != settings.m_gain) || force) {
|
||||
reverseAPIKeys.append("gain");
|
||||
}
|
||||
if ((m_settings.m_title != settings.m_title) || force) {
|
||||
reverseAPIKeys.append("title");
|
||||
}
|
||||
|
||||
if (m_running && ((m_settings.m_log2Decim != settings.m_log2Decim)
|
||||
|| (m_settings.m_filterChainHash != settings.m_filterChainHash) || force))
|
||||
if (m_running && (settingsKeys.contains("log2Decim")
|
||||
|| settingsKeys.contains("filterChainHash") || force))
|
||||
{
|
||||
InterferometerBaseband::MsgConfigureChannelizer *msg = InterferometerBaseband::MsgConfigureChannelizer::create(
|
||||
settings.m_log2Decim, settings.m_filterChainHash);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
if (m_running && ((m_settings.m_correlationType != settings.m_correlationType) || force))
|
||||
if (m_running && ((settingsKeys.contains("correlationType")) || force))
|
||||
{
|
||||
InterferometerBaseband::MsgConfigureCorrelation *msg = InterferometerBaseband::MsgConfigureCorrelation::create(
|
||||
settings.m_correlationType);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
if (m_running && ((m_settings.m_phase != settings.m_phase) || force)) {
|
||||
if (m_running && ((settingsKeys.contains("phase")) || force)) {
|
||||
m_basebandSink->setPhase(settings.m_phase);
|
||||
}
|
||||
|
||||
if (m_running && ((m_settings.m_gain != settings.m_gain) || force)) {
|
||||
if (m_running && ((settingsKeys.contains("gain")) || force)) {
|
||||
m_basebandSink->setGain(settings.m_gain);
|
||||
}
|
||||
|
||||
@@ -218,10 +204,24 @@ void Interferometer::applySettings(const InterferometerSettings& settings, bool
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
|
||||
|
||||
if (pipes.size() > 0) {
|
||||
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
|
||||
sendChannelSettings(pipes, settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (settings.m_useReverseAPI)
|
||||
{
|
||||
bool fullUpdate = (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) ||
|
||||
settingsKeys.contains("reverseAPIAddress") ||
|
||||
settingsKeys.contains("reverseAPIPort") ||
|
||||
settingsKeys.contains("reverseAPIFeatureSetIndex") ||
|
||||
settingsKeys.contains("reverseAPIFeatureIndex");
|
||||
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
|
||||
}
|
||||
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
void Interferometer::handleInputMessages()
|
||||
@@ -243,7 +243,7 @@ bool Interferometer::handleMessage(const Message& cmd)
|
||||
{
|
||||
MsgConfigureInterferometer& cfg = (MsgConfigureInterferometer&) cmd;
|
||||
qDebug() << "Interferometer::handleMessage: MsgConfigureInterferometer";
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
|
||||
return true;
|
||||
}
|
||||
else if (DSPMIMOSignalNotification::match(cmd))
|
||||
@@ -298,14 +298,14 @@ bool Interferometer::deserialize(const QByteArray& data)
|
||||
(void) data;
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
MsgConfigureInterferometer *msg = MsgConfigureInterferometer::create(m_settings, true);
|
||||
MsgConfigureInterferometer *msg = MsgConfigureInterferometer::create(m_settings, QList<QString>(), true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
MsgConfigureInterferometer *msg = MsgConfigureInterferometer::create(m_settings, true);
|
||||
MsgConfigureInterferometer *msg = MsgConfigureInterferometer::create(m_settings, QList<QString>(), true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return false;
|
||||
}
|
||||
@@ -338,6 +338,70 @@ void Interferometer::applyChannelSettings(uint32_t log2Decim, uint32_t filterCha
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
void Interferometer::updateDeviceSetList()
|
||||
{
|
||||
MainCore *mainCore = MainCore::instance();
|
||||
std::vector<DeviceSet*>& deviceSets = mainCore->getDeviceSets();
|
||||
std::vector<DeviceSet*>::const_iterator it = deviceSets.begin();
|
||||
|
||||
m_localInputDeviceIndexes.clear();
|
||||
unsigned int deviceIndex = 0;
|
||||
|
||||
for (; it != deviceSets.end(); ++it, deviceIndex++)
|
||||
{
|
||||
DSPDeviceSourceEngine *deviceSourceEngine = (*it)->m_deviceSourceEngine;
|
||||
|
||||
if (deviceSourceEngine)
|
||||
{
|
||||
DeviceSampleSource *deviceSource = deviceSourceEngine->getSource();
|
||||
|
||||
if (deviceSource->getDeviceDescription() == "LocalInput") {
|
||||
m_localInputDeviceIndexes.append(deviceIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (m_guiMessageQueue)
|
||||
{
|
||||
MsgReportDevices *msg = MsgReportDevices::create();
|
||||
msg->getDeviceSetIndexes() = m_localInputDeviceIndexes;
|
||||
m_guiMessageQueue->push(msg);
|
||||
}
|
||||
|
||||
InterferometerSettings settings = m_settings;
|
||||
int newIndexInList;
|
||||
|
||||
if (it != deviceSets.begin())
|
||||
{
|
||||
if (m_settings.m_localDeviceIndex < 0) {
|
||||
newIndexInList = 0;
|
||||
} else if (m_settings.m_localDeviceIndex >= m_localInputDeviceIndexes.size()) {
|
||||
newIndexInList = m_localInputDeviceIndexes.size() - 1;
|
||||
} else {
|
||||
newIndexInList = m_settings.m_localDeviceIndex;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
newIndexInList = -1;
|
||||
}
|
||||
|
||||
if (newIndexInList < 0) {
|
||||
settings.m_localDeviceIndex = -1; // means no device
|
||||
} else {
|
||||
settings.m_localDeviceIndex = m_localInputDeviceIndexes[newIndexInList];
|
||||
}
|
||||
|
||||
qDebug("LocalSink::updateDeviceSetLists: new device index: %d device: %d", newIndexInList, settings.m_localDeviceIndex);
|
||||
applySettings(settings, QList<QString>{"localDeviceIndex"});
|
||||
|
||||
if (m_guiMessageQueue)
|
||||
{
|
||||
MsgConfigureInterferometer *msg = MsgConfigureInterferometer::create(m_settings, QList<QString>{"localDeviceIndex"}, false);
|
||||
m_guiMessageQueue->push(msg);
|
||||
}
|
||||
}
|
||||
|
||||
int Interferometer::webapiSettingsGet(
|
||||
SWGSDRangel::SWGChannelSettings& response,
|
||||
QString& errorMessage)
|
||||
@@ -368,12 +432,12 @@ int Interferometer::webapiSettingsPutPatch(
|
||||
InterferometerSettings settings = m_settings;
|
||||
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
|
||||
|
||||
MsgConfigureInterferometer *msg = MsgConfigureInterferometer::create(settings, force);
|
||||
MsgConfigureInterferometer *msg = MsgConfigureInterferometer::create(settings, channelSettingsKeys, force);
|
||||
m_inputMessageQueue.push(msg);
|
||||
|
||||
if (getMessageQueueToGUI()) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureInterferometer *msgToGUI = MsgConfigureInterferometer::create(settings, force);
|
||||
MsgConfigureInterferometer *msgToGUI = MsgConfigureInterferometer::create(settings, channelSettingsKeys, force);
|
||||
getMessageQueueToGUI()->push(msgToGUI);
|
||||
}
|
||||
|
||||
@@ -521,7 +585,7 @@ void Interferometer::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings
|
||||
}
|
||||
}
|
||||
|
||||
void Interferometer::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const InterferometerSettings& settings, bool force)
|
||||
void Interferometer::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const InterferometerSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
@@ -548,7 +612,7 @@ void Interferometer::webapiReverseSendSettings(QList<QString>& channelSettingsKe
|
||||
|
||||
void Interferometer::sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const InterferometerSettings& settings,
|
||||
bool force)
|
||||
{
|
||||
@@ -572,7 +636,7 @@ void Interferometer::sendChannelSettings(
|
||||
}
|
||||
|
||||
void Interferometer::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const InterferometerSettings& settings,
|
||||
bool force
|
||||
@@ -606,18 +670,18 @@ void Interferometer::webapiFormatChannelSettings(
|
||||
swgInterferometerSettings->setFilterChainHash(settings.m_filterChainHash);
|
||||
}
|
||||
|
||||
if (settings.m_spectrumGUI)
|
||||
if (settings.m_spectrumGUI && (channelSettingsKeys.contains("spectrumConfig") || force))
|
||||
{
|
||||
if (channelSettingsKeys.contains("spectrumConfig") || force) {
|
||||
settings.m_spectrumGUI->formatTo(swgInterferometerSettings->getSpectrumConfig());
|
||||
}
|
||||
SWGSDRangel::SWGGLSpectrum *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum();
|
||||
settings.m_spectrumGUI->formatTo(swgGLSpectrum);
|
||||
swgInterferometerSettings->setSpectrumConfig(swgGLSpectrum);
|
||||
}
|
||||
|
||||
if (settings.m_scopeGUI)
|
||||
if (settings.m_scopeGUI && (channelSettingsKeys.contains("scopeConfig") || force))
|
||||
{
|
||||
if (channelSettingsKeys.contains("scopeConfig") || force) {
|
||||
settings.m_scopeGUI->formatTo(swgInterferometerSettings->getScopeConfig());
|
||||
}
|
||||
SWGSDRangel::SWGGLScope *swgGLScope = new SWGSDRangel::SWGGLScope();
|
||||
settings.m_scopeGUI->formatTo(swgGLScope);
|
||||
swgInterferometerSettings->setScopeConfig(swgGLScope);
|
||||
}
|
||||
|
||||
if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force))
|
||||
|
||||
Reference in New Issue
Block a user