From 3edaa4fdeffb3a74a207a113f95bbbc082836aa6 Mon Sep 17 00:00:00 2001 From: Adrian Suciu Date: Wed, 18 Sep 2024 18:23:16 +0300 Subject: [PATCH] adc: disconnect on run failure Signed-off-by: Adrian Suciu --- gr-util/src/grtopblock.cpp | 2 +- iioutil/include/iioutil/iiopingtask.h | 1 + iioutil/src/iiopingtask.cpp | 7 ++++++- plugins/adc/src/adcacquisitionmanager.cpp | 10 ++++++++++ plugins/adc/src/adcacquisitionmanager.h | 3 +++ plugins/adc/src/adcinstrumentcontroller.cpp | 5 ++++- plugins/adc/src/adcinstrumentcontroller.h | 3 ++- plugins/adc/src/adcplugin.cpp | 5 +++++ plugins/adc/src/adctimeinstrumentcontroller.h | 1 + plugins/adc/src/freq/grfftsinkcomponent.cpp | 7 ++++++- plugins/adc/src/freq/grfftsinkcomponent.h | 2 +- plugins/adc/src/time/grtimesinkcomponent.cpp | 7 ++++++- plugins/adc/src/time/grtimesinkcomponent.h | 2 +- plugins/adc/src/toolcomponent.h | 2 +- 14 files changed, 48 insertions(+), 9 deletions(-) diff --git a/gr-util/src/grtopblock.cpp b/gr-util/src/grtopblock.cpp index 09e8a36fa..1b91a5161 100644 --- a/gr-util/src/grtopblock.cpp +++ b/gr-util/src/grtopblock.cpp @@ -17,7 +17,7 @@ GRTopBlock::GRTopBlock(QString name, QObject *parent) QString topblockname = m_name + QString::number(topblockid); topblockid++; qInfo() << "building" << topblockname; - top = gr::make_top_block(topblockname.toStdString(), false); + top = gr::make_top_block(topblockname.toStdString(), true); QObject::connect(this, SIGNAL(requestRebuild()), this, SLOT(rebuild()), Qt::QueuedConnection); } diff --git a/iioutil/include/iioutil/iiopingtask.h b/iioutil/include/iioutil/iiopingtask.h index 41e289e32..17898b08c 100644 --- a/iioutil/include/iioutil/iiopingtask.h +++ b/iioutil/include/iioutil/iiopingtask.h @@ -19,6 +19,7 @@ class SCOPY_IIOUTIL_EXPORT IIOPingTask : public PingTask ~IIOPingTask(); virtual void run() override; virtual bool ping() override; + static bool pingCtx(iio_context *ctx); protected: iio_context *m_ctx; diff --git a/iioutil/src/iiopingtask.cpp b/iioutil/src/iiopingtask.cpp index e5179fedf..490310e5a 100644 --- a/iioutil/src/iiopingtask.cpp +++ b/iioutil/src/iiopingtask.cpp @@ -24,7 +24,12 @@ void IIOPingTask::run() bool IIOPingTask::ping() { - auto dev = iio_context_get_device(m_ctx, 0); + return pingCtx(m_ctx); +} + +bool IIOPingTask::pingCtx(iio_context *ctx) +{ + auto dev = iio_context_get_device(ctx, 0); const iio_device *test_device = nullptr; int ret = iio_device_get_trigger(dev, &test_device); diff --git a/plugins/adc/src/adcacquisitionmanager.cpp b/plugins/adc/src/adcacquisitionmanager.cpp index f73bdced8..036d8a80a 100644 --- a/plugins/adc/src/adcacquisitionmanager.cpp +++ b/plugins/adc/src/adcacquisitionmanager.cpp @@ -48,6 +48,16 @@ GRTopBlock *GRTopBlockNode::src() const { return m_src; } SyncController *GRTopBlockNode::sync() const { return m_sync; } +iio_context * GRTopBlockNode::ctx() const +{ + return m_ctx; +} + +void GRTopBlockNode::setCtx(iio_context *ctx) +{ + m_ctx = ctx; +} + AcqTreeNode::AcqTreeNode(QString name, QObject *parent) : QObject(parent) { diff --git a/plugins/adc/src/adcacquisitionmanager.h b/plugins/adc/src/adcacquisitionmanager.h index 38a873cfa..50771c429 100644 --- a/plugins/adc/src/adcacquisitionmanager.h +++ b/plugins/adc/src/adcacquisitionmanager.h @@ -60,10 +60,13 @@ class SCOPY_ADC_EXPORT GRTopBlockNode : public AcqTreeNode ~GRTopBlockNode(); GRTopBlock *src() const; SyncController *sync() const; + iio_context * ctx() const; + void setCtx(iio_context *ctx); private: GRTopBlock *m_src; SyncController *m_sync; + iio_context* m_ctx; }; class SCOPY_ADC_EXPORT GRIIODeviceSourceNode : public AcqTreeNode diff --git a/plugins/adc/src/adcinstrumentcontroller.cpp b/plugins/adc/src/adcinstrumentcontroller.cpp index bd0ed224f..de143c076 100644 --- a/plugins/adc/src/adcinstrumentcontroller.cpp +++ b/plugins/adc/src/adcinstrumentcontroller.cpp @@ -82,7 +82,10 @@ void ADCInstrumentController::onStop() void ADCInstrumentController::start() { ResourceManager::open("adc", this); - m_dataProvider->start(); + bool ret = m_dataProvider->start(); + if(!ret) { + Q_EMIT requestDisconnect(); + } } void ADCInstrumentController::stop() diff --git a/plugins/adc/src/adcinstrumentcontroller.h b/plugins/adc/src/adcinstrumentcontroller.h index f1b0a3bb9..f0e2d13ba 100644 --- a/plugins/adc/src/adcinstrumentcontroller.h +++ b/plugins/adc/src/adcinstrumentcontroller.h @@ -4,11 +4,11 @@ #include "toolcomponent.h" #include "scopy-adc_export.h" #include "timeplotcomponent.h" -#include "timeplotmanagersettings.h" #include "measurecomponent.h" #include #include #include +#include "plotmanager.h" namespace scopy { namespace adc { @@ -58,6 +58,7 @@ protected Q_SLOTS: void requestStop(); void requestStartLater(); void requestStopLater(); + void requestDisconnect(); protected: void setupChannelMeasurement(PlotManager *c, ChannelComponent *ch); diff --git a/plugins/adc/src/adcplugin.cpp b/plugins/adc/src/adcplugin.cpp index 3b603a418..1fea675ff 100644 --- a/plugins/adc/src/adcplugin.cpp +++ b/plugins/adc/src/adcplugin.cpp @@ -153,6 +153,7 @@ void ADCPlugin::createGRIIOTreeNode(GRTopBlockNode *ctxNode, iio_context *ctx) { int devCount = iio_context_get_devices_count(ctx); qDebug(CAT_ADCPLUGIN) << " Found " << devCount << "devices"; + ctxNode->setCtx(ctx); for(int i = 0; i < devCount; i++) { iio_device *dev = iio_context_get_device(ctx, i); QString dev_name = QString::fromLocal8Bit(iio_device_get_name(dev)); @@ -255,6 +256,8 @@ void ADCPlugin::newInstrument(ADCInstrumentType t, AcqTreeNode *root) } deleteInstrument(t); }); + + connect(adc, &ADCInstrumentController::requestDisconnect, this, &ADCPlugin::disconnectDevice, Qt::QueuedConnection); m_ctrls.append(adc); } else if(t == FREQUENCY) { @@ -286,6 +289,8 @@ void ADCPlugin::newInstrument(ADCInstrumentType t, AcqTreeNode *root) } deleteInstrument(t); }); + + connect(adc, &ADCInstrumentController::requestDisconnect, this, &ADCPlugin::disconnectDevice, Qt::QueuedConnection); m_ctrls.append(adc); } else { return; diff --git a/plugins/adc/src/adctimeinstrumentcontroller.h b/plugins/adc/src/adctimeinstrumentcontroller.h index 7eaf51cfd..e610b5694 100644 --- a/plugins/adc/src/adctimeinstrumentcontroller.h +++ b/plugins/adc/src/adctimeinstrumentcontroller.h @@ -3,6 +3,7 @@ #include "scopy-adc_export.h" #include "adcinstrumentcontroller.h" +#include "timeplotmanagersettings.h" namespace scopy { namespace adc { diff --git a/plugins/adc/src/freq/grfftsinkcomponent.cpp b/plugins/adc/src/freq/grfftsinkcomponent.cpp index f46e9dc3a..5190e9eb8 100644 --- a/plugins/adc/src/freq/grfftsinkcomponent.cpp +++ b/plugins/adc/src/freq/grfftsinkcomponent.cpp @@ -1,6 +1,7 @@ #include "grfftsinkcomponent.h" #include #include +#include "iioutil/iiopingtask.h" Q_LOGGING_CATEGORY(CAT_GRFFTSINKCOMPONENT, "GRFFTSinkComponent") using namespace scopy::adc; @@ -144,14 +145,18 @@ void GRFFTSinkComponent::init() void GRFFTSinkComponent::deinit() { qDebug(CAT_GRFFTSINKCOMPONENT) << "Deinit"; } -void GRFFTSinkComponent::start() +bool GRFFTSinkComponent::start() { + iio_context_set_timeout(m_node->ctx(), 1000); + if(!IIOPingTask::pingCtx(m_node->ctx())) + return false; m_sync->setBufferSize(this, m_samplingInfo.bufferSize); m_sync->setSingleShot(this, m_singleShot); m_top->setVLen(m_samplingInfo.bufferSize); m_sync->arm(this); m_top->build(); m_top->start(); + return true; } void GRFFTSinkComponent::stop() diff --git a/plugins/adc/src/freq/grfftsinkcomponent.h b/plugins/adc/src/freq/grfftsinkcomponent.h index 6782071f4..16ff20219 100644 --- a/plugins/adc/src/freq/grfftsinkcomponent.h +++ b/plugins/adc/src/freq/grfftsinkcomponent.h @@ -33,7 +33,7 @@ public Q_SLOTS: void init(); void deinit(); - virtual void start() override; + virtual bool start() override; virtual void stop() override; virtual size_t updateData() override; diff --git a/plugins/adc/src/time/grtimesinkcomponent.cpp b/plugins/adc/src/time/grtimesinkcomponent.cpp index bc272fe65..69c473c61 100644 --- a/plugins/adc/src/time/grtimesinkcomponent.cpp +++ b/plugins/adc/src/time/grtimesinkcomponent.cpp @@ -1,6 +1,7 @@ #include "grtimesinkcomponent.h" #include #include +#include "iioutil/iiopingtask.h" Q_LOGGING_CATEGORY(CAT_GRTIMESINKCOMPONENT, "GRTimeSinkComponent") using namespace scopy::adc; @@ -145,14 +146,18 @@ void GRTimeSinkComponent::init() void GRTimeSinkComponent::deinit() { qDebug(CAT_GRTIMESINKCOMPONENT) << "Deinit"; } -void GRTimeSinkComponent::start() +bool GRTimeSinkComponent::start() { + iio_context_set_timeout(m_node->ctx(), 1000); + if(!IIOPingTask::pingCtx(m_node->ctx())) + return false; m_sync->setBufferSize(this, m_samplingInfo.bufferSize); m_sync->setSingleShot(this, m_singleShot); m_top->setVLen(m_samplingInfo.bufferSize); m_sync->arm(this); m_top->build(); m_top->start(); + return true; } void GRTimeSinkComponent::stop() diff --git a/plugins/adc/src/time/grtimesinkcomponent.h b/plugins/adc/src/time/grtimesinkcomponent.h index a60c6fb31..4cc84c1ed 100644 --- a/plugins/adc/src/time/grtimesinkcomponent.h +++ b/plugins/adc/src/time/grtimesinkcomponent.h @@ -33,7 +33,7 @@ public Q_SLOTS: void init(); void deinit(); - virtual void start() override; + virtual bool start() override; virtual void stop() override; virtual size_t updateData() override; diff --git a/plugins/adc/src/toolcomponent.h b/plugins/adc/src/toolcomponent.h index 27baa5cb0..273ee550e 100644 --- a/plugins/adc/src/toolcomponent.h +++ b/plugins/adc/src/toolcomponent.h @@ -70,7 +70,7 @@ class SCOPY_ADC_EXPORT DataProvider virtual size_t updateData() = 0; virtual bool finished() = 0; virtual void setData(bool copy = false) = 0; - virtual void start() = 0; + virtual bool start() = 0; virtual void stop() = 0; };