From 3f5af83d42e8b0380bd579f2cb24256e3816b047 Mon Sep 17 00:00:00 2001 From: Alessio Morale Date: Fri, 17 Jan 2014 18:57:09 +0100 Subject: [PATCH] OP-1150 UI for thermal calibration: fix deadlock at end of acquisition, moved uavo disconnect at state exit to handle abort --- .../thermal/dataacquisitiontransition.h | 6 ++++++ .../thermal/thermalcalibrationhelper.cpp | 9 +++------ .../calibration/thermal/thermalcalibrationhelper.h | 2 +- .../thermal/thermalcalibrationmodel.cpp | 14 +++++++++----- .../src/plugins/config/calibration/wizardmodel.cpp | 7 ++++--- 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/calibration/thermal/dataacquisitiontransition.h b/ground/openpilotgcs/src/plugins/config/calibration/thermal/dataacquisitiontransition.h index 718c74e3c..ed14035cd 100644 --- a/ground/openpilotgcs/src/plugins/config/calibration/thermal/dataacquisitiontransition.h +++ b/ground/openpilotgcs/src/plugins/config/calibration/thermal/dataacquisitiontransition.h @@ -48,9 +48,15 @@ public: virtual void onTransition(QEvent *e) { + Q_UNUSED(e); qDebug() << "DataAcquisitionTransition::collectionCompleted"; } + virtual void exit(int __status){ + Q_UNUSED(__status); + m_helper->endAcquisition(); + } + public slots: void enterState() { diff --git a/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationhelper.cpp b/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationhelper.cpp index 90591185b..84790f729 100644 --- a/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationhelper.cpp @@ -284,7 +284,7 @@ void ThermalCalibrationHelper::updateTemp(float temp) m_initialGradient = m_gradient; } if (m_gradient < TargetGradient) { - endAcquisition(); + emit collectionCompleted(); } if (m_targetduration != 0) { @@ -302,16 +302,14 @@ void ThermalCalibrationHelper::updateTemp(float temp) void ThermalCalibrationHelper::endAcquisition() { - // this is called from the collectSample that already has the lock - // QMutexLocker lock(&sensorsUpdateLock); + QMutexLocker lock(&sensorsUpdateLock); disconnectUAVOs(); - emit collectionCompleted(); + setProcessPercentage(ProcessPercentageBaseCalculation); } void ThermalCalibrationHelper::connectUAVOs() { AccelSensor *accel = AccelSensor::GetInstance(getObjectManager()); - connect(accel, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(collectSample(UAVObject *))); GyroSensor *gyro = GyroSensor::GetInstance(getObjectManager()); @@ -327,7 +325,6 @@ void ThermalCalibrationHelper::connectUAVOs() void ThermalCalibrationHelper::disconnectUAVOs() { AccelSensor *accel = AccelSensor::GetInstance(getObjectManager()); - disconnect(accel, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(collectSample(UAVObject *))); GyroSensor *gyro = GyroSensor::GetInstance(getObjectManager()); diff --git a/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationhelper.h b/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationhelper.h index 001d88286..ad4d921c3 100644 --- a/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationhelper.h +++ b/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationhelper.h @@ -88,7 +88,7 @@ signals: void processPercentageChanged(int percentage); void collectionCompleted(); void calculationCompleted(); - + void abort(); public slots: /** diff --git a/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationmodel.cpp b/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationmodel.cpp index 03cb73de5..aebcb52a8 100644 --- a/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationmodel.cpp +++ b/ground/openpilotgcs/src/plugins/config/calibration/thermal/thermalcalibrationmodel.cpp @@ -30,6 +30,7 @@ #include "settingshandlingtransitions.h" #include "boardsetuptransition.h" #include "dataacquisitiontransition.h" +#include "compensationcalculationtransition.h" #define NEXT_EVENT "next" #define PREVIOUS_EVENT "previous" @@ -40,18 +41,18 @@ ThermalCalibrationModel::ThermalCalibrationModel(QObject *parent) : { m_helper = new ThermalCalibrationHelper(); m_readyState = new WizardState(tr("Start"), this), - m_workingState = new WizardState("workingState", this); + m_workingState = new WizardState(NULL, this); m_saveSettingState = new WizardState(tr("Saving initial settings"), m_workingState); m_workingState->setInitialState(m_saveSettingState); m_setupState = new WizardState(tr("Setup board for calibration"), m_workingState); - m_acquisitionState = new WizardState(tr("Samples acquisition"), m_workingState); + m_acquisitionState = new WizardState(tr("*** Please Wait *** Samples acquisition, this can take several minutes"), m_workingState); m_calculateState = new WizardState(tr("Calculate calibration matrix"), m_workingState); m_finalizeState = new WizardState(tr("Completed"), m_workingState); - m_abortState = new WizardState("abort", this); + m_abortState = new WizardState("Canceled", this); setTransitions(); @@ -75,7 +76,9 @@ void ThermalCalibrationModel::init() emit instructionsChanged(instructions()); } -void ThermalCalibrationModel::stepChanged(WizardState *state) {} +void ThermalCalibrationModel::stepChanged(WizardState *state) { + Q_UNUSED(state); +} void ThermalCalibrationModel::setTransitions() { @@ -92,9 +95,10 @@ void ThermalCalibrationModel::setTransitions() // revert settings after acquisition is completed // m_acquisitionState->addTransition(new BoardStatusRestoreTransition(m_helper, m_acquisitionState, m_calculateState)); m_acquisitionState->addTransition(new DataAcquisitionTransition(m_helper, m_acquisitionState, m_calculateState)); - + m_workingState->addTransition(m_helper, SIGNAL(abort()), m_abortState) ; m_calculateState->addTransition(new BoardStatusRestoreTransition(m_helper, m_calculateState, m_finalizeState)); + m_abortState->addTransition(new BoardStatusRestoreTransition(m_helper, m_abortState, m_readyState)); m_finalizeState->addTransition(this, SIGNAL(next()), m_readyState); // Ready } diff --git a/ground/openpilotgcs/src/plugins/config/calibration/wizardmodel.cpp b/ground/openpilotgcs/src/plugins/config/calibration/wizardmodel.cpp index e3ff8ca4c..25569f102 100644 --- a/ground/openpilotgcs/src/plugins/config/calibration/wizardmodel.cpp +++ b/ground/openpilotgcs/src/plugins/config/calibration/wizardmodel.cpp @@ -26,7 +26,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "wizardmodel.h" - +#include "QDebug" WizardModel::WizardModel(QObject *parent) : QStateMachine(parent) {} @@ -34,8 +34,9 @@ WizardModel::WizardModel(QObject *parent) : WizardState *WizardModel::currentState() { foreach(QAbstractState * value, this->configuration()) { - if (value->parent() != 0) { \ - return static_cast(value); + WizardState *state = static_cast(value); + if (state->children().count() <= 1) { + return state; } } return NULL;