1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-20 10:54:14 +01:00

OP-1604 Reinitialize accessoryDesiredObjects if they weren't initialized

Only instance 0 of UAVOs is initialized if no board is connected. The
TX Wizard tried to setup accessoryDesired instances 1 and 2 but failed,
causing crashes later in the wizard.
This commit is contained in:
Stefan Karlsson 2014-11-09 22:39:05 +01:00
parent da76ce1577
commit 90e0459522
2 changed files with 59 additions and 12 deletions

View File

@ -58,7 +58,10 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) :
skipflag(false),
nextDelayedTimer(),
nextDelayedTick(0),
nextDelayedLatestActivityTick(0)
nextDelayedLatestActivityTick(0),
accessoryDesiredObj0(NULL),
accessoryDesiredObj1(NULL),
accessoryDesiredObj2(NULL)
{
manualCommandObj = ManualControlCommand::GetInstance(getObjectManager());
manualSettingsObj = ManualControlSettings::GetInstance(getObjectManager());
@ -402,6 +405,10 @@ void ConfigInputWidget::goToWizard()
accessoryDesiredObj1 = AccessoryDesired::GetInstance(getObjectManager(), 1);
accessoryDesiredObj2 = AccessoryDesired::GetInstance(getObjectManager(), 2);
// Only instance 0 is present if the board is not connected.
// The other instances are populated lazily.
Q_ASSERT(accessoryDesiredObj0);
// Use faster input update rate.
fastMdata();
@ -1293,15 +1300,54 @@ void ConfigInputWidget::moveTxControls()
}
}
AccessoryDesired *ConfigInputWidget::getAccessoryDesiredInstance(int instance)
{
switch (instance) {
case 0:
if (accessoryDesiredObj0 == NULL) {
accessoryDesiredObj0 = AccessoryDesired::GetInstance(getObjectManager(), 0);
}
return accessoryDesiredObj0;
case 1:
if (accessoryDesiredObj1 == NULL) {
accessoryDesiredObj1 = AccessoryDesired::GetInstance(getObjectManager(), 1);
}
return accessoryDesiredObj1;
case 2:
if (accessoryDesiredObj2 == NULL) {
accessoryDesiredObj2 = AccessoryDesired::GetInstance(getObjectManager(), 2);
}
return accessoryDesiredObj2;
default:
Q_ASSERT(false);
}
return NULL;
}
float ConfigInputWidget::getAccessoryDesiredValue(int instance)
{
AccessoryDesired *accessoryDesiredObj = getAccessoryDesiredInstance(instance);
if (accessoryDesiredObj == NULL) {
Q_ASSERT(false);
return 0.0f;
}
AccessoryDesired::DataFields data = accessoryDesiredObj->getData();
return data.AccessoryVal;
}
void ConfigInputWidget::moveSticks()
{
QTransform trans;
manualCommandData = manualCommandObj->getData();
flightStatusData = flightStatusObj->getData();
accessoryDesiredData0 = accessoryDesiredObj0->getData();
accessoryDesiredData1 = accessoryDesiredObj1->getData();
accessoryDesiredData2 = accessoryDesiredObj2->getData();
manualCommandData = manualCommandObj->getData();
flightStatusData = flightStatusObj->getData();
switch (transmitterMode) {
case mode1:
@ -1342,9 +1388,10 @@ void ConfigInputWidget::moveSticks()
m_txFlightMode->setElementId("flightModeRight");
m_txFlightMode->setTransform(m_txFlightModeROrig, false);
}
m_txAccess0->setTransform(QTransform(m_txAccess0Orig).translate(accessoryDesiredData0.AccessoryVal * ACCESS_MAX_MOVE * 10, 0), false);
m_txAccess1->setTransform(QTransform(m_txAccess1Orig).translate(accessoryDesiredData1.AccessoryVal * ACCESS_MAX_MOVE * 10, 0), false);
m_txAccess2->setTransform(QTransform(m_txAccess2Orig).translate(accessoryDesiredData2.AccessoryVal * ACCESS_MAX_MOVE * 10, 0), false);
m_txAccess0->setTransform(QTransform(m_txAccess0Orig).translate(getAccessoryDesiredValue(0) * ACCESS_MAX_MOVE * 10, 0), false);
m_txAccess1->setTransform(QTransform(m_txAccess1Orig).translate(getAccessoryDesiredValue(1) * ACCESS_MAX_MOVE * 10, 0), false);
m_txAccess2->setTransform(QTransform(m_txAccess2Orig).translate(getAccessoryDesiredValue(2) * ACCESS_MAX_MOVE * 10, 0), false);
}
void ConfigInputWidget::dimOtherControls(bool value)

View File

@ -116,9 +116,6 @@ private:
AccessoryDesired *accessoryDesiredObj0;
AccessoryDesired *accessoryDesiredObj1;
AccessoryDesired *accessoryDesiredObj2;
AccessoryDesired::DataFields accessoryDesiredData0;
AccessoryDesired::DataFields accessoryDesiredData1;
AccessoryDesired::DataFields accessoryDesiredData2;
ManualControlSettings *manualSettingsObj;
ManualControlSettings::DataFields manualSettingsData;
@ -171,6 +168,9 @@ private:
void wzNextDelayedStart();
void wzNextDelayedCancel();
AccessoryDesired *getAccessoryDesiredInstance(int instance);
float getAccessoryDesiredValue(int instance);
private slots:
void wzNext();
void wzNextDelayed();