diff --git a/plugins/samplesource/fcdpro/fcdprogui.cpp b/plugins/samplesource/fcdpro/fcdprogui.cpp index 41b59210a..46f6cf6bf 100644 --- a/plugins/samplesource/fcdpro/fcdprogui.cpp +++ b/plugins/samplesource/fcdpro/fcdprogui.cpp @@ -35,6 +35,9 @@ FCDProGui::FCDProGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : m_sampleSource(NULL), m_lastEngineState((DSPDeviceSourceEngine::State)-1) { + m_sampleSource = new FCDProInput(m_deviceAPI); + m_deviceAPI->setSource(m_sampleSource); + ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::ReverseGold)); ui->centerFrequency->setValueRange(7, 64000U, 1700000U); @@ -141,9 +144,6 @@ FCDProGui::FCDProGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : displaySettings(); - m_sampleSource = new FCDProInput(m_deviceAPI); - m_deviceAPI->setSource(m_sampleSource); - char recFileNameCStr[30]; sprintf(recFileNameCStr, "test_%d.sdriq", m_deviceAPI->getDeviceUID()); m_fileSink = new FileRecord(std::string(recFileNameCStr)); diff --git a/plugins/samplesource/fcdpro/fcdproinput.cpp b/plugins/samplesource/fcdpro/fcdproinput.cpp index 87710d72b..9aab8420b 100644 --- a/plugins/samplesource/fcdpro/fcdproinput.cpp +++ b/plugins/samplesource/fcdpro/fcdproinput.cpp @@ -42,31 +42,61 @@ FCDProInput::FCDProInput(DeviceSourceAPI *deviceAPI) : m_deviceDescription(fcd_traits::displayedName), m_running(false) { + openDevice(); } FCDProInput::~FCDProInput() { - stop(); + if (m_running) stop(); + closeDevice(); +} + +bool FCDProInput::openDevice() +{ + int device = m_deviceAPI->getSampleSourceSequence(); + + if (m_dev != 0) + { + closeDevice(); + } + + qDebug() << "FCDProInput::openDevice with device #" << device; + + m_dev = fcdOpen(fcd_traits::vendorId, fcd_traits::productId, device); + + if (m_dev == 0) + { + qCritical("FCDProInput::start: could not open FCD"); + return false; + } + + return true; } bool FCDProInput::start(int device) { - qDebug() << "FCDProInput::start with device #" << device; + qDebug() << "FCDProInput::start"; - QMutexLocker mutexLocker(&m_mutex); +// QMutexLocker mutexLocker(&m_mutex); - if (m_FCDThread) - { - return false; - } + if (!m_dev) { + return false; + } - m_dev = fcdOpen(fcd_traits::vendorId, fcd_traits::productId, device); + if (m_running) stop(); - if (m_dev == 0) - { - qCritical("FCDProInput::start: could not open FCD"); - return false; - } +// if (m_FCDThread) +// { +// return false; +// } + +// m_dev = fcdOpen(fcd_traits::vendorId, fcd_traits::productId, device); +// +// if (m_dev == 0) +// { +// qCritical("FCDProInput::start: could not open FCD"); +// return false; +// } /* Apply settings before streaming to avoid bus contention; * there is very little spare bandwidth on a full speed USB device. @@ -89,16 +119,24 @@ bool FCDProInput::start(int device) m_FCDThread->startWork(); - mutexLocker.unlock(); +// mutexLocker.unlock(); applySettings(m_settings, true); qDebug("FCDProInput::started"); + m_running = true; + return true; } +void FCDProInput::closeDevice() +{ + fcdClose(m_dev); + m_dev = 0; +} + void FCDProInput::stop() { - QMutexLocker mutexLocker(&m_mutex); +// QMutexLocker mutexLocker(&m_mutex); if (m_FCDThread) { @@ -108,8 +146,9 @@ void FCDProInput::stop() m_FCDThread = 0; } - fcdClose(m_dev); - m_dev = 0; + m_running = false; +// fcdClose(m_dev); +// m_dev = 0; } const QString& FCDProInput::getDeviceDescription() const diff --git a/plugins/samplesource/fcdpro/fcdproinput.h b/plugins/samplesource/fcdpro/fcdproinput.h index 84c46d6b6..be4d24e85 100644 --- a/plugins/samplesource/fcdpro/fcdproinput.h +++ b/plugins/samplesource/fcdpro/fcdproinput.h @@ -87,6 +87,8 @@ public: void set_gain6(int index); private: + bool openDevice(); + void closeDevice(); void applySettings(const FCDProSettings& settings, bool force); void set_lo_ppm();