mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-25 01:18:38 -05:00
SDRPlayV3: implemented transverter feature. Updated documentation
This commit is contained in:
parent
7880a523a7
commit
57a5551401
Binary file not shown.
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 47 KiB |
BIN
doc/img/SDRPlayV3_plugin.xcf
Normal file
BIN
doc/img/SDRPlayV3_plugin.xcf
Normal file
Binary file not shown.
@ -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.
|
||||
|
||||
<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.
|
||||
|
||||
<h3>8: IQ imbalance correction</h3>
|
||||
<h3>9: IQ imbalance correction</h3>
|
||||
|
||||
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.
|
||||
|
||||
<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.
|
||||
|
||||
<h3>11: AM notch filter</h3>
|
||||
<h3>12: AM notch filter</h3>
|
||||
|
||||
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.
|
||||
|
||||
<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.
|
||||
|
||||
<h3>14: IF bandwidth</h3>
|
||||
<h3>15: IF bandwidth</h3>
|
||||
|
||||
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
|
||||
- 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**.
|
||||
|
||||
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:
|
||||
|
||||
- **0 for zero IF**
|
||||
- 450 kHz. Some practical tricks that may or may not work:
|
||||
- Frequency is shifted by -450 kHZ.
|
||||
- Do not set center frequency lower than 450 kHz down the target frequency
|
||||
- Use at least 1536 kHz bandwidth (14)
|
||||
- After sample rate change (16) you may need to start/stop device to get thins right.
|
||||
- Use decimation > 1 (17) with Inf position (18)
|
||||
- 1620 kHz: do not use
|
||||
- 2048 kHz: do not use
|
||||
- 450 kHz.
|
||||
- Move center frequency by -450 kHZ (3).
|
||||
- Direct frequency reading is -450 kHz off from real Rx frequency.
|
||||
- You may use the transverter mode (7) with a shift of +450 kHz to correct the frequency reading
|
||||
- If you already use the transverter mode for transverter work just add 450 kHz to the current shift
|
||||
- Use 1536 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)
|
||||
- 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.
|
||||
|
||||
<h3>17: Decimation</h3>
|
||||
<h3>18: Decimation</h3>
|
||||
|
||||
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.
|
||||
- **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 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.
|
||||
|
||||
<h3>20. IF AGC</h3>
|
||||
<h3>21. IF AGC</h3>
|
||||
|
||||
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.
|
||||
|
@ -44,7 +44,7 @@ SDRPlayV3Gui::SDRPlayV3Gui(DeviceUISet *deviceUISet, QWidget* parent) :
|
||||
|
||||
ui->setupUi(this);
|
||||
ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
|
||||
ui->centerFrequency->setValueRange(7, 1U, 2000000U);
|
||||
updateFrequencyLimits();
|
||||
|
||||
ui->ifFrequency->clear();
|
||||
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));
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
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->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)
|
||||
{
|
||||
BasicDeviceSettingsDialog dialog(this);
|
||||
|
@ -67,6 +67,7 @@ private:
|
||||
void updateLNAValues();
|
||||
void sendSettings();
|
||||
void updateSampleRateAndFrequency();
|
||||
void updateFrequencyLimits();
|
||||
bool handleMessage(const Message& message);
|
||||
|
||||
private slots:
|
||||
@ -93,6 +94,7 @@ private slots:
|
||||
void on_gainIFAGC_toggled(bool checked);
|
||||
void on_gainIF_valueChanged(int value);
|
||||
void on_startStop_toggled(bool checked);
|
||||
void on_transverter_clicked();
|
||||
void openDeviceSettingsDialog(const QPoint& p);
|
||||
};
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>317</width>
|
||||
<width>409</width>
|
||||
<height>260</height>
|
||||
</rect>
|
||||
</property>
|
||||
@ -278,6 +278,25 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</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>
|
||||
</item>
|
||||
<item>
|
||||
@ -791,6 +810,11 @@
|
||||
<header>gui/valuedial.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>TransverterButton</class>
|
||||
<extends>QPushButton</extends>
|
||||
<header>gui/transverterbutton.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="../../../sdrgui/resources/res.qrc"/>
|
||||
|
@ -429,20 +429,37 @@ bool SDRPlayV3Input::applySettings(const SDRPlayV3Settings& settings, bool forwa
|
||||
if ((m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force) {
|
||||
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)
|
||||
|| (m_settings.m_LOppmTenths != settings.m_LOppmTenths)
|
||||
|| (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(
|
||||
settings.m_centerFrequency,
|
||||
0,
|
||||
settings.m_transverterDeltaFrequency,
|
||||
settings.m_log2Decim,
|
||||
(DeviceSampleSource::fcPos_t) settings.m_fcPos,
|
||||
settings.m_devSampleRate,
|
||||
DeviceSampleSource::FrequencyShiftScheme::FSHIFT_STD,
|
||||
false);
|
||||
settings.m_transverterMode);
|
||||
|
||||
forwardChange = true;
|
||||
|
||||
@ -862,6 +879,15 @@ void SDRPlayV3Input::webapiUpdateDeviceSettings(
|
||||
if (deviceSettingsKeys.contains("antenna")) {
|
||||
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")) {
|
||||
settings.m_useReverseAPI = response.getSdrPlayV3Settings()->getUseReverseApi() != 0;
|
||||
}
|
||||
@ -896,6 +922,9 @@ void SDRPlayV3Input::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings&
|
||||
response.getSdrPlayV3Settings()->setExtRef(settings.m_extRef);
|
||||
response.getSdrPlayV3Settings()->setTuner(settings.m_tuner);
|
||||
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);
|
||||
|
||||
@ -1026,6 +1055,15 @@ void SDRPlayV3Input::webapiReverseSendSettings(QList<QString>& deviceSettingsKey
|
||||
if (deviceSettingsKeys.contains("antenna") || force) {
|
||||
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")
|
||||
.arg(settings.m_reverseAPIAddress)
|
||||
|
@ -47,6 +47,9 @@ void SDRPlayV3Settings::resetToDefaults()
|
||||
m_tuner = 0;
|
||||
m_antenna = 0;
|
||||
m_extRef = false;
|
||||
m_transverterMode = false;
|
||||
m_iqOrder = true;
|
||||
m_transverterDeltaFrequency = 0;
|
||||
m_useReverseAPI = false;
|
||||
m_reverseAPIAddress = "127.0.0.1";
|
||||
m_reverseAPIPort = 8888;
|
||||
@ -79,6 +82,10 @@ QByteArray SDRPlayV3Settings::serialize() const
|
||||
s.writeS32(23, m_tuner);
|
||||
s.writeS32(24, m_antenna);
|
||||
s.writeBool(25, m_extRef);
|
||||
s.writeBool(26, m_transverterMode);
|
||||
s.writeS64(27, m_transverterDeltaFrequency);
|
||||
s.writeBool(28, m_iqOrder);
|
||||
|
||||
return s.final();
|
||||
}
|
||||
|
||||
@ -128,6 +135,9 @@ bool SDRPlayV3Settings::deserialize(const QByteArray& data)
|
||||
d.readS32(23, &m_tuner, 0);
|
||||
d.readS32(24, &m_antenna, 0);
|
||||
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;
|
||||
}
|
||||
|
@ -50,6 +50,9 @@ struct SDRPlayV3Settings {
|
||||
int m_tuner;
|
||||
int m_antenna;
|
||||
bool m_extRef;
|
||||
bool m_transverterMode;
|
||||
bool m_iqOrder;
|
||||
qint64 m_transverterDeltaFrequency;
|
||||
bool m_useReverseAPI;
|
||||
QString m_reverseAPIAddress;
|
||||
uint16_t m_reverseAPIPort;
|
||||
|
@ -33,7 +33,8 @@ SDRPlayV3Thread::SDRPlayV3Thread(sdrplay_api_DeviceT* dev, SampleSinkFifo* sampl
|
||||
m_sampleFifo(sampleFifo),
|
||||
m_samplerate(2000000),
|
||||
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];
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -41,6 +41,7 @@ public:
|
||||
void setSamplerate(int samplerate);
|
||||
void setLog2Decimation(unsigned int log2_decim);
|
||||
void setFcPos(int fcPos);
|
||||
void setIQOrder(bool iqOrder) { m_iqOrder = iqOrder; }
|
||||
|
||||
void resetRfChanged();
|
||||
bool waitForRfChanged();
|
||||
@ -57,14 +58,17 @@ private:
|
||||
int m_samplerate;
|
||||
unsigned int m_log2Decim;
|
||||
int m_fcPos;
|
||||
bool m_iqOrder;
|
||||
|
||||
int m_rfChanged;
|
||||
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, false> m_decimatorsQI;
|
||||
|
||||
void run();
|
||||
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 eventCallback(sdrplay_api_EventT eventId, sdrplay_api_TunerSelectT tuner, sdrplay_api_EventParamsT *params, void *cbContext);
|
||||
|
@ -10880,6 +10880,17 @@ margin-bottom: 20px;
|
||||
"antenna" : {
|
||||
"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" : {
|
||||
"type" : "integer",
|
||||
"description" : "Synchronize with reverse API (1 for yes, 0 for no)"
|
||||
@ -52269,7 +52280,7 @@ except ApiException as e:
|
||||
</div>
|
||||
<div id="generator">
|
||||
<div class="content">
|
||||
Generated 2022-02-06T00:22:44.703+01:00
|
||||
Generated 2022-02-06T20:14:33.369+01:00
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -38,6 +38,17 @@ SDRPlayV3Settings:
|
||||
type: integer
|
||||
antenna:
|
||||
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:
|
||||
description: Synchronize with reverse API (1 for yes, 0 for no)
|
||||
type: integer
|
||||
|
@ -38,6 +38,17 @@ SDRPlayV3Settings:
|
||||
type: integer
|
||||
antenna:
|
||||
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:
|
||||
description: Synchronize with reverse API (1 for yes, 0 for no)
|
||||
type: integer
|
||||
|
@ -10880,6 +10880,17 @@ margin-bottom: 20px;
|
||||
"antenna" : {
|
||||
"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" : {
|
||||
"type" : "integer",
|
||||
"description" : "Synchronize with reverse API (1 for yes, 0 for no)"
|
||||
@ -52269,7 +52280,7 @@ except ApiException as e:
|
||||
</div>
|
||||
<div id="generator">
|
||||
<div class="content">
|
||||
Generated 2022-02-06T00:22:44.703+01:00
|
||||
Generated 2022-02-06T20:14:33.369+01:00
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -64,6 +64,12 @@ SWGSDRPlayV3Settings::SWGSDRPlayV3Settings() {
|
||||
m_tuner_isSet = false;
|
||||
antenna = 0;
|
||||
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;
|
||||
m_use_reverse_api_isSet = false;
|
||||
reverse_api_address = nullptr;
|
||||
@ -116,6 +122,12 @@ SWGSDRPlayV3Settings::init() {
|
||||
m_tuner_isSet = false;
|
||||
antenna = 0;
|
||||
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;
|
||||
m_use_reverse_api_isSet = false;
|
||||
reverse_api_address = new QString("");
|
||||
@ -145,6 +157,9 @@ SWGSDRPlayV3Settings::cleanup() {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if(reverse_api_address != nullptr) {
|
||||
@ -201,6 +216,12 @@ SWGSDRPlayV3Settings::fromJsonObject(QJsonObject &pJson) {
|
||||
|
||||
::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(&reverse_api_address, pJson["reverseAPIAddress"], "QString", "QString");
|
||||
@ -279,6 +300,15 @@ SWGSDRPlayV3Settings::asJsonObject() {
|
||||
if(m_antenna_isSet){
|
||||
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){
|
||||
obj->insert("useReverseAPI", QJsonValue(use_reverse_api));
|
||||
}
|
||||
@ -475,6 +505,36 @@ SWGSDRPlayV3Settings::setAntenna(qint32 antenna) {
|
||||
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
|
||||
SWGSDRPlayV3Settings::getUseReverseApi() {
|
||||
return use_reverse_api;
|
||||
@ -574,6 +634,15 @@ SWGSDRPlayV3Settings::isSet(){
|
||||
if(m_antenna_isSet){
|
||||
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){
|
||||
isObjectUpdated = true; break;
|
||||
}
|
||||
|
@ -96,6 +96,15 @@ public:
|
||||
qint32 getAntenna();
|
||||
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();
|
||||
void setUseReverseApi(qint32 use_reverse_api);
|
||||
|
||||
@ -166,6 +175,15 @@ private:
|
||||
qint32 antenna;
|
||||
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;
|
||||
bool m_use_reverse_api_isSet;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user