2015-09-09 03:13:24 -04:00
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2015 Edouard Griffiths, F4EXB //
// //
// 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 //
// //
// 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 04:38:31 -05:00
2015-09-09 03:13:24 -04:00
# include <QDebug>
2018-05-25 19:43:28 -04:00
# include <QList>
2018-12-25 04:38:31 -05:00
# include <QNetworkReply>
# include <QBuffer>
2015-09-09 03:13:24 -04:00
2017-12-14 12:15:27 -05:00
# include "SWGDeviceSettings.h"
# include "SWGDeviceState.h"
2018-05-25 19:43:28 -04:00
# include "SWGDeviceReport.h"
# include "SWGAirspyReport.h"
2017-12-14 12:15:27 -05:00
2015-09-09 03:13:24 -04:00
# include "airspyinput.h"
2018-01-10 18:17:06 -05:00
# include "airspyplugin.h"
2016-10-10 19:17:55 -04:00
# include <device/devicesourceapi.h>
2017-09-04 16:24:32 -04:00
# include <dsp/filerecord.h>
2015-09-09 03:13:24 -04:00
# include "dsp/dspcommands.h"
2015-09-27 06:50:38 -04:00
# include "dsp/dspengine.h"
2015-09-30 07:53:09 -04:00
# include "airspysettings.h"
2015-09-09 03:13:24 -04:00
# include "airspythread.h"
MESSAGE_CLASS_DEFINITION ( AirspyInput : : MsgConfigureAirspy , Message )
2017-12-14 12:02:49 -05:00
MESSAGE_CLASS_DEFINITION ( AirspyInput : : MsgStartStop , Message )
2017-09-04 16:24:32 -04:00
MESSAGE_CLASS_DEFINITION ( AirspyInput : : MsgFileRecord , Message )
2017-09-25 17:07:29 -04:00
const qint64 AirspyInput : : loLowLimitFreq = 24000000L ;
const qint64 AirspyInput : : loHighLimitFreq = 1900000000L ;
2015-09-09 03:13:24 -04:00
2016-10-10 19:17:55 -04:00
AirspyInput : : AirspyInput ( DeviceSourceAPI * deviceAPI ) :
2016-05-15 20:14:36 -04:00
m_deviceAPI ( deviceAPI ) ,
2015-09-09 03:13:24 -04:00
m_settings ( ) ,
m_dev ( 0 ) ,
m_airspyThread ( 0 ) ,
2017-04-13 02:29:51 -04:00
m_deviceDescription ( " Airspy " ) ,
m_running ( false )
2015-09-09 03:13:24 -04:00
{
2017-04-13 02:29:51 -04:00
openDevice ( ) ;
2018-05-08 05:03:09 -04:00
m_fileSink = new FileRecord ( QString ( " test_%1.sdriq " ) . arg ( m_deviceAPI - > getDeviceUID ( ) ) ) ;
2017-09-04 16:24:32 -04:00
m_deviceAPI - > addSink ( m_fileSink ) ;
2018-12-25 04:38:31 -05:00
m_networkManager = new QNetworkAccessManager ( ) ;
connect ( m_networkManager , SIGNAL ( finished ( QNetworkReply * ) ) , this , SLOT ( networkManagerFinished ( QNetworkReply * ) ) ) ;
2015-09-09 03:13:24 -04:00
}
AirspyInput : : ~ AirspyInput ( )
{
2018-12-25 04:38:31 -05:00
disconnect ( m_networkManager , SIGNAL ( finished ( QNetworkReply * ) ) , this , SLOT ( networkManagerFinished ( QNetworkReply * ) ) ) ;
delete m_networkManager ;
if ( m_running ) {
stop ( ) ;
}
2017-09-04 16:24:32 -04:00
m_deviceAPI - > removeSink ( m_fileSink ) ;
delete m_fileSink ;
2017-04-13 02:29:51 -04:00
closeDevice ( ) ;
2015-09-09 03:13:24 -04:00
}
2017-09-14 20:32:30 -04:00
void AirspyInput : : destroy ( )
{
delete this ;
}
2017-04-13 02:29:51 -04:00
bool AirspyInput : : openDevice ( )
2015-09-09 03:13:24 -04:00
{
2017-04-13 02:29:51 -04:00
if ( m_dev ! = 0 )
{
closeDevice ( ) ;
}
2015-09-09 03:13:24 -04:00
2017-04-13 02:29:51 -04:00
airspy_error rc ;
2015-09-09 03:13:24 -04:00
2017-04-13 02:29:51 -04:00
rc = ( airspy_error ) airspy_init ( ) ;
2015-09-09 03:13:24 -04:00
2017-04-13 02:29:51 -04:00
if ( rc ! = AIRSPY_SUCCESS )
{
qCritical ( " AirspyInput::start: failed to initiate Airspy library %s " , airspy_error_name ( rc ) ) ;
}
2015-09-09 03:13:24 -04:00
2017-04-13 02:29:51 -04:00
if ( ! m_sampleFifo . setSize ( 1 < < 19 ) )
{
qCritical ( " AirspyInput::start: could not allocate SampleFifo " ) ;
return false ;
}
2015-09-09 03:13:24 -04:00
2017-04-13 02:29:51 -04:00
int device = m_deviceAPI - > getSampleSourceSequence ( ) ;
if ( ( m_dev = open_airspy_from_sequence ( device ) ) = = 0 )
{
qCritical ( " AirspyInput::start: could not open Airspy #%d " , device ) ;
return false ;
}
2015-09-09 03:13:24 -04:00
2015-09-10 21:02:02 -04:00
# ifdef LIBAIRSPY_DYN_RATES
2017-04-13 02:29:51 -04:00
uint32_t nbSampleRates ;
uint32_t * sampleRates ;
2015-09-09 03:13:24 -04:00
2017-04-13 02:29:51 -04:00
airspy_get_samplerates ( m_dev , & nbSampleRates , 0 ) ;
2015-09-09 03:13:24 -04:00
2017-04-13 02:29:51 -04:00
sampleRates = new uint32_t [ nbSampleRates ] ;
2015-09-09 03:13:24 -04:00
2017-04-13 02:29:51 -04:00
airspy_get_samplerates ( m_dev , sampleRates , nbSampleRates ) ;
2015-09-09 03:13:24 -04:00
2017-04-13 02:29:51 -04: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-09 23:53:37 -04:00
2017-04-13 02:29:51 -04:00
m_sampleRates . clear ( ) ;
2015-09-10 21:02:02 -04:00
2017-05-25 14:13:34 -04:00
for ( unsigned int i = 0 ; i < nbSampleRates ; i + + )
2017-04-13 02:29:51 -04:00
{
m_sampleRates . push_back ( sampleRates [ i ] ) ;
qDebug ( " AirspyInput::start: sampleRates[%d] = %u Hz " , i , sampleRates [ i ] ) ;
}
2015-09-09 03:13:24 -04:00
2017-04-13 02:29:51 -04:00
delete [ ] sampleRates ;
2015-09-23 20:50:24 -04:00
# else
2017-04-13 02:29:51 -04:00
qDebug ( " AirspyInput::start: detault rates " ) ;
m_sampleRates . clear ( ) ;
m_sampleRates . push_back ( 10000000 ) ;
m_sampleRates . push_back ( 2500000 ) ;
2015-09-09 03:13:24 -04:00
# endif
2017-04-13 02:29:51 -04:00
// MsgReportAirspy *message = MsgReportAirspy::create(m_sampleRates);
// getOutputMessageQueueToGUI()->push(message);
2015-09-10 21:02:02 -04:00
2017-04-13 02:29:51 -04:00
rc = ( airspy_error ) airspy_set_sample_type ( m_dev , AIRSPY_SAMPLE_INT16_IQ ) ;
2015-09-09 23:53:37 -04:00
2017-04-13 02:29:51 -04:00
if ( rc ! = AIRSPY_SUCCESS )
{
qCritical ( " AirspyInput::start: could not set sample type to INT16_IQ " ) ;
return false ;
}
return true ;
}
2017-12-25 03:10:19 -05:00
void AirspyInput : : init ( )
{
applySettings ( m_settings , true ) ;
}
2017-04-13 21:40:45 -04:00
bool AirspyInput : : start ( )
2017-04-13 02:29:51 -04:00
{
QMutexLocker mutexLocker ( & m_mutex ) ;
if ( ! m_dev ) {
return false ;
}
2018-02-24 04:29:27 -05:00
if ( m_running ) { stop ( ) ; }
2015-09-09 03:13:24 -04:00
2018-02-24 04:29:27 -05:00
m_airspyThread = new AirspyThread ( m_dev , & m_sampleFifo ) ;
2017-04-13 14:29:05 -04:00
m_airspyThread - > setSamplerate ( m_sampleRates [ m_settings . m_devSampleRateIndex ] ) ;
m_airspyThread - > setLog2Decimation ( m_settings . m_log2Decim ) ;
m_airspyThread - > setFcPos ( ( int ) m_settings . m_fcPos ) ;
2015-09-09 03:13:24 -04:00
m_airspyThread - > startWork ( ) ;
mutexLocker . unlock ( ) ;
2015-09-10 21:02:02 -04:00
applySettings ( m_settings , true ) ;
2015-09-09 03:13:24 -04:00
qDebug ( " AirspyInput::startInput: started " ) ;
2017-04-13 02:29:51 -04:00
m_running = true ;
2015-09-09 03:13:24 -04:00
return true ;
}
2017-04-13 02:29:51 -04:00
void AirspyInput : : closeDevice ( )
{
if ( m_dev ! = 0 )
{
airspy_stop_rx ( m_dev ) ;
airspy_close ( m_dev ) ;
m_dev = 0 ;
}
m_deviceDescription . clear ( ) ;
airspy_exit ( ) ;
}
2015-09-09 03:13:24 -04:00
void AirspyInput : : stop ( )
{
2015-09-10 21:02:02 -04:00
qDebug ( " AirspyInput::stop " ) ;
2015-09-09 03:13:24 -04:00
QMutexLocker mutexLocker ( & m_mutex ) ;
2017-04-13 02:29:51 -04:00
if ( m_airspyThread ! = 0 )
2015-09-09 03:13:24 -04:00
{
m_airspyThread - > stopWork ( ) ;
delete m_airspyThread ;
m_airspyThread = 0 ;
}
2017-04-13 02:29:51 -04:00
m_running = false ;
2015-09-09 03:13:24 -04:00
}
2017-12-27 21:21:48 -05: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 ;
}
MsgConfigureAirspy * message = MsgConfigureAirspy : : create ( m_settings , true ) ;
m_inputMessageQueue . push ( message ) ;
if ( m_guiMessageQueue )
{
MsgConfigureAirspy * messageToGUI = MsgConfigureAirspy : : create ( m_settings , true ) ;
m_guiMessageQueue - > push ( messageToGUI ) ;
}
return success ;
}
2015-09-09 03:13:24 -04:00
const QString & AirspyInput : : getDeviceDescription ( ) const
{
return m_deviceDescription ;
}
int AirspyInput : : getSampleRate ( ) const
{
2015-09-09 23:53:37 -04:00
int rate = m_sampleRates [ m_settings . m_devSampleRateIndex ] ;
2015-09-09 03:13:24 -04:00
return ( rate / ( 1 < < m_settings . m_log2Decim ) ) ;
}
quint64 AirspyInput : : getCenterFrequency ( ) const
{
return m_settings . m_centerFrequency ;
}
2017-12-27 21:21:48 -05:00
void AirspyInput : : setCenterFrequency ( qint64 centerFrequency )
{
AirspySettings settings = m_settings ;
settings . m_centerFrequency = centerFrequency ;
MsgConfigureAirspy * message = MsgConfigureAirspy : : create ( settings , false ) ;
m_inputMessageQueue . push ( message ) ;
if ( m_guiMessageQueue )
{
MsgConfigureAirspy * messageToGUI = MsgConfigureAirspy : : create ( settings , false ) ;
m_guiMessageQueue - > push ( messageToGUI ) ;
}
}
2015-09-09 03:13:24 -04:00
bool AirspyInput : : handleMessage ( const Message & message )
{
if ( MsgConfigureAirspy : : match ( message ) )
{
MsgConfigureAirspy & conf = ( MsgConfigureAirspy & ) message ;
qDebug ( ) < < " AirspyInput::handleMessage: MsgConfigureAirspy " ;
2017-10-14 00:30:48 -04:00
bool success = applySettings ( conf . getSettings ( ) , conf . getForce ( ) ) ;
2015-09-10 21:02:02 -04:00
if ( ! success )
2015-09-09 03:13:24 -04:00
{
2018-01-10 18:17:06 -05:00
qDebug ( " AirspyInput::handleMessage: Airspy config error " ) ;
2015-09-09 03:13:24 -04:00
}
return true ;
}
2017-12-14 12:02:49 -05:00
else if ( MsgStartStop : : match ( message ) )
{
MsgStartStop & cmd = ( MsgStartStop & ) message ;
qDebug ( ) < < " AirspyInput::handleMessage: MsgStartStop: " < < ( cmd . getStartStop ( ) ? " start " : " stop " ) ;
if ( cmd . getStartStop ( ) )
{
if ( m_deviceAPI - > initAcquisition ( ) )
{
m_deviceAPI - > startAcquisition ( ) ;
}
}
else
{
m_deviceAPI - > stopAcquisition ( ) ;
}
2018-12-25 04:38:31 -05:00
if ( m_settings . m_useReverseAPI ) {
webapiReverseSendStartStop ( cmd . getStartStop ( ) ) ;
}
2017-12-14 12:02:49 -05:00
return true ;
}
2017-09-04 16:24:32 -04:00
else if ( MsgFileRecord : : match ( message ) )
{
MsgFileRecord & conf = ( MsgFileRecord & ) message ;
2017-09-04 16:45:07 -04:00
qDebug ( ) < < " AirspyInput::handleMessage: MsgFileRecord: " < < conf . getStartStop ( ) ;
2017-09-04 16:24:32 -04:00
2018-05-09 11:39:48 -04:00
if ( conf . getStartStop ( ) )
{
if ( m_settings . m_fileRecordName . size ( ) ! = 0 ) {
m_fileSink - > setFileName ( m_settings . m_fileRecordName ) ;
} else {
2018-05-11 03:08:20 -04:00
m_fileSink - > genUniqueFileName ( m_deviceAPI - > getDeviceUID ( ) ) ;
2018-05-09 11:39:48 -04:00
}
2017-09-04 16:24:32 -04:00
m_fileSink - > startRecording ( ) ;
2018-05-09 11:39:48 -04:00
}
else
{
2017-09-04 16:24:32 -04:00
m_fileSink - > stopRecording ( ) ;
}
return true ;
}
2015-09-09 03:13:24 -04:00
else
{
return false ;
}
}
2017-12-27 21:21:48 -05:00
void AirspyInput : : setDeviceCenterFrequency ( quint64 freq_hz )
2015-09-09 23:53:37 -04:00
{
2015-09-27 12:32:19 -04:00
qint64 df = ( ( qint64 ) freq_hz * m_settings . m_LOppmTenths ) / 10000000LL ;
freq_hz + = df ;
2015-09-09 23:53:37 -04:00
airspy_error rc = ( airspy_error ) airspy_set_freq ( m_dev , static_cast < uint32_t > ( freq_hz ) ) ;
if ( rc ! = AIRSPY_SUCCESS )
{
2017-12-27 21:21:48 -05:00
qWarning ( " AirspyInput::setDeviceCenterFrequency: could not frequency to %llu Hz " , freq_hz ) ;
2015-09-09 23:53:37 -04:00
}
else
{
2018-01-10 18:17:06 -05:00
qDebug ( " AirspyInput::setDeviceCenterFrequency: frequency set to %llu Hz " , freq_hz ) ;
2015-09-09 23:53:37 -04:00
}
}
2015-09-30 07:23:20 -04:00
bool AirspyInput : : applySettings ( const AirspySettings & settings , bool force )
2015-09-09 03:13:24 -04:00
{
2015-09-10 21:02:02 -04:00
QMutexLocker mutexLocker ( & m_mutex ) ;
2015-09-09 03:13:24 -04:00
bool forwardChange = false ;
2017-05-25 14:13:34 -04:00
airspy_error rc = AIRSPY_ERROR_OTHER ;
2018-12-25 04:38:31 -05:00
QList < QString > reverseAPIKeys ;
2015-09-09 03:13:24 -04:00
2015-09-10 21:02:02 -04:00
qDebug ( ) < < " AirspyInput::applySettings " ;
2015-09-09 03:13:24 -04:00
2018-12-25 04:38:31 -05:00
if ( ( m_settings . m_dcBlock ! = settings . m_dcBlock ) | | force ) {
reverseAPIKeys . append ( " dcBlock " ) ;
}
if ( ( m_settings . m_iqCorrection ! = settings . m_iqCorrection ) | | force ) {
reverseAPIKeys . append ( " iqCorrection " ) ;
}
2018-01-10 18:17:06 -05:00
if ( ( m_settings . m_dcBlock ! = settings . m_dcBlock ) | |
( m_settings . m_iqCorrection ! = settings . m_iqCorrection ) | | force )
{
2018-12-25 04:38:31 -05:00
m_deviceAPI - > configureCorrections ( settings . m_dcBlock , settings . m_iqCorrection ) ;
2015-09-30 07:23:20 -04:00
}
2015-09-09 23:53:37 -04:00
if ( ( m_settings . m_devSampleRateIndex ! = settings . m_devSampleRateIndex ) | | force )
{
2018-12-25 04:38:31 -05:00
reverseAPIKeys . append ( " devSampleRateIndex " ) ;
2015-09-10 21:02:02 -04:00
forwardChange = true ;
2015-09-09 23:53:37 -04:00
if ( m_dev ! = 0 )
{
2018-12-25 04:38:31 -05:00
rc = ( airspy_error ) airspy_set_samplerate ( m_dev , static_cast < airspy_samplerate_t > ( settings . m_devSampleRateIndex ) ) ;
2015-09-09 23:53:37 -04:00
if ( rc ! = AIRSPY_SUCCESS )
{
2018-12-25 04:38:31 -05: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-09 23:53:37 -04:00
}
2017-04-13 14:29:05 -04:00
else if ( m_airspyThread ! = 0 )
2015-09-09 23:53:37 -04:00
{
2018-12-25 04:38:31 -05:00
qDebug ( " AirspyInput::applySettings: sample rate set to index: %u (%d S/s) " , settings . m_devSampleRateIndex , m_sampleRates [ settings . m_devSampleRateIndex ] ) ;
m_airspyThread - > setSamplerate ( m_sampleRates [ settings . m_devSampleRateIndex ] ) ;
2015-09-09 23:53:37 -04:00
}
}
}
if ( ( m_settings . m_log2Decim ! = settings . m_log2Decim ) | | force )
{
2018-12-25 04:38:31 -05:00
reverseAPIKeys . append ( " log2Decim " ) ;
2015-09-09 23:53:37 -04:00
forwardChange = true ;
2017-04-13 14:29:05 -04:00
if ( m_airspyThread ! = 0 )
2015-09-09 23:53:37 -04:00
{
2018-01-19 21:28:30 -05:00
m_airspyThread - > setLog2Decimation ( settings . m_log2Decim ) ;
qDebug ( ) < < " AirspyInput: set decimation to " < < ( 1 < < settings . m_log2Decim ) ;
2015-09-09 23:53:37 -04:00
}
}
2018-12-25 04:38:31 -05:00
if ( ( m_settings . m_centerFrequency ! = settings . m_centerFrequency ) | | force ) {
reverseAPIKeys . append ( " centerFrequency " ) ;
}
if ( ( m_settings . m_LOppmTenths ! = settings . m_LOppmTenths ) | | force ) {
reverseAPIKeys . append ( " LOppmTenths " ) ;
}
if ( ( m_settings . m_fcPos ! = settings . m_fcPos ) | | force ) {
reverseAPIKeys . append ( " fcPos " ) ;
}
if ( ( m_settings . m_transverterMode ! = settings . m_transverterMode ) | | force ) {
reverseAPIKeys . append ( " transverterMode " ) ;
}
if ( ( m_settings . m_transverterDeltaFrequency ! = settings . m_transverterDeltaFrequency ) | | force ) {
reverseAPIKeys . append ( " transverterDeltaFrequency " ) ;
}
2018-01-19 21:28:30 -05:00
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 )
| | ( m_settings . m_transverterMode ! = settings . m_transverterMode )
| | ( m_settings . m_transverterDeltaFrequency ! = settings . m_transverterDeltaFrequency ) | | force )
2015-09-09 23:53:37 -04:00
{
2018-05-10 08:51:05 -04:00
qint64 deviceCenterFrequency = DeviceSampleSource : : calculateDeviceCenterFrequency (
settings . m_centerFrequency ,
settings . m_transverterDeltaFrequency ,
settings . m_log2Decim ,
( DeviceSampleSource : : fcPos_t ) settings . m_fcPos ,
2018-12-25 04:38:31 -05:00
m_sampleRates [ settings . m_devSampleRateIndex ] ,
2018-05-10 08:51:05 -04:00
settings . m_transverterMode ) ;
if ( m_dev ! = 0 ) {
2017-12-27 21:21:48 -05:00
setDeviceCenterFrequency ( deviceCenterFrequency ) ;
2015-09-09 23:53:37 -04:00
}
forwardChange = true ;
}
2015-10-01 00:34:08 -04:00
if ( ( m_settings . m_fcPos ! = settings . m_fcPos ) | | force )
{
2017-04-13 14:29:05 -04:00
if ( m_airspyThread ! = 0 )
2015-10-01 00:34:08 -04:00
{
2018-12-25 04:38:31 -05:00
m_airspyThread - > setFcPos ( ( int ) settings . m_fcPos ) ;
qDebug ( ) < < " AirspyInput: set fc pos (enum) to " < < ( int ) settings . m_fcPos ;
2015-10-01 00:34:08 -04:00
}
}
2015-09-09 03:13:24 -04:00
if ( ( m_settings . m_lnaGain ! = settings . m_lnaGain ) | | force )
{
2018-12-25 04:38:31 -05:00
reverseAPIKeys . append ( " lnaGain " ) ;
2015-09-09 03:13:24 -04:00
if ( m_dev ! = 0 )
{
2018-12-25 04:38:31 -05:00
rc = ( airspy_error ) airspy_set_lna_gain ( m_dev , settings . m_lnaGain ) ;
2015-09-09 03:13:24 -04:00
2018-12-25 04:38:31 -05:00
if ( rc ! = AIRSPY_SUCCESS ) {
2015-09-09 03:13:24 -04:00
qDebug ( " AirspyInput::applySettings: airspy_set_lna_gain failed: %s " , airspy_error_name ( rc ) ) ;
2018-12-25 04:38:31 -05:00
} else {
qDebug ( ) < < " AirspyInput:applySettings: LNA gain set to " < < settings . m_lnaGain ;
2015-09-09 03:13:24 -04:00
}
}
}
2015-12-08 19:49:46 -05:00
if ( ( m_settings . m_lnaAGC ! = settings . m_lnaAGC ) | | force )
{
2018-12-25 04:38:31 -05:00
reverseAPIKeys . append ( " lnaAGC " ) ;
2015-12-08 19:49:46 -05:00
2018-12-25 04:38:31 -05:00
if ( m_dev ! = 0 ) {
rc = ( airspy_error ) airspy_set_lna_agc ( m_dev , ( settings . m_lnaAGC ? 1 : 0 ) ) ;
2015-12-08 19:49:46 -05:00
}
2018-12-25 04:38:31 -05:00
if ( rc ! = AIRSPY_SUCCESS ) {
2015-12-08 19:49:46 -05:00
qDebug ( " AirspyInput::applySettings: airspy_set_lna_agc failed: %s " , airspy_error_name ( rc ) ) ;
2018-12-25 04:38:31 -05:00
} else {
qDebug ( ) < < " AirspyInput:applySettings: LNA AGC set to " < < settings . m_lnaAGC ;
2015-12-08 19:49:46 -05:00
}
}
2015-09-09 03:13:24 -04:00
if ( ( m_settings . m_mixerGain ! = settings . m_mixerGain ) | | force )
{
2018-12-25 04:38:31 -05:00
reverseAPIKeys . append ( " mixerGain " ) ;
2015-09-09 03:13:24 -04:00
if ( m_dev ! = 0 )
{
2018-12-25 04:38:31 -05:00
rc = ( airspy_error ) airspy_set_mixer_gain ( m_dev , settings . m_mixerGain ) ;
2015-09-09 03:13:24 -04:00
2018-12-25 04:38:31 -05:00
if ( rc ! = AIRSPY_SUCCESS ) {
2015-09-09 03:13:24 -04:00
qDebug ( " AirspyInput::applySettings: airspy_set_mixer_gain failed: %s " , airspy_error_name ( rc ) ) ;
2018-12-25 04:38:31 -05:00
} else {
qDebug ( ) < < " AirspyInput:applySettings: mixer gain set to " < < settings . m_mixerGain ;
2015-09-09 03:13:24 -04:00
}
}
}
2015-12-08 19:49:46 -05:00
if ( ( m_settings . m_mixerAGC ! = settings . m_mixerAGC ) | | force )
{
2018-12-25 04:38:31 -05:00
reverseAPIKeys . append ( " mixerAGC " ) ;
2015-12-08 19:49:46 -05:00
2018-12-25 04:38:31 -05:00
if ( m_dev ! = 0 ) {
rc = ( airspy_error ) airspy_set_mixer_agc ( m_dev , ( settings . m_mixerAGC ? 1 : 0 ) ) ;
2015-12-08 19:49:46 -05:00
}
2018-12-25 04:38:31 -05:00
if ( rc ! = AIRSPY_SUCCESS ) {
2015-12-08 19:49:46 -05:00
qDebug ( " AirspyInput::applySettings: airspy_set_mixer_agc failed: %s " , airspy_error_name ( rc ) ) ;
2018-12-25 04:38:31 -05:00
} else {
qDebug ( ) < < " AirspyInput:applySettings: Mixer AGC set to " < < settings . m_mixerAGC ;
2015-12-08 19:49:46 -05:00
}
}
2015-09-09 03:13:24 -04:00
if ( ( m_settings . m_vgaGain ! = settings . m_vgaGain ) | | force )
{
2018-12-25 04:38:31 -05:00
reverseAPIKeys . append ( " vgaGain " ) ;
2015-09-09 03:13:24 -04:00
if ( m_dev ! = 0 )
{
2018-12-25 04:38:31 -05:00
rc = ( airspy_error ) airspy_set_vga_gain ( m_dev , settings . m_vgaGain ) ;
2015-09-09 03:13:24 -04:00
2018-12-25 04:38:31 -05:00
if ( rc ! = AIRSPY_SUCCESS ) {
2015-09-09 03:13:24 -04:00
qDebug ( " AirspyInput::applySettings: airspy_set_vga_gain failed: %s " , airspy_error_name ( rc ) ) ;
2018-12-25 04:38:31 -05:00
} else {
qDebug ( ) < < " AirspyInput:applySettings: VGA gain set to " < < settings . m_vgaGain ;
2015-09-09 03:13:24 -04:00
}
}
}
2015-09-09 23:53:37 -04:00
if ( ( m_settings . m_biasT ! = settings . m_biasT ) | | force )
2015-09-09 03:13:24 -04:00
{
2018-12-25 04:38:31 -05:00
reverseAPIKeys . append ( " biasT " ) ;
2015-09-09 03:13:24 -04:00
if ( m_dev ! = 0 )
{
2018-12-25 04:38:31 -05:00
rc = ( airspy_error ) airspy_set_rf_bias ( m_dev , ( settings . m_biasT ? 1 : 0 ) ) ;
2015-09-09 03:13:24 -04:00
2018-12-25 04:38:31 -05:00
if ( rc ! = AIRSPY_SUCCESS ) {
2015-09-09 23:53:37 -04:00
qDebug ( " AirspyInput::applySettings: airspy_set_rf_bias failed: %s " , airspy_error_name ( rc ) ) ;
2018-12-25 04:38:31 -05:00
} else {
qDebug ( ) < < " AirspyInput:applySettings: bias tee set to " < < settings . m_biasT ;
2015-09-09 03:13:24 -04:00
}
}
}
2018-12-25 04:38:31 -05:00
if ( settings . m_useReverseAPI )
{
bool fullUpdate = ( ( m_settings . m_useReverseAPI ! = settings . m_useReverseAPI ) & & settings . m_useReverseAPI ) | |
( m_settings . m_reverseAPIAddress ! = settings . m_reverseAPIAddress ) | |
( m_settings . m_reverseAPIPort ! = settings . m_reverseAPIPort ) | |
( m_settings . m_reverseAPIDeviceIndex ! = settings . m_reverseAPIDeviceIndex ) ;
webapiReverseSendSettings ( reverseAPIKeys , settings , fullUpdate | | force ) ;
}
m_settings = settings ;
2015-09-09 03:13:24 -04:00
if ( forwardChange )
{
2017-09-25 17:07:29 -04:00
int sampleRate = m_sampleRates [ m_settings . m_devSampleRateIndex ] / ( 1 < < m_settings . m_log2Decim ) ;
2015-09-09 03:13:24 -04:00
DSPSignalNotification * notif = new DSPSignalNotification ( sampleRate , m_settings . m_centerFrequency ) ;
2017-09-04 16:24:32 -04:00
m_fileSink - > handleMessage ( * notif ) ; // forward to file sink
2017-09-13 17:40:06 -04:00
m_deviceAPI - > getDeviceEngineInputMessageQueue ( ) - > push ( notif ) ;
2015-09-09 03:13:24 -04:00
}
return true ;
}
struct airspy_device * AirspyInput : : open_airspy_from_sequence ( int sequence )
{
2017-05-25 14:13:34 -04:00
struct airspy_device * devinfo ;
airspy_error rc = AIRSPY_ERROR_OTHER ;
2015-09-09 03:13:24 -04:00
2018-01-10 18:17:06 -05:00
for ( int i = 0 ; i < AirspyPlugin : : m_maxDevices ; i + + )
2015-09-09 03:13:24 -04:00
{
2015-09-10 21:02:02 -04:00
rc = ( airspy_error ) airspy_open ( & devinfo ) ;
2015-09-09 03:13:24 -04:00
2015-09-09 23:53:37 -04:00
if ( rc = = AIRSPY_SUCCESS )
2015-09-09 03:13:24 -04:00
{
2018-01-10 18:17:06 -05:00
if ( i = = sequence ) {
2015-09-09 23:53:37 -04:00
return devinfo ;
2018-01-10 18:17:06 -05:00
} else {
airspy_close ( devinfo ) ;
2015-09-09 23:53:37 -04:00
}
2015-09-09 03:13:24 -04:00
}
else
{
2015-09-10 21:02:02 -04:00
break ;
2015-09-09 03:13:24 -04:00
}
}
return 0 ;
}
2017-12-14 12:15:27 -05:00
int AirspyInput : : webapiRunGet (
SWGSDRangel : : SWGDeviceState & response ,
2018-11-13 02:51:14 -05:00
QString & errorMessage )
2017-12-14 12:15:27 -05:00
{
2018-11-13 02:51:14 -05:00
( void ) errorMessage ;
2017-12-14 12:15:27 -05:00
m_deviceAPI - > getDeviceEngineStateStr ( * response . getState ( ) ) ;
return 200 ;
}
int AirspyInput : : webapiRun (
bool run ,
SWGSDRangel : : SWGDeviceState & response ,
2018-11-13 02:51:14 -05:00
QString & errorMessage )
2017-12-14 12:15:27 -05:00
{
2018-11-13 02:51:14 -05:00
( void ) errorMessage ;
2017-12-14 17:29:12 -05:00
m_deviceAPI - > getDeviceEngineStateStr ( * response . getState ( ) ) ;
2017-12-14 12:15:27 -05: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 13:28:57 -04:00
int AirspyInput : : webapiSettingsGet (
SWGSDRangel : : SWGDeviceSettings & response ,
2018-11-13 02:51:14 -05:00
QString & errorMessage )
2018-05-25 13:28:57 -04:00
{
2018-11-13 02:51:14 -05:00
( void ) errorMessage ;
2018-05-25 13:28:57 -04: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 02:51:14 -05:00
QString & errorMessage )
2018-05-25 13:28:57 -04:00
{
2018-11-13 02:51:14 -05:00
( void ) errorMessage ;
2018-05-25 13:28:57 -04:00
AirspySettings settings = m_settings ;
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 ( ) ;
}
if ( deviceSettingsKeys . contains ( " fcPos " ) ) {
2018-05-25 20:01:59 -04:00
int fcPos = response . getAirspySettings ( ) - > getFcPos ( ) ;
fcPos = fcPos < 0 ? 0 : fcPos > 2 ? 2 : fcPos ;
settings . m_fcPos = ( AirspySettings : : fcPos_t ) fcPos ;
2018-05-25 13:28:57 -04: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 ;
}
if ( deviceSettingsKeys . contains ( " fileRecordName " ) ) {
settings . m_fileRecordName = * response . getAirspySettings ( ) - > getFileRecordName ( ) ;
}
MsgConfigureAirspy * msg = MsgConfigureAirspy : : create ( settings , force ) ;
m_inputMessageQueue . push ( msg ) ;
if ( m_guiMessageQueue ) // forward to GUI if any
{
MsgConfigureAirspy * msgToGUI = MsgConfigureAirspy : : create ( settings , force ) ;
m_guiMessageQueue - > push ( msgToGUI ) ;
}
webapiFormatDeviceSettings ( response , settings ) ;
return 200 ;
}
2018-05-25 19:43:28 -04:00
int AirspyInput : : webapiReportGet (
SWGSDRangel : : SWGDeviceReport & response ,
2018-11-13 02:51:14 -05:00
QString & errorMessage )
2018-05-25 19:43:28 -04:00
{
2018-11-13 02:51:14 -05:00
( void ) errorMessage ;
2018-05-25 19:43:28 -04:00
response . setAirspyReport ( new SWGSDRangel : : SWGAirspyReport ( ) ) ;
response . getAirspyReport ( ) - > init ( ) ;
webapiFormatDeviceReport ( response ) ;
return 200 ;
}
2018-05-25 13:28:57 -04:00
void AirspyInput : : webapiFormatDeviceSettings ( SWGSDRangel : : SWGDeviceSettings & response , const AirspySettings & settings )
{
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 ) ;
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 ) ;
if ( response . getAirspySettings ( ) - > getFileRecordName ( ) ) {
* response . getAirspySettings ( ) - > getFileRecordName ( ) = settings . m_fileRecordName ;
} else {
response . getAirspySettings ( ) - > setFileRecordName ( new QString ( settings . m_fileRecordName ) ) ;
}
}
2018-05-25 19:43:28 -04:00
void AirspyInput : : webapiFormatDeviceReport ( SWGSDRangel : : SWGDeviceReport & response )
{
2018-05-27 13:54:33 -04:00
response . getAirspyReport ( ) - > setSampleRates ( new QList < SWGSDRangel : : SWGSampleRate * > ) ;
2018-05-25 19:43:28 -04:00
for ( std : : vector < uint32_t > : : const_iterator it = getSampleRates ( ) . begin ( ) ; it ! = getSampleRates ( ) . end ( ) ; + + it )
{
2018-05-27 13:54:33 -04:00
response . getAirspyReport ( ) - > getSampleRates ( ) - > append ( new SWGSDRangel : : SWGSampleRate ) ;
response . getAirspyReport ( ) - > getSampleRates ( ) - > back ( ) - > setRate ( * it ) ;
2018-05-25 19:43:28 -04:00
}
}
2018-12-25 04:38:31 -05:00
void AirspyInput : : webapiReverseSendSettings ( QList < QString > & deviceSettingsKeys , const AirspySettings & settings , bool force )
{
SWGSDRangel : : SWGDeviceSettings * swgDeviceSettings = new SWGSDRangel : : SWGDeviceSettings ( ) ;
swgDeviceSettings - > setTx ( 0 ) ;
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
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 ) ;
}
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 ) ;
}
if ( deviceSettingsKeys . contains ( " fileRecordName " ) | | force ) {
swgAirspySettings - > setFileRecordName ( new QString ( settings . m_fileRecordName ) ) ;
}
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 " ) ;
QBuffer * buffer = new QBuffer ( ) ;
buffer - > open ( ( QBuffer : : ReadWrite ) ) ;
buffer - > write ( swgDeviceSettings - > asJson ( ) . toUtf8 ( ) ) ;
buffer - > seek ( 0 ) ;
// Always use PATCH to avoid passing reverse API settings
m_networkManager - > sendCustomRequest ( m_networkRequest , " PATCH " , buffer ) ;
delete swgDeviceSettings ;
}
void AirspyInput : : webapiReverseSendStartStop ( bool start )
{
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 ) ) ;
if ( start ) {
m_networkManager - > sendCustomRequest ( m_networkRequest , " POST " ) ;
} else {
m_networkManager - > sendCustomRequest ( m_networkRequest , " DELETE " ) ;
}
}
void AirspyInput : : networkManagerFinished ( QNetworkReply * reply )
{
QNetworkReply : : NetworkError replyError = reply - > error ( ) ;
if ( replyError )
{
qWarning ( ) < < " AirspyInput::networkManagerFinished: "
< < " error( " < < ( int ) replyError
< < " ): " < < replyError
< < " : " < < reply - > errorString ( ) ;
return ;
}
QString answer = reply - > readAll ( ) ;
answer . chop ( 1 ) ; // remove last \n
qDebug ( " AirspyInput::networkManagerFinished: reply: \n %s " , answer . toStdString ( ) . c_str ( ) ) ;
}