2015-09-09 09:13:24 +02:00
///////////////////////////////////////////////////////////////////////////////////
2023-11-18 10:07:41 +01:00
// Copyright (C) 2015-2020, 2022 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// Copyright (C) 2018 beta-tester <alpha-beta-release@gmx.net> //
// Copyright (C) 2022 Jon Beniston, M7RCE <jon@beniston.com> //
// Copyright (C) 2023 Daniele Forsi <iu5hkx@gmail.com> //
2015-09-09 09:13:24 +02:00
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
2019-04-11 06:57:41 +02:00
// (at your option) any later version. //
2015-09-09 09:13:24 +02:00
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include <string.h>
#include <errno.h>
2018-12-25 10:38:31 +01:00
2015-09-09 09:13:24 +02:00
#include <QDebug>
2018-05-26 01:43:28 +02:00
#include <QList>
2018-12-25 10:38:31 +01:00
#include <QNetworkReply>
#include <QBuffer>
2022-09-28 21:34:39 +02:00
#include <QThread>
2015-09-09 09:13:24 +02:00
2017-12-14 18:15:27 +01:00
#include "SWGDeviceSettings.h"
#include "SWGDeviceState.h"
2018-05-26 01:43:28 +02:00
#include "SWGDeviceReport.h"
#include "SWGAirspyReport.h"
2017-12-14 18:15:27 +01:00
2015-09-09 09:13:24 +02:00
#include "airspyinput.h"
2018-01-11 00:17:06 +01:00
#include "airspyplugin.h"
2016-10-11 01:17:55 +02:00
2019-05-08 22:11:53 +02:00
#include "device/deviceapi.h"
2015-09-09 09:13:24 +02:00
#include "dsp/dspcommands.h"
2015-09-30 13:53:09 +02:00
#include "airspysettings.h"
2020-07-12 01:51:57 +02:00
#include "airspyworker.h"
2022-12-22 11:04:12 +00:00
#ifdef ANDROID
#include "util/android.h"
#endif
2015-09-09 09:13:24 +02:00
MESSAGE_CLASS_DEFINITION ( AirspyInput :: MsgConfigureAirspy , Message )
2017-12-14 18:02:49 +01:00
MESSAGE_CLASS_DEFINITION ( AirspyInput :: MsgStartStop , Message )
2017-09-25 23:07:29 +02:00
const qint64 AirspyInput :: loLowLimitFreq = 24000000L ;
const qint64 AirspyInput :: loHighLimitFreq = 1900000000L ;
2015-09-09 09:13:24 +02:00
2019-05-08 22:11:53 +02:00
AirspyInput :: AirspyInput ( DeviceAPI * deviceAPI ) :
2016-05-16 02:14:36 +02:00
m_deviceAPI ( deviceAPI ),
2015-09-09 09:13:24 +02:00
m_settings (),
2020-06-21 11:46:08 +02:00
m_dev ( nullptr ),
2020-07-12 01:51:57 +02:00
m_airspyWorker ( nullptr ),
2022-09-28 21:34:39 +02:00
m_airspyWorkerThread ( nullptr ),
2017-04-13 08:29:51 +02:00
m_deviceDescription ( "Airspy" ),
m_running ( false )
2015-09-09 09:13:24 +02:00
{
2022-03-17 21:10:30 +01:00
m_sampleFifo . setLabel ( m_deviceDescription );
2017-04-13 08:29:51 +02:00
openDevice ();
2019-05-21 00:27:08 +02:00
m_deviceAPI -> setNbSourceStreams ( 1 );
2018-12-25 10:38:31 +01:00
m_networkManager = new QNetworkAccessManager ();
2022-03-23 22:32:23 +01:00
QObject :: connect (
m_networkManager ,
& QNetworkAccessManager :: finished ,
this ,
& AirspyInput :: networkManagerFinished
);
2015-09-09 09:13:24 +02:00
}
AirspyInput ::~ AirspyInput ()
{
2022-03-23 22:32:23 +01:00
QObject :: disconnect (
m_networkManager ,
& QNetworkAccessManager :: finished ,
this ,
& AirspyInput :: networkManagerFinished
);
2018-12-25 10:38:31 +01:00
delete m_networkManager ;
if ( m_running ) {
stop ();
}
2017-04-13 08:29:51 +02:00
closeDevice ();
2015-09-09 09:13:24 +02:00
}
2017-09-15 02:32:30 +02:00
void AirspyInput :: destroy ()
{
delete this ;
}
2017-04-13 08:29:51 +02:00
bool AirspyInput :: openDevice ()
2015-09-09 09:13:24 +02:00
{
2017-04-13 08:29:51 +02:00
if ( m_dev != 0 )
{
closeDevice ();
}
2015-09-09 09:13:24 +02:00
2017-04-13 08:29:51 +02:00
airspy_error rc ;
2015-09-09 09:13:24 +02:00
2017-04-13 08:29:51 +02:00
rc = ( airspy_error ) airspy_init ();
2015-09-09 09:13:24 +02:00
2017-04-13 08:29:51 +02:00
if ( rc != AIRSPY_SUCCESS )
{
qCritical ( "AirspyInput::start: failed to initiate Airspy library %s" , airspy_error_name ( rc ));
}
2015-09-09 09:13:24 +02:00
2017-04-13 08:29:51 +02:00
if ( ! m_sampleFifo . setSize ( 1 << 19 ))
{
qCritical ( "AirspyInput::start: could not allocate SampleFifo" );
return false ;
}
2015-09-09 09:13:24 +02:00
2022-12-22 11:04:12 +00:00
#ifdef ANDROID
int fd ;
QString serial = m_deviceAPI -> getSamplingDeviceSerial ();
if (( fd = Android :: openUSBDevice ( serial )) < 0 )
{
qCritical ( "AirspyInput::openDevice: could not open USB device %s" , qPrintable ( serial ));
return false ;
}
if ( airspy_open_fd ( & m_dev , fd ) != AIRSPY_SUCCESS )
{
qCritical ( "AirspyInput::openDevice: could not open Airspy: %s" , qPrintable ( serial ));
return false ;
}
#else
2019-05-08 22:11:53 +02:00
int device = m_deviceAPI -> getSamplingDeviceSequence ();
2017-04-13 08:29:51 +02:00
if (( m_dev = open_airspy_from_sequence ( device )) == 0 )
{
qCritical ( "AirspyInput::start: could not open Airspy #%d" , device );
return false ;
}
2022-12-22 11:04:12 +00:00
#endif
2015-09-09 09:13:24 +02:00
2019-06-30 03:13:07 +02:00
#ifdef LIBAIRSPY_DEFAULT_RATES
2023-07-23 16:44:42 +02:00
qDebug ( "AirspyInput::start: default rates" );
2019-06-30 03:13:07 +02:00
m_sampleRates . clear ();
m_sampleRates . push_back ( 10000000 );
m_sampleRates . push_back ( 2500000 );
#else
2017-04-13 08:29:51 +02:00
uint32_t nbSampleRates ;
uint32_t * sampleRates ;
2015-09-09 09:13:24 +02:00
2017-04-13 08:29:51 +02:00
airspy_get_samplerates ( m_dev , & nbSampleRates , 0 );
2015-09-09 09:13:24 +02:00
2017-04-13 08:29:51 +02:00
sampleRates = new uint32_t [ nbSampleRates ];
2015-09-09 09:13:24 +02:00
2017-04-13 08:29:51 +02:00
airspy_get_samplerates ( m_dev , sampleRates , nbSampleRates );
2015-09-09 09:13:24 +02:00
2017-04-13 08:29:51 +02:00
if ( nbSampleRates == 0 )
{
qCritical ( "AirspyInput::start: could not obtain Airspy sample rates" );
return false ;
}
else
{
qDebug ( "AirspyInput::start: %d sample rates" , nbSampleRates );
}
2015-09-10 05:53:37 +02:00
2017-04-13 08:29:51 +02:00
m_sampleRates . clear ();
2015-09-11 03:02:02 +02:00
2017-05-25 20:13:34 +02:00
for ( unsigned int i = 0 ; i < nbSampleRates ; i ++ )
2017-04-13 08:29:51 +02:00
{
m_sampleRates . push_back ( sampleRates [ i ]);
qDebug ( "AirspyInput::start: sampleRates[%d] = %u Hz" , i , sampleRates [ i ]);
}
2015-09-09 09:13:24 +02:00
2017-04-13 08:29:51 +02:00
delete [] sampleRates ;
2015-09-09 09:13:24 +02:00
#endif
2017-04-13 08:29:51 +02:00
// MsgReportAirspy *message = MsgReportAirspy::create(m_sampleRates);
// getOutputMessageQueueToGUI()->push(message);
2015-09-11 03:02:02 +02:00
2017-04-13 08:29:51 +02:00
rc = ( airspy_error ) airspy_set_sample_type ( m_dev , AIRSPY_SAMPLE_INT16_IQ );
2015-09-10 05:53:37 +02:00
2017-04-13 08:29:51 +02:00
if ( rc != AIRSPY_SUCCESS )
{
qCritical ( "AirspyInput::start: could not set sample type to INT16_IQ" );
return false ;
}
return true ;
}
2017-12-25 09:10:19 +01:00
void AirspyInput :: init ()
{
2022-10-22 10:23:29 +02:00
applySettings ( m_settings , QList < QString > (), true );
2017-12-25 09:10:19 +01:00
}
2017-04-14 03:40:45 +02:00
bool AirspyInput :: start ()
2017-04-13 08:29:51 +02:00
{
QMutexLocker mutexLocker ( & m_mutex );
2020-07-12 01:51:57 +02:00
if ( m_running ) {
2022-09-28 21:34:39 +02:00
return true ;
2020-07-12 01:51:57 +02:00
}
2015-09-09 09:13:24 +02:00
2024-08-21 05:27:01 +02:00
if ( ! m_dev ) {
return false ;
}
2022-09-28 21:34:39 +02:00
m_airspyWorkerThread = new QThread ();
2020-07-12 01:51:57 +02:00
m_airspyWorker = new AirspyWorker ( m_dev , & m_sampleFifo );
2022-09-28 21:34:39 +02:00
m_airspyWorker -> moveToThread ( m_airspyWorkerThread );
QObject :: connect ( m_airspyWorkerThread , & QThread :: started , m_airspyWorker , & AirspyWorker :: startWork );
QObject :: connect ( m_airspyWorkerThread , & QThread :: finished , m_airspyWorker , & QObject :: deleteLater );
QObject :: connect ( m_airspyWorkerThread , & QThread :: finished , m_airspyWorkerThread , & QThread :: deleteLater );
2020-07-12 01:51:57 +02:00
m_airspyWorker -> setSamplerate ( m_sampleRates [ m_settings . m_devSampleRateIndex ]);
m_airspyWorker -> setLog2Decimation ( m_settings . m_log2Decim );
m_airspyWorker -> setIQOrder ( m_settings . m_iqOrder );
m_airspyWorker -> setFcPos (( int ) m_settings . m_fcPos );
2022-09-28 21:34:39 +02:00
m_airspyWorkerThread -> start ();
2024-08-21 05:27:01 +02:00
m_running = true ;
mutexLocker . unlock ();
2022-09-28 21:34:39 +02:00
qDebug ( "AirspyInput::startInput: started" );
2022-10-22 10:23:29 +02:00
applySettings ( m_settings , QList < QString > (), true );
2015-09-09 09:13:24 +02:00
2022-09-28 21:34:39 +02:00
return true ;
2015-09-09 09:13:24 +02:00
}
2017-04-13 08:29:51 +02:00
void AirspyInput :: closeDevice ()
{
2022-09-28 21:34:39 +02:00
if ( m_dev )
2017-04-13 08:29:51 +02:00
{
airspy_stop_rx ( m_dev );
airspy_close ( m_dev );
2022-09-28 21:34:39 +02:00
m_dev = nullptr ;
2017-04-13 08:29:51 +02:00
}
m_deviceDescription . clear ();
airspy_exit ();
}
2015-09-09 09:13:24 +02:00
void AirspyInput :: stop ()
{
2022-09-28 21:34:39 +02:00
QMutexLocker mutexLocker ( & m_mutex );
if ( ! m_running ) {
return ;
}
2015-09-11 03:02:02 +02:00
qDebug ( "AirspyInput::stop" );
2015-09-09 09:13:24 +02:00
2022-09-28 21:34:39 +02:00
if ( m_airspyWorkerThread )
2015-09-09 09:13:24 +02:00
{
2022-09-28 21:34:39 +02:00
m_airspyWorkerThread -> quit ();
m_airspyWorkerThread -> wait ();
m_airspyWorkerThread = nullptr ;
m_airspyWorker = nullptr ;
2015-09-09 09:13:24 +02:00
}
2017-04-13 08:29:51 +02:00
m_running = false ;
2015-09-09 09:13:24 +02:00
}
2017-12-28 03:21:48 +01:00
QByteArray AirspyInput :: serialize () const
{
return m_settings . serialize ();
}
bool AirspyInput :: deserialize ( const QByteArray & data )
{
bool success = true ;
if ( ! m_settings . deserialize ( data ))
{
m_settings . resetToDefaults ();
success = false ;
}
2022-10-22 10:23:29 +02:00
MsgConfigureAirspy * message = MsgConfigureAirspy :: create ( m_settings , QList < QString > (), true );
2017-12-28 03:21:48 +01:00
m_inputMessageQueue . push ( message );
if ( m_guiMessageQueue )
{
2022-10-22 10:23:29 +02:00
MsgConfigureAirspy * messageToGUI = MsgConfigureAirspy :: create ( m_settings , QList < QString > (), true );
2017-12-28 03:21:48 +01:00
m_guiMessageQueue -> push ( messageToGUI );
}
return success ;
}
2015-09-09 09:13:24 +02:00
const QString & AirspyInput :: getDeviceDescription () const
{
return m_deviceDescription ;
}
int AirspyInput :: getSampleRate () const
{
2015-09-10 05:53:37 +02:00
int rate = m_sampleRates [ m_settings . m_devSampleRateIndex ];
2015-09-09 09:13:24 +02:00
return ( rate / ( 1 << m_settings . m_log2Decim ));
}
quint64 AirspyInput :: getCenterFrequency () const
{
return m_settings . m_centerFrequency ;
}
2017-12-28 03:21:48 +01:00
void AirspyInput :: setCenterFrequency ( qint64 centerFrequency )
{
AirspySettings settings = m_settings ;
settings . m_centerFrequency = centerFrequency ;
2022-10-22 10:23:29 +02:00
MsgConfigureAirspy * message = MsgConfigureAirspy :: create ( settings , QList < QString > { "centerFrequency" }, false );
2017-12-28 03:21:48 +01:00
m_inputMessageQueue . push ( message );
if ( m_guiMessageQueue )
{
2022-10-22 10:23:29 +02:00
MsgConfigureAirspy * messageToGUI = MsgConfigureAirspy :: create ( settings , QList < QString > { "centerFrequency" }, false );
2017-12-28 03:21:48 +01:00
m_guiMessageQueue -> push ( messageToGUI );
}
}
2015-09-09 09:13:24 +02:00
bool AirspyInput :: handleMessage ( const Message & message )
{
if ( MsgConfigureAirspy :: match ( message ))
{
MsgConfigureAirspy & conf = ( MsgConfigureAirspy & ) message ;
qDebug () << "AirspyInput::handleMessage: MsgConfigureAirspy" ;
2022-10-22 10:23:29 +02:00
bool success = applySettings ( conf . getSettings (), conf . getSettingsKeys (), conf . getForce ());
2015-09-11 03:02:02 +02:00
2022-10-22 10:23:29 +02:00
if ( ! success ) {
2018-01-11 00:17:06 +01:00
qDebug ( "AirspyInput::handleMessage: Airspy config error" );
2015-09-09 09:13:24 +02:00
}
return true ;
}
2017-12-14 18:02:49 +01:00
else if ( MsgStartStop :: match ( message ))
{
MsgStartStop & cmd = ( MsgStartStop & ) message ;
qDebug () << "AirspyInput::handleMessage: MsgStartStop: " << ( cmd . getStartStop () ? "start" : "stop" );
if ( cmd . getStartStop ())
{
2022-10-22 10:23:29 +02:00
if ( m_deviceAPI -> initDeviceEngine ()) {
2019-05-08 22:11:53 +02:00
m_deviceAPI -> startDeviceEngine ();
2017-12-14 18:02:49 +01:00
}
}
else
{
2019-05-08 22:11:53 +02:00
m_deviceAPI -> stopDeviceEngine ();
2017-12-14 18:02:49 +01:00
}
2018-12-25 10:38:31 +01:00
if ( m_settings . m_useReverseAPI ) {
webapiReverseSendStartStop ( cmd . getStartStop ());
}
2017-12-14 18:02:49 +01:00
return true ;
}
2015-09-09 09:13:24 +02:00
else
{
return false ;
}
}
2017-12-28 03:21:48 +01:00
void AirspyInput :: setDeviceCenterFrequency ( quint64 freq_hz )
2015-09-10 05:53:37 +02:00
{
2015-09-27 18:32:19 +02:00
qint64 df = (( qint64 ) freq_hz * m_settings . m_LOppmTenths ) / 10000000LL ;
freq_hz += df ;
2015-09-10 05:53:37 +02:00
airspy_error rc = ( airspy_error ) airspy_set_freq ( m_dev , static_cast < uint32_t > ( freq_hz ));
2022-10-22 10:23:29 +02:00
if ( rc != AIRSPY_SUCCESS ) {
2017-12-28 03:21:48 +01:00
qWarning ( "AirspyInput::setDeviceCenterFrequency: could not frequency to %llu Hz" , freq_hz );
2022-10-22 10:23:29 +02:00
} else {
2018-01-11 00:17:06 +01:00
qDebug ( "AirspyInput::setDeviceCenterFrequency: frequency set to %llu Hz" , freq_hz );
2015-09-10 05:53:37 +02:00
}
}
2022-10-22 10:23:29 +02:00
bool AirspyInput :: applySettings ( const AirspySettings & settings , const QList < QString >& settingsKeys , bool force )
2015-09-09 09:13:24 +02:00
{
2015-09-11 03:02:02 +02:00
QMutexLocker mutexLocker ( & m_mutex );
2015-09-09 09:13:24 +02:00
bool forwardChange = false ;
2017-05-25 20:13:34 +02:00
airspy_error rc = AIRSPY_ERROR_OTHER ;
2015-09-09 09:13:24 +02:00
2022-10-22 10:23:29 +02:00
qDebug () << "AirspyInput::applySettings:"
<< "force:" << force
<< settings . getDebugString ( settingsKeys , force );
2018-12-25 10:38:31 +01:00
2022-10-22 10:23:29 +02:00
if (( settingsKeys . contains ( "dcBlock" )) ||
( settingsKeys . contains ( "iqCorrection" )) || force )
2018-01-11 00:17:06 +01:00
{
2018-12-25 10:38:31 +01:00
m_deviceAPI -> configureCorrections ( settings . m_dcBlock , settings . m_iqCorrection );
2015-09-30 13:23:20 +02:00
}
2022-10-22 10:23:29 +02:00
if (( settingsKeys . contains ( "devSampleRateIndex" )) || force )
2015-09-10 05:53:37 +02:00
{
2015-09-11 03:02:02 +02:00
forwardChange = true ;
2015-09-10 05:53:37 +02:00
if ( m_dev != 0 )
{
2018-12-25 10:38:31 +01:00
rc = ( airspy_error ) airspy_set_samplerate ( m_dev , static_cast < airspy_samplerate_t > ( settings . m_devSampleRateIndex ));
2015-09-10 05:53:37 +02:00
if ( rc != AIRSPY_SUCCESS )
{
2018-12-25 10:38:31 +01:00
qCritical ( "AirspyInput::applySettings: could not set sample rate index %u (%d S/s): %s" , settings . m_devSampleRateIndex , m_sampleRates [ settings . m_devSampleRateIndex ], airspy_error_name ( rc ));
2015-09-10 05:53:37 +02:00
}
2020-07-12 01:51:57 +02:00
else if ( m_airspyWorker )
2015-09-10 05:53:37 +02:00
{
2018-12-25 10:38:31 +01:00
qDebug ( "AirspyInput::applySettings: sample rate set to index: %u (%d S/s)" , settings . m_devSampleRateIndex , m_sampleRates [ settings . m_devSampleRateIndex ]);
2020-07-12 01:51:57 +02:00
m_airspyWorker -> setSamplerate ( m_sampleRates [ settings . m_devSampleRateIndex ]);
2015-09-10 05:53:37 +02:00
}
}
}
2022-10-22 10:23:29 +02:00
if (( settingsKeys . contains ( "log2Decim" )) || force )
2015-09-10 05:53:37 +02:00
{
forwardChange = true ;
2020-07-12 01:51:57 +02:00
if ( m_airspyWorker )
2015-09-10 05:53:37 +02:00
{
2020-07-12 01:51:57 +02:00
m_airspyWorker -> setLog2Decimation ( settings . m_log2Decim );
2018-01-20 03:28:30 +01:00
qDebug () << "AirspyInput: set decimation to " << ( 1 << settings . m_log2Decim );
2015-09-10 05:53:37 +02:00
}
}
2022-10-22 10:23:29 +02:00
if (( settingsKeys . contains ( "iqOrder" )) || force )
2020-06-21 11:46:08 +02:00
{
2020-07-12 01:51:57 +02:00
if ( m_airspyWorker ) {
m_airspyWorker -> setIQOrder ( settings . m_iqOrder );
2020-06-21 11:46:08 +02:00
}
}
2022-10-22 10:23:29 +02:00
if (( settingsKeys . contains ( "centerFrequency" ))
|| ( settingsKeys . contains ( "transverterDeltaFrequency" ))
|| ( settingsKeys . contains ( "log2Decim" ))
|| ( settingsKeys . contains ( "fcPos" ))
|| ( settingsKeys . contains ( "devSampleRateIndex" ))
|| ( settingsKeys . contains ( "transverterMode" )) || force )
2015-09-10 05:53:37 +02:00
{
2018-05-10 14:51:05 +02:00
qint64 deviceCenterFrequency = DeviceSampleSource :: calculateDeviceCenterFrequency (
settings . m_centerFrequency ,
settings . m_transverterDeltaFrequency ,
settings . m_log2Decim ,
( DeviceSampleSource :: fcPos_t ) settings . m_fcPos ,
2018-12-25 10:38:31 +01:00
m_sampleRates [ settings . m_devSampleRateIndex ],
2019-04-02 01:10:03 +02:00
DeviceSampleSource :: FrequencyShiftScheme :: FSHIFT_STD ,
2018-05-10 14:51:05 +02:00
settings . m_transverterMode );
if ( m_dev != 0 ) {
2017-12-28 03:21:48 +01:00
setDeviceCenterFrequency ( deviceCenterFrequency );
2015-09-10 05:53:37 +02:00
}
forwardChange = true ;
}
2022-10-22 10:23:29 +02:00
if (( settingsKeys . contains ( "fcPos" )) || force )
2015-10-01 06:34:08 +02:00
{
2020-07-12 01:51:57 +02:00
if ( m_airspyWorker )
2015-10-01 06:34:08 +02:00
{
2020-07-12 01:51:57 +02:00
m_airspyWorker -> setFcPos (( int ) settings . m_fcPos );
2018-12-25 10:38:31 +01:00
qDebug () << "AirspyInput: set fc pos (enum) to " << ( int ) settings . m_fcPos ;
2015-10-01 06:34:08 +02:00
}
}
2022-10-22 10:23:29 +02:00
if ( settingsKeys . contains ( "lnaGain" ) || force )
2015-09-09 09:13:24 +02:00
{
if ( m_dev != 0 )
{
2018-12-25 10:38:31 +01:00
rc = ( airspy_error ) airspy_set_lna_gain ( m_dev , settings . m_lnaGain );
2015-09-09 09:13:24 +02:00
2018-12-25 10:38:31 +01:00
if ( rc != AIRSPY_SUCCESS ) {
2015-09-09 09:13:24 +02:00
qDebug ( "AirspyInput::applySettings: airspy_set_lna_gain failed: %s" , airspy_error_name ( rc ));
2018-12-25 10:38:31 +01:00
} else {
qDebug () << "AirspyInput:applySettings: LNA gain set to " << settings . m_lnaGain ;
2015-09-09 09:13:24 +02:00
}
}
}
2022-10-22 10:23:29 +02:00
if ( settingsKeys . contains ( "lnaAGC" ) || force )
2015-12-09 01:49:46 +01:00
{
2018-12-25 10:38:31 +01:00
if ( m_dev != 0 ) {
rc = ( airspy_error ) airspy_set_lna_agc ( m_dev , ( settings . m_lnaAGC ? 1 : 0 ));
2015-12-09 01:49:46 +01:00
}
2018-12-25 10:38:31 +01:00
if ( rc != AIRSPY_SUCCESS ) {
2015-12-09 01:49:46 +01:00
qDebug ( "AirspyInput::applySettings: airspy_set_lna_agc failed: %s" , airspy_error_name ( rc ));
2018-12-25 10:38:31 +01:00
} else {
qDebug () << "AirspyInput:applySettings: LNA AGC set to " << settings . m_lnaAGC ;
2015-12-09 01:49:46 +01:00
}
}
2022-10-22 10:23:29 +02:00
if ( settingsKeys . contains ( "mixerGain" ) || force )
2015-09-09 09:13:24 +02:00
{
if ( m_dev != 0 )
{
2018-12-25 10:38:31 +01:00
rc = ( airspy_error ) airspy_set_mixer_gain ( m_dev , settings . m_mixerGain );
2015-09-09 09:13:24 +02:00
2018-12-25 10:38:31 +01:00
if ( rc != AIRSPY_SUCCESS ) {
2015-09-09 09:13:24 +02:00
qDebug ( "AirspyInput::applySettings: airspy_set_mixer_gain failed: %s" , airspy_error_name ( rc ));
2018-12-25 10:38:31 +01:00
} else {
qDebug () << "AirspyInput:applySettings: mixer gain set to " << settings . m_mixerGain ;
2015-09-09 09:13:24 +02:00
}
}
}
2022-10-22 10:23:29 +02:00
if ( settingsKeys . contains ( "mixerAGC" ) || force )
2015-12-09 01:49:46 +01:00
{
2018-12-25 10:38:31 +01:00
if ( m_dev != 0 ) {
rc = ( airspy_error ) airspy_set_mixer_agc ( m_dev , ( settings . m_mixerAGC ? 1 : 0 ));
2015-12-09 01:49:46 +01:00
}
2018-12-25 10:38:31 +01:00
if ( rc != AIRSPY_SUCCESS ) {
2015-12-09 01:49:46 +01:00
qDebug ( "AirspyInput::applySettings: airspy_set_mixer_agc failed: %s" , airspy_error_name ( rc ));
2018-12-25 10:38:31 +01:00
} else {
qDebug () << "AirspyInput:applySettings: Mixer AGC set to " << settings . m_mixerAGC ;
2015-12-09 01:49:46 +01:00
}
}
2022-10-22 10:23:29 +02:00
if ( settingsKeys . contains ( "vgaGain" ) || force )
2015-09-09 09:13:24 +02:00
{
if ( m_dev != 0 )
{
2018-12-25 10:38:31 +01:00
rc = ( airspy_error ) airspy_set_vga_gain ( m_dev , settings . m_vgaGain );
2015-09-09 09:13:24 +02:00
2018-12-25 10:38:31 +01:00
if ( rc != AIRSPY_SUCCESS ) {
2015-09-09 09:13:24 +02:00
qDebug ( "AirspyInput::applySettings: airspy_set_vga_gain failed: %s" , airspy_error_name ( rc ));
2018-12-25 10:38:31 +01:00
} else {
qDebug () << "AirspyInput:applySettings: VGA gain set to " << settings . m_vgaGain ;
2015-09-09 09:13:24 +02:00
}
}
}
2022-10-22 10:23:29 +02:00
if ( settingsKeys . contains ( "biasT" ) || force )
2015-09-09 09:13:24 +02:00
{
if ( m_dev != 0 )
{
2018-12-25 10:38:31 +01:00
rc = ( airspy_error ) airspy_set_rf_bias ( m_dev , ( settings . m_biasT ? 1 : 0 ));
2015-09-09 09:13:24 +02:00
2018-12-25 10:38:31 +01:00
if ( rc != AIRSPY_SUCCESS ) {
2015-09-10 05:53:37 +02:00
qDebug ( "AirspyInput::applySettings: airspy_set_rf_bias failed: %s" , airspy_error_name ( rc ));
2018-12-25 10:38:31 +01:00
} else {
qDebug () << "AirspyInput:applySettings: bias tee set to " << settings . m_biasT ;
2015-09-09 09:13:24 +02:00
}
}
}
2024-04-14 18:58:12 +02:00
if ( settings . m_useReverseAPI )
2018-12-25 10:38:31 +01:00
{
2022-10-22 12:27:54 +02:00
bool fullUpdate = ( settingsKeys . contains ( "useReverseAPI" ) && settings . m_useReverseAPI ) ||
settingsKeys . contains ( "reverseAPIAddress" ) ||
settingsKeys . contains ( "reverseAPIPort" ) ||
settingsKeys . contains ( "reverseAPIDeviceIndex" );
2022-10-22 10:23:29 +02:00
webapiReverseSendSettings ( settingsKeys , settings , fullUpdate || force );
2018-12-25 10:38:31 +01:00
}
2022-10-22 10:23:29 +02:00
if ( force ) {
m_settings = settings ;
} else {
m_settings . applySettings ( settingsKeys , settings );
}
2018-12-25 10:38:31 +01:00
2015-09-09 09:13:24 +02:00
if ( forwardChange )
{
2017-09-25 23:07:29 +02:00
int sampleRate = m_sampleRates [ m_settings . m_devSampleRateIndex ] / ( 1 << m_settings . m_log2Decim );
2015-09-09 09:13:24 +02:00
DSPSignalNotification * notif = new DSPSignalNotification ( sampleRate , m_settings . m_centerFrequency );
2017-09-13 23:40:06 +02:00
m_deviceAPI -> getDeviceEngineInputMessageQueue () -> push ( notif );
2015-09-09 09:13:24 +02:00
}
return true ;
}
struct airspy_device * AirspyInput :: open_airspy_from_sequence ( int sequence )
{
2017-05-25 20:13:34 +02:00
struct airspy_device * devinfo ;
airspy_error rc = AIRSPY_ERROR_OTHER ;
2015-09-09 09:13:24 +02:00
2018-01-11 00:17:06 +01:00
for ( int i = 0 ; i < AirspyPlugin :: m_maxDevices ; i ++ )
2015-09-09 09:13:24 +02:00
{
2015-09-11 03:02:02 +02:00
rc = ( airspy_error ) airspy_open ( & devinfo );
2015-09-09 09:13:24 +02:00
2015-09-10 05:53:37 +02:00
if ( rc == AIRSPY_SUCCESS )
2015-09-09 09:13:24 +02:00
{
2018-01-11 00:17:06 +01:00
if ( i == sequence ) {
2015-09-10 05:53:37 +02:00
return devinfo ;
2018-01-11 00:17:06 +01:00
} else {
airspy_close ( devinfo );
2015-09-10 05:53:37 +02:00
}
2015-09-09 09:13:24 +02:00
}
else
{
2015-09-11 03:02:02 +02:00
break ;
2015-09-09 09:13:24 +02:00
}
}
return 0 ;
}
2017-12-14 18:15:27 +01:00
int AirspyInput :: webapiRunGet (
SWGSDRangel :: SWGDeviceState & response ,
2018-11-13 08:51:14 +01:00
QString & errorMessage )
2017-12-14 18:15:27 +01:00
{
2018-11-13 08:51:14 +01:00
( void ) errorMessage ;
2017-12-14 18:15:27 +01:00
m_deviceAPI -> getDeviceEngineStateStr ( * response . getState ());
return 200 ;
}
int AirspyInput :: webapiRun (
bool run ,
SWGSDRangel :: SWGDeviceState & response ,
2018-11-13 08:51:14 +01:00
QString & errorMessage )
2017-12-14 18:15:27 +01:00
{
2018-11-13 08:51:14 +01:00
( void ) errorMessage ;
2017-12-14 23:29:12 +01:00
m_deviceAPI -> getDeviceEngineStateStr ( * response . getState ());
2017-12-14 18:15:27 +01:00
MsgStartStop * message = MsgStartStop :: create ( run );
m_inputMessageQueue . push ( message );
if ( m_guiMessageQueue ) // forward to GUI if any
{
MsgStartStop * msgToGUI = MsgStartStop :: create ( run );
m_guiMessageQueue -> push ( msgToGUI );
}
return 200 ;
}
2018-05-25 19:28:57 +02:00
int AirspyInput :: webapiSettingsGet (
SWGSDRangel :: SWGDeviceSettings & response ,
2018-11-13 08:51:14 +01:00
QString & errorMessage )
2018-05-25 19:28:57 +02:00
{
2018-11-13 08:51:14 +01:00
( void ) errorMessage ;
2018-05-25 19:28:57 +02:00
response . setAirspySettings ( new SWGSDRangel :: SWGAirspySettings ());
response . getAirspySettings () -> init ();
webapiFormatDeviceSettings ( response , m_settings );
return 200 ;
}
int AirspyInput :: webapiSettingsPutPatch (
bool force ,
const QStringList & deviceSettingsKeys ,
SWGSDRangel :: SWGDeviceSettings & response , // query + response
2018-11-13 08:51:14 +01:00
QString & errorMessage )
2018-05-25 19:28:57 +02:00
{
2018-11-13 08:51:14 +01:00
( void ) errorMessage ;
2018-05-25 19:28:57 +02:00
AirspySettings settings = m_settings ;
2019-08-03 11:21:46 +02:00
webapiUpdateDeviceSettings ( settings , deviceSettingsKeys , response );
2018-05-25 19:28:57 +02:00
2022-10-22 10:23:29 +02:00
MsgConfigureAirspy * msg = MsgConfigureAirspy :: create ( settings , deviceSettingsKeys , force );
2019-08-03 11:21:46 +02:00
m_inputMessageQueue . push ( msg );
if ( m_guiMessageQueue ) // forward to GUI if any
{
2022-10-22 10:23:29 +02:00
MsgConfigureAirspy * msgToGUI = MsgConfigureAirspy :: create ( settings , deviceSettingsKeys , force );
2019-08-03 11:21:46 +02:00
m_guiMessageQueue -> push ( msgToGUI );
}
webapiFormatDeviceSettings ( response , settings );
return 200 ;
}
2019-08-04 20:24:44 +02:00
void AirspyInput :: webapiUpdateDeviceSettings (
2019-08-03 11:21:46 +02:00
AirspySettings & settings ,
const QStringList & deviceSettingsKeys ,
SWGSDRangel :: SWGDeviceSettings & response )
{
2026-01-28 02:48:42 +01:00
if ( deviceSettingsKeys . contains ( "title" )) {
settings . m_title = * response . getAirspySettings () -> getTitle ();
}
2018-05-25 19:28:57 +02:00
if ( deviceSettingsKeys . contains ( "centerFrequency" )) {
settings . m_centerFrequency = response . getAirspySettings () -> getCenterFrequency ();
}
if ( deviceSettingsKeys . contains ( "LOppmTenths" )) {
settings . m_LOppmTenths = response . getAirspySettings () -> getLOppmTenths ();
}
if ( deviceSettingsKeys . contains ( "devSampleRateIndex" )) {
settings . m_devSampleRateIndex = response . getAirspySettings () -> getDevSampleRateIndex ();
}
if ( deviceSettingsKeys . contains ( "lnaGain" )) {
settings . m_lnaGain = response . getAirspySettings () -> getLnaGain ();
}
if ( deviceSettingsKeys . contains ( "mixerGain" )) {
settings . m_mixerGain = response . getAirspySettings () -> getMixerGain ();
}
if ( deviceSettingsKeys . contains ( "vgaGain" )) {
settings . m_vgaGain = response . getAirspySettings () -> getVgaGain ();
}
if ( deviceSettingsKeys . contains ( "lnaAGC" )) {
settings . m_lnaAGC = response . getAirspySettings () -> getLnaAgc () != 0 ;
}
if ( deviceSettingsKeys . contains ( "mixerAGC" )) {
settings . m_mixerAGC = response . getAirspySettings () -> getMixerAgc () != 0 ;
}
if ( deviceSettingsKeys . contains ( "log2Decim" )) {
settings . m_log2Decim = response . getAirspySettings () -> getLog2Decim ();
}
2020-06-22 02:10:35 +02:00
if ( deviceSettingsKeys . contains ( "iqOrder" )) {
settings . m_iqOrder = response . getAirspySettings () -> getIqOrder () != 0 ;
}
2018-05-25 19:28:57 +02:00
if ( deviceSettingsKeys . contains ( "fcPos" )) {
2018-05-26 02:01:59 +02:00
int fcPos = response . getAirspySettings () -> getFcPos ();
fcPos = fcPos < 0 ? 0 : fcPos > 2 ? 2 : fcPos ;
settings . m_fcPos = ( AirspySettings :: fcPos_t ) fcPos ;
2018-05-25 19:28:57 +02:00
}
if ( deviceSettingsKeys . contains ( "biasT" )) {
settings . m_biasT = response . getAirspySettings () -> getBiasT () != 0 ;
}
if ( deviceSettingsKeys . contains ( "dcBlock" )) {
settings . m_dcBlock = response . getAirspySettings () -> getDcBlock () != 0 ;
}
if ( deviceSettingsKeys . contains ( "iqCorrection" )) {
settings . m_iqCorrection = response . getAirspySettings () -> getIqCorrection () != 0 ;
}
if ( deviceSettingsKeys . contains ( "transverterDeltaFrequency" )) {
settings . m_transverterDeltaFrequency = response . getAirspySettings () -> getTransverterDeltaFrequency ();
}
if ( deviceSettingsKeys . contains ( "transverterMode" )) {
settings . m_transverterMode = response . getAirspySettings () -> getTransverterMode () != 0 ;
}
2019-01-10 22:35:38 +01:00
if ( deviceSettingsKeys . contains ( "useReverseAPI" )) {
2019-01-11 08:50:47 +01:00
settings . m_useReverseAPI = response . getAirspySettings () -> getUseReverseApi () != 0 ;
2019-01-10 22:35:38 +01:00
}
if ( deviceSettingsKeys . contains ( "reverseAPIAddress" )) {
2019-01-11 08:50:47 +01:00
settings . m_reverseAPIAddress = * response . getAirspySettings () -> getReverseApiAddress ();
2019-01-10 22:35:38 +01:00
}
if ( deviceSettingsKeys . contains ( "reverseAPIPort" )) {
2019-01-11 08:50:47 +01:00
settings . m_reverseAPIPort = response . getAirspySettings () -> getReverseApiPort ();
2019-01-10 22:35:38 +01:00
}
if ( deviceSettingsKeys . contains ( "reverseAPIDeviceIndex" )) {
2019-01-11 08:50:47 +01:00
settings . m_reverseAPIDeviceIndex = response . getAirspySettings () -> getReverseApiDeviceIndex ();
2019-01-10 22:35:38 +01:00
}
2018-05-25 19:28:57 +02:00
}
2018-05-26 01:43:28 +02:00
int AirspyInput :: webapiReportGet (
SWGSDRangel :: SWGDeviceReport & response ,
2018-11-13 08:51:14 +01:00
QString & errorMessage )
2018-05-26 01:43:28 +02:00
{
2018-11-13 08:51:14 +01:00
( void ) errorMessage ;
2018-05-26 01:43:28 +02:00
response . setAirspyReport ( new SWGSDRangel :: SWGAirspyReport ());
response . getAirspyReport () -> init ();
webapiFormatDeviceReport ( response );
return 200 ;
}
2018-05-25 19:28:57 +02:00
void AirspyInput :: webapiFormatDeviceSettings ( SWGSDRangel :: SWGDeviceSettings & response , const AirspySettings & settings )
{
2026-01-28 02:48:42 +01:00
if ( response . getAirspySettings () -> getTitle ()) {
* response . getAirspySettings () -> getTitle () = settings . m_title ;
} else {
response . getAirspySettings () -> setTitle ( new QString ( settings . m_title ));
}
2018-05-25 19:28:57 +02:00
response . getAirspySettings () -> setCenterFrequency ( settings . m_centerFrequency );
response . getAirspySettings () -> setLOppmTenths ( settings . m_LOppmTenths );
response . getAirspySettings () -> setDevSampleRateIndex ( settings . m_devSampleRateIndex );
response . getAirspySettings () -> setLnaGain ( settings . m_lnaGain );
response . getAirspySettings () -> setMixerGain ( settings . m_mixerGain );
response . getAirspySettings () -> setVgaGain ( settings . m_vgaGain );
response . getAirspySettings () -> setLnaAgc ( settings . m_lnaAGC ? 1 : 0 );
response . getAirspySettings () -> setMixerAgc ( settings . m_mixerAGC ? 1 : 0 );
response . getAirspySettings () -> setLog2Decim ( settings . m_log2Decim );
2020-06-22 02:10:35 +02:00
response . getAirspySettings () -> setIqOrder ( settings . m_iqOrder ? 1 : 0 );
2018-05-25 19:28:57 +02:00
response . getAirspySettings () -> setFcPos (( int ) settings . m_fcPos );
response . getAirspySettings () -> setBiasT ( settings . m_biasT ? 1 : 0 );
response . getAirspySettings () -> setDcBlock ( settings . m_dcBlock ? 1 : 0 );
response . getAirspySettings () -> setIqCorrection ( settings . m_iqCorrection ? 1 : 0 );
response . getAirspySettings () -> setTransverterDeltaFrequency ( settings . m_transverterDeltaFrequency );
response . getAirspySettings () -> setTransverterMode ( settings . m_transverterMode ? 1 : 0 );
2019-01-11 08:50:47 +01:00
response . getAirspySettings () -> setUseReverseApi ( settings . m_useReverseAPI ? 1 : 0 );
2019-01-10 22:35:38 +01:00
2019-01-11 08:50:47 +01:00
if ( response . getAirspySettings () -> getReverseApiAddress ()) {
* response . getAirspySettings () -> getReverseApiAddress () = settings . m_reverseAPIAddress ;
2019-01-10 22:35:38 +01:00
} else {
2019-01-11 08:50:47 +01:00
response . getAirspySettings () -> setReverseApiAddress ( new QString ( settings . m_reverseAPIAddress ));
2019-01-10 22:35:38 +01:00
}
2019-01-11 08:50:47 +01:00
response . getAirspySettings () -> setReverseApiPort ( settings . m_reverseAPIPort );
response . getAirspySettings () -> setReverseApiDeviceIndex ( settings . m_reverseAPIDeviceIndex );
2018-05-25 19:28:57 +02:00
}
2018-05-26 01:43:28 +02:00
void AirspyInput :: webapiFormatDeviceReport ( SWGSDRangel :: SWGDeviceReport & response )
{
2018-05-27 19:54:33 +02:00
response . getAirspyReport () -> setSampleRates ( new QList < SWGSDRangel :: SWGSampleRate *> );
2018-05-26 01:43:28 +02:00
for ( std :: vector < uint32_t >:: const_iterator it = getSampleRates (). begin (); it != getSampleRates (). end (); ++ it )
{
2018-05-27 19:54:33 +02:00
response . getAirspyReport () -> getSampleRates () -> append ( new SWGSDRangel :: SWGSampleRate );
response . getAirspyReport () -> getSampleRates () -> back () -> setRate ( * it );
2018-05-26 01:43:28 +02:00
}
}
2018-12-25 10:38:31 +01:00
2022-10-22 10:23:29 +02:00
void AirspyInput :: webapiReverseSendSettings ( const QList < QString >& deviceSettingsKeys , const AirspySettings & settings , bool force )
2018-12-25 10:38:31 +01:00
{
SWGSDRangel :: SWGDeviceSettings * swgDeviceSettings = new SWGSDRangel :: SWGDeviceSettings ();
2019-05-07 14:43:38 +02:00
swgDeviceSettings -> setDirection ( 0 ); // single Rx
2019-03-25 13:41:38 +01:00
swgDeviceSettings -> setOriginatorIndex ( m_deviceAPI -> getDeviceSetIndex ());
2018-12-25 10:38:31 +01:00
swgDeviceSettings -> setDeviceHwType ( new QString ( "Airspy" ));
swgDeviceSettings -> setAirspySettings ( new SWGSDRangel :: SWGAirspySettings ());
SWGSDRangel :: SWGAirspySettings * swgAirspySettings = swgDeviceSettings -> getAirspySettings ();
// transfer data that has been modified. When force is on transfer all data except reverse API data
2026-01-28 02:48:42 +01:00
if ( deviceSettingsKeys . contains ( "title" ) || force ) {
swgAirspySettings -> setTitle ( new QString ( settings . m_title ));
}
2018-12-25 10:38:31 +01:00
if ( deviceSettingsKeys . contains ( "centerFrequency" ) || force ) {
swgAirspySettings -> setCenterFrequency ( settings . m_centerFrequency );
}
if ( deviceSettingsKeys . contains ( "LOppmTenths" ) || force ) {
swgAirspySettings -> setLOppmTenths ( settings . m_LOppmTenths );
}
if ( deviceSettingsKeys . contains ( "devSampleRateIndex" ) || force ) {
swgAirspySettings -> setDevSampleRateIndex ( settings . m_devSampleRateIndex );
}
if ( deviceSettingsKeys . contains ( "lnaGain" ) || force ) {
swgAirspySettings -> setLnaGain ( settings . m_lnaGain );
}
if ( deviceSettingsKeys . contains ( "mixerGain" ) || force ) {
swgAirspySettings -> setMixerGain ( settings . m_mixerGain );
}
if ( deviceSettingsKeys . contains ( "vgaGain" ) || force ) {
swgAirspySettings -> setVgaGain ( settings . m_vgaGain );
}
if ( deviceSettingsKeys . contains ( "lnaAGC" ) || force ) {
swgAirspySettings -> setLnaAgc ( settings . m_lnaAGC ? 1 : 0 );
}
if ( deviceSettingsKeys . contains ( "mixerAGC" ) || force ) {
swgAirspySettings -> setMixerAgc ( settings . m_mixerAGC ? 1 : 0 );
}
if ( deviceSettingsKeys . contains ( "log2Decim" ) || force ) {
swgAirspySettings -> setLog2Decim ( settings . m_log2Decim );
}
2020-06-22 02:10:35 +02:00
if ( deviceSettingsKeys . contains ( "iqOrder" ) || force ) {
swgAirspySettings -> setIqOrder ( settings . m_iqOrder ? 1 : 0 );
}
2018-12-25 10:38:31 +01:00
if ( deviceSettingsKeys . contains ( "fcPos" ) || force ) {
swgAirspySettings -> setFcPos (( int ) settings . m_fcPos );
}
if ( deviceSettingsKeys . contains ( "biasT" ) || force ) {
swgAirspySettings -> setBiasT ( settings . m_biasT ? 1 : 0 );
}
if ( deviceSettingsKeys . contains ( "dcBlock" ) || force ) {
swgAirspySettings -> setDcBlock ( settings . m_dcBlock ? 1 : 0 );
}
if ( deviceSettingsKeys . contains ( "iqCorrection" ) || force ) {
swgAirspySettings -> setIqCorrection ( settings . m_iqCorrection ? 1 : 0 );
}
if ( deviceSettingsKeys . contains ( "transverterDeltaFrequency" ) || force ) {
swgAirspySettings -> setTransverterDeltaFrequency ( settings . m_transverterDeltaFrequency );
}
if ( deviceSettingsKeys . contains ( "transverterMode" ) || force ) {
swgAirspySettings -> setTransverterMode ( settings . m_transverterMode ? 1 : 0 );
}
QString deviceSettingsURL = QString ( "http://%1:%2/sdrangel/deviceset/%3/device/settings" )
. arg ( settings . m_reverseAPIAddress )
. arg ( settings . m_reverseAPIPort )
. arg ( settings . m_reverseAPIDeviceIndex );
m_networkRequest . setUrl ( QUrl ( deviceSettingsURL ));
m_networkRequest . setHeader ( QNetworkRequest :: ContentTypeHeader , "application/json" );
2019-11-12 18:46:21 +01:00
QBuffer * buffer = new QBuffer ();
2018-12-25 10:38:31 +01:00
buffer -> open (( QBuffer :: ReadWrite ));
buffer -> write ( swgDeviceSettings -> asJson (). toUtf8 ());
buffer -> seek ( 0 );
// Always use PATCH to avoid passing reverse API settings
2019-11-12 18:46:21 +01:00
QNetworkReply * reply = m_networkManager -> sendCustomRequest ( m_networkRequest , "PATCH" , buffer );
buffer -> setParent ( reply );
2018-12-25 10:38:31 +01:00
delete swgDeviceSettings ;
}
void AirspyInput :: webapiReverseSendStartStop ( bool start )
{
2019-03-25 15:21:17 +01:00
SWGSDRangel :: SWGDeviceSettings * swgDeviceSettings = new SWGSDRangel :: SWGDeviceSettings ();
2019-05-07 14:43:38 +02:00
swgDeviceSettings -> setDirection ( 0 ); // single Rx
2019-03-25 15:21:17 +01:00
swgDeviceSettings -> setOriginatorIndex ( m_deviceAPI -> getDeviceSetIndex ());
swgDeviceSettings -> setDeviceHwType ( new QString ( "Airspy" ));
2018-12-25 10:38:31 +01:00
QString deviceSettingsURL = QString ( "http://%1:%2/sdrangel/deviceset/%3/device/run" )
. arg ( m_settings . m_reverseAPIAddress )
. arg ( m_settings . m_reverseAPIPort )
. arg ( m_settings . m_reverseAPIDeviceIndex );
m_networkRequest . setUrl ( QUrl ( deviceSettingsURL ));
2019-03-25 15:21:17 +01:00
m_networkRequest . setHeader ( QNetworkRequest :: ContentTypeHeader , "application/json" );
2019-11-12 18:46:21 +01:00
QBuffer * buffer = new QBuffer ();
2019-03-25 15:21:17 +01:00
buffer -> open (( QBuffer :: ReadWrite ));
buffer -> write ( swgDeviceSettings -> asJson (). toUtf8 ());
buffer -> seek ( 0 );
2019-11-12 18:46:21 +01:00
QNetworkReply * reply ;
2018-12-25 10:38:31 +01:00
if ( start ) {
2019-11-12 18:46:21 +01:00
reply = m_networkManager -> sendCustomRequest ( m_networkRequest , "POST" , buffer );
2018-12-25 10:38:31 +01:00
} else {
2019-11-12 18:46:21 +01:00
reply = m_networkManager -> sendCustomRequest ( m_networkRequest , "DELETE" , buffer );
2018-12-25 10:38:31 +01:00
}
2019-06-14 16:58:09 +02:00
2019-11-12 18:46:21 +01:00
buffer -> setParent ( reply );
2019-06-14 16:58:09 +02:00
delete swgDeviceSettings ;
2018-12-25 10:38:31 +01:00
}
void AirspyInput :: networkManagerFinished ( QNetworkReply * reply )
{
QNetworkReply :: NetworkError replyError = reply -> error ();
if ( replyError )
{
qWarning () << "AirspyInput::networkManagerFinished:"
<< " error(" << ( int ) replyError
<< "): " << replyError
<< ": " << reply -> errorString ();
2019-11-12 18:46:21 +01:00
}
else
{
QString answer = reply -> readAll ();
answer . chop ( 1 ); // remove last \n
qDebug ( "AirspyInput::networkManagerFinished: reply: \n %s" , answer . toStdString (). c_str ());
2018-12-25 10:38:31 +01:00
}
2019-11-12 18:46:21 +01:00
reply -> deleteLater ();
2018-12-25 10:38:31 +01:00
}