From 246303cd4608e73eb91315b9882c73722f18c087 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 17 Jun 2023 08:19:53 +0200 Subject: [PATCH] Audio CAT SISO: polling time and spectrum follows PTT --- doc/img/AudioCATSISO_plugin.png | Bin 0 -> 40516 bytes doc/img/AudioCATSISO_plugin.xcf | Bin 0 -> 166054 bytes .../samplemimo/audiocatsiso/audiocatsiso.cpp | 14 ++++++ .../audiocatsiso/audiocatsisocatdialog.cpp | 12 +++++ .../audiocatsiso/audiocatsisocatdialog.h | 1 + .../audiocatsiso/audiocatsisocatdialog.ui | 28 ++++++++++- .../audiocatsiso/audiocatsisocatworker.cpp | 6 +++ .../audiocatsiso/audiocatsisogui.cpp | 17 ++++++- .../samplemimo/audiocatsiso/audiocatsisogui.h | 1 + .../audiocatsiso/audiocatsisogui.ui | 20 ++++++++ .../audiocatsiso/audiocatsisosettings.cpp | 13 ++++- .../audiocatsiso/audiocatsisosettings.h | 1 + plugins/samplemimo/audiocatsiso/readme.md | 38 +++++++++++++++ sdrbase/resources/webapi/doc/html2/index.html | 10 +++- .../doc/swagger/include/AudioCATSISO.yaml | 9 ++++ .../api/swagger/include/AudioCATSISO.yaml | 9 ++++ swagger/sdrangel/code/html2/index.html | 10 +++- .../qt5/client/SWGAudioCATSISOSettings.cpp | 46 ++++++++++++++++++ .../code/qt5/client/SWGAudioCATSISOSettings.h | 12 +++++ 19 files changed, 242 insertions(+), 5 deletions(-) create mode 100644 doc/img/AudioCATSISO_plugin.png create mode 100644 doc/img/AudioCATSISO_plugin.xcf create mode 100644 plugins/samplemimo/audiocatsiso/readme.md diff --git a/doc/img/AudioCATSISO_plugin.png b/doc/img/AudioCATSISO_plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..609906e7fccd360f170f470f576d7f0918992e51 GIT binary patch literal 40516 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 Jx{Ut4{|i#Re5e2b literal 0 HcmV?d00001 diff --git a/doc/img/AudioCATSISO_plugin.xcf b/doc/img/AudioCATSISO_plugin.xcf new file mode 100644 index 0000000000000000000000000000000000000000..15b411fa5f8edb43e5276227081743f72206790b GIT binary patch literal 166054 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 != 0; } + if (deviceSettingsKeys.contains("catRTSHigh")) { + settings.m_catPollingMs = response.getAudioCatsisoSettings()->getCatPollingMs(); + } if (deviceSettingsKeys.contains("txEnable")) { settings.m_txEnable = response.getAudioCatsisoSettings()->getTxEnable() != 0; } + if (deviceSettingsKeys.contains("pttSpectrumLink")) { + settings.m_pttSpectrumLink = response.getAudioCatsisoSettings()->getPttSpectrumLink() != 0; + } if (deviceSettingsKeys.contains("useReverseAPI")) { settings.m_useReverseAPI = response.getAudioCatsisoSettings()->getUseReverseApi() != 0; } @@ -787,6 +793,7 @@ void AudioCATSISO::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& re response.getAudioCatsisoSettings()->setTxVolume(settings.m_txVolume); response.getAudioCatsisoSettings()->setTxEnable(settings.m_txEnable ? 1 : 0); + response.getAudioCatsisoSettings()->setPttSpectrumLink(settings.m_pttSpectrumLink ? 1 : 0); response.getAudioCatsisoSettings()->setCatSpeedIndex(settings.m_catSpeedIndex); response.getAudioCatsisoSettings()->setCatHandshakeIndex(settings.m_catHandshakeIndex); @@ -795,6 +802,7 @@ void AudioCATSISO::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& re response.getAudioCatsisoSettings()->setCatStopBitsIndex(settings.m_catPTTMethodIndex); response.getAudioCatsisoSettings()->setCatDtrHigh(settings.m_catDTRHigh ? 1 : 0); response.getAudioCatsisoSettings()->setCatRtsHigh(settings.m_catRTSHigh ? 1 : 0); + response.getAudioCatsisoSettings()->setCatPollingMs(settings.m_catPollingMs); response.getAudioCatsisoSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0); @@ -869,6 +877,9 @@ void AudioCATSISO::webapiReverseSendSettings(const QList& deviceSetting if (deviceSettingsKeys.contains("txEnable")) { swgAudioCATSISOSettings->setTxEnable(settings.m_txEnable ? 1 : 0); } + if (deviceSettingsKeys.contains("pttSpectrumLink")) { + swgAudioCATSISOSettings->setPttSpectrumLink(settings.m_pttSpectrumLink ? 1 : 0); + } if (deviceSettingsKeys.contains("catSpeedIndex")) { swgAudioCATSISOSettings->setCatSpeedIndex(settings.m_catSpeedIndex); @@ -891,6 +902,9 @@ void AudioCATSISO::webapiReverseSendSettings(const QList& deviceSetting if (deviceSettingsKeys.contains("catRTSHigh")) { swgAudioCATSISOSettings->setCatRtsHigh(settings.m_catRTSHigh ? 1 : 0); } + if (deviceSettingsKeys.contains("catPollingMs")) { + swgAudioCATSISOSettings->setCatPollingMs(settings.m_catPollingMs); + } QString deviceSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/device/settings") .arg(settings.m_reverseAPIAddress) diff --git a/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.cpp b/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.cpp index 6f73a0101..45eb97ae9 100644 --- a/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.cpp +++ b/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.cpp @@ -33,6 +33,7 @@ AudioCATSISOCATDialog::AudioCATSISOCATDialog(AudioCATSISOSettings& settings, QLi ui->pttMethod->blockSignals(true); ui->dtrHigh->blockSignals(true); ui->rtsHigh->blockSignals(true); + ui->pollingTime->blockSignals(true); ui->baudRate->setCurrentIndex(m_settings.m_catSpeedIndex); ui->handshake->setCurrentIndex(m_settings.m_catHandshakeIndex); @@ -41,6 +42,7 @@ AudioCATSISOCATDialog::AudioCATSISOCATDialog(AudioCATSISOSettings& settings, QLi ui->pttMethod->setCurrentIndex(m_settings.m_catPTTMethodIndex); ui->dtrHigh->setCurrentIndex(m_settings.m_catDTRHigh ? 1 : 0); ui->rtsHigh->setCurrentIndex(m_settings.m_catRTSHigh ? 1 : 0); + ui->pollingTime->setValue(m_settings.m_catPollingMs); ui->baudRate->blockSignals(false); ui->handshake->blockSignals(false); @@ -49,6 +51,7 @@ AudioCATSISOCATDialog::AudioCATSISOCATDialog(AudioCATSISOSettings& settings, QLi ui->pttMethod->blockSignals(false); ui->dtrHigh->blockSignals(false); ui->rtsHigh->blockSignals(false); + ui->pollingTime->blockSignals(false); } AudioCATSISOCATDialog::~AudioCATSISOCATDialog() @@ -123,3 +126,12 @@ void AudioCATSISOCATDialog::on_rtsHigh_currentIndexChanged(int index) m_settingsKeys.append("catRTSHigh"); } } + +void AudioCATSISOCATDialog::on_pollingTime_valueChanged(int value) +{ + m_settings.m_catPollingMs = value; + + if (!m_settingsKeys.contains("catPollingMs")) { + m_settingsKeys.append("catPollingMs"); + } +} diff --git a/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.h b/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.h index 51b844313..81fedf9cb 100644 --- a/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.h +++ b/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.h @@ -44,6 +44,7 @@ private slots: void on_pttMethod_currentIndexChanged(int index); void on_dtrHigh_currentIndexChanged(int index); void on_rtsHigh_currentIndexChanged(int index); + void on_pollingTime_valueChanged(int value); private: Ui::AudioCATSISOCATDialog* ui; diff --git a/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.ui b/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.ui index 93d6c8baa..306ba0321 100644 --- a/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.ui +++ b/plugins/samplemimo/audiocatsiso/audiocatsisocatdialog.ui @@ -6,7 +6,7 @@ 0 0 - 319 + 337 256 @@ -243,6 +243,32 @@ + + + + Polling (ms) + + + + + + + CAT frequency polling time in milliseconds + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 500 + + + 5000 + + + 100 + + + diff --git a/plugins/samplemimo/audiocatsiso/audiocatsisocatworker.cpp b/plugins/samplemimo/audiocatsiso/audiocatsisocatworker.cpp index 8927bc02a..0a27340ae 100644 --- a/plugins/samplemimo/audiocatsiso/audiocatsisocatworker.cpp +++ b/plugins/samplemimo/audiocatsiso/audiocatsisocatworker.cpp @@ -79,6 +79,11 @@ void AudioCATSISOCATWorker::applySettings(const AudioCATSISOSettings& settings, } } + if (settingsKeys.contains("catPollingMs") || force) + { + m_pollTimer.setInterval(settings.m_catPollingMs); + } + if (force) { m_settings = settings; } else { @@ -268,6 +273,7 @@ void AudioCATSISOCATWorker::pollingTick() if (retcode == RIG_OK) { + // qDebug("AudioCATSISOCATWorker::pollingTick: %f %lu", freq, m_frequency); if (m_frequency != freq) { qDebug("AudioCATSISOCATWorker::pollingTick: %lu", m_frequency); diff --git a/plugins/samplemimo/audiocatsiso/audiocatsisogui.cpp b/plugins/samplemimo/audiocatsiso/audiocatsisogui.cpp index e889ffd79..1cfce1af4 100644 --- a/plugins/samplemimo/audiocatsiso/audiocatsisogui.cpp +++ b/plugins/samplemimo/audiocatsiso/audiocatsisogui.cpp @@ -156,6 +156,8 @@ bool AudioCATSISOGUI::deserialize(const QByteArray& data) void AudioCATSISOGUI::on_startStop_toggled(bool checked) { + ui->txEnable->setEnabled(!checked); + if (m_doApplySettings) { AudioCATSISO::MsgStartStop *message = AudioCATSISO::MsgStartStop::create(checked); @@ -165,10 +167,21 @@ void AudioCATSISOGUI::on_startStop_toggled(bool checked) void AudioCATSISOGUI::on_ptt_toggled(bool checked) { + if (m_settings.m_pttSpectrumLink) { + ui->streamSide->setCurrentIndex(checked ? 1 : 0); + } + AudioCATSISOSettings::MsgPTT *msg = AudioCATSISOSettings::MsgPTT::create(checked); m_sampleMIMO->getInputMessageQueue()->push(msg); } +void AudioCATSISOGUI::on_pttSpectrumLinkToggled(bool checked) +{ + m_settings.m_pttSpectrumLink = checked; + m_settingsKeys.append("pttSpectrumLink"); + sendSettings(); +} + void AudioCATSISOGUI::on_catConnect_toggled(bool checked) { AudioCATSISOSettings::MsgCATConnect *msg = AudioCATSISOSettings::MsgCATConnect::create(checked); @@ -408,10 +421,11 @@ void AudioCATSISOGUI::displaySettings() ui->dcBlock->setChecked(m_settings.m_dcBlock); ui->iqCorrection->setChecked(m_settings.m_iqCorrection); ui->txEnable->setChecked(m_settings.m_txEnable); + ui->pttSpectrumLink->setChecked(m_settings.m_pttSpectrumLink); ui->rxVolume->setValue((int)(m_settings.m_rxVolume*10.0f)); ui->rxVolumeText->setText(QString("%1").arg(m_settings.m_rxVolume, 3, 'f', 1)); ui->rxChannels->setCurrentIndex((int)m_settings.m_rxIQMapping); - ui->txVolume->setValue((int)(m_settings.m_txVolume*10.0f)); + ui->txVolume->setValue((int)(m_settings.m_txVolume)); ui->txVolumeText->setText(tr("%1").arg(m_settings.m_txVolume)); ui->txChannels->setCurrentIndex((int)m_settings.m_txIQMapping); ui->fcPosRx->setCurrentIndex(m_settings.m_fcPosRx); @@ -753,6 +767,7 @@ void AudioCATSISOGUI::makeUIConnections() QObject::connect(ui->dcBlock, &ButtonSwitch::toggled, this, &AudioCATSISOGUI::on_dcBlock_toggled); QObject::connect(ui->iqCorrection, &ButtonSwitch::toggled, this, &AudioCATSISOGUI::on_iqCorrection_toggled); QObject::connect(ui->txEnable, &ButtonSwitch::toggled, this, &AudioCATSISOGUI::on_txEnable_toggled); + QObject::connect(ui->pttSpectrumLink, &ButtonSwitch::toggled, this, &AudioCATSISOGUI::on_pttSpectrumLinkToggled); QObject::connect(ui->transverter, &TransverterButton::clicked, this, &AudioCATSISOGUI::on_transverter_clicked); QObject::connect(ui->rxDeviceSelect, &QPushButton::clicked, this, &AudioCATSISOGUI::on_rxDeviceSelect_clicked); QObject::connect(ui->txDeviceSelect, &QPushButton::clicked, this, &AudioCATSISOGUI::on_txDeviceSelect_clicked); diff --git a/plugins/samplemimo/audiocatsiso/audiocatsisogui.h b/plugins/samplemimo/audiocatsiso/audiocatsisogui.h index f210dbdb7..9f94c454a 100644 --- a/plugins/samplemimo/audiocatsiso/audiocatsisogui.h +++ b/plugins/samplemimo/audiocatsiso/audiocatsisogui.h @@ -90,6 +90,7 @@ private slots: void on_streamLock_toggled(bool checked); void on_startStop_toggled(bool checked); void on_ptt_toggled(bool checked); + void on_pttSpectrumLinkToggled(bool checked); void on_catConnect_toggled(bool checked); void on_centerFrequency_changed(quint64 value); void on_log2Decim_currentIndexChanged(int index); diff --git a/plugins/samplemimo/audiocatsiso/audiocatsisogui.ui b/plugins/samplemimo/audiocatsiso/audiocatsisogui.ui index f20ab2967..6c0d9dc58 100644 --- a/plugins/samplemimo/audiocatsiso/audiocatsisogui.ui +++ b/plugins/samplemimo/audiocatsiso/audiocatsisogui.ui @@ -180,6 +180,26 @@ + + + + + 24 + 24 + + + + Toggles PTT switches spectrum view + + + + + + + :/link.png:/link.png + + + diff --git a/plugins/samplemimo/audiocatsiso/audiocatsisosettings.cpp b/plugins/samplemimo/audiocatsiso/audiocatsisosettings.cpp index 80638ba9d..725f2ccb8 100644 --- a/plugins/samplemimo/audiocatsiso/audiocatsisosettings.cpp +++ b/plugins/samplemimo/audiocatsiso/audiocatsisosettings.cpp @@ -69,6 +69,8 @@ AudioCATSISOSettings::AudioCATSISOSettings() void AudioCATSISOSettings::resetToDefaults() { + m_txEnable = false; + m_pttSpectrumLink = true; m_rxCenterFrequency = 14200000; m_txCenterFrequency = 14200000; m_rxDeviceName = ""; @@ -100,6 +102,8 @@ void AudioCATSISOSettings::resetToDefaults() AudioCATSISOSettings::AudioCATSISOSettings(const AudioCATSISOSettings& other) { + m_txEnable = other.m_txEnable; + m_pttSpectrumLink = other.m_pttSpectrumLink; m_rxCenterFrequency = other.m_rxCenterFrequency; m_txCenterFrequency = other.m_txCenterFrequency; m_rxDeviceName = other.m_rxDeviceName; @@ -112,7 +116,6 @@ AudioCATSISOSettings::AudioCATSISOSettings(const AudioCATSISOSettings& other) m_txDeviceName = other.m_txDeviceName; m_txVolume = other.m_txVolume; m_txIQMapping = other.m_txIQMapping; - m_txEnable = other.m_txEnable; m_catDevicePath = other.m_catDevicePath; m_hamlibModel = other.m_hamlibModel; m_catSpeedIndex = other.m_catSpeedIndex; @@ -162,6 +165,7 @@ QByteArray AudioCATSISOSettings::serialize() const s.writeString(52, m_reverseAPIAddress); s.writeU32(53, m_reverseAPIPort); s.writeU32(54, m_reverseAPIDeviceIndex); + s.writeBool(56, m_pttSpectrumLink); s.writeBool(57, m_txEnable); return s.final(); @@ -221,6 +225,7 @@ bool AudioCATSISOSettings::deserialize(const QByteArray& data) d.readU32(54, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readBool(56, &m_pttSpectrumLink, true); d.readBool(57, &m_txEnable, false); return true; @@ -275,6 +280,9 @@ void AudioCATSISOSettings::applySettings(const QStringList& settingsKeys, const if (settingsKeys.contains("txEnable")) { m_txEnable = settings.m_txEnable; } + if (settingsKeys.contains("pttSpectrumLink")) { + m_pttSpectrumLink = settings.m_pttSpectrumLink; + } if (settingsKeys.contains("catDevicePath")) { m_catDevicePath = settings.m_catDevicePath; } @@ -365,6 +373,9 @@ QString AudioCATSISOSettings::getDebugString(const QStringList& settingsKeys, bo if (settingsKeys.contains("txEnable") || force) { ostr << " m_txEnable: " << m_txEnable; } + if (settingsKeys.contains("pttSpectrumLink") || force) { + ostr << " m_pttSpectrumLink: " << m_pttSpectrumLink; + } if (settingsKeys.contains("catDevicePath") || force) { ostr << " m_catDevicePath: " << m_catDevicePath.toStdString(); } diff --git a/plugins/samplemimo/audiocatsiso/audiocatsisosettings.h b/plugins/samplemimo/audiocatsiso/audiocatsisosettings.h index 51ce54de2..632e4fc42 100644 --- a/plugins/samplemimo/audiocatsiso/audiocatsisosettings.h +++ b/plugins/samplemimo/audiocatsiso/audiocatsisosettings.h @@ -106,6 +106,7 @@ struct AudioCATSISOSettings { qint64 m_transverterDeltaFrequency; bool m_iqOrder; bool m_txEnable; + bool m_pttSpectrumLink; QString m_rxDeviceName; // Including realm, as from getFullDeviceName below IQMapping m_rxIQMapping; diff --git a/plugins/samplemimo/audiocatsiso/readme.md b/plugins/samplemimo/audiocatsiso/readme.md new file mode 100644 index 000000000..fbbb38c9a --- /dev/null +++ b/plugins/samplemimo/audiocatsiso/readme.md @@ -0,0 +1,38 @@ +

Audio CAT SISO plugin

+ +

Introduction

+ +This MIMO plugin gets its samples from an audio device on the Rx side and sends its samples to an audio device on the Tx side. It is single stream on both Rx and Tx therefore it has "SISO" in the name. In addition it allows CAT control of a radio device using Hamlib. CAT control is limited to frequency and PTT for radios that are transceivers. You can enable or disable the Tx side. It does not use VFO-A and VFO-B to manage split operation instead it holds one frequency for Rx and one for Tx and switches the current VFO to the appropriate value according to PTT status. It is specifically designed for radios with internal audio cards but you may also connect the audio I/O of a "traditional" radio to the line in and out of a soundcard. Not a lot of radios (if any) allow true I/Q modulation through their audio in interface therefore transmission will be limited to mono audio transfer with the radio in USB mode and have limited bandwidth only on the positive frequencies of the baseband (using the negative side just switches USB to LSB). + +

Interface

+ +The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + +![Audio output plugin GUI](../../../doc/img/AudioOutput_plugin.png) + +

1: Start/Stop

+ +Device start / stop button. Use this switch button to play or stop audio playback + +

2: Audio sample rate

+ +Audio sample rate in Hz (Sa/s) with multiplier indicator (k). + +

3: Select audio device

+ +Use this push button to open a dialog that lets you choose the audio playback device. See [audio management documentation](../../../sdrgui/audio.md) for details. + +

4: Audio device

+ +The name of the audio device in use. + +

5: Volume

+ +A control to set the output volume. This is not supported by all output audio devices. + +

6: Channel Map

+ +This controls how the left and right audio channels map on to the IQ channels. + +* 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. diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index 6e1bf2685..93594acfa 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -2474,6 +2474,10 @@ margin-bottom: 20px; "type" : "integer", "description" : "Enable or disable transmission\n * 0 - Disable transmission\n * 1 - Enable transmission\n" }, + "pttSpectrumLink" : { + "type" : "integer", + "description" : "Main spectrum display (Rx/Tx) follows PTT (GUI)\n * 0 - Disable PTT following\n * 1 - Enable PTT following\n" + }, "rxDeviceName" : { "type" : "string", "description" : "The name of the input audio device" @@ -2541,6 +2545,10 @@ margin-bottom: 20px; "type" : "integer", "description" : "CAT RTS control\n * 0 - low\n * 1 - high (default)\n" }, + "catPollingMs" : { + "type" : "integer", + "description" : "CAT frequency polling interval in milliseconds" + }, "useReverseAPI" : { "type" : "integer", "description" : "Synchronize with reverse API (1 for yes, 0 for no)" @@ -57798,7 +57806,7 @@ except ApiException as e:
- Generated 2023-06-12T01:13:22.125+02:00 + Generated 2023-06-16T17:40:24.489+02:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/AudioCATSISO.yaml b/sdrbase/resources/webapi/doc/swagger/include/AudioCATSISO.yaml index efb673028..adc2ca7b8 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/AudioCATSISO.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/AudioCATSISO.yaml @@ -24,6 +24,12 @@ AudioCATSISOSettings: Enable or disable transmission * 0 - Disable transmission * 1 - Enable transmission + pttSpectrumLink: + type: integer + description: > + Main spectrum display (Rx/Tx) follows PTT (GUI) + * 0 - Disable PTT following + * 1 - Enable PTT following rxDeviceName: description: The name of the input audio device type: string @@ -122,6 +128,9 @@ AudioCATSISOSettings: CAT RTS control * 0 - low * 1 - high (default) + catPollingMs: + type: integer + description: CAT frequency polling interval in milliseconds useReverseAPI: description: Synchronize with reverse API (1 for yes, 0 for no) type: integer diff --git a/swagger/sdrangel/api/swagger/include/AudioCATSISO.yaml b/swagger/sdrangel/api/swagger/include/AudioCATSISO.yaml index efb673028..adc2ca7b8 100644 --- a/swagger/sdrangel/api/swagger/include/AudioCATSISO.yaml +++ b/swagger/sdrangel/api/swagger/include/AudioCATSISO.yaml @@ -24,6 +24,12 @@ AudioCATSISOSettings: Enable or disable transmission * 0 - Disable transmission * 1 - Enable transmission + pttSpectrumLink: + type: integer + description: > + Main spectrum display (Rx/Tx) follows PTT (GUI) + * 0 - Disable PTT following + * 1 - Enable PTT following rxDeviceName: description: The name of the input audio device type: string @@ -122,6 +128,9 @@ AudioCATSISOSettings: CAT RTS control * 0 - low * 1 - high (default) + catPollingMs: + type: integer + description: CAT frequency polling interval in milliseconds 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 6e1bf2685..93594acfa 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -2474,6 +2474,10 @@ margin-bottom: 20px; "type" : "integer", "description" : "Enable or disable transmission\n * 0 - Disable transmission\n * 1 - Enable transmission\n" }, + "pttSpectrumLink" : { + "type" : "integer", + "description" : "Main spectrum display (Rx/Tx) follows PTT (GUI)\n * 0 - Disable PTT following\n * 1 - Enable PTT following\n" + }, "rxDeviceName" : { "type" : "string", "description" : "The name of the input audio device" @@ -2541,6 +2545,10 @@ margin-bottom: 20px; "type" : "integer", "description" : "CAT RTS control\n * 0 - low\n * 1 - high (default)\n" }, + "catPollingMs" : { + "type" : "integer", + "description" : "CAT frequency polling interval in milliseconds" + }, "useReverseAPI" : { "type" : "integer", "description" : "Synchronize with reverse API (1 for yes, 0 for no)" @@ -57798,7 +57806,7 @@ except ApiException as e:
- Generated 2023-06-12T01:13:22.125+02:00 + Generated 2023-06-16T17:40:24.489+02:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGAudioCATSISOSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGAudioCATSISOSettings.cpp index f023cfdba..24c1c6138 100644 --- a/swagger/sdrangel/code/qt5/client/SWGAudioCATSISOSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGAudioCATSISOSettings.cpp @@ -40,6 +40,8 @@ SWGAudioCATSISOSettings::SWGAudioCATSISOSettings() { m_iq_order_isSet = false; tx_enable = 0; m_tx_enable_isSet = false; + ptt_spectrum_link = 0; + m_ptt_spectrum_link_isSet = false; rx_device_name = nullptr; m_rx_device_name_isSet = false; rx_iq_mapping = 0; @@ -74,6 +76,8 @@ SWGAudioCATSISOSettings::SWGAudioCATSISOSettings() { m_cat_dtr_high_isSet = false; cat_rts_high = 0; m_cat_rts_high_isSet = false; + cat_polling_ms = 0; + m_cat_polling_ms_isSet = false; use_reverse_api = 0; m_use_reverse_api_isSet = false; reverse_api_address = nullptr; @@ -102,6 +106,8 @@ SWGAudioCATSISOSettings::init() { m_iq_order_isSet = false; tx_enable = 0; m_tx_enable_isSet = false; + ptt_spectrum_link = 0; + m_ptt_spectrum_link_isSet = false; rx_device_name = new QString(""); m_rx_device_name_isSet = false; rx_iq_mapping = 0; @@ -136,6 +142,8 @@ SWGAudioCATSISOSettings::init() { m_cat_dtr_high_isSet = false; cat_rts_high = 0; m_cat_rts_high_isSet = false; + cat_polling_ms = 0; + m_cat_polling_ms_isSet = false; use_reverse_api = 0; m_use_reverse_api_isSet = false; reverse_api_address = new QString(""); @@ -154,6 +162,7 @@ SWGAudioCATSISOSettings::cleanup() { + if(rx_device_name != nullptr) { delete rx_device_name; } @@ -176,6 +185,7 @@ SWGAudioCATSISOSettings::cleanup() { + if(reverse_api_address != nullptr) { delete reverse_api_address; } @@ -206,6 +216,8 @@ SWGAudioCATSISOSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&tx_enable, pJson["txEnable"], "qint32", ""); + ::SWGSDRangel::setValue(&ptt_spectrum_link, pJson["pttSpectrumLink"], "qint32", ""); + ::SWGSDRangel::setValue(&rx_device_name, pJson["rxDeviceName"], "QString", "QString"); ::SWGSDRangel::setValue(&rx_iq_mapping, pJson["rxIQMapping"], "qint32", ""); @@ -240,6 +252,8 @@ SWGAudioCATSISOSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&cat_rts_high, pJson["catRTSHigh"], "qint32", ""); + ::SWGSDRangel::setValue(&cat_polling_ms, pJson["catPollingMs"], "qint32", ""); + ::SWGSDRangel::setValue(&use_reverse_api, pJson["useReverseAPI"], "qint32", ""); ::SWGSDRangel::setValue(&reverse_api_address, pJson["reverseAPIAddress"], "QString", "QString"); @@ -282,6 +296,9 @@ SWGAudioCATSISOSettings::asJsonObject() { if(m_tx_enable_isSet){ obj->insert("txEnable", QJsonValue(tx_enable)); } + if(m_ptt_spectrum_link_isSet){ + obj->insert("pttSpectrumLink", QJsonValue(ptt_spectrum_link)); + } if(rx_device_name != nullptr && *rx_device_name != QString("")){ toJsonValue(QString("rxDeviceName"), rx_device_name, obj, QString("QString")); } @@ -333,6 +350,9 @@ SWGAudioCATSISOSettings::asJsonObject() { if(m_cat_rts_high_isSet){ obj->insert("catRTSHigh", QJsonValue(cat_rts_high)); } + if(m_cat_polling_ms_isSet){ + obj->insert("catPollingMs", QJsonValue(cat_polling_ms)); + } if(m_use_reverse_api_isSet){ obj->insert("useReverseAPI", QJsonValue(use_reverse_api)); } @@ -409,6 +429,16 @@ SWGAudioCATSISOSettings::setTxEnable(qint32 tx_enable) { this->m_tx_enable_isSet = true; } +qint32 +SWGAudioCATSISOSettings::getPttSpectrumLink() { + return ptt_spectrum_link; +} +void +SWGAudioCATSISOSettings::setPttSpectrumLink(qint32 ptt_spectrum_link) { + this->ptt_spectrum_link = ptt_spectrum_link; + this->m_ptt_spectrum_link_isSet = true; +} + QString* SWGAudioCATSISOSettings::getRxDeviceName() { return rx_device_name; @@ -579,6 +609,16 @@ SWGAudioCATSISOSettings::setCatRtsHigh(qint32 cat_rts_high) { this->m_cat_rts_high_isSet = true; } +qint32 +SWGAudioCATSISOSettings::getCatPollingMs() { + return cat_polling_ms; +} +void +SWGAudioCATSISOSettings::setCatPollingMs(qint32 cat_polling_ms) { + this->cat_polling_ms = cat_polling_ms; + this->m_cat_polling_ms_isSet = true; +} + qint32 SWGAudioCATSISOSettings::getUseReverseApi() { return use_reverse_api; @@ -642,6 +682,9 @@ SWGAudioCATSISOSettings::isSet(){ if(m_tx_enable_isSet){ isObjectUpdated = true; break; } + if(m_ptt_spectrum_link_isSet){ + isObjectUpdated = true; break; + } if(rx_device_name && *rx_device_name != QString("")){ isObjectUpdated = true; break; } @@ -693,6 +736,9 @@ SWGAudioCATSISOSettings::isSet(){ if(m_cat_rts_high_isSet){ isObjectUpdated = true; break; } + if(m_cat_polling_ms_isSet){ + isObjectUpdated = true; break; + } if(m_use_reverse_api_isSet){ isObjectUpdated = true; break; } diff --git a/swagger/sdrangel/code/qt5/client/SWGAudioCATSISOSettings.h b/swagger/sdrangel/code/qt5/client/SWGAudioCATSISOSettings.h index ac57b26b7..8cf8ca60d 100644 --- a/swagger/sdrangel/code/qt5/client/SWGAudioCATSISOSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGAudioCATSISOSettings.h @@ -60,6 +60,9 @@ public: qint32 getTxEnable(); void setTxEnable(qint32 tx_enable); + qint32 getPttSpectrumLink(); + void setPttSpectrumLink(qint32 ptt_spectrum_link); + QString* getRxDeviceName(); void setRxDeviceName(QString* rx_device_name); @@ -111,6 +114,9 @@ public: qint32 getCatRtsHigh(); void setCatRtsHigh(qint32 cat_rts_high); + qint32 getCatPollingMs(); + void setCatPollingMs(qint32 cat_polling_ms); + qint32 getUseReverseApi(); void setUseReverseApi(qint32 use_reverse_api); @@ -145,6 +151,9 @@ private: qint32 tx_enable; bool m_tx_enable_isSet; + qint32 ptt_spectrum_link; + bool m_ptt_spectrum_link_isSet; + QString* rx_device_name; bool m_rx_device_name_isSet; @@ -196,6 +205,9 @@ private: qint32 cat_rts_high; bool m_cat_rts_high_isSet; + qint32 cat_polling_ms; + bool m_cat_polling_ms_isSet; + qint32 use_reverse_api; bool m_use_reverse_api_isSet;