1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-06-25 13:35:23 -04:00

Deep redesign: Better support for FCD dongles #9: use fcd_traits template instead of hardcoded values

This commit is contained in:
f4exb 2015-09-05 05:50:29 +02:00
parent f56a3d9385
commit 208d3deb6e
14 changed files with 154 additions and 34 deletions

View File

@ -330,3 +330,4 @@ qt5_use_modules(sdrangel Widgets Multimedia)
add_subdirectory(plugins) add_subdirectory(plugins)
add_subdirectory(fcdhid) add_subdirectory(fcdhid)
add_subdirectory(fcdlib)

25
fcdlib/CMakeLists.txt Normal file
View File

@ -0,0 +1,25 @@
project(fcdlib)
set(fcdlib_SOURCES
fcdtraits.cpp
)
set(fcdlib_HEADERS
fcdtraits.h
)
include_directories(
.
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/include-gpl
)
#add_definitions(-DQT_PLUGIN)
add_definitions(-DQT_SHARED)
add_library(fcdlib SHARED
${fcdlib_SOURCES}
)
target_link_libraries(fcdlib)

23
fcdlib/fcdtraits.cpp Normal file
View File

@ -0,0 +1,23 @@
/*
* fcdtraits.cpp
*
* Created on: Sep 5, 2015
* Author: f4exb
*/
#include "fcdtraits.h"
const char *fcd_traits<Pro>::alsaDeviceName = "hw:CARD=V10";
const char *fcd_traits<ProPlus>::alsaDeviceName = "hw:CARD=V20";
const char *fcd_traits<Pro>::interfaceIID = "org.osmocom.sdr.samplesource.fcdpro";
const char *fcd_traits<ProPlus>::interfaceIID = "org.osmocom.sdr.samplesource.fcdproplus";
const char *fcd_traits<Pro>::displayedName = "FunCube Dongle Pro";
const char *fcd_traits<ProPlus>::displayedName = "FunCube Dongle Pro+";
const char *fcd_traits<Pro>::pluginDisplayedName = "FunCube Pro Input";
const char *fcd_traits<ProPlus>::pluginDisplayedName = "FunCube Pro+ Input";
const char *fcd_traits<Pro>::pluginVersion = "---";
const char *fcd_traits<ProPlus>::pluginVersion = "---";

67
fcdlib/fcdtraits.h Normal file
View File

@ -0,0 +1,67 @@
/*
* fcdtraits.h
*
* Created on: 3 Sep 2015
* Author: egriffiths
*/
#ifndef FCDLIB_FCDTRAITS_H_
#define FCDLIB_FCDTRAITS_H_
#include <inttypes.h>
typedef enum
{
Pro,
ProPlus
} fcd_type;
template <fcd_type FCDType>
struct fcd_traits
{
static const uint16_t vendorId = 0x0;
static const uint16_t productId = 0x0;
static const int sampleRate = 48000;
static const int convBufSize = (1<<11);
static const char *alsaDeviceName;
static const char *interfaceIID;
static const char *displayedName;
static const char *pluginDisplayedName;
static const char *pluginVersion;
};
template<>
struct fcd_traits<Pro>
{
static const uint16_t vendorId = 0x04D8;
static const uint16_t productId = 0xFB56;
static const int sampleRate = 96000;
static const int convBufSize = (1<<11);
static const char *alsaDeviceName;
static const char *interfaceIID;
static const char *displayedName;
static const char *pluginDisplayedName;
static const char *pluginVersion;
};
template<>
struct fcd_traits<ProPlus>
{
static const uint16_t vendorId = 0x04D8;
static const uint16_t productId = 0xFB31;
static const int sampleRate = 192000;
static const int convBufSize = (1<<13);
static const char *alsaDeviceName;
static const char *interfaceIID;
static const char *displayedName;
static const char *pluginDisplayedName;
static const char *pluginVersion;
};
template <fcd_type FCDType> const char *fcd_traits<FCDType>::alsaDeviceName = "";
template <fcd_type FCDType> const char *fcd_traits<FCDType>::interfaceIID = "";
template <fcd_type FCDType> const char *fcd_traits<FCDType>::displayedName = "";
template <fcd_type FCDType> const char *fcd_traits<FCDType>::pluginDisplayedName = "";
template <fcd_type FCDType> const char *fcd_traits<FCDType>::pluginVersion = "---";
#endif /* FCDLIB_FCDTRAITS_H_ */

View File

@ -26,6 +26,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/include-gpl ${CMAKE_SOURCE_DIR}/include-gpl
${CMAKE_SOURCE_DIR}/fcdhid ${CMAKE_SOURCE_DIR}/fcdhid
${CMAKE_SOURCE_DIR}/fcdlib
) )
#include(${QT_USE_FILE}) #include(${QT_USE_FILE})
@ -47,6 +48,7 @@ target_link_libraries(inputfcdpro
${LIBUSB_LIBRARIES} ${LIBUSB_LIBRARIES}
asound asound
fcdhid fcdhid
fcdlib
sdrbase sdrbase
) )

View File

@ -26,6 +26,7 @@
#include "fcdprogui.h" #include "fcdprogui.h"
#include "fcdproserializer.h" #include "fcdproserializer.h"
#include "fcdprothread.h" #include "fcdprothread.h"
#include "fcdtraits.h"
MESSAGE_CLASS_DEFINITION(FCDProInput::MsgConfigureFCD, Message) MESSAGE_CLASS_DEFINITION(FCDProInput::MsgConfigureFCD, Message)
@ -113,7 +114,7 @@ FCDProInput::FCDProInput() :
m_dev(0), m_dev(0),
m_settings(), m_settings(),
m_FCDThread(0), m_FCDThread(0),
m_deviceDescription("Funcube Dongle Pro") m_deviceDescription(fcd_traits<Pro>::displayedName)
{ {
} }
@ -138,7 +139,7 @@ bool FCDProInput::start(int device)
return false; return false;
} }
m_dev = fcdOpen(0x04D8, 0xFB56, device); m_dev = fcdOpen(fcd_traits<Pro>::vendorId, fcd_traits<Pro>::productId, device);
if (m_dev == 0) if (m_dev == 0)
{ {
@ -197,7 +198,7 @@ const QString& FCDProInput::getDeviceDescription() const
int FCDProInput::getSampleRate() const int FCDProInput::getSampleRate() const
{ {
return 96000; return fcd_traits<Pro>::sampleRate;
} }
quint64 FCDProInput::getCenterFrequency() const quint64 FCDProInput::getCenterFrequency() const
@ -259,7 +260,7 @@ void FCDProInput::applySettings(const Settings& settings, bool force)
if (signalChange) if (signalChange)
{ {
DSPSignalNotification *notif = new DSPSignalNotification(96000, m_settings.centerFrequency); DSPSignalNotification *notif = new DSPSignalNotification(fcd_traits<Pro>::sampleRate, m_settings.centerFrequency);
getOutputMessageQueue()->push(notif); getOutputMessageQueue()->push(notif);
} }
} }

View File

@ -20,10 +20,11 @@
#include "util/simpleserializer.h" #include "util/simpleserializer.h"
#include "fcdproplugin.h" #include "fcdproplugin.h"
#include "fcdprogui.h" #include "fcdprogui.h"
#include "fcdtraits.h"
const PluginDescriptor FCDProPlugin::m_pluginDescriptor = { const PluginDescriptor FCDProPlugin::m_pluginDescriptor = {
QString("FunCube Pro Input"), QString(fcd_traits<Pro>::pluginDisplayedName),
QString("---"), QString(fcd_traits<Pro>::pluginVersion),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,
@ -44,7 +45,7 @@ void FCDProPlugin::initPlugin(PluginAPI* pluginAPI)
{ {
m_pluginAPI = pluginAPI; m_pluginAPI = pluginAPI;
m_pluginAPI->registerSampleSource("org.osmocom.sdr.samplesource.fcdpro", this); m_pluginAPI->registerSampleSource(fcd_traits<Pro>::interfaceIID, this);
} }
PluginInterface::SampleSourceDevices FCDProPlugin::enumSampleSources() PluginInterface::SampleSourceDevices FCDProPlugin::enumSampleSources()
@ -52,15 +53,15 @@ PluginInterface::SampleSourceDevices FCDProPlugin::enumSampleSources()
SampleSourceDevices result; SampleSourceDevices result;
int i = 1; int i = 1;
struct hid_device_info *device_info = hid_enumerate(0x04D8, 0xFB56); struct hid_device_info *device_info = hid_enumerate(fcd_traits<Pro>::vendorId, fcd_traits<Pro>::productId);
while (device_info != 0) while (device_info != 0)
{ {
QString serialNumber = QString::fromWCharArray(device_info->serial_number); QString serialNumber = QString::fromWCharArray(device_info->serial_number);
QString displayedName(QString("FunCube Dongle Pro #%1 ").arg(i) + serialNumber); QString displayedName(QString("%1 #%2 %3").arg(fcd_traits<Pro>::displayedName).arg(i).arg(serialNumber));
SimpleSerializer s(1); SimpleSerializer s(1);
s.writeS32(1, 0); s.writeS32(1, 0);
result.append(SampleSourceDevice(displayedName, "org.osmocom.sdr.samplesource.fcdpro", s.final())); result.append(SampleSourceDevice(displayedName, fcd_traits<Pro>::interfaceIID, s.final()));
device_info = device_info->next; device_info = device_info->next;
i++; i++;
@ -71,7 +72,7 @@ PluginInterface::SampleSourceDevices FCDProPlugin::enumSampleSources()
PluginGUI* FCDProPlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address) PluginGUI* FCDProPlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address)
{ {
if(sourceName == "org.osmocom.sdr.samplesource.fcdpro") if(sourceName == fcd_traits<Pro>::interfaceIID)
{ {
FCDProGui* gui = new FCDProGui(m_pluginAPI); FCDProGui* gui = new FCDProGui(m_pluginAPI);
m_pluginAPI->setInputGUI(gui); m_pluginAPI->setInputGUI(gui);

View File

@ -20,13 +20,13 @@
#include <errno.h> #include <errno.h>
#include "dsp/samplefifo.h" #include "dsp/samplefifo.h"
#include "fcdprothread.h" #include "fcdprothread.h"
#include "fcdproinput.h" #include "fcdtraits.h"
FCDProThread::FCDProThread(SampleFifo* sampleFifo, QObject* parent) : FCDProThread::FCDProThread(SampleFifo* sampleFifo, QObject* parent) :
QThread(parent), QThread(parent),
fcd_handle(NULL), fcd_handle(NULL),
m_running(false), m_running(false),
m_convertBuffer(FCD_BLOCKSIZE), m_convertBuffer(fcd_traits<Pro>::convBufSize),
m_sampleFifo(sampleFifo) m_sampleFifo(sampleFifo)
{ {
start(); start();
@ -58,7 +58,7 @@ void FCDProThread::stopWork()
void FCDProThread::run() void FCDProThread::run()
{ {
if ( !OpenSource("hw:CARD=V10") ) if ( !OpenSource(fcd_traits<Pro>::alsaDeviceName) )
{ {
qCritical() << "FCDThread::run: cannot open FCD sound card"; qCritical() << "FCDThread::run: cannot open FCD sound card";
return; return;
@ -69,7 +69,7 @@ void FCDProThread::run()
while(m_running) while(m_running)
{ {
if (work(FCD_BLOCKSIZE) < 0) if (work(fcd_traits<Pro>::convBufSize) < 0)
{ {
break; break;
} }

View File

@ -24,8 +24,6 @@
#include "dsp/inthalfbandfilter.h" #include "dsp/inthalfbandfilter.h"
#include <alsa/asoundlib.h> #include <alsa/asoundlib.h>
#define FCD_BLOCKSIZE (1<<11)
class FCDProThread : public QThread { class FCDProThread : public QThread {
Q_OBJECT Q_OBJECT

View File

@ -26,6 +26,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/include-gpl ${CMAKE_SOURCE_DIR}/include-gpl
${CMAKE_SOURCE_DIR}/fcdhid ${CMAKE_SOURCE_DIR}/fcdhid
${CMAKE_SOURCE_DIR}/fcdlib
) )
#include(${QT_USE_FILE}) #include(${QT_USE_FILE})
@ -47,6 +48,7 @@ target_link_libraries(inputfcdproplus
${LIBUSB_LIBRARIES} ${LIBUSB_LIBRARIES}
asound asound
fcdhid fcdhid
fcdlib
sdrbase sdrbase
) )

View File

@ -26,6 +26,7 @@
#include "fcdproplusgui.h" #include "fcdproplusgui.h"
#include "fcdproplusserializer.h" #include "fcdproplusserializer.h"
#include "fcdproplusthread.h" #include "fcdproplusthread.h"
#include "fcdtraits.h"
MESSAGE_CLASS_DEFINITION(FCDProPlusInput::MsgConfigureFCD, Message) MESSAGE_CLASS_DEFINITION(FCDProPlusInput::MsgConfigureFCD, Message)
//MESSAGE_CLASS_DEFINITION(FCDInput::MsgReportFCD, Message) //MESSAGE_CLASS_DEFINITION(FCDInput::MsgReportFCD, Message)
@ -114,7 +115,7 @@ FCDProPlusInput::FCDProPlusInput() :
m_dev(0), m_dev(0),
m_settings(), m_settings(),
m_FCDThread(0), m_FCDThread(0),
m_deviceDescription("Funcube Dongle Pro+") m_deviceDescription(fcd_traits<ProPlus>::displayedName)
{ {
} }
@ -139,7 +140,7 @@ bool FCDProPlusInput::start(int device)
return false; return false;
} }
m_dev = fcdOpen(0x04D8, 0xFB31, device); m_dev = fcdOpen(fcd_traits<ProPlus>::vendorId, fcd_traits<ProPlus>::productId, device);
if (m_dev == 0) if (m_dev == 0)
{ {
@ -198,7 +199,7 @@ const QString& FCDProPlusInput::getDeviceDescription() const
int FCDProPlusInput::getSampleRate() const int FCDProPlusInput::getSampleRate() const
{ {
return 192000; return fcd_traits<ProPlus>::sampleRate;
} }
quint64 FCDProPlusInput::getCenterFrequency() const quint64 FCDProPlusInput::getCenterFrequency() const
@ -260,7 +261,7 @@ void FCDProPlusInput::applySettings(const Settings& settings, bool force)
if (signalChange) if (signalChange)
{ {
DSPSignalNotification *notif = new DSPSignalNotification(192000, m_settings.centerFrequency); DSPSignalNotification *notif = new DSPSignalNotification(fcd_traits<ProPlus>::sampleRate, m_settings.centerFrequency);
getOutputMessageQueue()->push(notif); getOutputMessageQueue()->push(notif);
} }
} }

View File

@ -20,10 +20,11 @@
#include "util/simpleserializer.h" #include "util/simpleserializer.h"
#include "fcdproplusplugin.h" #include "fcdproplusplugin.h"
#include "fcdproplusgui.h" #include "fcdproplusgui.h"
#include "fcdtraits.h"
const PluginDescriptor FCDProPlusPlugin::m_pluginDescriptor = { const PluginDescriptor FCDProPlusPlugin::m_pluginDescriptor = {
QString("FunCube Pro+ Input"), QString(fcd_traits<ProPlus>::pluginDisplayedName),
QString("---"), QString(fcd_traits<ProPlus>::pluginVersion),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,
@ -44,7 +45,7 @@ void FCDProPlusPlugin::initPlugin(PluginAPI* pluginAPI)
{ {
m_pluginAPI = pluginAPI; m_pluginAPI = pluginAPI;
m_pluginAPI->registerSampleSource("org.osmocom.sdr.samplesource.fcdproplus", this); m_pluginAPI->registerSampleSource(fcd_traits<ProPlus>::interfaceIID, this);
} }
PluginInterface::SampleSourceDevices FCDProPlusPlugin::enumSampleSources() PluginInterface::SampleSourceDevices FCDProPlusPlugin::enumSampleSources()
@ -52,15 +53,15 @@ PluginInterface::SampleSourceDevices FCDProPlusPlugin::enumSampleSources()
SampleSourceDevices result; SampleSourceDevices result;
int i = 1; int i = 1;
struct hid_device_info *device_info = hid_enumerate(0x04D8, 0xFB31); struct hid_device_info *device_info = hid_enumerate(fcd_traits<ProPlus>::vendorId, fcd_traits<ProPlus>::productId);
while (device_info != 0) while (device_info != 0)
{ {
QString serialNumber = QString::fromWCharArray(device_info->serial_number); QString serialNumber = QString::fromWCharArray(device_info->serial_number);
QString displayedName(QString("FunCube Dongle Pro+ #%1 ").arg(i) + serialNumber); QString displayedName(QString("%1 #%2 %3").arg(fcd_traits<ProPlus>::displayedName).arg(i).arg(serialNumber));
SimpleSerializer s(1); SimpleSerializer s(1);
s.writeS32(1, 0); s.writeS32(1, 0);
result.append(SampleSourceDevice(displayedName, "org.osmocom.sdr.samplesource.fcdproplus", s.final())); result.append(SampleSourceDevice(displayedName, fcd_traits<ProPlus>::interfaceIID, s.final()));
device_info = device_info->next; device_info = device_info->next;
i++; i++;
@ -71,7 +72,7 @@ PluginInterface::SampleSourceDevices FCDProPlusPlugin::enumSampleSources()
PluginGUI* FCDProPlusPlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address) PluginGUI* FCDProPlusPlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address)
{ {
if(sourceName == "org.osmocom.sdr.samplesource.fcdproplus") if(sourceName == fcd_traits<ProPlus>::interfaceIID)
{ {
FCDProPlusGui* gui = new FCDProPlusGui(m_pluginAPI); FCDProPlusGui* gui = new FCDProPlusGui(m_pluginAPI);
m_pluginAPI->setInputGUI(gui); m_pluginAPI->setInputGUI(gui);

View File

@ -20,13 +20,13 @@
#include <errno.h> #include <errno.h>
#include "dsp/samplefifo.h" #include "dsp/samplefifo.h"
#include "fcdproplusthread.h" #include "fcdproplusthread.h"
#include "fcdproplusinput.h" #include "fcdtraits.h"
FCDProPlusThread::FCDProPlusThread(SampleFifo* sampleFifo, QObject* parent) : FCDProPlusThread::FCDProPlusThread(SampleFifo* sampleFifo, QObject* parent) :
QThread(parent), QThread(parent),
fcd_handle(NULL), fcd_handle(NULL),
m_running(false), m_running(false),
m_convertBuffer(FCD_BLOCKSIZE), m_convertBuffer(fcd_traits<ProPlus>::convBufSize),
m_sampleFifo(sampleFifo) m_sampleFifo(sampleFifo)
{ {
start(); start();
@ -58,7 +58,7 @@ void FCDProPlusThread::stopWork()
void FCDProPlusThread::run() void FCDProPlusThread::run()
{ {
if ( !OpenSource("hw:CARD=V20") ) if ( !OpenSource(fcd_traits<ProPlus>::alsaDeviceName) )
{ {
qCritical() << "FCDThread::run: cannot open FCD sound card"; qCritical() << "FCDThread::run: cannot open FCD sound card";
return; return;
@ -69,7 +69,7 @@ void FCDProPlusThread::run()
while(m_running) while(m_running)
{ {
if (work(FCD_BLOCKSIZE) < 0) if (work(fcd_traits<ProPlus>::convBufSize) < 0)
{ {
break; break;
} }

View File

@ -25,8 +25,6 @@
#include "dsp/inthalfbandfilter.h" #include "dsp/inthalfbandfilter.h"
#include <alsa/asoundlib.h> #include <alsa/asoundlib.h>
#define FCD_BLOCKSIZE (1<<13)
class FCDProPlusThread : public QThread { class FCDProPlusThread : public QThread {
Q_OBJECT Q_OBJECT