From e606805beb2f4a57ddf0b6156b1a5033baa2ba5b Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 11 Mar 2023 05:05:58 +0100 Subject: [PATCH] Audio inout: added DC block and IQ imbalance --- doc/img/AudioInput_plugin.png | Bin 23287 -> 26061 bytes doc/img/AudioInput_plugin.xcf | Bin 44111 -> 54319 bytes .../samplesource/audioinput/audioinput.cpp | 22 ++ .../samplesource/audioinput/audioinputgui.cpp | 18 + .../samplesource/audioinput/audioinputgui.h | 2 + .../samplesource/audioinput/audioinputgui.ui | 20 + .../audioinput/audioinputsettings.cpp | 18 + .../audioinput/audioinputsettings.h | 2 + plugins/samplesource/audioinput/readme.md | 8 + sdrbase/resources/webapi/doc/html2/index.html | 361 +++++++++++++++++- .../doc/swagger/include/AudioInput.yaml | 12 + .../doc/swagger/include/ChannelReport.yaml | 6 + .../doc/swagger/include/ChannelSettings.yaml | 6 + .../api/swagger/include/AudioInput.yaml | 12 + swagger/sdrangel/code/html2/index.html | 361 +++++++++++++++++- .../code/qt5/client/SWGAudioInputSettings.cpp | 46 +++ .../code/qt5/client/SWGAudioInputSettings.h | 12 + 17 files changed, 896 insertions(+), 10 deletions(-) diff --git a/doc/img/AudioInput_plugin.png b/doc/img/AudioInput_plugin.png index 2a875dad337884ae9dc4304be82f75d1971d17aa..e8e5432fd02b8f14b77eb0699b226521c8f307b9 100644 GIT binary patch literal 26061 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 diff --git a/plugins/samplesource/audioinput/audioinput.cpp b/plugins/samplesource/audioinput/audioinput.cpp index bebd89454..8c10c5d2f 100644 --- a/plugins/samplesource/audioinput/audioinput.cpp +++ b/plugins/samplesource/audioinput/audioinput.cpp @@ -312,6 +312,14 @@ void AudioInput::applySettings(const AudioInputSettings& settings, QListconfigureCorrections(settings.m_dcBlock, settings.m_iqImbalance); + qDebug("AudioInput::applySettings: corrections: DC block: %s IQ imbalance: %s", + settings.m_dcBlock ? "true" : "false", + settings.m_iqImbalance ? "true" : "false"); + } + if (settingsKeys.contains("useReverseAPI")) { bool fullUpdate = (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) || @@ -423,6 +431,12 @@ void AudioInput::webapiUpdateDeviceSettings( if (deviceSettingsKeys.contains("iqMapping")) { settings.m_iqMapping = (AudioInputSettings::IQMapping)response.getAudioInputSettings()->getIqMapping(); } + if (deviceSettingsKeys.contains("dcBlock")) { + settings.m_dcBlock = response.getAudioInputSettings()->getDcBlock() != 0; + } + if (deviceSettingsKeys.contains("iqImbalance")) { + settings.m_iqImbalance = response.getAudioInputSettings()->getIqImbalance() != 0; + } if (deviceSettingsKeys.contains("useReverseAPI")) { settings.m_useReverseAPI = response.getAudioInputSettings()->getUseReverseApi() != 0; } @@ -444,6 +458,8 @@ void AudioInput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& resp response.getAudioInputSettings()->setVolume(settings.m_volume); response.getAudioInputSettings()->setLog2Decim(settings.m_log2Decim); response.getAudioInputSettings()->setIqMapping((int)settings.m_iqMapping); + response.getAudioInputSettings()->setDcBlock(settings.m_dcBlock ? 1 : 0); + response.getAudioInputSettings()->setIqImbalance(settings.m_iqImbalance ? 1 : 0); response.getAudioInputSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0); @@ -483,6 +499,12 @@ void AudioInput::webapiReverseSendSettings(const QList& deviceSettingsK if (deviceSettingsKeys.contains("iqMapping") || force) { swgAudioInputSettings->setIqMapping(settings.m_iqMapping); } + if (deviceSettingsKeys.contains("dcBlock") || force) { + swgAudioInputSettings->setDcBlock(settings.m_dcBlock ? 1 : 0); + } + if (deviceSettingsKeys.contains("iqImbalance") || force) { + swgAudioInputSettings->setIqImbalance(settings.m_iqImbalance ? 1 : 0); + } QString deviceSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/device/settings") .arg(settings.m_reverseAPIAddress) diff --git a/plugins/samplesource/audioinput/audioinputgui.cpp b/plugins/samplesource/audioinput/audioinputgui.cpp index 4f227f195..f2aa2f451 100644 --- a/plugins/samplesource/audioinput/audioinputgui.cpp +++ b/plugins/samplesource/audioinput/audioinputgui.cpp @@ -242,6 +242,8 @@ void AudioInputGui::displaySettings() ui->volume->setValue((int)(m_settings.m_volume*10.0f)); ui->volumeText->setText(QString("%1").arg(m_settings.m_volume, 3, 'f', 1)); ui->channels->setCurrentIndex((int)m_settings.m_iqMapping); + ui->dcOffset->setChecked(m_settings.m_dcBlock); + ui->iqImbalance->setChecked(m_settings.m_iqImbalance); refreshSampleRates(ui->device->currentText()); } @@ -289,6 +291,20 @@ void AudioInputGui::on_channels_currentIndexChanged(int index) sendSettings(); } +void AudioInputGui::on_dcOffset_toggled(bool checked) +{ + m_settings.m_dcBlock = checked; + m_settingsKeys.append("dcBlock"); + sendSettings(); +} + +void AudioInputGui::on_iqImbalance_toggled(bool checked) +{ + m_settings.m_iqImbalance = checked; + m_settingsKeys.append("iqImbalance"); + sendSettings(); +} + void AudioInputGui::on_startStop_toggled(bool checked) { if (m_doApplySettings) @@ -376,5 +392,7 @@ void AudioInputGui::makeUIConnections() QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &AudioInputGui::on_decim_currentIndexChanged); QObject::connect(ui->volume, &QDial::valueChanged, this, &AudioInputGui::on_volume_valueChanged); QObject::connect(ui->channels, QOverload::of(&QComboBox::currentIndexChanged), this, &AudioInputGui::on_channels_currentIndexChanged); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &AudioInputGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &AudioInputGui::on_iqImbalance_toggled); QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &AudioInputGui::on_startStop_toggled); } diff --git a/plugins/samplesource/audioinput/audioinputgui.h b/plugins/samplesource/audioinput/audioinputgui.h index cb9351fc0..17d25ccb5 100644 --- a/plugins/samplesource/audioinput/audioinputgui.h +++ b/plugins/samplesource/audioinput/audioinputgui.h @@ -77,6 +77,8 @@ private slots: void on_decim_currentIndexChanged(int index); void on_volume_valueChanged(int value); void on_channels_currentIndexChanged(int index); + void on_dcOffset_toggled(bool checked); + void on_iqImbalance_toggled(bool checked); void on_startStop_toggled(bool checked); void updateHardware(); void openDeviceSettingsDialog(const QPoint& p); diff --git a/plugins/samplesource/audioinput/audioinputgui.ui b/plugins/samplesource/audioinput/audioinputgui.ui index 0559cd88e..f54f5ceb5 100644 --- a/plugins/samplesource/audioinput/audioinputgui.ui +++ b/plugins/samplesource/audioinput/audioinputgui.ui @@ -114,6 +114,26 @@ + + + + Automatic DC offset removal + + + DC + + + + + + + Automatic IQ imbalance correction + + + IQ + + + diff --git a/plugins/samplesource/audioinput/audioinputsettings.cpp b/plugins/samplesource/audioinput/audioinputsettings.cpp index eb52ca869..dc51693f4 100644 --- a/plugins/samplesource/audioinput/audioinputsettings.cpp +++ b/plugins/samplesource/audioinput/audioinputsettings.cpp @@ -32,6 +32,8 @@ void AudioInputSettings::resetToDefaults() m_volume = 1.0f; m_log2Decim = 0; m_iqMapping = L; + m_dcBlock = false; + m_iqImbalance = false; m_useReverseAPI = false; m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; @@ -47,6 +49,8 @@ QByteArray AudioInputSettings::serialize() const s.writeFloat(3, m_volume); s.writeU32(4, m_log2Decim); s.writeS32(5, (int)m_iqMapping); + s.writeBool(6, m_dcBlock); + s.writeBool(7, m_iqImbalance); s.writeBool(24, m_useReverseAPI); s.writeString(25, m_reverseAPIAddress); @@ -75,6 +79,8 @@ bool AudioInputSettings::deserialize(const QByteArray& data) d.readFloat(3, &m_volume, 1.0f); d.readU32(4, &m_log2Decim, 0); d.readS32(5, (int *)&m_iqMapping, IQMapping::L); + d.readBool(6, &m_dcBlock, false); + d.readBool(7, &m_iqImbalance, false); d.readBool(24, &m_useReverseAPI, false); d.readString(25, &m_reverseAPIAddress, "127.0.0.1"); @@ -115,6 +121,12 @@ void AudioInputSettings::applySettings(const QStringList& settingsKeys, const Au if (settingsKeys.contains("iqMapping")) { m_iqMapping = settings.m_iqMapping; } + if (settingsKeys.contains("dcBlock")) { + m_dcBlock = settings.m_dcBlock; + } + if (settingsKeys.contains("iqImbalance")) { + m_iqImbalance = settings.m_iqImbalance; + } if (settingsKeys.contains("useReverseAPI")) { m_useReverseAPI = settings.m_useReverseAPI; } @@ -148,6 +160,12 @@ QString AudioInputSettings::getDebugString(const QStringList& settingsKeys, bool if (settingsKeys.contains("iqMapping") || force) { ostr << " m_iqMapping: " << m_iqMapping; } + if (settingsKeys.contains("dcBlock") || force) { + ostr << " m_dcBlock: " << m_dcBlock; + } + if (settingsKeys.contains("iqImbalance") || force) { + ostr << " m_iqImbalance: " << m_iqImbalance; + } if (settingsKeys.contains("useReverseAPI") || force) { ostr << " m_useReverseAPI: " << m_useReverseAPI; } diff --git a/plugins/samplesource/audioinput/audioinputsettings.h b/plugins/samplesource/audioinput/audioinputsettings.h index aecf4484a..1f4ccf0e8 100644 --- a/plugins/samplesource/audioinput/audioinputsettings.h +++ b/plugins/samplesource/audioinput/audioinputsettings.h @@ -34,6 +34,8 @@ struct AudioInputSettings { LR, RL } m_iqMapping; + bool m_dcBlock; + bool m_iqImbalance; bool m_useReverseAPI; QString m_reverseAPIAddress; diff --git a/plugins/samplesource/audioinput/readme.md b/plugins/samplesource/audioinput/readme.md index 08e70b8c9..3e1e5d6c3 100644 --- a/plugins/samplesource/audioinput/readme.md +++ b/plugins/samplesource/audioinput/readme.md @@ -46,3 +46,11 @@ This controls how the left and right audio channels map on to the IQ channels. * Mono R - Same as above but takes the right audio channel for the real signal. * I=L, Q=R - The left audio channel is driven to the I channel. The right audio channel is driven to the Q channel for a complex (analytic signal)input. * I=R, Q=L - The right audio channel is driven to the I channel. The left audio channel is driven to the Q channel for a complex (analytic signal)input. + +

8: Auto remove DC component

+ +Software DSP auto remove DC correction. + +

9: Auto make I/Q balance

+ +Software DSP auto I/Q imbalance correction. The DC correction (8) must be enabled for this to be effective. diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index a697c0326..2d4ce2c29 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -2449,6 +2449,14 @@ margin-bottom: 20px; "type" : "integer", "description" : "Audio channel to IQ mapping\n * 0 - I=L, Q=0\n * 1 - I=R, Q=0\n * 2 - I=L, Q=R\n * 3 - I=R, Q=L\n" }, + "dcBlock" : { + "type" : "integer", + "description" : "Auto DC blocking\n * 0 - Off\n * 1 - On\n" + }, + "iqImbalance" : { + "type" : "integer", + "description" : "Auto IQ balance (you need auto DC blocking active)\n * 0 - Off\n * 1 - On\n" + }, "useReverseAPI" : { "type" : "integer", "description" : "Synchronize with reverse API (1 for yes, 0 for no)" @@ -3520,12 +3528,21 @@ margin-bottom: 20px; "FT8DemodReport" : { "$ref" : "#/definitions/FT8DemodReport" }, + "RTTYDemodReport" : { + "$ref" : "#/definitions/RTTYDemodReport" + }, + "HeatMapReport" : { + "$ref" : "#/definitions/HeatMapReport" + }, "M17DemodReport" : { "$ref" : "#/definitions/M17DemodReport" }, "M17ModReport" : { "$ref" : "#/definitions/M17ModReport" }, + "NavtexDemodReport" : { + "$ref" : "#/definitions/NavtexDemodReport" + }, "NFMDemodReport" : { "$ref" : "#/definitions/NFMDemodReport" }, @@ -3675,6 +3692,12 @@ margin-bottom: 20px; "FT8DemodSettings" : { "$ref" : "#/definitions/FT8DemodSettings" }, + "RTTYDemodSettings" : { + "$ref" : "#/definitions/RTTYDemodSettings" + }, + "HeatMapSettings" : { + "$ref" : "#/definitions/HeatMapSettings" + }, "InterferometerSettings" : { "$ref" : "#/definitions/InterferometerSettings" }, @@ -3687,6 +3710,9 @@ margin-bottom: 20px; "M17ModSettings" : { "$ref" : "#/definitions/M17ModSettings" }, + "NavtexDemodSettings" : { + "$ref" : "#/definitions/NavtexDemodSettings" + }, "NFMDemodSettings" : { "$ref" : "#/definitions/NFMDemodSettings" }, @@ -7119,6 +7145,94 @@ margin-bottom: 20px; } }, "description" : "HackRF" +}; + defs.HeatMapReport = { + "properties" : { + "channelPowerDB" : { + "type" : "number", + "format" : "float", + "description" : "power received in channel (dB)" + }, + "channelSampleRate" : { + "type" : "integer" + } + }, + "description" : "HeatMap" +}; + defs.HeatMapSettings = { + "properties" : { + "inputFrequencyOffset" : { + "type" : "integer", + "format" : "int64" + }, + "rfBandwidth" : { + "type" : "number", + "format" : "float", + "description" : "channel RF bandwidth in Hz" + }, + "minPower" : { + "type" : "number", + "format" : "float" + }, + "maxPower" : { + "type" : "number", + "format" : "float" + }, + "colorMapName" : { + "type" : "string" + }, + "mode" : { + "type" : "integer", + "description" : "(0 - None, 1 - Average, 2 - Max, 3 - Min, 4 - Pulse Average)" + }, + "pulseThreshold" : { + "type" : "number", + "format" : "float" + }, + "averagePeriodUS" : { + "type" : "integer", + "description" : "Averaging period in microseconds" + }, + "sampleRate" : { + "type" : "integer" + }, + "rgbColor" : { + "type" : "integer" + }, + "title" : { + "type" : "string" + }, + "streamIndex" : { + "type" : "integer", + "description" : "MIMO channel. Not relevant when connected to SI (single Rx)." + }, + "useReverseAPI" : { + "type" : "integer", + "description" : "Synchronize with reverse API (1 for yes, 0 for no)" + }, + "reverseAPIAddress" : { + "type" : "string" + }, + "reverseAPIPort" : { + "type" : "integer" + }, + "reverseAPIDeviceIndex" : { + "type" : "integer" + }, + "reverseAPIChannelIndex" : { + "type" : "integer" + }, + "scopeConfig" : { + "$ref" : "#/definitions/GLScope" + }, + "channelMarker" : { + "$ref" : "#/definitions/ChannelMarker" + }, + "rollupState" : { + "$ref" : "#/definitions/RollupState" + } + }, + "description" : "HeatMap" }; defs.IEEE_802_15_4_ModActions = { "properties" : { @@ -8948,7 +9062,7 @@ margin-bottom: 20px; }, "altitudeReference" : { "type" : "integer", - "description" : "0 - NONE (Absolule), 1 - CLAMP_TO_GROUND, 2 - RELATIVE_TO_GROUND, 3 - CLIP_TO_GROUND" + "description" : "0 - NONE (Absolute), 1 - CLAMP_TO_GROUND, 2 - RELATIVE_TO_GROUND, 3 - CLIP_TO_GROUND" }, "animations" : { "type" : "array", @@ -8959,7 +9073,7 @@ margin-bottom: 20px; }, "type" : { "type" : "integer", - "description" : "(0 - Map Item, 1 - Image Tile)" + "description" : "(0 - Map Item, 1 - Image Tile, 2 - Polygon, 3 - Polyline)" }, "imageTileWest" : { "type" : "number", @@ -8976,6 +9090,27 @@ margin-bottom: 20px; "imageTileNorth" : { "type" : "number", "format" : "float" + }, + "imageZoomLevel" : { + "type" : "number", + "format" : "float", + "description" : "For 2D map" + }, + "coordinates" : { + "type" : "array", + "description" : "Polygon/polyline coordinates", + "items" : { + "$ref" : "#/definitions/MapCoordinate" + } + }, + "extrudedHeight" : { + "type" : "number", + "format" : "float", + "description" : "Extruded height (from surface) for polygons" + }, + "availableUntil" : { + "type" : "string", + "description" : "Date and time until after which this item should no longer appear on 3D map" } }, "description" : "An item to draw on the map. Set image to an empty string to remove item from the map." @@ -9078,7 +9213,7 @@ margin-bottom: 20px; }, "altitudeReference" : { "type" : "integer", - "description" : "0 - NONE (Absolule), 1 - CLAMP_TO_GROUND, 2 - RELATIVE_TO_GROUND, 3 - CLIP_TO_GROUND" + "description" : "0 - NONE (Absolute), 1 - CLAMP_TO_GROUND, 2 - RELATIVE_TO_GROUND, 3 - CLIP_TO_GROUND" }, "animations" : { "type" : "array", @@ -9089,7 +9224,7 @@ margin-bottom: 20px; }, "type" : { "type" : "integer", - "description" : "(0 - Map Item, 1 - Image Tile)" + "description" : "(0 - Map Item, 1 - Image Tile, 2 - Polygon, 3 - Polyline)" }, "imageTileWest" : { "type" : "number", @@ -9106,6 +9241,27 @@ margin-bottom: 20px; "imageTileNorth" : { "type" : "number", "format" : "float" + }, + "imageZoomLevel" : { + "type" : "number", + "format" : "float", + "description" : "For 2D map" + }, + "coordinates" : { + "type" : "array", + "description" : "Polygon/polyline coordinates", + "items" : { + "$ref" : "#/definitions/MapCoordinate" + } + }, + "extrudedHeight" : { + "type" : "number", + "format" : "float", + "description" : "Extruded height (from surface) for polygons" + }, + "availableUntil" : { + "type" : "string", + "description" : "Date and time until after which this item should no longer appear on 3D map" } }, "description" : "An item to draw on the map. Set image to an empty string to remove item from the map." @@ -9560,6 +9716,94 @@ margin-bottom: 20px; } }, "description" : "Enumeration with name for values" +}; + defs.NavtexDemodReport = { + "properties" : { + "channelPowerDB" : { + "type" : "number", + "format" : "float", + "description" : "power received in channel (dB)" + }, + "channelSampleRate" : { + "type" : "integer" + } + }, + "description" : "ACARSDemod" +}; + defs.NavtexDemodSettings = { + "properties" : { + "inputFrequencyOffset" : { + "type" : "integer", + "format" : "int64" + }, + "rfBandwidth" : { + "type" : "number", + "format" : "float" + }, + "navArea" : { + "type" : "integer" + }, + "filterStation" : { + "type" : "string" + }, + "filterType" : { + "type" : "string" + }, + "udpEnabled" : { + "type" : "integer", + "description" : "Whether to forward received messages to specified UDP port" + }, + "udpAddress" : { + "type" : "string", + "description" : "UDP address to forward received messages to" + }, + "udpPort" : { + "type" : "integer", + "description" : "UDP port to forward received messages to" + }, + "logFilename" : { + "type" : "string" + }, + "logEnabled" : { + "type" : "integer" + }, + "rgbColor" : { + "type" : "integer" + }, + "title" : { + "type" : "string" + }, + "streamIndex" : { + "type" : "integer", + "description" : "MIMO channel. Not relevant when connected to SI (single Rx)." + }, + "useReverseAPI" : { + "type" : "integer", + "description" : "Synchronize with reverse API (1 for yes, 0 for no)" + }, + "reverseAPIAddress" : { + "type" : "string" + }, + "reverseAPIPort" : { + "type" : "integer" + }, + "reverseAPIDeviceIndex" : { + "type" : "integer" + }, + "reverseAPIChannelIndex" : { + "type" : "integer" + }, + "scopeConfig" : { + "$ref" : "#/definitions/GLScope" + }, + "channelMarker" : { + "$ref" : "#/definitions/ChannelMarker" + }, + "rollupState" : { + "$ref" : "#/definitions/RollupState" + } + }, + "description" : "ACARSDemod" }; defs.NoiseFigureReport = { "properties" : { @@ -10913,6 +11157,110 @@ margin-bottom: 20px; "format" : "float" } } +}; + defs.RTTYDemodReport = { + "properties" : { + "channelPowerDB" : { + "type" : "number", + "format" : "float", + "description" : "power received in channel (dB)" + }, + "channelSampleRate" : { + "type" : "integer" + } + }, + "description" : "ACARSDemod" +}; + defs.RTTYDemodSettings = { + "properties" : { + "inputFrequencyOffset" : { + "type" : "integer", + "format" : "int64" + }, + "rfBandwidth" : { + "type" : "number", + "format" : "float" + }, + "baudRate" : { + "type" : "number", + "format" : "float" + }, + "frequencyShift" : { + "type" : "integer" + }, + "udpEnabled" : { + "type" : "integer", + "description" : "Whether to forward received messages to specified UDP port" + }, + "udpAddress" : { + "type" : "string", + "description" : "UDP address to forward received messages to" + }, + "udpPort" : { + "type" : "integer", + "description" : "UDP port to forward received messages to" + }, + "characterSet" : { + "type" : "integer" + }, + "suppressCRLF" : { + "type" : "integer" + }, + "unshiftOnSpace" : { + "type" : "integer" + }, + "msbFirst" : { + "type" : "integer" + }, + "spaceHigh" : { + "type" : "integer" + }, + "squelch" : { + "type" : "integer" + }, + "logFilename" : { + "type" : "string" + }, + "logEnabled" : { + "type" : "integer" + }, + "rgbColor" : { + "type" : "integer" + }, + "title" : { + "type" : "string" + }, + "streamIndex" : { + "type" : "integer", + "description" : "MIMO channel. Not relevant when connected to SI (single Rx)." + }, + "useReverseAPI" : { + "type" : "integer", + "description" : "Synchronize with reverse API (1 for yes, 0 for no)" + }, + "reverseAPIAddress" : { + "type" : "string" + }, + "reverseAPIPort" : { + "type" : "integer" + }, + "reverseAPIDeviceIndex" : { + "type" : "integer" + }, + "reverseAPIChannelIndex" : { + "type" : "integer" + }, + "scopeConfig" : { + "$ref" : "#/definitions/GLScope" + }, + "channelMarker" : { + "$ref" : "#/definitions/ChannelMarker" + }, + "rollupState" : { + "$ref" : "#/definitions/RollupState" + } + }, + "description" : "ACARSDemod" }; defs.RadioAstronomyActions = { "properties" : { @@ -14757,6 +15105,9 @@ margin-bottom: 20px; "audioMute" : { "type" : "integer" }, + "identBandpassEnable" : { + "type" : "integer" + }, "rgbColor" : { "type" : "integer" }, @@ -56905,7 +57256,7 @@ except ApiException as e:
- Generated 2023-01-28T23:27:13.480+01:00 + Generated 2023-03-11T04:40:02.823+01:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/AudioInput.yaml b/sdrbase/resources/webapi/doc/swagger/include/AudioInput.yaml index 540442dd8..4c78a925e 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/AudioInput.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/AudioInput.yaml @@ -21,6 +21,18 @@ AudioInputSettings: * 1 - I=R, Q=0 * 2 - I=L, Q=R * 3 - I=R, Q=L + dcBlock: + type: integer + description: > + Auto DC blocking + * 0 - Off + * 1 - On + iqImbalance: + type: integer + description: > + Auto IQ balance (you need auto DC blocking active) + * 0 - Off + * 1 - On useReverseAPI: description: Synchronize with reverse API (1 for yes, 0 for no) type: integer diff --git a/sdrbase/resources/webapi/doc/swagger/include/ChannelReport.yaml b/sdrbase/resources/webapi/doc/swagger/include/ChannelReport.yaml index 231ed3a86..1697138e5 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/ChannelReport.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/ChannelReport.yaml @@ -51,10 +51,16 @@ ChannelReport: $ref: "/doc/swagger/include/FreqTracker.yaml#/FreqTrackerReport" FT8DemodReport: $ref: "/doc/swagger/include/FT8Demod.yaml#/FT8DemodReport" + RTTYDemodReport: + $ref: "/doc/swagger/include/RTTYDemod.yaml#/RTTYDemodReport" + HeatMapReport: + $ref: "/doc/swagger/include/HeatMap.yaml#/HeatMapReport" M17DemodReport: $ref: "/doc/swagger/include/M17Demod.yaml#/M17DemodReport" M17ModReport: $ref: "/doc/swagger/include/M17Mod.yaml#/M17ModReport" + NavtexDemodReport: + $ref: "/doc/swagger/include/NavtexDemod.yaml#/NavtexDemodReport" NFMDemodReport: $ref: "/doc/swagger/include/NFMDemod.yaml#/NFMDemodReport" NFMModReport: diff --git a/sdrbase/resources/webapi/doc/swagger/include/ChannelSettings.yaml b/sdrbase/resources/webapi/doc/swagger/include/ChannelSettings.yaml index d690ed5eb..10855b93a 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/ChannelSettings.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/ChannelSettings.yaml @@ -65,6 +65,10 @@ ChannelSettings: $ref: "/doc/swagger/include/FreqTracker.yaml#/FreqTrackerSettings" FT8DemodSettings: $ref: "/doc/swagger/include/FT8Demod.yaml#/FT8DemodSettings" + RTTYDemodSettings: + $ref: "/doc/swagger/include/RTTYDemod.yaml#/RTTYDemodSettings" + HeatMapSettings: + $ref: "/doc/swagger/include/HeatMap.yaml#/HeatMapSettings" InterferometerSettings: $ref: "/doc/swagger/include/Interferometer.yaml#/InterferometerSettings" IEEE_802_15_4_ModSettings: @@ -73,6 +77,8 @@ ChannelSettings: $ref: "/doc/swagger/include/M17Demod.yaml#/M17DemodSettings" M17ModSettings: $ref: "/doc/swagger/include/M17Mod.yaml#/M17ModSettings" + NavtexDemodSettings: + $ref: "/doc/swagger/include/NavtexDemod.yaml#/NavtexDemodSettings" NFMDemodSettings: $ref: "/doc/swagger/include/NFMDemod.yaml#/NFMDemodSettings" NFMModSettings: diff --git a/swagger/sdrangel/api/swagger/include/AudioInput.yaml b/swagger/sdrangel/api/swagger/include/AudioInput.yaml index 540442dd8..4c78a925e 100644 --- a/swagger/sdrangel/api/swagger/include/AudioInput.yaml +++ b/swagger/sdrangel/api/swagger/include/AudioInput.yaml @@ -21,6 +21,18 @@ AudioInputSettings: * 1 - I=R, Q=0 * 2 - I=L, Q=R * 3 - I=R, Q=L + dcBlock: + type: integer + description: > + Auto DC blocking + * 0 - Off + * 1 - On + iqImbalance: + type: integer + description: > + Auto IQ balance (you need auto DC blocking active) + * 0 - Off + * 1 - On useReverseAPI: description: Synchronize with reverse API (1 for yes, 0 for no) type: integer diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index a697c0326..2d4ce2c29 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -2449,6 +2449,14 @@ margin-bottom: 20px; "type" : "integer", "description" : "Audio channel to IQ mapping\n * 0 - I=L, Q=0\n * 1 - I=R, Q=0\n * 2 - I=L, Q=R\n * 3 - I=R, Q=L\n" }, + "dcBlock" : { + "type" : "integer", + "description" : "Auto DC blocking\n * 0 - Off\n * 1 - On\n" + }, + "iqImbalance" : { + "type" : "integer", + "description" : "Auto IQ balance (you need auto DC blocking active)\n * 0 - Off\n * 1 - On\n" + }, "useReverseAPI" : { "type" : "integer", "description" : "Synchronize with reverse API (1 for yes, 0 for no)" @@ -3520,12 +3528,21 @@ margin-bottom: 20px; "FT8DemodReport" : { "$ref" : "#/definitions/FT8DemodReport" }, + "RTTYDemodReport" : { + "$ref" : "#/definitions/RTTYDemodReport" + }, + "HeatMapReport" : { + "$ref" : "#/definitions/HeatMapReport" + }, "M17DemodReport" : { "$ref" : "#/definitions/M17DemodReport" }, "M17ModReport" : { "$ref" : "#/definitions/M17ModReport" }, + "NavtexDemodReport" : { + "$ref" : "#/definitions/NavtexDemodReport" + }, "NFMDemodReport" : { "$ref" : "#/definitions/NFMDemodReport" }, @@ -3675,6 +3692,12 @@ margin-bottom: 20px; "FT8DemodSettings" : { "$ref" : "#/definitions/FT8DemodSettings" }, + "RTTYDemodSettings" : { + "$ref" : "#/definitions/RTTYDemodSettings" + }, + "HeatMapSettings" : { + "$ref" : "#/definitions/HeatMapSettings" + }, "InterferometerSettings" : { "$ref" : "#/definitions/InterferometerSettings" }, @@ -3687,6 +3710,9 @@ margin-bottom: 20px; "M17ModSettings" : { "$ref" : "#/definitions/M17ModSettings" }, + "NavtexDemodSettings" : { + "$ref" : "#/definitions/NavtexDemodSettings" + }, "NFMDemodSettings" : { "$ref" : "#/definitions/NFMDemodSettings" }, @@ -7119,6 +7145,94 @@ margin-bottom: 20px; } }, "description" : "HackRF" +}; + defs.HeatMapReport = { + "properties" : { + "channelPowerDB" : { + "type" : "number", + "format" : "float", + "description" : "power received in channel (dB)" + }, + "channelSampleRate" : { + "type" : "integer" + } + }, + "description" : "HeatMap" +}; + defs.HeatMapSettings = { + "properties" : { + "inputFrequencyOffset" : { + "type" : "integer", + "format" : "int64" + }, + "rfBandwidth" : { + "type" : "number", + "format" : "float", + "description" : "channel RF bandwidth in Hz" + }, + "minPower" : { + "type" : "number", + "format" : "float" + }, + "maxPower" : { + "type" : "number", + "format" : "float" + }, + "colorMapName" : { + "type" : "string" + }, + "mode" : { + "type" : "integer", + "description" : "(0 - None, 1 - Average, 2 - Max, 3 - Min, 4 - Pulse Average)" + }, + "pulseThreshold" : { + "type" : "number", + "format" : "float" + }, + "averagePeriodUS" : { + "type" : "integer", + "description" : "Averaging period in microseconds" + }, + "sampleRate" : { + "type" : "integer" + }, + "rgbColor" : { + "type" : "integer" + }, + "title" : { + "type" : "string" + }, + "streamIndex" : { + "type" : "integer", + "description" : "MIMO channel. Not relevant when connected to SI (single Rx)." + }, + "useReverseAPI" : { + "type" : "integer", + "description" : "Synchronize with reverse API (1 for yes, 0 for no)" + }, + "reverseAPIAddress" : { + "type" : "string" + }, + "reverseAPIPort" : { + "type" : "integer" + }, + "reverseAPIDeviceIndex" : { + "type" : "integer" + }, + "reverseAPIChannelIndex" : { + "type" : "integer" + }, + "scopeConfig" : { + "$ref" : "#/definitions/GLScope" + }, + "channelMarker" : { + "$ref" : "#/definitions/ChannelMarker" + }, + "rollupState" : { + "$ref" : "#/definitions/RollupState" + } + }, + "description" : "HeatMap" }; defs.IEEE_802_15_4_ModActions = { "properties" : { @@ -8948,7 +9062,7 @@ margin-bottom: 20px; }, "altitudeReference" : { "type" : "integer", - "description" : "0 - NONE (Absolule), 1 - CLAMP_TO_GROUND, 2 - RELATIVE_TO_GROUND, 3 - CLIP_TO_GROUND" + "description" : "0 - NONE (Absolute), 1 - CLAMP_TO_GROUND, 2 - RELATIVE_TO_GROUND, 3 - CLIP_TO_GROUND" }, "animations" : { "type" : "array", @@ -8959,7 +9073,7 @@ margin-bottom: 20px; }, "type" : { "type" : "integer", - "description" : "(0 - Map Item, 1 - Image Tile)" + "description" : "(0 - Map Item, 1 - Image Tile, 2 - Polygon, 3 - Polyline)" }, "imageTileWest" : { "type" : "number", @@ -8976,6 +9090,27 @@ margin-bottom: 20px; "imageTileNorth" : { "type" : "number", "format" : "float" + }, + "imageZoomLevel" : { + "type" : "number", + "format" : "float", + "description" : "For 2D map" + }, + "coordinates" : { + "type" : "array", + "description" : "Polygon/polyline coordinates", + "items" : { + "$ref" : "#/definitions/MapCoordinate" + } + }, + "extrudedHeight" : { + "type" : "number", + "format" : "float", + "description" : "Extruded height (from surface) for polygons" + }, + "availableUntil" : { + "type" : "string", + "description" : "Date and time until after which this item should no longer appear on 3D map" } }, "description" : "An item to draw on the map. Set image to an empty string to remove item from the map." @@ -9078,7 +9213,7 @@ margin-bottom: 20px; }, "altitudeReference" : { "type" : "integer", - "description" : "0 - NONE (Absolule), 1 - CLAMP_TO_GROUND, 2 - RELATIVE_TO_GROUND, 3 - CLIP_TO_GROUND" + "description" : "0 - NONE (Absolute), 1 - CLAMP_TO_GROUND, 2 - RELATIVE_TO_GROUND, 3 - CLIP_TO_GROUND" }, "animations" : { "type" : "array", @@ -9089,7 +9224,7 @@ margin-bottom: 20px; }, "type" : { "type" : "integer", - "description" : "(0 - Map Item, 1 - Image Tile)" + "description" : "(0 - Map Item, 1 - Image Tile, 2 - Polygon, 3 - Polyline)" }, "imageTileWest" : { "type" : "number", @@ -9106,6 +9241,27 @@ margin-bottom: 20px; "imageTileNorth" : { "type" : "number", "format" : "float" + }, + "imageZoomLevel" : { + "type" : "number", + "format" : "float", + "description" : "For 2D map" + }, + "coordinates" : { + "type" : "array", + "description" : "Polygon/polyline coordinates", + "items" : { + "$ref" : "#/definitions/MapCoordinate" + } + }, + "extrudedHeight" : { + "type" : "number", + "format" : "float", + "description" : "Extruded height (from surface) for polygons" + }, + "availableUntil" : { + "type" : "string", + "description" : "Date and time until after which this item should no longer appear on 3D map" } }, "description" : "An item to draw on the map. Set image to an empty string to remove item from the map." @@ -9560,6 +9716,94 @@ margin-bottom: 20px; } }, "description" : "Enumeration with name for values" +}; + defs.NavtexDemodReport = { + "properties" : { + "channelPowerDB" : { + "type" : "number", + "format" : "float", + "description" : "power received in channel (dB)" + }, + "channelSampleRate" : { + "type" : "integer" + } + }, + "description" : "ACARSDemod" +}; + defs.NavtexDemodSettings = { + "properties" : { + "inputFrequencyOffset" : { + "type" : "integer", + "format" : "int64" + }, + "rfBandwidth" : { + "type" : "number", + "format" : "float" + }, + "navArea" : { + "type" : "integer" + }, + "filterStation" : { + "type" : "string" + }, + "filterType" : { + "type" : "string" + }, + "udpEnabled" : { + "type" : "integer", + "description" : "Whether to forward received messages to specified UDP port" + }, + "udpAddress" : { + "type" : "string", + "description" : "UDP address to forward received messages to" + }, + "udpPort" : { + "type" : "integer", + "description" : "UDP port to forward received messages to" + }, + "logFilename" : { + "type" : "string" + }, + "logEnabled" : { + "type" : "integer" + }, + "rgbColor" : { + "type" : "integer" + }, + "title" : { + "type" : "string" + }, + "streamIndex" : { + "type" : "integer", + "description" : "MIMO channel. Not relevant when connected to SI (single Rx)." + }, + "useReverseAPI" : { + "type" : "integer", + "description" : "Synchronize with reverse API (1 for yes, 0 for no)" + }, + "reverseAPIAddress" : { + "type" : "string" + }, + "reverseAPIPort" : { + "type" : "integer" + }, + "reverseAPIDeviceIndex" : { + "type" : "integer" + }, + "reverseAPIChannelIndex" : { + "type" : "integer" + }, + "scopeConfig" : { + "$ref" : "#/definitions/GLScope" + }, + "channelMarker" : { + "$ref" : "#/definitions/ChannelMarker" + }, + "rollupState" : { + "$ref" : "#/definitions/RollupState" + } + }, + "description" : "ACARSDemod" }; defs.NoiseFigureReport = { "properties" : { @@ -10913,6 +11157,110 @@ margin-bottom: 20px; "format" : "float" } } +}; + defs.RTTYDemodReport = { + "properties" : { + "channelPowerDB" : { + "type" : "number", + "format" : "float", + "description" : "power received in channel (dB)" + }, + "channelSampleRate" : { + "type" : "integer" + } + }, + "description" : "ACARSDemod" +}; + defs.RTTYDemodSettings = { + "properties" : { + "inputFrequencyOffset" : { + "type" : "integer", + "format" : "int64" + }, + "rfBandwidth" : { + "type" : "number", + "format" : "float" + }, + "baudRate" : { + "type" : "number", + "format" : "float" + }, + "frequencyShift" : { + "type" : "integer" + }, + "udpEnabled" : { + "type" : "integer", + "description" : "Whether to forward received messages to specified UDP port" + }, + "udpAddress" : { + "type" : "string", + "description" : "UDP address to forward received messages to" + }, + "udpPort" : { + "type" : "integer", + "description" : "UDP port to forward received messages to" + }, + "characterSet" : { + "type" : "integer" + }, + "suppressCRLF" : { + "type" : "integer" + }, + "unshiftOnSpace" : { + "type" : "integer" + }, + "msbFirst" : { + "type" : "integer" + }, + "spaceHigh" : { + "type" : "integer" + }, + "squelch" : { + "type" : "integer" + }, + "logFilename" : { + "type" : "string" + }, + "logEnabled" : { + "type" : "integer" + }, + "rgbColor" : { + "type" : "integer" + }, + "title" : { + "type" : "string" + }, + "streamIndex" : { + "type" : "integer", + "description" : "MIMO channel. Not relevant when connected to SI (single Rx)." + }, + "useReverseAPI" : { + "type" : "integer", + "description" : "Synchronize with reverse API (1 for yes, 0 for no)" + }, + "reverseAPIAddress" : { + "type" : "string" + }, + "reverseAPIPort" : { + "type" : "integer" + }, + "reverseAPIDeviceIndex" : { + "type" : "integer" + }, + "reverseAPIChannelIndex" : { + "type" : "integer" + }, + "scopeConfig" : { + "$ref" : "#/definitions/GLScope" + }, + "channelMarker" : { + "$ref" : "#/definitions/ChannelMarker" + }, + "rollupState" : { + "$ref" : "#/definitions/RollupState" + } + }, + "description" : "ACARSDemod" }; defs.RadioAstronomyActions = { "properties" : { @@ -14757,6 +15105,9 @@ margin-bottom: 20px; "audioMute" : { "type" : "integer" }, + "identBandpassEnable" : { + "type" : "integer" + }, "rgbColor" : { "type" : "integer" }, @@ -56905,7 +57256,7 @@ except ApiException as e:
- Generated 2023-01-28T23:27:13.480+01:00 + Generated 2023-03-11T04:40:02.823+01:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.cpp index 5b5f1a39c..6d5e34ad4 100644 --- a/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.cpp @@ -38,6 +38,10 @@ SWGAudioInputSettings::SWGAudioInputSettings() { m_log2_decim_isSet = false; iq_mapping = 0; m_iq_mapping_isSet = false; + dc_block = 0; + m_dc_block_isSet = false; + iq_imbalance = 0; + m_iq_imbalance_isSet = false; use_reverse_api = 0; m_use_reverse_api_isSet = false; reverse_api_address = nullptr; @@ -64,6 +68,10 @@ SWGAudioInputSettings::init() { m_log2_decim_isSet = false; iq_mapping = 0; m_iq_mapping_isSet = false; + dc_block = 0; + m_dc_block_isSet = false; + iq_imbalance = 0; + m_iq_imbalance_isSet = false; use_reverse_api = 0; m_use_reverse_api_isSet = false; reverse_api_address = new QString(""); @@ -84,6 +92,8 @@ SWGAudioInputSettings::cleanup() { + + if(reverse_api_address != nullptr) { delete reverse_api_address; } @@ -112,6 +122,10 @@ SWGAudioInputSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&iq_mapping, pJson["iqMapping"], "qint32", ""); + ::SWGSDRangel::setValue(&dc_block, pJson["dcBlock"], "qint32", ""); + + ::SWGSDRangel::setValue(&iq_imbalance, pJson["iqImbalance"], "qint32", ""); + ::SWGSDRangel::setValue(&use_reverse_api, pJson["useReverseAPI"], "qint32", ""); ::SWGSDRangel::setValue(&reverse_api_address, pJson["reverseAPIAddress"], "QString", "QString"); @@ -151,6 +165,12 @@ SWGAudioInputSettings::asJsonObject() { if(m_iq_mapping_isSet){ obj->insert("iqMapping", QJsonValue(iq_mapping)); } + if(m_dc_block_isSet){ + obj->insert("dcBlock", QJsonValue(dc_block)); + } + if(m_iq_imbalance_isSet){ + obj->insert("iqImbalance", QJsonValue(iq_imbalance)); + } if(m_use_reverse_api_isSet){ obj->insert("useReverseAPI", QJsonValue(use_reverse_api)); } @@ -217,6 +237,26 @@ SWGAudioInputSettings::setIqMapping(qint32 iq_mapping) { this->m_iq_mapping_isSet = true; } +qint32 +SWGAudioInputSettings::getDcBlock() { + return dc_block; +} +void +SWGAudioInputSettings::setDcBlock(qint32 dc_block) { + this->dc_block = dc_block; + this->m_dc_block_isSet = true; +} + +qint32 +SWGAudioInputSettings::getIqImbalance() { + return iq_imbalance; +} +void +SWGAudioInputSettings::setIqImbalance(qint32 iq_imbalance) { + this->iq_imbalance = iq_imbalance; + this->m_iq_imbalance_isSet = true; +} + qint32 SWGAudioInputSettings::getUseReverseApi() { return use_reverse_api; @@ -277,6 +317,12 @@ SWGAudioInputSettings::isSet(){ if(m_iq_mapping_isSet){ isObjectUpdated = true; break; } + if(m_dc_block_isSet){ + isObjectUpdated = true; break; + } + if(m_iq_imbalance_isSet){ + isObjectUpdated = true; break; + } if(m_use_reverse_api_isSet){ isObjectUpdated = true; break; } diff --git a/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.h b/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.h index 7a2b8865e..ca8bb7fbf 100644 --- a/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.h @@ -57,6 +57,12 @@ public: qint32 getIqMapping(); void setIqMapping(qint32 iq_mapping); + qint32 getDcBlock(); + void setDcBlock(qint32 dc_block); + + qint32 getIqImbalance(); + void setIqImbalance(qint32 iq_imbalance); + qint32 getUseReverseApi(); void setUseReverseApi(qint32 use_reverse_api); @@ -88,6 +94,12 @@ private: qint32 iq_mapping; bool m_iq_mapping_isSet; + qint32 dc_block; + bool m_dc_block_isSet; + + qint32 iq_imbalance; + bool m_iq_imbalance_isSet; + qint32 use_reverse_api; bool m_use_reverse_api_isSet;