1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-05-24 03:02:29 -04:00

SDRPlayV3: implemented transverter feature. Updated documentation

This commit is contained in:
f4exb 2022-02-06 20:30:00 +01:00
parent 7880a523a7
commit 57a5551401
17 changed files with 395 additions and 32 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

View File

@ -40,35 +40,39 @@ Selects which tuner is used for input. For RSPduo this can be 1 or 2. Other RSP
Selects which antenna port is used. The antenna ports available depend upon the RSP device and tuner selected. Selects which antenna port is used. The antenna ports available depend upon the RSP device and tuner selected.
<h3>7: DC offset correction</h3> <h3>7. Transverter mode open dialog</h3>
This button opens a dialog to set the transverter mode frequency translation options. The details about this dialog can be found [here](../../../sdrgui/gui/transverterdialog.md)
<h3>8: DC offset correction</h3>
Check this button to enable DC offset correction. Check this button to enable DC offset correction.
<h3>8: IQ imbalance correction</h3> <h3>9: IQ imbalance correction</h3>
Check this button to enable IQ imbalance correction. Check this button to enable IQ imbalance correction.
<h3>9: External reference clock output</h3> <h3>10: External reference clock output</h3>
Enable reference clock output. This is only available for RSP2 and DSPduo. Enable reference clock output. This is only available for RSP2 and DSPduo.
<h3>10: Bias tee</h3> <h3>11: Bias tee</h3>
Enable bias tee. This is only available for RSP1A, RSP2, RSPduo tuner 2 and RSPdx. Enable bias tee. This is only available for RSP1A, RSP2, RSPduo tuner 2 and RSPdx.
<h3>11: AM notch filter</h3> <h3>12: AM notch filter</h3>
Enable AM notch filter. This is only available for RSPduo tuner 1. Enable AM notch filter. This is only available for RSPduo tuner 1.
<h3>12: MW/FM notch filter</h3> <h3>13: MW/FM notch filter</h3>
Enable MW/FM notch filter. This is only available for RSP1A, RSP2, RSPduo and RSPdx. Enable MW/FM notch filter. This is only available for RSP1A, RSP2, RSPduo and RSPdx.
<h3>13: DAB notch filter</h3> <h3>14: DAB notch filter</h3>
Enable DAB notch filter. This is only available for RSP1A, RSPduo and RSPdx. Enable DAB notch filter. This is only available for RSP1A, RSPduo and RSPdx.
<h3>14: IF bandwidth</h3> <h3>15: IF bandwidth</h3>
This selects the IF filter bandwidth. The following bandwidths are available: This selects the IF filter bandwidth. The following bandwidths are available:
@ -81,31 +85,49 @@ This selects the IF filter bandwidth. The following bandwidths are available:
- 7000 kHz - 7000 kHz
- 8000 kHz - 8000 kHz
<h3>15: IF frequency</h3> <h3>16: IF frequency</h3>
Warning there is no good support of non zero IF. **It is advised to keep zero IF for normal use**. Warning there is no good support of non zero IF. **It is advised to keep zero IF for normal use**.
Some tricks are provided for expert use of non-zero IFs. You may want to start from these settings to experiment more with it.
This selects the IF frequency between these values: This selects the IF frequency between these values:
- **0 for zero IF** - **0 for zero IF**
- 450 kHz. Some practical tricks that may or may not work: - 450 kHz.
- Frequency is shifted by -450 kHZ. - Move center frequency by -450 kHZ (3).
- Do not set center frequency lower than 450 kHz down the target frequency - Direct frequency reading is -450 kHz off from real Rx frequency.
- Use at least 1536 kHz bandwidth (14) - You may use the transverter mode (7) with a shift of +450 kHz to correct the frequency reading
- After sample rate change (16) you may need to start/stop device to get thins right. - If you already use the transverter mode for transverter work just add 450 kHz to the current shift
- Use decimation > 1 (17) with Inf position (18) - Use 1536 kHz bandwidth (15)
- 1620 kHz: do not use - After sample rate change (17) you may need to start/stop device to get things right.
- 2048 kHz: do not use - Use decimation > 1 (18) with Inf position (19)
- 1620 kHz:
- Move center frequency by -1620 kHz (3).
- Direct frequency reading is -1620 kHz off from real Rx frequency.
- You may use the transverter mode (7) with a shift of +1620 kHz to correct the frequency reading
- If you already use the transverter mode for transverter work just add 1620 kHz to the current shift
- Use 5000 kHz bandwidth (15)
- After sample rate change (17) you may need to start/stop device to get things right.
- Use decimation > 1 (18) with Inf position (19)
- 2048 kHz:
- Move center frequency by -2048 kHz (3).
- Direct frequency reading is -2048 kHz off from real Rx frequency.
- You may use the transverter mode (7) with a shift of +2048 kHz to correct the frequency reading
- If you already use the transverter mode for transverter work just add 2048 kHz to the current shift
- Use 5000 kHz bandwidth (15)
- After sample rate change (17) you may need to start/stop device to get things right.
- Use decimation > 1 (18) with Inf position (19)
<h3>16: Sample rate</h3> <h3>17: Sample rate</h3>
Sets the ADC IQ sample rats from 2M to 10.66M Hz. Sets the ADC IQ sample rats from 2M to 10.66M Hz.
<h3>17: Decimation</h3> <h3>18: Decimation</h3>
Decimation in powers of two from 1 (no decimation) to 64. Decimation in powers of two from 1 (no decimation) to 64.
<h3>18: Decimated bandpass center frequency position relative the SDRplay center frequency</h3> <h3>19: Decimated bandpass center frequency position relative the SDRplay center frequency</h3>
- **Cen**: the decimation operation takes place around the SDRplay center frequency Fs. - **Cen**: the decimation operation takes place around the SDRplay center frequency Fs.
- **Inf**: the decimation operation takes place around Fs - Fc. - **Inf**: the decimation operation takes place around Fs - Fc.
@ -116,14 +138,14 @@ With SR as the sample rate before decimation Fc is calculated as:
- if decimation n is 4 or lower: Fc = SR/2^(log2(n)-1). The device center frequency is on the side of the baseband. You need a RF filter bandwidth at least twice the baseband. - if decimation n is 4 or lower: Fc = SR/2^(log2(n)-1). The device center frequency is on the side of the baseband. You need a RF filter bandwidth at least twice the baseband.
- if decimation n is 8 or higher: Fc = SR/n. The device center frequency is half the baseband away from the side of the baseband. You need a RF filter bandwidth at least 3 times the baseband. - if decimation n is 8 or higher: Fc = SR/n. The device center frequency is half the baseband away from the side of the baseband. You need a RF filter bandwidth at least 3 times the baseband.
<h3>19. RF gain setting</h3> <h3>20. RF gain setting</h3>
Sets the LNA and mixer gain dB. The settings available depended upon the RSP device and frequency band. Sets the LNA and mixer gain dB. The settings available depended upon the RSP device and frequency band.
<h3>20. IF AGC</h3> <h3>21. IF AGC</h3>
Check this button to enable IF automatic gain control. Check this button to enable IF automatic gain control.
<h3>21. IF gain</h3> <h3>22. IF gain</h3>
Manual IF gain from 0 to -59 dB. Only enabled when IF AGC is disabled. Manual IF gain from 0 to -59 dB. Only enabled when IF AGC is disabled.

View File

@ -44,7 +44,7 @@ SDRPlayV3Gui::SDRPlayV3Gui(DeviceUISet *deviceUISet, QWidget* parent) :
ui->setupUi(this); ui->setupUi(this);
ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
ui->centerFrequency->setValueRange(7, 1U, 2000000U); updateFrequencyLimits();
ui->ifFrequency->clear(); ui->ifFrequency->clear();
for (unsigned int i = 0; i < SDRPlayV3IF::getNbIFs(); i++) for (unsigned int i = 0; i < SDRPlayV3IF::getNbIFs(); i++)
@ -218,8 +218,28 @@ void SDRPlayV3Gui::updateSampleRateAndFrequency()
ui->deviceRateText->setText(tr("%1k").arg((float)m_sampleRate / 1000)); ui->deviceRateText->setText(tr("%1k").arg((float)m_sampleRate / 1000));
} }
void SDRPlayV3Gui::updateFrequencyLimits()
{
// values in kHz
qint64 deltaFrequency = m_settings.m_transverterMode ? m_settings.m_transverterDeltaFrequency/1000 : 0;
qint64 minLimit = 1U + deltaFrequency;
qint64 maxLimit = 2000000U + deltaFrequency;
minLimit = minLimit < 0 ? 0 : minLimit > 9999999 ? 9999999 : minLimit;
maxLimit = maxLimit < 0 ? 0 : maxLimit > 9999999 ? 9999999 : maxLimit;
qDebug("SDRPlayV3Gui::updateFrequencyLimits: delta: %lld min: %lld max: %lld", deltaFrequency, minLimit, maxLimit);
ui->centerFrequency->setValueRange(7, minLimit, maxLimit);
}
void SDRPlayV3Gui::displaySettings() void SDRPlayV3Gui::displaySettings()
{ {
ui->transverter->setDeltaFrequency(m_settings.m_transverterDeltaFrequency);
ui->transverter->setDeltaFrequencyActive(m_settings.m_transverterMode);
ui->transverter->setIQOrder(m_settings.m_iqOrder);
updateFrequencyLimits();
ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000); ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000);
ui->ppm->setValue(m_settings.m_LOppmTenths); ui->ppm->setValue(m_settings.m_LOppmTenths);
@ -471,6 +491,17 @@ void SDRPlayV3Gui::on_startStop_toggled(bool checked)
} }
} }
void SDRPlayV3Gui::on_transverter_clicked()
{
m_settings.m_transverterMode = ui->transverter->getDeltaFrequencyAcive();
m_settings.m_transverterDeltaFrequency = ui->transverter->getDeltaFrequency();
m_settings.m_iqOrder = ui->transverter->getIQOrder();
qDebug("SDRPlayV3Gui::on_transverter_clicked: %lld Hz %s", m_settings.m_transverterDeltaFrequency, m_settings.m_transverterMode ? "on" : "off");
updateFrequencyLimits();
m_settings.m_centerFrequency = ui->centerFrequency->getValueNew()*1000;
sendSettings();
}
void SDRPlayV3Gui::openDeviceSettingsDialog(const QPoint& p) void SDRPlayV3Gui::openDeviceSettingsDialog(const QPoint& p)
{ {
BasicDeviceSettingsDialog dialog(this); BasicDeviceSettingsDialog dialog(this);

View File

@ -67,6 +67,7 @@ private:
void updateLNAValues(); void updateLNAValues();
void sendSettings(); void sendSettings();
void updateSampleRateAndFrequency(); void updateSampleRateAndFrequency();
void updateFrequencyLimits();
bool handleMessage(const Message& message); bool handleMessage(const Message& message);
private slots: private slots:
@ -93,6 +94,7 @@ private slots:
void on_gainIFAGC_toggled(bool checked); void on_gainIFAGC_toggled(bool checked);
void on_gainIF_valueChanged(int value); void on_gainIF_valueChanged(int value);
void on_startStop_toggled(bool checked); void on_startStop_toggled(bool checked);
void on_transverter_clicked();
void openDeviceSettingsDialog(const QPoint& p); void openDeviceSettingsDialog(const QPoint& p);
}; };

View File

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>317</width> <width>409</width>
<height>260</height> <height>260</height>
</rect> </rect>
</property> </property>
@ -278,6 +278,25 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item>
<widget class="TransverterButton" name="transverter">
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="toolTip">
<string>Transverter frequency translation dialog</string>
</property>
<property name="text">
<string>X</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -791,6 +810,11 @@
<header>gui/valuedial.h</header> <header>gui/valuedial.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget>
<class>TransverterButton</class>
<extends>QPushButton</extends>
<header>gui/transverterbutton.h</header>
</customwidget>
</customwidgets> </customwidgets>
<resources> <resources>
<include location="../../../sdrgui/resources/res.qrc"/> <include location="../../../sdrgui/resources/res.qrc"/>

View File

@ -429,20 +429,37 @@ bool SDRPlayV3Input::applySettings(const SDRPlayV3Settings& settings, bool forwa
if ((m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force) { if ((m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force) {
reverseAPIKeys.append("LOppmTenths"); reverseAPIKeys.append("LOppmTenths");
} }
if ((m_settings.m_transverterMode != settings.m_transverterMode) || force) {
reverseAPIKeys.append("transverterMode");
}
if ((m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) || force) {
reverseAPIKeys.append("transverterDeltaFrequency");
}
if ((m_settings.m_iqOrder != settings.m_iqOrder) || force)
{
reverseAPIKeys.append("iqOrder");
if (m_sdrPlayThread) {
m_sdrPlayThread->setIQOrder(settings.m_iqOrder);
}
}
if ((m_settings.m_centerFrequency != settings.m_centerFrequency) if ((m_settings.m_centerFrequency != settings.m_centerFrequency)
|| (m_settings.m_LOppmTenths != settings.m_LOppmTenths) || (m_settings.m_LOppmTenths != settings.m_LOppmTenths)
|| (m_settings.m_fcPos != settings.m_fcPos) || (m_settings.m_fcPos != settings.m_fcPos)
|| (m_settings.m_log2Decim != settings.m_log2Decim) || force) || (m_settings.m_log2Decim != settings.m_log2Decim)
|| (m_settings.m_transverterMode != settings.m_transverterMode)
|| (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) || force)
{ {
qint64 deviceCenterFrequency = DeviceSampleSource::calculateDeviceCenterFrequency( qint64 deviceCenterFrequency = DeviceSampleSource::calculateDeviceCenterFrequency(
settings.m_centerFrequency, settings.m_centerFrequency,
0, settings.m_transverterDeltaFrequency,
settings.m_log2Decim, settings.m_log2Decim,
(DeviceSampleSource::fcPos_t) settings.m_fcPos, (DeviceSampleSource::fcPos_t) settings.m_fcPos,
settings.m_devSampleRate, settings.m_devSampleRate,
DeviceSampleSource::FrequencyShiftScheme::FSHIFT_STD, DeviceSampleSource::FrequencyShiftScheme::FSHIFT_STD,
false); settings.m_transverterMode);
forwardChange = true; forwardChange = true;
@ -862,6 +879,15 @@ void SDRPlayV3Input::webapiUpdateDeviceSettings(
if (deviceSettingsKeys.contains("antenna")) { if (deviceSettingsKeys.contains("antenna")) {
settings.m_antenna = response.getSdrPlayV3Settings()->getAntenna(); settings.m_antenna = response.getSdrPlayV3Settings()->getAntenna();
} }
if (deviceSettingsKeys.contains("transverterDeltaFrequency")) {
settings.m_transverterDeltaFrequency = response.getSdrPlayV3Settings()->getTransverterDeltaFrequency();
}
if (deviceSettingsKeys.contains("transverterMode")) {
settings.m_transverterMode = response.getSdrPlayV3Settings()->getTransverterMode() != 0;
}
if (deviceSettingsKeys.contains("iqOrder")) {
settings.m_iqOrder = response.getSdrPlayV3Settings()->getIqOrder() != 0;
}
if (deviceSettingsKeys.contains("useReverseAPI")) { if (deviceSettingsKeys.contains("useReverseAPI")) {
settings.m_useReverseAPI = response.getSdrPlayV3Settings()->getUseReverseApi() != 0; settings.m_useReverseAPI = response.getSdrPlayV3Settings()->getUseReverseApi() != 0;
} }
@ -896,6 +922,9 @@ void SDRPlayV3Input::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings&
response.getSdrPlayV3Settings()->setExtRef(settings.m_extRef); response.getSdrPlayV3Settings()->setExtRef(settings.m_extRef);
response.getSdrPlayV3Settings()->setTuner(settings.m_tuner); response.getSdrPlayV3Settings()->setTuner(settings.m_tuner);
response.getSdrPlayV3Settings()->setAntenna(settings.m_antenna); response.getSdrPlayV3Settings()->setAntenna(settings.m_antenna);
response.getSdrPlayV3Settings()->setTransverterDeltaFrequency(settings.m_transverterDeltaFrequency);
response.getSdrPlayV3Settings()->setTransverterMode(settings.m_transverterMode ? 1 : 0);
response.getSdrPlayV3Settings()->setIqOrder(settings.m_iqOrder ? 1 : 0);
response.getSdrPlayV3Settings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0); response.getSdrPlayV3Settings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
@ -1026,6 +1055,15 @@ void SDRPlayV3Input::webapiReverseSendSettings(QList<QString>& deviceSettingsKey
if (deviceSettingsKeys.contains("antenna") || force) { if (deviceSettingsKeys.contains("antenna") || force) {
swgSDRPlayV3Settings->setAntenna(settings.m_antenna); swgSDRPlayV3Settings->setAntenna(settings.m_antenna);
} }
if (deviceSettingsKeys.contains("transverterDeltaFrequency") || force) {
swgSDRPlayV3Settings->setTransverterDeltaFrequency(settings.m_transverterDeltaFrequency);
}
if (deviceSettingsKeys.contains("transverterMode") || force) {
swgSDRPlayV3Settings->setTransverterMode(settings.m_transverterMode ? 1 : 0);
}
if (deviceSettingsKeys.contains("iqOrder") || force) {
swgSDRPlayV3Settings->setIqOrder(settings.m_iqOrder ? 1 : 0);
}
QString deviceSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/device/settings") QString deviceSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/device/settings")
.arg(settings.m_reverseAPIAddress) .arg(settings.m_reverseAPIAddress)

View File

@ -47,6 +47,9 @@ void SDRPlayV3Settings::resetToDefaults()
m_tuner = 0; m_tuner = 0;
m_antenna = 0; m_antenna = 0;
m_extRef = false; m_extRef = false;
m_transverterMode = false;
m_iqOrder = true;
m_transverterDeltaFrequency = 0;
m_useReverseAPI = false; m_useReverseAPI = false;
m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIAddress = "127.0.0.1";
m_reverseAPIPort = 8888; m_reverseAPIPort = 8888;
@ -79,6 +82,10 @@ QByteArray SDRPlayV3Settings::serialize() const
s.writeS32(23, m_tuner); s.writeS32(23, m_tuner);
s.writeS32(24, m_antenna); s.writeS32(24, m_antenna);
s.writeBool(25, m_extRef); s.writeBool(25, m_extRef);
s.writeBool(26, m_transverterMode);
s.writeS64(27, m_transverterDeltaFrequency);
s.writeBool(28, m_iqOrder);
return s.final(); return s.final();
} }
@ -128,6 +135,9 @@ bool SDRPlayV3Settings::deserialize(const QByteArray& data)
d.readS32(23, &m_tuner, 0); d.readS32(23, &m_tuner, 0);
d.readS32(24, &m_antenna, 0); d.readS32(24, &m_antenna, 0);
d.readBool(25, &m_extRef, false); d.readBool(25, &m_extRef, false);
d.readBool(26, &m_transverterMode, false);
d.readS64(27, &m_transverterDeltaFrequency, 0);
d.readBool(28, &m_iqOrder, true);
return true; return true;
} }

View File

@ -50,6 +50,9 @@ struct SDRPlayV3Settings {
int m_tuner; int m_tuner;
int m_antenna; int m_antenna;
bool m_extRef; bool m_extRef;
bool m_transverterMode;
bool m_iqOrder;
qint64 m_transverterDeltaFrequency;
bool m_useReverseAPI; bool m_useReverseAPI;
QString m_reverseAPIAddress; QString m_reverseAPIAddress;
uint16_t m_reverseAPIPort; uint16_t m_reverseAPIPort;

View File

@ -33,7 +33,8 @@ SDRPlayV3Thread::SDRPlayV3Thread(sdrplay_api_DeviceT* dev, SampleSinkFifo* sampl
m_sampleFifo(sampleFifo), m_sampleFifo(sampleFifo),
m_samplerate(2000000), m_samplerate(2000000),
m_log2Decim(0), m_log2Decim(0),
m_fcPos(0) m_fcPos(0),
m_iqOrder(true)
{ {
} }
@ -149,7 +150,11 @@ void SDRPlayV3Thread::callbackHelper(short *xi, short *xq, sdrplay_api_StreamCbP
iq[i*2+1] = xq[i]; iq[i*2+1] = xq[i];
} }
thread->callbackIQ(iq, numSamples*2); if (thread->m_iqOrder) {
thread->callbackIQ(iq, numSamples*2);
} else {
thread->callbackQI(iq, numSamples*2);
}
} }
} }
@ -245,3 +250,96 @@ void SDRPlayV3Thread::callbackIQ(const qint16* buf, qint32 len)
m_sampleFifo->write(m_convertBuffer.begin(), it); m_sampleFifo->write(m_convertBuffer.begin(), it);
} }
void SDRPlayV3Thread::callbackQI(const qint16* buf, qint32 len)
{
SampleVector::iterator it = m_convertBuffer.begin();
if (m_log2Decim == 0)
{
m_decimatorsQI.decimate1(&it, buf, len);
}
else
{
if (m_fcPos == 0) // Infradyne
{
switch (m_log2Decim)
{
case 1:
m_decimatorsQI.decimate2_inf(&it, buf, len);
break;
case 2:
m_decimatorsQI.decimate4_inf(&it, buf, len);
break;
case 3:
m_decimatorsQI.decimate8_inf(&it, buf, len);
break;
case 4:
m_decimatorsQI.decimate16_inf(&it, buf, len);
break;
case 5:
m_decimatorsQI.decimate32_inf(&it, buf, len);
break;
case 6:
m_decimatorsQI.decimate64_inf(&it, buf, len);
break;
default:
break;
}
}
else if (m_fcPos == 1) // Supradyne
{
switch (m_log2Decim)
{
case 1:
m_decimatorsQI.decimate2_sup(&it, buf, len);
break;
case 2:
m_decimatorsQI.decimate4_sup(&it, buf, len);
break;
case 3:
m_decimatorsQI.decimate8_sup(&it, buf, len);
break;
case 4:
m_decimatorsQI.decimate16_sup(&it, buf, len);
break;
case 5:
m_decimatorsQI.decimate32_sup(&it, buf, len);
break;
case 6:
m_decimatorsQI.decimate64_sup(&it, buf, len);
break;
default:
break;
}
}
else // Centered
{
switch (m_log2Decim)
{
case 1:
m_decimatorsQI.decimate2_cen(&it, buf, len);
break;
case 2:
m_decimatorsQI.decimate4_cen(&it, buf, len);
break;
case 3:
m_decimatorsQI.decimate8_cen(&it, buf, len);
break;
case 4:
m_decimatorsQI.decimate16_cen(&it, buf, len);
break;
case 5:
m_decimatorsQI.decimate32_cen(&it, buf, len);
break;
case 6:
m_decimatorsQI.decimate64_cen(&it, buf, len);
break;
default:
break;
}
}
}
m_sampleFifo->write(m_convertBuffer.begin(), it);
}

View File

@ -41,6 +41,7 @@ public:
void setSamplerate(int samplerate); void setSamplerate(int samplerate);
void setLog2Decimation(unsigned int log2_decim); void setLog2Decimation(unsigned int log2_decim);
void setFcPos(int fcPos); void setFcPos(int fcPos);
void setIQOrder(bool iqOrder) { m_iqOrder = iqOrder; }
void resetRfChanged(); void resetRfChanged();
bool waitForRfChanged(); bool waitForRfChanged();
@ -57,14 +58,17 @@ private:
int m_samplerate; int m_samplerate;
unsigned int m_log2Decim; unsigned int m_log2Decim;
int m_fcPos; int m_fcPos;
bool m_iqOrder;
int m_rfChanged; int m_rfChanged;
static const unsigned int m_rfChangedTimeout = 500; static const unsigned int m_rfChangedTimeout = 500;
Decimators<qint32, qint16, SDR_RX_SAMP_SZ, 16, true> m_decimatorsIQ; Decimators<qint32, qint16, SDR_RX_SAMP_SZ, 16, true> m_decimatorsIQ;
Decimators<qint32, qint16, SDR_RX_SAMP_SZ, 16, false> m_decimatorsQI;
void run(); void run();
void callbackIQ(const qint16* buf, qint32 len); void callbackIQ(const qint16* buf, qint32 len);
void callbackQI(const qint16* buf, qint32 len);
static void callbackHelper(short *xi, short *xq, sdrplay_api_StreamCbParamsT *params, unsigned int numSamples, unsigned int reset, void *ctx); static void callbackHelper(short *xi, short *xq, sdrplay_api_StreamCbParamsT *params, unsigned int numSamples, unsigned int reset, void *ctx);
static void eventCallback(sdrplay_api_EventT eventId, sdrplay_api_TunerSelectT tuner, sdrplay_api_EventParamsT *params, void *cbContext); static void eventCallback(sdrplay_api_EventT eventId, sdrplay_api_TunerSelectT tuner, sdrplay_api_EventParamsT *params, void *cbContext);

View File

@ -10880,6 +10880,17 @@ margin-bottom: 20px;
"antenna" : { "antenna" : {
"type" : "integer" "type" : "integer"
}, },
"transverterMode" : {
"type" : "integer"
},
"transverterDeltaFrequency" : {
"type" : "integer",
"format" : "int64"
},
"iqOrder" : {
"type" : "integer",
"description" : "IQ samples order\n * 0 - Q then I (swapped)\n * 1 - I then Q (straight)\n"
},
"useReverseAPI" : { "useReverseAPI" : {
"type" : "integer", "type" : "integer",
"description" : "Synchronize with reverse API (1 for yes, 0 for no)" "description" : "Synchronize with reverse API (1 for yes, 0 for no)"
@ -52269,7 +52280,7 @@ except ApiException as e:
</div> </div>
<div id="generator"> <div id="generator">
<div class="content"> <div class="content">
Generated 2022-02-06T00:22:44.703+01:00 Generated 2022-02-06T20:14:33.369+01:00
</div> </div>
</div> </div>
</div> </div>

View File

@ -38,6 +38,17 @@ SDRPlayV3Settings:
type: integer type: integer
antenna: antenna:
type: integer type: integer
transverterMode:
type: integer
transverterDeltaFrequency:
type: integer
format: int64
iqOrder:
type: integer
description: >
IQ samples order
* 0 - Q then I (swapped)
* 1 - I then Q (straight)
useReverseAPI: useReverseAPI:
description: Synchronize with reverse API (1 for yes, 0 for no) description: Synchronize with reverse API (1 for yes, 0 for no)
type: integer type: integer

View File

@ -38,6 +38,17 @@ SDRPlayV3Settings:
type: integer type: integer
antenna: antenna:
type: integer type: integer
transverterMode:
type: integer
transverterDeltaFrequency:
type: integer
format: int64
iqOrder:
type: integer
description: >
IQ samples order
* 0 - Q then I (swapped)
* 1 - I then Q (straight)
useReverseAPI: useReverseAPI:
description: Synchronize with reverse API (1 for yes, 0 for no) description: Synchronize with reverse API (1 for yes, 0 for no)
type: integer type: integer

View File

@ -10880,6 +10880,17 @@ margin-bottom: 20px;
"antenna" : { "antenna" : {
"type" : "integer" "type" : "integer"
}, },
"transverterMode" : {
"type" : "integer"
},
"transverterDeltaFrequency" : {
"type" : "integer",
"format" : "int64"
},
"iqOrder" : {
"type" : "integer",
"description" : "IQ samples order\n * 0 - Q then I (swapped)\n * 1 - I then Q (straight)\n"
},
"useReverseAPI" : { "useReverseAPI" : {
"type" : "integer", "type" : "integer",
"description" : "Synchronize with reverse API (1 for yes, 0 for no)" "description" : "Synchronize with reverse API (1 for yes, 0 for no)"
@ -52269,7 +52280,7 @@ except ApiException as e:
</div> </div>
<div id="generator"> <div id="generator">
<div class="content"> <div class="content">
Generated 2022-02-06T00:22:44.703+01:00 Generated 2022-02-06T20:14:33.369+01:00
</div> </div>
</div> </div>
</div> </div>

View File

@ -64,6 +64,12 @@ SWGSDRPlayV3Settings::SWGSDRPlayV3Settings() {
m_tuner_isSet = false; m_tuner_isSet = false;
antenna = 0; antenna = 0;
m_antenna_isSet = false; m_antenna_isSet = false;
transverter_mode = 0;
m_transverter_mode_isSet = false;
transverter_delta_frequency = 0L;
m_transverter_delta_frequency_isSet = false;
iq_order = 0;
m_iq_order_isSet = false;
use_reverse_api = 0; use_reverse_api = 0;
m_use_reverse_api_isSet = false; m_use_reverse_api_isSet = false;
reverse_api_address = nullptr; reverse_api_address = nullptr;
@ -116,6 +122,12 @@ SWGSDRPlayV3Settings::init() {
m_tuner_isSet = false; m_tuner_isSet = false;
antenna = 0; antenna = 0;
m_antenna_isSet = false; m_antenna_isSet = false;
transverter_mode = 0;
m_transverter_mode_isSet = false;
transverter_delta_frequency = 0L;
m_transverter_delta_frequency_isSet = false;
iq_order = 0;
m_iq_order_isSet = false;
use_reverse_api = 0; use_reverse_api = 0;
m_use_reverse_api_isSet = false; m_use_reverse_api_isSet = false;
reverse_api_address = new QString(""); reverse_api_address = new QString("");
@ -145,6 +157,9 @@ SWGSDRPlayV3Settings::cleanup() {
if(reverse_api_address != nullptr) { if(reverse_api_address != nullptr) {
@ -201,6 +216,12 @@ SWGSDRPlayV3Settings::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&antenna, pJson["antenna"], "qint32", ""); ::SWGSDRangel::setValue(&antenna, pJson["antenna"], "qint32", "");
::SWGSDRangel::setValue(&transverter_mode, pJson["transverterMode"], "qint32", "");
::SWGSDRangel::setValue(&transverter_delta_frequency, pJson["transverterDeltaFrequency"], "qint64", "");
::SWGSDRangel::setValue(&iq_order, pJson["iqOrder"], "qint32", "");
::SWGSDRangel::setValue(&use_reverse_api, pJson["useReverseAPI"], "qint32", ""); ::SWGSDRangel::setValue(&use_reverse_api, pJson["useReverseAPI"], "qint32", "");
::SWGSDRangel::setValue(&reverse_api_address, pJson["reverseAPIAddress"], "QString", "QString"); ::SWGSDRangel::setValue(&reverse_api_address, pJson["reverseAPIAddress"], "QString", "QString");
@ -279,6 +300,15 @@ SWGSDRPlayV3Settings::asJsonObject() {
if(m_antenna_isSet){ if(m_antenna_isSet){
obj->insert("antenna", QJsonValue(antenna)); obj->insert("antenna", QJsonValue(antenna));
} }
if(m_transverter_mode_isSet){
obj->insert("transverterMode", QJsonValue(transverter_mode));
}
if(m_transverter_delta_frequency_isSet){
obj->insert("transverterDeltaFrequency", QJsonValue(transverter_delta_frequency));
}
if(m_iq_order_isSet){
obj->insert("iqOrder", QJsonValue(iq_order));
}
if(m_use_reverse_api_isSet){ if(m_use_reverse_api_isSet){
obj->insert("useReverseAPI", QJsonValue(use_reverse_api)); obj->insert("useReverseAPI", QJsonValue(use_reverse_api));
} }
@ -475,6 +505,36 @@ SWGSDRPlayV3Settings::setAntenna(qint32 antenna) {
this->m_antenna_isSet = true; this->m_antenna_isSet = true;
} }
qint32
SWGSDRPlayV3Settings::getTransverterMode() {
return transverter_mode;
}
void
SWGSDRPlayV3Settings::setTransverterMode(qint32 transverter_mode) {
this->transverter_mode = transverter_mode;
this->m_transverter_mode_isSet = true;
}
qint64
SWGSDRPlayV3Settings::getTransverterDeltaFrequency() {
return transverter_delta_frequency;
}
void
SWGSDRPlayV3Settings::setTransverterDeltaFrequency(qint64 transverter_delta_frequency) {
this->transverter_delta_frequency = transverter_delta_frequency;
this->m_transverter_delta_frequency_isSet = true;
}
qint32
SWGSDRPlayV3Settings::getIqOrder() {
return iq_order;
}
void
SWGSDRPlayV3Settings::setIqOrder(qint32 iq_order) {
this->iq_order = iq_order;
this->m_iq_order_isSet = true;
}
qint32 qint32
SWGSDRPlayV3Settings::getUseReverseApi() { SWGSDRPlayV3Settings::getUseReverseApi() {
return use_reverse_api; return use_reverse_api;
@ -574,6 +634,15 @@ SWGSDRPlayV3Settings::isSet(){
if(m_antenna_isSet){ if(m_antenna_isSet){
isObjectUpdated = true; break; isObjectUpdated = true; break;
} }
if(m_transverter_mode_isSet){
isObjectUpdated = true; break;
}
if(m_transverter_delta_frequency_isSet){
isObjectUpdated = true; break;
}
if(m_iq_order_isSet){
isObjectUpdated = true; break;
}
if(m_use_reverse_api_isSet){ if(m_use_reverse_api_isSet){
isObjectUpdated = true; break; isObjectUpdated = true; break;
} }

View File

@ -96,6 +96,15 @@ public:
qint32 getAntenna(); qint32 getAntenna();
void setAntenna(qint32 antenna); void setAntenna(qint32 antenna);
qint32 getTransverterMode();
void setTransverterMode(qint32 transverter_mode);
qint64 getTransverterDeltaFrequency();
void setTransverterDeltaFrequency(qint64 transverter_delta_frequency);
qint32 getIqOrder();
void setIqOrder(qint32 iq_order);
qint32 getUseReverseApi(); qint32 getUseReverseApi();
void setUseReverseApi(qint32 use_reverse_api); void setUseReverseApi(qint32 use_reverse_api);
@ -166,6 +175,15 @@ private:
qint32 antenna; qint32 antenna;
bool m_antenna_isSet; bool m_antenna_isSet;
qint32 transverter_mode;
bool m_transverter_mode_isSet;
qint64 transverter_delta_frequency;
bool m_transverter_delta_frequency_isSet;
qint32 iq_order;
bool m_iq_order_isSet;
qint32 use_reverse_api; qint32 use_reverse_api;
bool m_use_reverse_api_isSet; bool m_use_reverse_api_isSet;