1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-27 16:54:15 +01:00

OP-1150 UI for thermal calibration: fix deadlock at end of acquisition, moved uavo disconnect at state exit to handle abort

This commit is contained in:
Alessio Morale 2014-01-17 18:57:09 +01:00
parent 847c3327eb
commit 3f5af83d42
5 changed files with 23 additions and 15 deletions

View File

@ -48,9 +48,15 @@ public:
virtual void onTransition(QEvent *e) virtual void onTransition(QEvent *e)
{ {
Q_UNUSED(e);
qDebug() << "DataAcquisitionTransition::collectionCompleted"; qDebug() << "DataAcquisitionTransition::collectionCompleted";
} }
virtual void exit(int __status){
Q_UNUSED(__status);
m_helper->endAcquisition();
}
public slots: public slots:
void enterState() void enterState()
{ {

View File

@ -284,7 +284,7 @@ void ThermalCalibrationHelper::updateTemp(float temp)
m_initialGradient = m_gradient; m_initialGradient = m_gradient;
} }
if (m_gradient < TargetGradient) { if (m_gradient < TargetGradient) {
endAcquisition(); emit collectionCompleted();
} }
if (m_targetduration != 0) { if (m_targetduration != 0) {
@ -302,16 +302,14 @@ void ThermalCalibrationHelper::updateTemp(float temp)
void ThermalCalibrationHelper::endAcquisition() void ThermalCalibrationHelper::endAcquisition()
{ {
// this is called from the collectSample that already has the lock QMutexLocker lock(&sensorsUpdateLock);
// QMutexLocker lock(&sensorsUpdateLock);
disconnectUAVOs(); disconnectUAVOs();
emit collectionCompleted(); setProcessPercentage(ProcessPercentageBaseCalculation);
} }
void ThermalCalibrationHelper::connectUAVOs() void ThermalCalibrationHelper::connectUAVOs()
{ {
AccelSensor *accel = AccelSensor::GetInstance(getObjectManager()); AccelSensor *accel = AccelSensor::GetInstance(getObjectManager());
connect(accel, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(collectSample(UAVObject *))); connect(accel, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(collectSample(UAVObject *)));
GyroSensor *gyro = GyroSensor::GetInstance(getObjectManager()); GyroSensor *gyro = GyroSensor::GetInstance(getObjectManager());
@ -327,7 +325,6 @@ void ThermalCalibrationHelper::connectUAVOs()
void ThermalCalibrationHelper::disconnectUAVOs() void ThermalCalibrationHelper::disconnectUAVOs()
{ {
AccelSensor *accel = AccelSensor::GetInstance(getObjectManager()); AccelSensor *accel = AccelSensor::GetInstance(getObjectManager());
disconnect(accel, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(collectSample(UAVObject *))); disconnect(accel, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(collectSample(UAVObject *)));
GyroSensor *gyro = GyroSensor::GetInstance(getObjectManager()); GyroSensor *gyro = GyroSensor::GetInstance(getObjectManager());

View File

@ -88,7 +88,7 @@ signals:
void processPercentageChanged(int percentage); void processPercentageChanged(int percentage);
void collectionCompleted(); void collectionCompleted();
void calculationCompleted(); void calculationCompleted();
void abort();
public slots: public slots:
/** /**

View File

@ -30,6 +30,7 @@
#include "settingshandlingtransitions.h" #include "settingshandlingtransitions.h"
#include "boardsetuptransition.h" #include "boardsetuptransition.h"
#include "dataacquisitiontransition.h" #include "dataacquisitiontransition.h"
#include "compensationcalculationtransition.h"
#define NEXT_EVENT "next" #define NEXT_EVENT "next"
#define PREVIOUS_EVENT "previous" #define PREVIOUS_EVENT "previous"
@ -40,18 +41,18 @@ ThermalCalibrationModel::ThermalCalibrationModel(QObject *parent) :
{ {
m_helper = new ThermalCalibrationHelper(); m_helper = new ThermalCalibrationHelper();
m_readyState = new WizardState(tr("Start"), this), 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_saveSettingState = new WizardState(tr("Saving initial settings"), m_workingState);
m_workingState->setInitialState(m_saveSettingState); m_workingState->setInitialState(m_saveSettingState);
m_setupState = new WizardState(tr("Setup board for calibration"), m_workingState); 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_calculateState = new WizardState(tr("Calculate calibration matrix"), m_workingState);
m_finalizeState = new WizardState(tr("Completed"), m_workingState); m_finalizeState = new WizardState(tr("Completed"), m_workingState);
m_abortState = new WizardState("abort", this); m_abortState = new WizardState("Canceled", this);
setTransitions(); setTransitions();
@ -75,7 +76,9 @@ void ThermalCalibrationModel::init()
emit instructionsChanged(instructions()); emit instructionsChanged(instructions());
} }
void ThermalCalibrationModel::stepChanged(WizardState *state) {} void ThermalCalibrationModel::stepChanged(WizardState *state) {
Q_UNUSED(state);
}
void ThermalCalibrationModel::setTransitions() void ThermalCalibrationModel::setTransitions()
{ {
@ -92,9 +95,10 @@ void ThermalCalibrationModel::setTransitions()
// revert settings after acquisition is completed // revert settings after acquisition is completed
// m_acquisitionState->addTransition(new BoardStatusRestoreTransition(m_helper, m_acquisitionState, m_calculateState)); // m_acquisitionState->addTransition(new BoardStatusRestoreTransition(m_helper, m_acquisitionState, m_calculateState));
m_acquisitionState->addTransition(new DataAcquisitionTransition(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_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); m_finalizeState->addTransition(this, SIGNAL(next()), m_readyState);
// Ready // Ready
} }

View File

@ -26,7 +26,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "wizardmodel.h" #include "wizardmodel.h"
#include "QDebug"
WizardModel::WizardModel(QObject *parent) : WizardModel::WizardModel(QObject *parent) :
QStateMachine(parent) QStateMachine(parent)
{} {}
@ -34,8 +34,9 @@ WizardModel::WizardModel(QObject *parent) :
WizardState *WizardModel::currentState() WizardState *WizardModel::currentState()
{ {
foreach(QAbstractState * value, this->configuration()) { foreach(QAbstractState * value, this->configuration()) {
if (value->parent() != 0) { \ WizardState *state = static_cast<WizardState *>(value);
return static_cast<WizardState *>(value); if (state->children().count() <= 1) {
return state;
} }
} }
return NULL; return NULL;