2015-09-24 02:50:24 +02: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/>. //
///////////////////////////////////////////////////////////////////////////////////
2017-01-08 00:33:11 +01:00
# include "hackrfinput.h"
2016-12-27 03:14:50 +01:00
2015-09-24 02:50:24 +02:00
# include <string.h>
# include <errno.h>
# include <QDebug>
2017-12-10 01:57:50 +01:00
# include "SWGDeviceSettings.h"
# include "SWGDeviceState.h"
2015-09-24 02:50:24 +02:00
# include "util/simpleserializer.h"
# include "dsp/dspcommands.h"
2015-09-27 12:50:38 +02:00
# include "dsp/dspengine.h"
2017-09-04 23:49:51 +02:00
# include "dsp/filerecord.h"
2017-01-08 00:33:11 +01:00
# include "device/devicesourceapi.h"
# include "device/devicesinkapi.h"
2017-01-08 02:48:01 +01:00
# include "hackrf/devicehackrfvalues.h"
2017-07-21 00:44:30 +02:00
# include "hackrf/devicehackrfshared.h"
2016-10-11 01:17:55 +02:00
2017-01-07 11:24:09 +01:00
# include "hackrfinputthread.h"
2015-09-24 02:50:24 +02:00
2015-09-27 07:37:15 +02:00
MESSAGE_CLASS_DEFINITION ( HackRFInput : : MsgConfigureHackRF , Message )
2015-09-24 02:50:24 +02:00
MESSAGE_CLASS_DEFINITION ( HackRFInput : : MsgReportHackRF , Message )
2017-09-04 23:49:51 +02:00
MESSAGE_CLASS_DEFINITION ( HackRFInput : : MsgFileRecord , Message )
2017-12-14 18:02:49 +01:00
MESSAGE_CLASS_DEFINITION ( HackRFInput : : MsgStartStop , Message )
2015-09-24 02:50:24 +02:00
2016-10-11 01:17:55 +02:00
HackRFInput : : HackRFInput ( DeviceSourceAPI * deviceAPI ) :
2016-05-16 02:14:36 +02:00
m_deviceAPI ( deviceAPI ) ,
2015-09-24 02:50:24 +02:00
m_settings ( ) ,
m_dev ( 0 ) ,
2015-09-27 07:37:15 +02:00
m_hackRFThread ( 0 ) ,
2017-04-14 00:14:40 +02:00
m_deviceDescription ( " HackRF " ) ,
m_running ( false )
2015-09-24 02:50:24 +02:00
{
2017-04-14 00:14:40 +02:00
openDevice ( ) ;
2017-09-04 23:49:51 +02:00
char recFileNameCStr [ 30 ] ;
sprintf ( recFileNameCStr , " test_%d.sdriq " , m_deviceAPI - > getDeviceUID ( ) ) ;
m_fileSink = new FileRecord ( std : : string ( recFileNameCStr ) ) ;
m_deviceAPI - > addSink ( m_fileSink ) ;
2017-01-08 00:33:11 +01:00
m_deviceAPI - > setBuddySharedPtr ( & m_sharedParams ) ;
2015-09-24 02:50:24 +02:00
}
HackRFInput : : ~ HackRFInput ( )
{
2017-04-14 00:14:40 +02:00
if ( m_running ) stop ( ) ;
2017-09-04 23:49:51 +02:00
m_deviceAPI - > removeSink ( m_fileSink ) ;
delete m_fileSink ;
2017-04-14 00:14:40 +02:00
closeDevice ( ) ;
2017-01-08 00:33:11 +01:00
m_deviceAPI - > setBuddySharedPtr ( 0 ) ;
2015-09-24 02:50:24 +02:00
}
2017-09-15 02:32:30 +02:00
void HackRFInput : : destroy ( )
{
delete this ;
}
2017-04-14 00:14:40 +02:00
bool HackRFInput : : openDevice ( )
2015-09-24 02:50:24 +02:00
{
2017-01-08 00:33:11 +01:00
if ( m_dev ! = 0 )
{
2017-04-14 00:14:40 +02:00
closeDevice ( ) ;
2017-01-08 00:33:11 +01:00
}
2017-04-14 00:14:40 +02:00
if ( ! m_sampleFifo . setSize ( 1 < < 19 ) )
{
qCritical ( " HackRFInput::start: could not allocate SampleFifo " ) ;
return false ;
}
2015-09-24 02:50:24 +02:00
2017-01-08 00:33:11 +01:00
if ( m_deviceAPI - > getSinkBuddies ( ) . size ( ) > 0 )
{
DeviceSinkAPI * buddy = m_deviceAPI - > getSinkBuddies ( ) [ 0 ] ;
DeviceHackRFParams * buddySharedParams = ( DeviceHackRFParams * ) buddy - > getBuddySharedPtr ( ) ;
if ( buddySharedParams = = 0 )
{
2017-04-14 00:14:40 +02:00
qCritical ( " HackRFInput::openDevice: could not get shared parameters from buddy " ) ;
2017-01-08 00:33:11 +01:00
return false ;
}
2017-04-14 01:41:02 +02:00
if ( buddySharedParams - > m_dev = = 0 ) // device is not opened by buddy
2017-01-08 00:33:11 +01:00
{
2017-04-14 01:41:02 +02:00
qCritical ( " HackRFInput::openDevice: could not get HackRF handle from buddy " ) ;
return false ;
2017-01-08 00:33:11 +01:00
}
2017-04-14 01:41:02 +02:00
m_sharedParams = * ( buddySharedParams ) ; // copy parameters from buddy
m_dev = m_sharedParams . m_dev ; // get HackRF handle
2017-01-08 00:33:11 +01:00
}
2017-04-14 01:41:02 +02:00
else
2017-01-08 00:33:11 +01:00
{
2017-04-14 02:09:36 +02:00
if ( ( m_dev = DeviceHackRF : : open_hackrf ( qPrintable ( m_deviceAPI - > getSampleSourceSerial ( ) ) ) ) = = 0 )
2017-01-08 00:33:11 +01:00
{
2017-04-14 02:09:36 +02:00
qCritical ( " HackRFInput::openDevice: could not open HackRF %s " , qPrintable ( m_deviceAPI - > getSampleSourceSerial ( ) ) ) ;
2017-01-08 00:33:11 +01:00
return false ;
}
m_sharedParams . m_dev = m_dev ;
}
2015-09-24 02:50:24 +02:00
2017-04-14 00:14:40 +02:00
return true ;
}
2017-12-25 09:10:19 +01:00
void HackRFInput : : init ( )
{
applySettings ( m_settings , true ) ;
}
2017-04-14 03:40:45 +02:00
bool HackRFInput : : start ( )
2017-04-14 00:14:40 +02:00
{
// QMutexLocker mutexLocker(&m_mutex);
2017-04-14 01:41:02 +02:00
if ( ! m_dev ) {
return false ;
2017-04-14 00:14:40 +02:00
}
if ( m_running ) stop ( ) ;
if ( ( m_hackRFThread = new HackRFInputThread ( m_dev , & m_sampleFifo ) ) = = 0 )
2015-09-24 02:50:24 +02:00
{
2015-09-27 07:37:15 +02:00
qFatal ( " HackRFInput::start: out of memory " ) ;
2015-09-24 02:50:24 +02:00
stop ( ) ;
return false ;
}
2017-01-08 00:33:11 +01:00
// mutexLocker.unlock();
2015-09-24 02:50:24 +02:00
applySettings ( m_settings , true ) ;
2017-04-14 00:14:40 +02:00
m_hackRFThread - > setSamplerate ( m_settings . m_devSampleRate ) ;
m_hackRFThread - > setLog2Decimation ( m_settings . m_log2Decim ) ;
m_hackRFThread - > setFcPos ( ( int ) m_settings . m_fcPos ) ;
2015-10-21 02:32:21 +02:00
m_hackRFThread - > startWork ( ) ;
2015-09-27 07:37:15 +02:00
qDebug ( " HackRFInput::startInput: started " ) ;
2017-04-14 00:14:40 +02:00
m_running = true ;
2015-09-24 02:50:24 +02:00
return true ;
}
2017-04-14 00:14:40 +02:00
void HackRFInput : : closeDevice ( )
2015-09-24 02:50:24 +02:00
{
2017-04-14 01:41:02 +02:00
if ( m_deviceAPI - > getSinkBuddies ( ) . size ( ) = = 0 )
2017-01-08 00:33:11 +01:00
{
2017-04-14 01:41:02 +02:00
qDebug ( " HackRFInput::closeDevice: closing device since Tx side is not open " ) ;
2017-01-08 00:33:11 +01:00
if ( m_dev ! = 0 ) // close BladeRF
{
hackrf_close ( m_dev ) ;
2017-04-14 01:49:48 +02:00
//hackrf_exit(); // TODO: this may not work if several HackRF Devices are running concurrently. It should be handled globally in the application
2017-01-08 00:33:11 +01:00
}
}
m_sharedParams . m_dev = 0 ;
m_dev = 0 ;
2017-04-14 00:14:40 +02:00
}
void HackRFInput : : stop ( )
{
qDebug ( " HackRFInput::stop " ) ;
// QMutexLocker mutexLocker(&m_mutex);
if ( m_hackRFThread ! = 0 )
{
m_hackRFThread - > stopWork ( ) ;
delete m_hackRFThread ;
m_hackRFThread = 0 ;
}
2017-01-08 00:33:11 +01:00
2017-04-14 00:14:40 +02:00
m_running = false ;
2015-09-24 02:50:24 +02:00
}
2017-12-28 03:21:48 +01:00
QByteArray HackRFInput : : serialize ( ) const
{
return m_settings . serialize ( ) ;
}
bool HackRFInput : : deserialize ( const QByteArray & data )
{
bool success = true ;
if ( ! m_settings . deserialize ( data ) )
{
m_settings . resetToDefaults ( ) ;
success = false ;
}
MsgConfigureHackRF * message = MsgConfigureHackRF : : create ( m_settings , true ) ;
m_inputMessageQueue . push ( message ) ;
if ( m_guiMessageQueue )
{
MsgConfigureHackRF * messageToGUI = MsgConfigureHackRF : : create ( m_settings , true ) ;
m_guiMessageQueue - > push ( messageToGUI ) ;
}
return success ;
}
2015-09-24 02:50:24 +02:00
const QString & HackRFInput : : getDeviceDescription ( ) const
{
return m_deviceDescription ;
}
int HackRFInput : : getSampleRate ( ) const
{
2017-01-08 02:48:01 +01:00
return ( m_settings . m_devSampleRate / ( 1 < < m_settings . m_log2Decim ) ) ;
2015-09-24 02:50:24 +02:00
}
quint64 HackRFInput : : getCenterFrequency ( ) const
{
return m_settings . m_centerFrequency ;
}
2017-12-28 03:21:48 +01:00
void HackRFInput : : setCenterFrequency ( qint64 centerFrequency )
{
HackRFInputSettings settings = m_settings ;
settings . m_centerFrequency = centerFrequency ;
MsgConfigureHackRF * message = MsgConfigureHackRF : : create ( settings , false ) ;
m_inputMessageQueue . push ( message ) ;
if ( m_guiMessageQueue )
{
MsgConfigureHackRF * messageToGUI = MsgConfigureHackRF : : create ( settings , false ) ;
m_guiMessageQueue - > push ( messageToGUI ) ;
}
}
2015-09-24 02:50:24 +02:00
bool HackRFInput : : handleMessage ( const Message & message )
{
2015-09-27 07:37:15 +02:00
if ( MsgConfigureHackRF : : match ( message ) )
2015-09-24 02:50:24 +02:00
{
2015-09-27 07:37:15 +02:00
MsgConfigureHackRF & conf = ( MsgConfigureHackRF & ) message ;
qDebug ( ) < < " HackRFInput::handleMessage: MsgConfigureHackRF " ;
2015-09-24 02:50:24 +02:00
2017-05-26 17:42:57 +02:00
bool success = applySettings ( conf . getSettings ( ) , conf . getForce ( ) ) ;
2015-09-24 02:50:24 +02:00
if ( ! success )
{
2015-09-27 07:37:15 +02:00
qDebug ( " HackRFInput::handleMessage: config error " ) ;
2015-09-24 02:50:24 +02:00
}
return true ;
}
2017-09-04 23:49:51 +02:00
else if ( MsgFileRecord : : match ( message ) )
{
MsgFileRecord & conf = ( MsgFileRecord & ) message ;
qDebug ( ) < < " HackRFInput::handleMessage: MsgFileRecord: " < < conf . getStartStop ( ) ;
if ( conf . getStartStop ( ) ) {
m_fileSink - > startRecording ( ) ;
} else {
m_fileSink - > stopRecording ( ) ;
}
return true ;
}
2017-12-14 18:02:49 +01:00
else if ( MsgStartStop : : match ( message ) )
{
MsgStartStop & cmd = ( MsgStartStop & ) message ;
qDebug ( ) < < " HackRFInput::handleMessage: MsgStartStop: " < < ( cmd . getStartStop ( ) ? " start " : " stop " ) ;
if ( cmd . getStartStop ( ) )
{
if ( m_deviceAPI - > initAcquisition ( ) )
{
m_deviceAPI - > startAcquisition ( ) ;
DSPEngine : : instance ( ) - > startAudioOutput ( ) ;
}
}
else
{
m_deviceAPI - > stopAcquisition ( ) ;
DSPEngine : : instance ( ) - > stopAudioOutput ( ) ;
}
return true ;
}
2015-09-24 02:50:24 +02:00
else
{
return false ;
}
}
2017-12-29 01:40:34 +01:00
void HackRFInput : : setDeviceCenterFrequency ( quint64 freq_hz )
2015-09-24 02:50:24 +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-24 02:50:24 +02:00
2015-09-27 07:37:15 +02:00
hackrf_error rc = ( hackrf_error ) hackrf_set_freq ( m_dev , static_cast < uint64_t > ( freq_hz ) ) ;
2015-09-24 02:50:24 +02:00
2015-09-27 07:37:15 +02:00
if ( rc ! = HACKRF_SUCCESS )
2015-09-24 02:50:24 +02:00
{
2017-12-29 01:40:34 +01:00
qWarning ( " HackRFInput::setDeviceCenterFrequency: could not frequency to %llu Hz " , freq_hz ) ;
2015-09-24 02:50:24 +02:00
}
else
{
2017-12-29 01:40:34 +01:00
qWarning ( " HackRFInput::setDeviceCenterFrequency: frequency set to %llu Hz " , freq_hz ) ;
2015-09-24 02:50:24 +02:00
}
}
2016-12-27 02:25:06 +01:00
bool HackRFInput : : applySettings ( const HackRFInputSettings & settings , bool force )
2015-09-24 02:50:24 +02:00
{
2017-01-08 00:33:11 +01:00
// QMutexLocker mutexLocker(&m_mutex);
2015-09-24 02:50:24 +02:00
bool forwardChange = false ;
2015-09-27 07:37:15 +02:00
hackrf_error rc ;
2015-09-24 02:50:24 +02:00
2015-09-27 07:37:15 +02:00
qDebug ( ) < < " HackRFInput::applySettings " ;
2015-09-24 02:50:24 +02:00
2017-11-06 02:12:44 +01:00
if ( ( m_settings . m_dcBlock ! = settings . m_dcBlock ) | |
( m_settings . m_iqCorrection ! = settings . m_iqCorrection ) | | force )
2015-09-30 04:39:09 +02:00
{
2017-12-29 02:44:35 +01:00
m_deviceAPI - > configureCorrections ( settings . m_dcBlock , settings . m_iqCorrection ) ;
2015-09-30 04:39:09 +02:00
}
2017-01-08 02:48:01 +01:00
if ( ( m_settings . m_devSampleRate ! = settings . m_devSampleRate ) | | force )
2015-09-24 02:50:24 +02:00
{
2017-01-08 04:13:20 +01:00
forwardChange = true ;
2015-09-24 02:50:24 +02:00
2017-01-08 04:13:20 +01:00
if ( m_dev ! = 0 )
2015-09-24 02:50:24 +02:00
{
2017-12-29 02:44:35 +01:00
rc = ( hackrf_error ) hackrf_set_sample_rate_manual ( m_dev , settings . m_devSampleRate , 1 ) ;
2015-09-24 02:50:24 +02:00
2015-09-27 07:37:15 +02:00
if ( rc ! = HACKRF_SUCCESS )
2015-09-24 02:50:24 +02:00
{
2017-12-29 02:44:35 +01:00
qCritical ( " HackRFInput::applySettings: could not set sample rate TO %llu S/s: %s " , settings . m_devSampleRate , hackrf_error_name ( rc ) ) ;
2015-09-24 02:50:24 +02:00
}
else
{
2017-04-14 00:14:40 +02:00
if ( m_hackRFThread ! = 0 )
{
2017-12-29 02:44:35 +01:00
qDebug ( " HackRFInput::applySettings: sample rate set to %llu S/s " , settings . m_devSampleRate ) ;
m_hackRFThread - > setSamplerate ( settings . m_devSampleRate ) ;
2017-04-14 00:14:40 +02:00
}
2015-09-24 02:50:24 +02:00
}
}
}
if ( ( m_settings . m_log2Decim ! = settings . m_log2Decim ) | | force )
{
forwardChange = true ;
2017-04-14 00:14:40 +02:00
if ( m_hackRFThread ! = 0 )
2015-09-24 02:50:24 +02:00
{
2017-12-29 02:44:35 +01:00
m_hackRFThread - > setLog2Decimation ( settings . m_log2Decim ) ;
qDebug ( ) < < " HackRFInput: set decimation to " < < ( 1 < < settings . m_log2Decim ) ;
2015-09-24 02:50:24 +02:00
}
}
2017-12-29 02:44:35 +01:00
qint64 deviceCenterFrequency = settings . m_centerFrequency ;
2015-09-24 02:50:24 +02:00
qint64 f_img = deviceCenterFrequency ;
2017-12-29 02:44:35 +01:00
quint32 devSampleRate = settings . m_devSampleRate ;
2015-09-24 02:50:24 +02:00
2017-07-21 00:44:30 +02:00
if ( force | | ( m_settings . m_centerFrequency ! = settings . m_centerFrequency ) ) // forward delta to buddy if necessary
{
if ( m_settings . m_linkTxFrequency & & ( m_deviceAPI - > getSinkBuddies ( ) . size ( ) > 0 ) )
{
DeviceSinkAPI * buddy = m_deviceAPI - > getSinkBuddies ( ) [ 0 ] ;
2017-09-18 00:01:29 +02:00
DeviceHackRFShared : : MsgConfigureFrequencyDelta * deltaMsg = DeviceHackRFShared : : MsgConfigureFrequencyDelta : : create (
settings . m_centerFrequency - m_settings . m_centerFrequency ) ;
2017-09-17 17:35:03 +02:00
if ( buddy - > getSampleSinkGUIMessageQueue ( ) )
{
2017-09-18 00:01:29 +02:00
DeviceHackRFShared : : MsgConfigureFrequencyDelta * deltaMsgToGUI = new DeviceHackRFShared : : MsgConfigureFrequencyDelta ( * deltaMsg ) ;
buddy - > getSampleSinkGUIMessageQueue ( ) - > push ( deltaMsgToGUI ) ;
2017-09-17 17:35:03 +02:00
}
2017-09-18 00:01:29 +02:00
buddy - > getSampleSinkInputMessageQueue ( ) - > push ( deltaMsg ) ;
2017-07-21 00:44:30 +02:00
}
}
2015-09-24 02:50:24 +02:00
if ( force | | ( m_settings . m_centerFrequency ! = settings . m_centerFrequency ) | |
2015-10-01 06:34:08 +02:00
( m_settings . m_LOppmTenths ! = settings . m_LOppmTenths ) | |
( m_settings . m_fcPos ! = settings . m_fcPos ) )
2015-09-24 02:50:24 +02:00
{
2016-12-27 02:25:06 +01:00
if ( ( m_settings . m_log2Decim = = 0 ) | | ( settings . m_fcPos = = HackRFInputSettings : : FC_POS_CENTER ) )
2015-09-24 02:50:24 +02:00
{
2017-12-29 02:44:35 +01:00
deviceCenterFrequency = settings . m_centerFrequency ;
2015-09-24 02:50:24 +02:00
f_img = deviceCenterFrequency ;
}
else
{
2016-12-27 02:25:06 +01:00
if ( settings . m_fcPos = = HackRFInputSettings : : FC_POS_INFRA )
2015-09-24 02:50:24 +02:00
{
2017-12-29 02:44:35 +01:00
deviceCenterFrequency = settings . m_centerFrequency + ( devSampleRate / 4 ) ;
2015-09-24 02:50:24 +02:00
f_img = deviceCenterFrequency + devSampleRate / 2 ;
}
2016-12-27 02:25:06 +01:00
else if ( settings . m_fcPos = = HackRFInputSettings : : FC_POS_SUPRA )
2015-09-24 02:50:24 +02:00
{
2017-12-29 02:44:35 +01:00
deviceCenterFrequency = settings . m_centerFrequency - ( devSampleRate / 4 ) ;
2015-09-24 02:50:24 +02:00
f_img = deviceCenterFrequency - devSampleRate / 2 ;
}
}
if ( m_dev ! = 0 )
{
2017-12-29 01:40:34 +01:00
setDeviceCenterFrequency ( deviceCenterFrequency ) ;
2015-09-24 02:50:24 +02:00
2017-12-29 02:44:35 +01:00
qDebug ( ) < < " HackRFInput::applySettings: center freq: " < < settings . m_centerFrequency < < " Hz "
2015-09-24 02:50:24 +02:00
< < " device center freq: " < < deviceCenterFrequency < < " Hz "
< < " device sample rate: " < < devSampleRate < < " Hz "
2017-12-29 02:44:35 +01:00
< < " Actual sample rate: " < < devSampleRate / ( 1 < < settings . m_log2Decim ) < < " Hz "
2015-09-24 02:50:24 +02:00
< < " img: " < < f_img < < " Hz " ;
}
forwardChange = true ;
}
2015-10-01 06:34:08 +02:00
if ( ( m_settings . m_fcPos ! = settings . m_fcPos ) | | force )
{
2017-04-14 00:14:40 +02:00
if ( m_hackRFThread ! = 0 )
2015-10-01 06:34:08 +02:00
{
2017-12-29 02:44:35 +01:00
m_hackRFThread - > setFcPos ( ( int ) settings . m_fcPos ) ;
qDebug ( ) < < " HackRFInput: set fc pos (enum) to " < < ( int ) settings . m_fcPos ;
2015-10-01 06:34:08 +02:00
}
}
2015-09-24 02:50:24 +02:00
if ( ( m_settings . m_lnaGain ! = settings . m_lnaGain ) | | force )
{
if ( m_dev ! = 0 )
{
2017-12-29 02:44:35 +01:00
rc = ( hackrf_error ) hackrf_set_lna_gain ( m_dev , settings . m_lnaGain ) ;
2015-09-24 02:50:24 +02:00
2015-09-27 07:37:15 +02:00
if ( rc ! = HACKRF_SUCCESS )
2015-09-24 02:50:24 +02:00
{
2015-09-27 07:37:15 +02:00
qDebug ( " HackRFInput::applySettings: airspy_set_lna_gain failed: %s " , hackrf_error_name ( rc ) ) ;
2015-09-24 02:50:24 +02:00
}
else
{
2017-12-29 02:44:35 +01:00
qDebug ( ) < < " HackRFInput:applySettings: LNA gain set to " < < settings . m_lnaGain ;
2015-09-24 02:50:24 +02:00
}
}
}
2015-09-27 07:37:15 +02:00
if ( ( m_settings . m_vgaGain ! = settings . m_vgaGain ) | | force )
2015-09-24 02:50:24 +02:00
{
if ( m_dev ! = 0 )
{
2017-12-29 02:44:35 +01:00
rc = ( hackrf_error ) hackrf_set_vga_gain ( m_dev , settings . m_vgaGain ) ;
2015-09-24 02:50:24 +02:00
2015-09-27 07:37:15 +02:00
if ( rc ! = HACKRF_SUCCESS )
2015-09-24 02:50:24 +02:00
{
2015-09-27 07:37:15 +02:00
qDebug ( " HackRFInput::applySettings: hackrf_set_vga_gain failed: %s " , hackrf_error_name ( rc ) ) ;
2015-09-24 02:50:24 +02:00
}
else
{
2017-12-29 02:44:35 +01:00
qDebug ( ) < < " HackRFInput:applySettings: VGA gain set to " < < settings . m_vgaGain ;
2015-09-24 02:50:24 +02:00
}
}
}
2017-01-08 02:48:01 +01:00
if ( ( m_settings . m_bandwidth ! = settings . m_bandwidth ) | | force )
2015-09-24 02:50:24 +02:00
{
2017-01-08 04:13:20 +01:00
if ( m_dev ! = 0 )
2015-09-24 02:50:24 +02:00
{
2017-12-29 02:44:35 +01:00
uint32_t bw_index = hackrf_compute_baseband_filter_bw_round_down_lt ( settings . m_bandwidth + 1 ) ; // +1 so the round down to lower than yields desired bandwidth
2015-09-27 07:37:15 +02:00
rc = ( hackrf_error ) hackrf_set_baseband_filter_bandwidth ( m_dev , bw_index ) ;
2015-09-24 02:50:24 +02:00
2015-09-27 07:37:15 +02:00
if ( rc ! = HACKRF_SUCCESS )
2015-09-24 02:50:24 +02:00
{
2015-09-27 07:37:15 +02:00
qDebug ( " HackRFInput::applySettings: hackrf_set_baseband_filter_bandwidth failed: %s " , hackrf_error_name ( rc ) ) ;
2015-09-24 02:50:24 +02:00
}
else
{
2017-12-29 02:44:35 +01:00
qDebug ( ) < < " HackRFInput:applySettings: Baseband BW filter set to " < < settings . m_bandwidth < < " Hz " ;
2015-09-24 02:50:24 +02:00
}
}
}
if ( ( m_settings . m_biasT ! = settings . m_biasT ) | | force )
{
if ( m_dev ! = 0 )
{
2017-12-29 02:44:35 +01:00
rc = ( hackrf_error ) hackrf_set_antenna_enable ( m_dev , ( settings . m_biasT ? 1 : 0 ) ) ;
2015-09-24 02:50:24 +02:00
2015-09-27 07:37:15 +02:00
if ( rc ! = HACKRF_SUCCESS )
2015-09-24 02:50:24 +02:00
{
2015-09-27 11:27:02 +02:00
qDebug ( " HackRFInput::applySettings: hackrf_set_antenna_enable failed: %s " , hackrf_error_name ( rc ) ) ;
2015-09-24 02:50:24 +02:00
}
else
{
2017-12-29 02:44:35 +01:00
qDebug ( ) < < " HackRFInput:applySettings: bias tee set to " < < settings . m_biasT ;
2015-09-24 02:50:24 +02:00
}
}
}
2015-09-27 11:27:02 +02:00
if ( ( m_settings . m_lnaExt ! = settings . m_lnaExt ) | | force )
{
if ( m_dev ! = 0 )
{
2017-12-29 02:44:35 +01:00
rc = ( hackrf_error ) hackrf_set_amp_enable ( m_dev , ( settings . m_lnaExt ? 1 : 0 ) ) ;
2015-09-27 11:27:02 +02:00
if ( rc ! = HACKRF_SUCCESS )
{
qDebug ( " HackRFInput::applySettings: hackrf_set_amp_enable failed: %s " , hackrf_error_name ( rc ) ) ;
}
else
{
2017-12-29 02:44:35 +01:00
qDebug ( ) < < " HackRFInput:applySettings: extra LNA set to " < < settings . m_lnaExt ;
2015-09-27 11:27:02 +02:00
}
}
}
2015-09-24 02:50:24 +02:00
if ( forwardChange )
{
2017-12-29 02:44:35 +01:00
int sampleRate = devSampleRate / ( 1 < < settings . m_log2Decim ) ;
DSPSignalNotification * notif = new DSPSignalNotification ( sampleRate , settings . m_centerFrequency ) ;
2017-09-04 23:49:51 +02:00
m_fileSink - > handleMessage ( * notif ) ; // forward to file sink
2017-09-13 23:40:06 +02:00
m_deviceAPI - > getDeviceEngineInputMessageQueue ( ) - > push ( notif ) ;
2015-09-24 02:50:24 +02:00
}
2017-12-29 02:44:35 +01:00
m_settings = settings ;
qDebug ( ) < < " HackRFInput::applySettings: "
< < " m_centerFrequency: " < < m_settings . m_centerFrequency < < " Hz "
< < " m_LOppmTenths: " < < m_settings . m_LOppmTenths
< < " m_bandwidth: " < < m_settings . m_bandwidth
< < " m_lnaGain: " < < m_settings . m_lnaGain
< < " m_vgaGain: " < < m_settings . m_vgaGain
< < " m_log2Decim: " < < m_settings . m_log2Decim
< < " m_fcPos: " < < m_settings . m_fcPos
< < " m_devSampleRate: " < < m_settings . m_devSampleRate
< < " m_biasT: " < < m_settings . m_biasT
< < " m_lnaExt: " < < m_settings . m_lnaExt
< < " m_dcBlock: " < < m_settings . m_dcBlock
< < " m_linkTxFrequency: " < < m_settings . m_linkTxFrequency ;
2017-01-08 02:48:01 +01:00
2015-09-24 02:50:24 +02:00
return true ;
}
2017-12-29 01:40:34 +01:00
int HackRFInput : : webapiSettingsGet (
SWGSDRangel : : SWGDeviceSettings & response ,
QString & errorMessage __attribute__ ( ( unused ) ) )
{
response . setHackRfInputSettings ( new SWGSDRangel : : SWGHackRFInputSettings ( ) ) ;
webapiFormatDeviceSettings ( response , m_settings ) ;
return 200 ;
}
int HackRFInput : : webapiSettingsPutPatch (
bool force ,
const QStringList & deviceSettingsKeys ,
SWGSDRangel : : SWGDeviceSettings & response , // query + response
QString & errorMessage __attribute__ ( ( unused ) ) )
{
HackRFInputSettings settings = m_settings ;
if ( deviceSettingsKeys . contains ( " centerFrequency " ) ) {
settings . m_centerFrequency = response . getHackRfInputSettings ( ) - > getCenterFrequency ( ) ;
}
if ( deviceSettingsKeys . contains ( " LOppmTenths " ) ) {
settings . m_LOppmTenths = response . getHackRfInputSettings ( ) - > getLOppmTenths ( ) ;
}
if ( deviceSettingsKeys . contains ( " bandwidth " ) ) {
settings . m_bandwidth = response . getHackRfInputSettings ( ) - > getBandwidth ( ) ;
}
if ( deviceSettingsKeys . contains ( " lnaGain " ) ) {
settings . m_lnaGain = response . getHackRfInputSettings ( ) - > getLnaGain ( ) ;
}
if ( deviceSettingsKeys . contains ( " vgaGain " ) ) {
settings . m_vgaGain = response . getHackRfInputSettings ( ) - > getVgaGain ( ) ;
}
2017-12-29 02:44:35 +01:00
if ( deviceSettingsKeys . contains ( " log2Decim " ) ) {
2017-12-29 01:40:34 +01:00
settings . m_log2Decim = response . getHackRfInputSettings ( ) - > getLog2Decim ( ) ;
}
if ( deviceSettingsKeys . contains ( " devSampleRate " ) ) {
settings . m_devSampleRate = response . getHackRfInputSettings ( ) - > getDevSampleRate ( ) ;
}
if ( deviceSettingsKeys . contains ( " biasT " ) ) {
settings . m_biasT = response . getHackRfInputSettings ( ) - > getBiasT ( ) ! = 0 ;
}
if ( deviceSettingsKeys . contains ( " lnaExt " ) ) {
settings . m_lnaExt = response . getHackRfInputSettings ( ) - > getLnaExt ( ) ! = 0 ;
}
if ( deviceSettingsKeys . contains ( " dcBlock " ) ) {
settings . m_dcBlock = response . getHackRfInputSettings ( ) - > getDcBlock ( ) ! = 0 ;
}
if ( deviceSettingsKeys . contains ( " iqCorrection " ) ) {
settings . m_iqCorrection = response . getHackRfInputSettings ( ) - > getIqCorrection ( ) ! = 0 ;
}
if ( deviceSettingsKeys . contains ( " linkTxFrequency " ) ) {
settings . m_linkTxFrequency = response . getHackRfInputSettings ( ) - > getLinkTxFrequency ( ) ! = 0 ;
}
MsgConfigureHackRF * msg = MsgConfigureHackRF : : create ( settings , force ) ;
m_inputMessageQueue . push ( msg ) ;
if ( m_guiMessageQueue ) // forward to GUI if any
{
MsgConfigureHackRF * msgToGUI = MsgConfigureHackRF : : create ( settings , force ) ;
m_guiMessageQueue - > push ( msgToGUI ) ;
}
webapiFormatDeviceSettings ( response , settings ) ;
return 200 ;
}
void HackRFInput : : webapiFormatDeviceSettings ( SWGSDRangel : : SWGDeviceSettings & response , const HackRFInputSettings & settings )
{
response . getHackRfInputSettings ( ) - > setCenterFrequency ( settings . m_centerFrequency ) ;
response . getHackRfInputSettings ( ) - > setLOppmTenths ( settings . m_LOppmTenths ) ;
response . getHackRfInputSettings ( ) - > setBandwidth ( settings . m_bandwidth ) ;
response . getHackRfInputSettings ( ) - > setLnaGain ( settings . m_lnaGain ) ;
response . getHackRfInputSettings ( ) - > setVgaGain ( settings . m_vgaGain ) ;
response . getHackRfInputSettings ( ) - > setLog2Decim ( settings . m_log2Decim ) ;
response . getHackRfInputSettings ( ) - > setFcPos ( settings . m_fcPos ) ;
response . getHackRfInputSettings ( ) - > setDevSampleRate ( settings . m_devSampleRate ) ;
response . getHackRfInputSettings ( ) - > setBiasT ( settings . m_biasT ? 1 : 0 ) ;
response . getHackRfInputSettings ( ) - > setLnaExt ( settings . m_lnaExt ? 1 : 0 ) ;
response . getHackRfInputSettings ( ) - > setDcBlock ( settings . m_dcBlock ? 1 : 0 ) ;
response . getHackRfInputSettings ( ) - > setIqCorrection ( settings . m_iqCorrection ? 1 : 0 ) ;
response . getHackRfInputSettings ( ) - > setLinkTxFrequency ( settings . m_linkTxFrequency ? 1 : 0 ) ;
}
2017-12-10 01:57:50 +01:00
int HackRFInput : : webapiRunGet (
SWGSDRangel : : SWGDeviceState & response ,
QString & errorMessage __attribute__ ( ( unused ) ) )
{
m_deviceAPI - > getDeviceEngineStateStr ( * response . getState ( ) ) ;
return 200 ;
}
int HackRFInput : : webapiRun (
bool run ,
SWGSDRangel : : SWGDeviceState & response ,
QString & errorMessage __attribute__ ( ( unused ) ) )
{
2017-12-14 23:29:12 +01:00
m_deviceAPI - > getDeviceEngineStateStr ( * response . getState ( ) ) ;
2017-12-14 18:02:49 +01:00
MsgStartStop * message = MsgStartStop : : create ( run ) ;
m_inputMessageQueue . push ( message ) ;
if ( m_guiMessageQueue ) // forward to GUI if any
2017-12-10 01:57:50 +01:00
{
2017-12-14 18:02:49 +01:00
MsgStartStop * msgToGUI = MsgStartStop : : create ( run ) ;
m_guiMessageQueue - > push ( msgToGUI ) ;
2017-12-10 01:57:50 +01:00
}
return 200 ;
}
2017-01-07 11:24:09 +01:00
//hackrf_device *HackRFInput::open_hackrf_from_sequence(int sequence)
//{
// hackrf_device_list_t *hackrf_devices = hackrf_device_list();
// hackrf_device *hackrf_ptr;
// hackrf_error rc;
//
// rc = (hackrf_error) hackrf_device_list_open(hackrf_devices, sequence, &hackrf_ptr);
//
// if (rc == HACKRF_SUCCESS)
// {
// return hackrf_ptr;
// }
// else
// {
// return 0;
// }
//}