2016-05-15 19:12:55 -04:00
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2016 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/>. //
///////////////////////////////////////////////////////////////////////////////////
2016-10-17 18:03:51 -04:00
# include "device/devicesourceapi.h"
2016-05-16 10:37:07 -04:00
# include "plugin/plugingui.h"
2016-05-16 12:53:01 -04:00
# include "plugin/pluginapi.h"
# include "plugin/plugininterface.h"
2016-05-15 21:21:21 -04:00
# include "gui/glspectrum.h"
# include "gui/channelwindow.h"
2016-05-16 10:02:55 -04:00
# include "mainwindow.h"
2016-05-16 11:47:22 -04:00
# include "settings/preset.h"
2016-05-16 10:02:55 -04:00
2016-10-10 19:17:55 -04:00
DeviceSourceAPI : : DeviceSourceAPI ( MainWindow * mainWindow ,
2016-05-16 10:02:55 -04:00
int deviceTabIndex ,
2016-10-17 18:03:51 -04:00
DSPDeviceSourceEngine * deviceSourceEngine ,
2016-05-16 10:02:55 -04:00
GLSpectrum * glSpectrum ,
ChannelWindow * channelWindow ) :
m_mainWindow ( mainWindow ) ,
m_deviceTabIndex ( deviceTabIndex ) ,
2016-10-17 18:03:51 -04:00
m_deviceSourceEngine ( deviceSourceEngine ) ,
2016-05-15 21:21:21 -04:00
m_spectrum ( glSpectrum ) ,
2016-05-16 10:37:07 -04:00
m_channelWindow ( channelWindow ) ,
m_sampleSourceSequence ( 0 ) ,
m_sampleSourcePluginGUI ( 0 )
2016-05-15 19:12:55 -04:00
{
}
2016-10-10 19:17:55 -04:00
DeviceSourceAPI : : ~ DeviceSourceAPI ( )
2016-05-15 19:12:55 -04:00
{
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : addSink ( BasebandSampleSink * sink )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
m_deviceSourceEngine - > addSink ( sink ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : removeSink ( BasebandSampleSink * sink )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
m_deviceSourceEngine - > removeSink ( sink ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : addThreadedSink ( ThreadedBasebandSampleSink * sink )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
m_deviceSourceEngine - > addThreadedSink ( sink ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : removeThreadedSink ( ThreadedBasebandSampleSink * sink )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
m_deviceSourceEngine - > removeThreadedSink ( sink ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : setSource ( DeviceSampleSource * source )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
m_deviceSourceEngine - > setSource ( source ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
bool DeviceSourceAPI : : initAcquisition ( )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
return m_deviceSourceEngine - > initAcquisition ( ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
bool DeviceSourceAPI : : startAcquisition ( )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
return m_deviceSourceEngine - > startAcquisition ( ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : stopAcquisition ( )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
m_deviceSourceEngine - > stopAcquistion ( ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
DSPDeviceSourceEngine : : State DeviceSourceAPI : : state ( ) const
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
return m_deviceSourceEngine - > state ( ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
QString DeviceSourceAPI : : errorMessage ( )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
return m_deviceSourceEngine - > errorMessage ( ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
uint DeviceSourceAPI : : getDeviceUID ( ) const
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
return m_deviceSourceEngine - > getUID ( ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
MessageQueue * DeviceSourceAPI : : getDeviceInputMessageQueue ( )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
return m_deviceSourceEngine - > getInputMessageQueue ( ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
MessageQueue * DeviceSourceAPI : : getDeviceOutputMessageQueue ( )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
return m_deviceSourceEngine - > getOutputMessageQueue ( ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : configureCorrections ( bool dcOffsetCorrection , bool iqImbalanceCorrection )
2016-05-15 19:12:55 -04:00
{
2016-10-17 18:03:51 -04:00
m_deviceSourceEngine - > configureCorrections ( dcOffsetCorrection , iqImbalanceCorrection ) ;
2016-05-15 19:12:55 -04:00
}
2016-10-10 19:17:55 -04:00
GLSpectrum * DeviceSourceAPI : : getSpectrum ( )
2016-05-15 19:12:55 -04:00
{
return m_spectrum ;
}
2016-05-15 21:21:21 -04:00
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : addChannelMarker ( ChannelMarker * channelMarker )
2016-05-15 21:21:21 -04:00
{
m_spectrum - > addChannelMarker ( channelMarker ) ;
}
2016-10-10 19:17:55 -04:00
ChannelWindow * DeviceSourceAPI : : getChannelWindow ( )
2016-05-15 21:21:21 -04:00
{
return m_channelWindow ;
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : addRollupWidget ( QWidget * widget )
2016-05-15 21:21:21 -04:00
{
m_channelWindow - > addRollupWidget ( widget ) ;
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : setInputGUI ( QWidget * inputGUI , const QString & sourceDisplayName )
2016-05-16 10:02:55 -04:00
{
2016-10-17 18:03:51 -04:00
m_mainWindow - > setDeviceGUI ( m_deviceTabIndex , inputGUI , sourceDisplayName ) ;
2016-05-16 10:02:55 -04:00
}
2016-05-16 10:37:07 -04:00
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : setSampleSourceId ( const QString & id )
2016-05-16 10:37:07 -04:00
{
m_sampleSourceId = id ;
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : setSampleSourceSerial ( const QString & serial )
2016-05-16 10:37:07 -04:00
{
m_sampleSourceSerial = serial ;
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : setSampleSourceSequence ( int sequence )
2016-05-16 10:37:07 -04:00
{
m_sampleSourceSequence = sequence ;
2016-10-17 18:03:51 -04:00
m_deviceSourceEngine - > setSourceSequence ( sequence ) ;
2016-05-16 10:37:07 -04:00
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : setSampleSourcePluginGUI ( PluginGUI * gui )
2016-05-16 10:37:07 -04:00
{
2016-05-17 05:06:56 -04:00
if ( m_sampleSourcePluginGUI ! = 0 )
{
m_sampleSourcePluginGUI - > destroy ( ) ;
m_sampleSourceId . clear ( ) ;
}
2016-05-16 10:37:07 -04:00
m_sampleSourcePluginGUI = gui ;
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : registerChannelInstance ( const QString & channelName , PluginGUI * pluginGUI )
2016-05-16 12:53:01 -04:00
{
m_channelInstanceRegistrations . append ( ChannelInstanceRegistration ( channelName , pluginGUI ) ) ;
renameChannelInstances ( ) ;
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : removeChannelInstance ( PluginGUI * pluginGUI )
2016-05-16 12:53:01 -04:00
{
for ( ChannelInstanceRegistrations : : iterator it = m_channelInstanceRegistrations . begin ( ) ; it ! = m_channelInstanceRegistrations . end ( ) ; + + it )
{
if ( it - > m_gui = = pluginGUI )
{
m_channelInstanceRegistrations . erase ( it ) ;
break ;
}
}
renameChannelInstances ( ) ;
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : renameChannelInstances ( )
2016-05-16 12:53:01 -04:00
{
for ( int i = 0 ; i < m_channelInstanceRegistrations . count ( ) ; i + + )
{
m_channelInstanceRegistrations [ i ] . m_gui - > setName ( QString ( " %1:%2 " ) . arg ( m_channelInstanceRegistrations [ i ] . m_channelName ) . arg ( i ) ) ;
}
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : freeAll ( )
2016-05-16 10:37:07 -04:00
{
2016-05-16 15:51:53 -04:00
// while(!m_channelInstanceRegistrations.isEmpty())
// {
// ChannelInstanceRegistration reg(m_channelInstanceRegistrations.takeLast());
// reg.m_gui->destroy();
// }
2016-05-16 10:37:07 -04:00
2016-05-16 15:51:53 -04:00
for ( int i = 0 ; i < m_channelInstanceRegistrations . count ( ) ; i + + )
2016-05-16 12:53:01 -04:00
{
2016-10-17 18:03:51 -04:00
qDebug ( " DeviceSourceAPI::freeAll: destroying channel [%s] " , qPrintable ( m_channelInstanceRegistrations [ i ] . m_channelName ) ) ;
2016-05-16 15:51:53 -04:00
m_channelInstanceRegistrations [ i ] . m_gui - > destroy ( ) ;
2016-05-16 12:53:01 -04:00
}
2016-05-16 15:51:53 -04:00
2016-05-16 18:04:27 -04:00
if ( m_sampleSourcePluginGUI ! = 0 )
{
2016-10-17 18:03:51 -04:00
qDebug ( " DeviceSourceAPI::freeAll: destroying m_sampleSourcePluginGUI " ) ;
m_deviceSourceEngine - > setSource ( 0 ) ;
2016-05-16 18:04:27 -04:00
m_sampleSourcePluginGUI - > destroy ( ) ;
m_sampleSourcePluginGUI = 0 ;
m_sampleSourceId . clear ( ) ;
}
2016-05-16 10:37:07 -04:00
}
2016-05-16 11:47:22 -04:00
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : loadSourceSettings ( const Preset * preset )
2016-05-16 11:47:22 -04:00
{
2016-10-18 18:07:42 -04:00
if ( preset - > isSourcePreset ( ) )
2016-05-16 11:47:22 -04:00
{
2016-10-22 04:10:17 -04:00
qDebug ( " DeviceSourceAPI::loadSourceSettings: Loading preset [%s | %s] " , qPrintable ( preset - > getGroup ( ) ) , qPrintable ( preset - > getDescription ( ) ) ) ;
2016-05-16 11:47:22 -04:00
2016-10-18 18:07:42 -04:00
if ( m_sampleSourcePluginGUI ! = 0 )
2016-05-16 11:47:22 -04:00
{
2016-10-18 18:07:42 -04:00
const QByteArray * sourceConfig = preset - > findBestDeviceConfig ( m_sampleSourceId , m_sampleSourceSerial , m_sampleSourceSequence ) ;
if ( sourceConfig ! = 0 )
{
2016-10-22 04:10:17 -04:00
qDebug ( " DeviceSourceAPI::loadSettings: deserializing source %s " , qPrintable ( m_sampleSourceId ) ) ;
2016-10-18 18:07:42 -04:00
m_sampleSourcePluginGUI - > deserialize ( * sourceConfig ) ;
}
2016-05-16 11:47:22 -04:00
2016-10-18 18:07:42 -04:00
qint64 centerFrequency = preset - > getCenterFrequency ( ) ;
m_sampleSourcePluginGUI - > setCenterFrequency ( centerFrequency ) ;
}
}
else
{
2016-10-22 04:10:17 -04:00
qDebug ( " DeviceSourceAPI::loadSourceSettings: Loading preset [%s | %s] is not a source preset \n " , qPrintable ( preset - > getGroup ( ) ) , qPrintable ( preset - > getDescription ( ) ) ) ;
2016-05-16 11:47:22 -04:00
}
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : saveSourceSettings ( Preset * preset )
2016-05-16 11:47:22 -04:00
{
2016-10-18 18:07:42 -04:00
if ( preset - > isSourcePreset ( ) )
{
if ( m_sampleSourcePluginGUI ! = NULL )
{
2016-10-22 04:10:17 -04:00
qDebug ( " DeviceSourceAPI::saveSourceSettings: %s saved " , qPrintable ( m_sampleSourcePluginGUI - > getName ( ) ) ) ;
2016-10-18 18:07:42 -04:00
preset - > addOrUpdateDeviceConfig ( m_sampleSourceId , m_sampleSourceSerial , m_sampleSourceSequence , m_sampleSourcePluginGUI - > serialize ( ) ) ;
preset - > setCenterFrequency ( m_sampleSourcePluginGUI - > getCenterFrequency ( ) ) ;
}
2016-10-22 04:10:17 -04:00
else
{
qDebug ( " DeviceSourceAPI::saveSourceSettings: no source " ) ;
}
2016-10-18 18:07:42 -04:00
}
else
2016-05-16 11:47:22 -04:00
{
2016-10-22 04:10:17 -04:00
qDebug ( " DeviceSourceAPI::saveSourceSettings: not a source preset " ) ;
2016-05-16 11:47:22 -04:00
}
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : loadChannelSettings ( const Preset * preset , PluginAPI * pluginAPI )
2016-05-16 12:53:01 -04:00
{
2016-10-18 18:07:42 -04:00
if ( preset - > isSourcePreset ( ) )
2016-05-16 12:53:01 -04:00
{
2016-10-22 04:10:17 -04:00
qDebug ( " DeviceSourceAPI::loadChannelSettings: Loading preset [%s | %s] " , qPrintable ( preset - > getGroup ( ) ) , qPrintable ( preset - > getDescription ( ) ) ) ;
2016-05-16 12:53:01 -04:00
2016-10-18 18:07:42 -04:00
// Available channel plugins
PluginAPI : : ChannelRegistrations * channelRegistrations = pluginAPI - > getRxChannelRegistrations ( ) ;
2016-05-16 12:53:01 -04:00
2016-10-18 18:07:42 -04:00
// copy currently open channels and clear list
ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations ;
m_channelInstanceRegistrations . clear ( ) ;
2016-10-22 04:10:17 -04:00
qDebug ( " DeviceSourceAPI::loadChannelSettings: %d channel(s) in preset " , preset - > getChannelCount ( ) ) ;
2016-10-18 18:07:42 -04:00
for ( int i = 0 ; i < preset - > getChannelCount ( ) ; i + + )
2016-05-16 12:53:01 -04:00
{
2016-10-18 18:07:42 -04:00
const Preset : : ChannelConfig & channelConfig = preset - > getChannelConfig ( i ) ;
ChannelInstanceRegistration reg ;
2016-05-16 12:53:01 -04:00
2016-10-18 18:07:42 -04:00
// if we have one instance available already, use it
for ( int i = 0 ; i < openChannels . count ( ) ; i + + )
2016-05-16 12:53:01 -04:00
{
2016-10-18 18:07:42 -04:00
qDebug ( " DeviceSourceAPI::loadChannelSettings: channels compare [%s] vs [%s] " , qPrintable ( openChannels [ i ] . m_channelName ) , qPrintable ( channelConfig . m_channel ) ) ;
if ( openChannels [ i ] . m_channelName = = channelConfig . m_channel )
{
qDebug ( " DeviceSourceAPI::loadChannelSettings: channel [%s] found " , qPrintable ( openChannels [ i ] . m_channelName ) ) ;
reg = openChannels . takeAt ( i ) ;
m_channelInstanceRegistrations . append ( reg ) ;
break ;
}
2016-05-16 12:53:01 -04:00
}
2016-10-18 18:07:42 -04:00
// if we haven't one already, create one
2016-05-16 12:53:01 -04:00
2016-10-18 18:07:42 -04:00
if ( reg . m_gui = = NULL )
2016-05-16 12:53:01 -04:00
{
2016-10-18 18:07:42 -04:00
for ( int i = 0 ; i < channelRegistrations - > count ( ) ; i + + )
2016-05-16 12:53:01 -04:00
{
2016-10-18 18:07:42 -04:00
if ( ( * channelRegistrations ) [ i ] . m_channelName = = channelConfig . m_channel )
{
qDebug ( " DeviceSourceAPI::loadChannelSettings: creating new channel [%s] " , qPrintable ( channelConfig . m_channel ) ) ;
reg = ChannelInstanceRegistration ( channelConfig . m_channel , ( * channelRegistrations ) [ i ] . m_plugin - > createRxChannel ( channelConfig . m_channel , this ) ) ;
break ;
}
2016-05-16 12:53:01 -04:00
}
}
2016-10-18 18:07:42 -04:00
if ( reg . m_gui ! = NULL )
{
qDebug ( " DeviceSourceAPI::loadChannelSettings: deserializing channel [%s] " , qPrintable ( channelConfig . m_channel ) ) ;
reg . m_gui - > deserialize ( channelConfig . m_config ) ;
}
2016-05-16 12:53:01 -04:00
}
2016-10-18 18:07:42 -04:00
// everything, that is still "available" is not needed anymore
for ( int i = 0 ; i < openChannels . count ( ) ; i + + )
2016-05-16 12:53:01 -04:00
{
2016-10-18 18:07:42 -04:00
qDebug ( " DeviceSourceAPI::loadChannelSettings: destroying spare channel [%s] " , qPrintable ( openChannels [ i ] . m_channelName ) ) ;
openChannels [ i ] . m_gui - > destroy ( ) ;
2016-05-16 12:53:01 -04:00
}
2016-10-18 18:07:42 -04:00
renameChannelInstances ( ) ;
}
else
2016-05-16 12:53:01 -04:00
{
2016-10-22 04:10:17 -04:00
qDebug ( " DeviceSourceAPI::loadChannelSettings: Loading preset [%s | %s] not a source preset \n " , qPrintable ( preset - > getGroup ( ) ) , qPrintable ( preset - > getDescription ( ) ) ) ;
2016-05-16 12:53:01 -04:00
}
}
2016-10-10 19:17:55 -04:00
void DeviceSourceAPI : : saveChannelSettings ( Preset * preset )
2016-05-16 12:34:23 -04:00
{
2016-10-18 18:07:42 -04:00
if ( preset - > isSourcePreset ( ) )
{
qSort ( m_channelInstanceRegistrations . begin ( ) , m_channelInstanceRegistrations . end ( ) ) ; // sort by increasing delta frequency and type
2016-05-16 12:34:23 -04:00
2016-10-18 18:07:42 -04:00
for ( int i = 0 ; i < m_channelInstanceRegistrations . count ( ) ; i + + )
{
2016-10-22 04:10:17 -04:00
qDebug ( " DeviceSourceAPI::saveChannelSettings: channel [%s] saved " , qPrintable ( m_channelInstanceRegistrations [ i ] . m_channelName ) ) ;
2016-10-18 18:07:42 -04:00
preset - > addChannel ( m_channelInstanceRegistrations [ i ] . m_channelName , m_channelInstanceRegistrations [ i ] . m_gui - > serialize ( ) ) ;
}
}
else
2016-05-16 12:34:23 -04:00
{
2016-10-22 04:10:17 -04:00
qDebug ( " DeviceSourceAPI::saveChannelSettings: not a source preset " ) ;
2016-05-16 12:34:23 -04:00
}
}
2016-05-16 11:47:22 -04:00
// sort by increasing delta frequency and type (i.e. name)
2016-10-10 19:17:55 -04:00
bool DeviceSourceAPI : : ChannelInstanceRegistration : : operator < ( const ChannelInstanceRegistration & other ) const
2016-05-16 11:47:22 -04:00
{
if ( m_gui & & other . m_gui )
{
if ( m_gui - > getCenterFrequency ( ) = = other . m_gui - > getCenterFrequency ( ) )
{
return m_gui - > getName ( ) < other . m_gui - > getName ( ) ;
}
else
{
return m_gui - > getCenterFrequency ( ) < other . m_gui - > getCenterFrequency ( ) ;
}
}
else
{
return false ;
}
}