1
0
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:
f4exb
2024-05-12 03:52:19 +02:00
parent dae5a9174b
commit 40d7fece02
7 changed files with 363 additions and 67 deletions
@@ -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))