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

Merged in filnet/librepilot/LP-467_fix_old_regressions_in_vehicle_config (pull request #377)

LP-467 fix old regressions in vehicle config
This commit is contained in:
Lalanne Laurent 2017-01-27 20:20:23 +00:00
commit 82ae88e942
22 changed files with 708 additions and 604 deletions

View File

@ -69,7 +69,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QComboBox" name="comboBox"> <widget class="QComboBox" name="curve1SourceCombo">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>

View File

@ -57,7 +57,7 @@ QStringList ConfigCcpmWidget::getChannelDescriptions()
QStringList channelDesc; QStringList channelDesc;
for (int i = 0; i < (int)ConfigCcpmWidget::CHANNEL_NUMELEM; i++) { for (int i = 0; i < (int)ConfigCcpmWidget::CHANNEL_NUMELEM; i++) {
channelDesc.append(QString("-")); channelDesc.append("-");
} }
// get the gui config data // get the gui config data
@ -65,64 +65,64 @@ QStringList ConfigCcpmWidget::getChannelDescriptions()
heliGUISettingsStruct heli = configData.heli; heliGUISettingsStruct heli = configData.heli;
if (heli.Throttle > 0) { if (heli.Throttle > 0) {
channelDesc[heli.Throttle - 1] = QString("Throttle"); channelDesc[heli.Throttle - 1] = "Throttle";
} }
if (heli.Tail > 0) { if (heli.Tail > 0) {
channelDesc[heli.Tail - 1] = QString("Tail"); channelDesc[heli.Tail - 1] = "Tail";
} }
switch (heli.FirstServoIndex) { switch (heli.FirstServoIndex) {
case 0: case 0:
// front // front
if (heli.ServoIndexW > 0) { if (heli.ServoIndexW > 0) {
channelDesc[heli.ServoIndexW - 1] = QString("Elevator"); channelDesc[heli.ServoIndexW - 1] = "Elevator";
} }
if (heli.ServoIndexX > 0) { if (heli.ServoIndexX > 0) {
channelDesc[heli.ServoIndexX - 1] = QString("Roll1"); channelDesc[heli.ServoIndexX - 1] = "Roll1";
} }
if (heli.ServoIndexY > 0) { if (heli.ServoIndexY > 0) {
channelDesc[heli.ServoIndexY - 1] = QString("Roll2"); channelDesc[heli.ServoIndexY - 1] = "Roll2";
} }
break; break;
case 1: case 1:
// right // right
if (heli.ServoIndexW > 0) { if (heli.ServoIndexW > 0) {
channelDesc[heli.ServoIndexW - 1] = QString("ServoW"); channelDesc[heli.ServoIndexW - 1] = "ServoW";
} }
if (heli.ServoIndexX > 0) { if (heli.ServoIndexX > 0) {
channelDesc[heli.ServoIndexX - 1] = QString("ServoX"); channelDesc[heli.ServoIndexX - 1] = "ServoX";
} }
if (heli.ServoIndexY > 0) { if (heli.ServoIndexY > 0) {
channelDesc[heli.ServoIndexY - 1] = QString("ServoY"); channelDesc[heli.ServoIndexY - 1] = "ServoY";
} }
break; break;
case 2: case 2:
// rear // rear
if (heli.ServoIndexW > 0) { if (heli.ServoIndexW > 0) {
channelDesc[heli.ServoIndexW - 1] = QString("Elevator"); channelDesc[heli.ServoIndexW - 1] = "Elevator";
} }
if (heli.ServoIndexX > 0) { if (heli.ServoIndexX > 0) {
channelDesc[heli.ServoIndexX - 1] = QString("Roll1"); channelDesc[heli.ServoIndexX - 1] = "Roll1";
} }
if (heli.ServoIndexY > 0) { if (heli.ServoIndexY > 0) {
channelDesc[heli.ServoIndexY - 1] = QString("Roll2"); channelDesc[heli.ServoIndexY - 1] = "Roll2";
} }
break; break;
case 3: case 3:
// left // left
if (heli.ServoIndexW > 0) { if (heli.ServoIndexW > 0) {
channelDesc[heli.ServoIndexW - 1] = QString("ServoW"); channelDesc[heli.ServoIndexW - 1] = "ServoW";
} }
if (heli.ServoIndexX > 0) { if (heli.ServoIndexX > 0) {
channelDesc[heli.ServoIndexX - 1] = QString("ServoX"); channelDesc[heli.ServoIndexX - 1] = "ServoX";
} }
if (heli.ServoIndexY > 0) { if (heli.ServoIndexY > 0) {
channelDesc[heli.ServoIndexY - 1] = QString("ServoY"); channelDesc[heli.ServoIndexY - 1] = "ServoY";
} }
break; break;
} }
if (heli.ServoIndexZ > 0) { if (heli.ServoIndexZ > 0) {
channelDesc[heli.ServoIndexZ - 1] = QString("ServoZ"); channelDesc[heli.ServoIndexZ - 1] = "ServoZ";
} }
return channelDesc; return channelDesc;
} }
@ -196,7 +196,7 @@ ConfigCcpmWidget::ConfigCcpmWidget(QWidget *parent) :
ServosText[i] = new QGraphicsTextItem(); ServosText[i] = new QGraphicsTextItem();
ServosText[i]->setDefaultTextColor(Qt::yellow); ServosText[i]->setDefaultTextColor(Qt::yellow);
ServosText[i]->setPlainText(QString("-")); ServosText[i]->setPlainText("-");
ServosText[i]->setFont(serifFont); ServosText[i]->setFont(serifFont);
ServosText[i]->setZValue(31); ServosText[i]->setZValue(31);
@ -237,16 +237,14 @@ ConfigCcpmWidget::ConfigCcpmWidget(QWidget *parent) :
m_aircraft->ccpmServoZChannel->setCurrentIndex(0); m_aircraft->ccpmServoZChannel->setCurrentIndex(0);
QStringList Types; QStringList Types;
Types << QString::fromUtf8("CCPM 2 Servo 90º") << QString::fromUtf8("CCPM 3 Servo 90º") Types << "CCPM 2 Servo 90º" << "CCPM 3 Servo 90º"
<< QString::fromUtf8("CCPM 4 Servo 90º") << QString::fromUtf8("CCPM 3 Servo 120º") << "CCPM 4 Servo 90º" << "CCPM 3 Servo 120º"
<< QString::fromUtf8("CCPM 3 Servo 140º") << QString::fromUtf8("FP 2 Servo 90º") << "CCPM 3 Servo 140º" << "FP 2 Servo 90º"
<< QString::fromUtf8("Coax 2 Servo 90º") << QString::fromUtf8("Custom - User Angles") << "Coax 2 Servo 90º" << "Custom - User Angles"
<< QString::fromUtf8("Custom - Advanced Settings"); << "Custom - Advanced Settings";
m_aircraft->ccpmType->addItems(Types); m_aircraft->ccpmType->addItems(Types);
m_aircraft->ccpmType->setCurrentIndex(m_aircraft->ccpmType->count() - 1); m_aircraft->ccpmType->setCurrentIndex(m_aircraft->ccpmType->count() - 1);
// refreshWidgetsValues(QString("HeliCP"));
connect(m_aircraft->ccpmAngleW, SIGNAL(valueChanged(double)), this, SLOT(ccpmSwashplateUpdate())); connect(m_aircraft->ccpmAngleW, SIGNAL(valueChanged(double)), this, SLOT(ccpmSwashplateUpdate()));
connect(m_aircraft->ccpmAngleX, SIGNAL(valueChanged(double)), this, SLOT(ccpmSwashplateUpdate())); connect(m_aircraft->ccpmAngleX, SIGNAL(valueChanged(double)), this, SLOT(ccpmSwashplateUpdate()));
connect(m_aircraft->ccpmAngleY, SIGNAL(valueChanged(double)), this, SLOT(ccpmSwashplateUpdate())); connect(m_aircraft->ccpmAngleY, SIGNAL(valueChanged(double)), this, SLOT(ccpmSwashplateUpdate()));
@ -284,6 +282,11 @@ ConfigCcpmWidget::~ConfigCcpmWidget()
delete m_aircraft; delete m_aircraft;
} }
QString ConfigCcpmWidget::getFrameType()
{
return "HeliCP";
}
void ConfigCcpmWidget::setupUI(QString frameType) void ConfigCcpmWidget::setupUI(QString frameType)
{ {
Q_UNUSED(frameType); Q_UNUSED(frameType);
@ -320,10 +323,10 @@ void ConfigCcpmWidget::registerWidgets(ConfigTaskWidget &parent)
parent.addWidget(m_aircraft->ccpmRollScaleBox); parent.addWidget(m_aircraft->ccpmRollScaleBox);
parent.addWidget(m_aircraft->SwashLvlPositionSlider); parent.addWidget(m_aircraft->SwashLvlPositionSlider);
parent.addWidget(m_aircraft->SwashLvlPositionSpinBox); parent.addWidget(m_aircraft->SwashLvlPositionSpinBox);
parent.addWidget(m_aircraft->ThrottleCurve->getCurveWidget()); parent.addWidget(m_aircraft->PitchCurve->getCurveWidget());
parent.addWidget(m_aircraft->PitchCurve); parent.addWidget(m_aircraft->PitchCurve);
parent.addWidget(m_aircraft->ThrottleCurve->getCurveWidget()); parent.addWidget(m_aircraft->ThrottleCurve->getCurveWidget());
parent.addWidget(m_aircraft->PitchCurve); parent.addWidget(m_aircraft->ThrottleCurve);
parent.addWidget(m_aircraft->ccpmAdvancedSettingsTable); parent.addWidget(m_aircraft->ccpmAdvancedSettingsTable);
} }
@ -337,11 +340,16 @@ void ConfigCcpmWidget::resetActuators(GUIConfigDataUnion *configData)
configData->heli.ServoIndexZ = 0; configData->heli.ServoIndexZ = 0;
} }
void ConfigCcpmWidget::refreshWidgetsValues(QString frameType) void ConfigCcpmWidget::enableControls(bool enable)
{ {
Q_UNUSED(frameType); if (enable) {
SetUIComponentVisibilities();
}
}
setupUI(frameType); void ConfigCcpmWidget::refreshWidgetsValuesImpl(UAVObject *obj)
{
Q_UNUSED(obj);
GUIConfigDataUnion config = getConfigData(); GUIConfigDataUnion config = getConfigData();
@ -383,13 +391,10 @@ void ConfigCcpmWidget::refreshWidgetsValues(QString frameType)
getMixer(); getMixer();
} }
QString ConfigCcpmWidget::updateConfigObjectsFromWidgets() void ConfigCcpmWidget::updateObjectsFromWidgetsImpl()
{ {
QString airframeType = updateConfigObjects(); updateConfigObjects();
setMixer(); setMixer();
return airframeType;
} }
void ConfigCcpmWidget::UpdateType() void ConfigCcpmWidget::UpdateType()
@ -406,85 +411,85 @@ void ConfigCcpmWidget::UpdateType()
NumServosDefined = 4; NumServosDefined = 4;
// set values for pre defined heli types // set values for pre defined heli types
if (typeText.compare(QString::fromUtf8("CCPM 2 Servo 90º"), Qt::CaseInsensitive) == 0) { if (typeText.compare("CCPM 2 Servo 90º", Qt::CaseInsensitive) == 0) {
m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0); m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0);
m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 90, 360)); m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 90, 360));
m_aircraft->ccpmAngleY->setValue(0); m_aircraft->ccpmAngleY->setValue(0);
m_aircraft->ccpmAngleZ->setValue(0); m_aircraft->ccpmAngleZ->setValue(0);
m_aircraft->ccpmAngleY->setEnabled(0); m_aircraft->ccpmAngleY->setEnabled(false);
m_aircraft->ccpmAngleZ->setEnabled(0); m_aircraft->ccpmAngleZ->setEnabled(false);
m_aircraft->ccpmServoYChannel->setCurrentIndex(0); m_aircraft->ccpmServoYChannel->setCurrentIndex(0);
m_aircraft->ccpmServoZChannel->setCurrentIndex(0); m_aircraft->ccpmServoZChannel->setCurrentIndex(0);
m_aircraft->ccpmServoYChannel->setEnabled(0); m_aircraft->ccpmServoYChannel->setEnabled(false);
m_aircraft->ccpmServoZChannel->setEnabled(0); m_aircraft->ccpmServoZChannel->setEnabled(false);
NumServosDefined = 2; NumServosDefined = 2;
} else if (typeText.compare(QString::fromUtf8("CCPM 3 Servo 90º"), Qt::CaseInsensitive) == 0) { } else if (typeText.compare("CCPM 3 Servo 90º", Qt::CaseInsensitive) == 0) {
m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0); m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0);
m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 90, 360)); m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 90, 360));
m_aircraft->ccpmAngleY->setValue(fmod(AdjustmentAngle + 180, 360)); m_aircraft->ccpmAngleY->setValue(fmod(AdjustmentAngle + 180, 360));
m_aircraft->ccpmAngleZ->setValue(0); m_aircraft->ccpmAngleZ->setValue(0);
m_aircraft->ccpmAngleZ->setEnabled(0); m_aircraft->ccpmAngleZ->setEnabled(false);
m_aircraft->ccpmServoZChannel->setCurrentIndex(0); m_aircraft->ccpmServoZChannel->setCurrentIndex(0);
m_aircraft->ccpmServoZChannel->setEnabled(0); m_aircraft->ccpmServoZChannel->setEnabled(false);
NumServosDefined = 3; NumServosDefined = 3;
} else if (typeText.compare(QString::fromUtf8("CCPM 4 Servo 90º"), Qt::CaseInsensitive) == 0) { } else if (typeText.compare("CCPM 4 Servo 90º", Qt::CaseInsensitive) == 0) {
m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0); m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0);
m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 90, 360)); m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 90, 360));
m_aircraft->ccpmAngleY->setValue(fmod(AdjustmentAngle + 180, 360)); m_aircraft->ccpmAngleY->setValue(fmod(AdjustmentAngle + 180, 360));
m_aircraft->ccpmAngleZ->setValue(fmod(AdjustmentAngle + 270, 360)); m_aircraft->ccpmAngleZ->setValue(fmod(AdjustmentAngle + 270, 360));
m_aircraft->ccpmSingleServo->setEnabled(0); m_aircraft->ccpmSingleServo->setEnabled(false);
m_aircraft->ccpmSingleServo->setCurrentIndex(0); m_aircraft->ccpmSingleServo->setCurrentIndex(0);
NumServosDefined = 4; NumServosDefined = 4;
} else if (typeText.compare(QString::fromUtf8("CCPM 3 Servo 120º"), Qt::CaseInsensitive) == 0) { } else if (typeText.compare("CCPM 3 Servo 120º", Qt::CaseInsensitive) == 0) {
m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0); m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0);
m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 120, 360)); m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 120, 360));
m_aircraft->ccpmAngleY->setValue(fmod(AdjustmentAngle + 240, 360)); m_aircraft->ccpmAngleY->setValue(fmod(AdjustmentAngle + 240, 360));
m_aircraft->ccpmAngleZ->setValue(0); m_aircraft->ccpmAngleZ->setValue(0);
m_aircraft->ccpmAngleZ->setEnabled(0); m_aircraft->ccpmAngleZ->setEnabled(false);
m_aircraft->ccpmServoZChannel->setCurrentIndex(0); m_aircraft->ccpmServoZChannel->setCurrentIndex(0);
m_aircraft->ccpmServoZChannel->setEnabled(0); m_aircraft->ccpmServoZChannel->setEnabled(false);
NumServosDefined = 3; NumServosDefined = 3;
} else if (typeText.compare(QString::fromUtf8("CCPM 3 Servo 140º"), Qt::CaseInsensitive) == 0) { } else if (typeText.compare("CCPM 3 Servo 140º", Qt::CaseInsensitive) == 0) {
m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0); m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0);
m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 140, 360)); m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 140, 360));
m_aircraft->ccpmAngleY->setValue(fmod(AdjustmentAngle + 220, 360)); m_aircraft->ccpmAngleY->setValue(fmod(AdjustmentAngle + 220, 360));
m_aircraft->ccpmAngleZ->setValue(0); m_aircraft->ccpmAngleZ->setValue(0);
m_aircraft->ccpmAngleZ->setEnabled(0); m_aircraft->ccpmAngleZ->setEnabled(false);
m_aircraft->ccpmServoZChannel->setCurrentIndex(0); m_aircraft->ccpmServoZChannel->setCurrentIndex(0);
m_aircraft->ccpmServoZChannel->setEnabled(0); m_aircraft->ccpmServoZChannel->setEnabled(false);
NumServosDefined = 3; NumServosDefined = 3;
} else if (typeText.compare(QString::fromUtf8("FP 2 Servo 90º"), Qt::CaseInsensitive) == 0) { } else if (typeText.compare("FP 2 Servo 90º", Qt::CaseInsensitive) == 0) {
m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0); m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0);
m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 90, 360)); m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 90, 360));
m_aircraft->ccpmAngleY->setValue(0); m_aircraft->ccpmAngleY->setValue(0);
m_aircraft->ccpmAngleZ->setValue(0); m_aircraft->ccpmAngleZ->setValue(0);
m_aircraft->ccpmAngleY->setEnabled(0); m_aircraft->ccpmAngleY->setEnabled(false);
m_aircraft->ccpmAngleZ->setEnabled(0); m_aircraft->ccpmAngleZ->setEnabled(false);
m_aircraft->ccpmServoYChannel->setCurrentIndex(0); m_aircraft->ccpmServoYChannel->setCurrentIndex(0);
m_aircraft->ccpmServoZChannel->setCurrentIndex(0); m_aircraft->ccpmServoZChannel->setCurrentIndex(0);
m_aircraft->ccpmServoYChannel->setEnabled(0); m_aircraft->ccpmServoYChannel->setEnabled(false);
m_aircraft->ccpmServoZChannel->setEnabled(0); m_aircraft->ccpmServoZChannel->setEnabled(false);
m_aircraft->ccpmCollectivespinBox->setEnabled(0); m_aircraft->ccpmCollectivespinBox->setEnabled(false);
m_aircraft->ccpmCollectiveSlider->setEnabled(0); m_aircraft->ccpmCollectiveSlider->setEnabled(false);
m_aircraft->ccpmCollectivespinBox->setValue(0); m_aircraft->ccpmCollectivespinBox->setValue(0);
m_aircraft->ccpmCollectiveSlider->setValue(0); m_aircraft->ccpmCollectiveSlider->setValue(0);
m_aircraft->PitchCurve->setVisible(0); m_aircraft->PitchCurve->setVisible(0);
NumServosDefined = 2; NumServosDefined = 2;
} else if (typeText.compare(QString::fromUtf8("Coax 2 Servo 90º"), Qt::CaseInsensitive) == 0) { } else if (typeText.compare("Coax 2 Servo 90º", Qt::CaseInsensitive) == 0) {
m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0); m_aircraft->ccpmAngleW->setValue(AdjustmentAngle + 0);
m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 90, 360)); m_aircraft->ccpmAngleX->setValue(fmod(AdjustmentAngle + 90, 360));
m_aircraft->ccpmAngleY->setValue(0); m_aircraft->ccpmAngleY->setValue(0);
m_aircraft->ccpmAngleZ->setValue(0); m_aircraft->ccpmAngleZ->setValue(0);
m_aircraft->ccpmAngleY->setEnabled(0); m_aircraft->ccpmAngleY->setEnabled(false);
m_aircraft->ccpmAngleZ->setEnabled(0); m_aircraft->ccpmAngleZ->setEnabled(false);
m_aircraft->ccpmServoYChannel->setCurrentIndex(0); m_aircraft->ccpmServoYChannel->setCurrentIndex(0);
m_aircraft->ccpmServoZChannel->setCurrentIndex(0); m_aircraft->ccpmServoZChannel->setCurrentIndex(0);
m_aircraft->ccpmServoYChannel->setEnabled(0); m_aircraft->ccpmServoYChannel->setEnabled(false);
m_aircraft->ccpmServoZChannel->setEnabled(0); m_aircraft->ccpmServoZChannel->setEnabled(false);
m_aircraft->ccpmCollectivespinBox->setEnabled(0); m_aircraft->ccpmCollectivespinBox->setEnabled(false);
m_aircraft->ccpmCollectiveSlider->setEnabled(0); m_aircraft->ccpmCollectiveSlider->setEnabled(false);
m_aircraft->ccpmCollectivespinBox->setValue(0); m_aircraft->ccpmCollectivespinBox->setValue(0);
m_aircraft->ccpmCollectiveSlider->setValue(0); m_aircraft->ccpmCollectiveSlider->setValue(0);
m_aircraft->PitchCurve->setVisible(0); m_aircraft->PitchCurve->setVisible(0);
@ -492,7 +497,7 @@ void ConfigCcpmWidget::UpdateType()
} }
// Set the text of the motor boxes // Set the text of the motor boxes
if (typeText.compare(QString::fromUtf8("Coax 2 Servo 90º"), Qt::CaseInsensitive) == 0) { if (typeText.compare("Coax 2 Servo 90º", Qt::CaseInsensitive) == 0) {
m_aircraft->ccpmEngineLabel->setText("CW motor"); m_aircraft->ccpmEngineLabel->setText("CW motor");
m_aircraft->ccpmTailLabel->setText("CCW motor"); m_aircraft->ccpmTailLabel->setText("CCW motor");
} else { } else {
@ -719,7 +724,7 @@ void ConfigCcpmWidget::UpdateMixer()
table->item(i, 3)->setText(QString("%1").arg(0)); // Roll table->item(i, 3)->setText(QString("%1").arg(0)); // Roll
table->item(i, 4)->setText(QString("%1").arg(0)); // Pitch table->item(i, 4)->setText(QString("%1").arg(0)); // Pitch
if (typeText.compare(QString::fromUtf8("Coax 2 Servo 90º"), Qt::CaseInsensitive) == 0) { if (typeText.compare("Coax 2 Servo 90º", Qt::CaseInsensitive) == 0) {
// Yaw // Yaw
table->item(i, 5)->setText(QString("%1").arg(-127)); table->item(i, 5)->setText(QString("%1").arg(-127));
} else { } else {
@ -729,7 +734,7 @@ void ConfigCcpmWidget::UpdateMixer()
} }
if (i == 1) { if (i == 1) {
// tailrotor --or-- counter-clockwise motor // tailrotor --or-- counter-clockwise motor
if (typeText.compare(QString::fromUtf8("Coax 2 Servo 90º"), Qt::CaseInsensitive) == 0) { if (typeText.compare("Coax 2 Servo 90º", Qt::CaseInsensitive) == 0) {
// ThrottleCurve1 // ThrottleCurve1
table->item(i, 1)->setText(QString("%1").arg(127)); table->item(i, 1)->setText(QString("%1").arg(127));
// Yaw // Yaw
@ -766,13 +771,13 @@ void ConfigCcpmWidget::UpdateMixer()
} }
} else { } else {
for (int j = 0; j < 6; j++) { for (int j = 0; j < 6; j++) {
table->item(i, j)->setText(QString("-")); table->item(i, j)->setText("-");
} }
} }
} }
} else { } else {
// advanced settings // advanced settings
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
// Populate custom mixer table from board values // Populate custom mixer table from board values
@ -797,24 +802,18 @@ void ConfigCcpmWidget::UpdateMixer()
VehicleConfig::MIXERVECTOR_YAW))); VehicleConfig::MIXERVECTOR_YAW)));
} else { } else {
for (int j = 0; j < 6; j++) { for (int j = 0; j < 6; j++) {
table->item(i, j)->setText(QString("-")); table->item(i, j)->setText("-");
} }
} }
} }
} }
} }
QString ConfigCcpmWidget::updateConfigObjects() void ConfigCcpmWidget::updateConfigObjects()
{ {
QString airframeType = "HeliCP";
bool useCCPM;
bool useCyclic;
if (updatingFromHardware == true) { if (updatingFromHardware == true) {
return airframeType; return;
} }
updatingFromHardware = true; updatingFromHardware = true;
// get the user options // get the user options
@ -828,8 +827,8 @@ QString ConfigCcpmWidget::updateConfigObjects()
config.heli.ccpmCollectivePassthroughState = m_aircraft->ccpmCollectivePassthrough->isChecked(); config.heli.ccpmCollectivePassthroughState = m_aircraft->ccpmCollectivePassthrough->isChecked();
config.heli.ccpmLinkCyclicState = m_aircraft->ccpmLinkCyclic->isChecked(); config.heli.ccpmLinkCyclicState = m_aircraft->ccpmLinkCyclic->isChecked();
config.heli.ccpmLinkRollState = m_aircraft->ccpmLinkRoll->isChecked(); config.heli.ccpmLinkRollState = m_aircraft->ccpmLinkRoll->isChecked();
useCCPM = !(config.heli.ccpmCollectivePassthroughState || !config.heli.ccpmLinkCyclicState); bool useCCPM = !(config.heli.ccpmCollectivePassthroughState || !config.heli.ccpmLinkCyclicState);
useCyclic = config.heli.ccpmLinkRollState; bool useCyclic = config.heli.ccpmLinkRollState;
// correction angle // correction angle
config.heli.CorrectionAngle = m_aircraft->ccpmCorrectionAngle->value(); config.heli.CorrectionAngle = m_aircraft->ccpmCorrectionAngle->value();
@ -861,7 +860,6 @@ QString ConfigCcpmWidget::updateConfigObjects()
setConfigData(config); setConfigData(config);
updatingFromHardware = false; updatingFromHardware = false;
return airframeType;
} }
void ConfigCcpmWidget::SetUIComponentVisibilities() void ConfigCcpmWidget::SetUIComponentVisibilities()
@ -939,7 +937,7 @@ void ConfigCcpmWidget::getMixer()
updatingFromHardware = true; updatingFromHardware = true;
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
QList<double> curveValues; QList<double> curveValues;
@ -1025,7 +1023,7 @@ void ConfigCcpmWidget::setMixer()
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
if ((MixerChannelData[i] > 0) && (MixerChannelData[i] < (int)ConfigCcpmWidget::CHANNEL_NUMELEM + 1)) { if ((MixerChannelData[i] > 0) && (MixerChannelData[i] < (int)ConfigCcpmWidget::CHANNEL_NUMELEM + 1)) {
// Set the mixer type. If Coax, then first two are motors. Otherwise, only first is motor // Set the mixer type. If Coax, then first two are motors. Otherwise, only first is motor
if (typeText.compare(QString::fromUtf8("Coax 2 Servo 90º"), Qt::CaseInsensitive) == 0) { if (typeText.compare("Coax 2 Servo 90º", Qt::CaseInsensitive) == 0) {
*(mixerTypes[MixerChannelData[i] - 1]) = i > 1 ? *(mixerTypes[MixerChannelData[i] - 1]) = i > 1 ?
MixerSettings::MIXER1TYPE_SERVO : MixerSettings::MIXER1TYPE_SERVO :
MixerSettings::MIXER1TYPE_MOTOR; MixerSettings::MIXER1TYPE_MOTOR;
@ -1141,12 +1139,12 @@ void ConfigCcpmWidget::SwashLvlStartButtonPressed()
// Get the channel assignements: // Get the channel assignements:
obj = dynamic_cast<UAVDataObject *>(objManager->getObject(QString("ActuatorSettings"))); obj = dynamic_cast<UAVDataObject *>(objManager->getObject("ActuatorSettings"));
Q_ASSERT(obj); Q_ASSERT(obj);
// obj->requestUpdate(); // obj->requestUpdate();
MinField = obj->getField(QString("ChannelMin")); MinField = obj->getField("ChannelMin");
NeutralField = obj->getField(QString("ChannelNeutral")); NeutralField = obj->getField("ChannelNeutral");
MaxField = obj->getField(QString("ChannelMax")); MaxField = obj->getField("ChannelMax");
// channel assignments // channel assignments
oldSwashLvlConfiguration.ServoChannels[0] = m_aircraft->ccpmServoWChannel->currentIndex() - 1; oldSwashLvlConfiguration.ServoChannels[0] = m_aircraft->ccpmServoWChannel->currentIndex() - 1;
@ -1291,7 +1289,7 @@ void ConfigCcpmWidget::SwashLvlPrevNextButtonPressed()
m_aircraft->SwashLvlPrevButton->setEnabled(true); m_aircraft->SwashLvlPrevButton->setEnabled(true);
m_aircraft->SwashLvlCancelButton->setEnabled(true); m_aircraft->SwashLvlCancelButton->setEnabled(true);
m_aircraft->SwashLvlFinishButton->setEnabled(true); m_aircraft->SwashLvlFinishButton->setEnabled(true);
break;
default: default:
// restore collective/cyclic setting // restore collective/cyclic setting
// restore pitch curve // restore pitch curve
@ -1324,12 +1322,12 @@ void ConfigCcpmWidget::SwashLvlCancelButtonPressed()
// restore old Actuator Settings // restore old Actuator Settings
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>(); UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
UAVDataObject *obj = dynamic_cast<UAVDataObject *>(objManager->getObject(QString("ActuatorSettings"))); UAVDataObject *obj = dynamic_cast<UAVDataObject *>(objManager->getObject("ActuatorSettings"));
Q_ASSERT(obj); Q_ASSERT(obj);
// update settings to match our changes. // update settings to match our changes.
MinField = obj->getField(QString("ChannelMin")); MinField = obj->getField("ChannelMin");
NeutralField = obj->getField(QString("ChannelNeutral")); NeutralField = obj->getField("ChannelNeutral");
MaxField = obj->getField(QString("ChannelMax")); MaxField = obj->getField("ChannelMax");
// min,neutral,max values for the servos // min,neutral,max values for the servos
for (int i = 0; i < CCPM_MAX_SWASH_SERVOS; i++) { for (int i = 0; i < CCPM_MAX_SWASH_SERVOS; i++) {
@ -1365,13 +1363,13 @@ void ConfigCcpmWidget::SwashLvlFinishButtonPressed()
// save new Actuator Settings to memory and SD card // save new Actuator Settings to memory and SD card
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>(); UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
UAVDataObject *obj = dynamic_cast<UAVDataObject *>(objManager->getObject(QString("ActuatorSettings"))); UAVDataObject *obj = dynamic_cast<UAVDataObject *>(objManager->getObject("ActuatorSettings"));
Q_ASSERT(obj); Q_ASSERT(obj);
// update settings to match our changes. // update settings to match our changes.
MinField = obj->getField(QString("ChannelMin")); MinField = obj->getField("ChannelMin");
NeutralField = obj->getField(QString("ChannelNeutral")); NeutralField = obj->getField("ChannelNeutral");
MaxField = obj->getField(QString("ChannelMax")); MaxField = obj->getField("ChannelMax");
// min,neutral,max values for the servos // min,neutral,max values for the servos
for (int i = 0; i < CCPM_MAX_SWASH_SERVOS; i++) { for (int i = 0; i < CCPM_MAX_SWASH_SERVOS; i++) {
@ -1467,7 +1465,7 @@ void ConfigCcpmWidget::enableSwashplateLevellingControl(bool state)
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>(); UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
UAVDataObject *obj = dynamic_cast<UAVDataObject *>(objManager->getObject(QString("ActuatorCommand"))); UAVDataObject *obj = dynamic_cast<UAVDataObject *>(objManager->getObject("ActuatorCommand"));
UAVObject::Metadata mdata = obj->getMetadata(); UAVObject::Metadata mdata = obj->getMetadata();
if (state) { if (state) {
@ -1481,7 +1479,7 @@ void ConfigCcpmWidget::enableSwashplateLevellingControl(bool state)
m_aircraft->TabObject->setTabEnabled(0, 0); m_aircraft->TabObject->setTabEnabled(0, 0);
m_aircraft->TabObject->setTabEnabled(2, 0); m_aircraft->TabObject->setTabEnabled(2, 0);
m_aircraft->TabObject->setTabEnabled(3, 0); m_aircraft->TabObject->setTabEnabled(3, 0);
m_aircraft->ccpmType->setEnabled(0); m_aircraft->ccpmType->setEnabled(false);
} else { } else {
// Restore metadata // Restore metadata
mdata = SwashLvlaccInitialData; mdata = SwashLvlaccInitialData;
@ -1490,7 +1488,7 @@ void ConfigCcpmWidget::enableSwashplateLevellingControl(bool state)
m_aircraft->TabObject->setTabEnabled(0, 1); m_aircraft->TabObject->setTabEnabled(0, 1);
m_aircraft->TabObject->setTabEnabled(2, 1); m_aircraft->TabObject->setTabEnabled(2, 1);
m_aircraft->TabObject->setTabEnabled(3, 1); m_aircraft->TabObject->setTabEnabled(3, 1);
m_aircraft->ccpmType->setEnabled(1); m_aircraft->ccpmType->setEnabled(true);
} }
obj->setMetadata(mdata); obj->setMetadata(mdata);
} }

View File

@ -25,15 +25,11 @@
* with this program; if not, write to the Free Software Foundation, Inc., * with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef CONFIGccpmWIDGET_H #ifndef CONFIGCCPMWIDGET_H
#define CONFIGccpmWIDGET_H #define CONFIGCCPMWIDGET_H
#include "cfg_vehicletypes/vehicleconfig.h" #include "cfg_vehicletypes/vehicleconfig.h"
#include "../uavobjectwidgetutils/configtaskwidget.h"
#include "uavobject.h"
class Ui_CcpmConfigWidget; class Ui_CcpmConfigWidget;
class QWidget; class QWidget;
@ -62,8 +58,7 @@ public:
ConfigCcpmWidget(QWidget *parent = 0); ConfigCcpmWidget(QWidget *parent = 0);
~ConfigCcpmWidget(); ~ConfigCcpmWidget();
virtual void refreshWidgetsValues(QString frameType); virtual QString getFrameType();
virtual QString updateConfigObjectsFromWidgets();
public slots: public slots:
void getMixer(); void getMixer();
@ -73,6 +68,13 @@ protected:
void showEvent(QShowEvent *event); void showEvent(QShowEvent *event);
void resizeEvent(QResizeEvent *event); void resizeEvent(QResizeEvent *event);
virtual void enableControls(bool enable);
virtual void refreshWidgetsValuesImpl(UAVObject *obj);
virtual void updateObjectsFromWidgetsImpl();
virtual void registerWidgets(ConfigTaskWidget &parent);
virtual void setupUI(QString frameType);
private: private:
Ui_CcpmConfigWidget *m_aircraft; Ui_CcpmConfigWidget *m_aircraft;
@ -96,26 +98,20 @@ private:
int MixerChannelData[6]; int MixerChannelData[6];
virtual void registerWidgets(ConfigTaskWidget &parent); void resetActuators(GUIConfigDataUnion *configData);
virtual void resetActuators(GUIConfigDataUnion *configData);
int ShowDisclaimer(int messageID); int ShowDisclaimer(int messageID);
virtual void enableControls(bool enable)
{
Q_UNUSED(enable)
}; // Not used by this widget
bool updatingFromHardware; bool updatingFromHardware;
bool updatingToHardware; bool updatingToHardware;
QString updateConfigObjects(); void updateConfigObjects();
void saveObjectToSD(UAVObject *obj); void saveObjectToSD(UAVObject *obj);
private slots: bool throwConfigError(int typeInt);
virtual void setupUI(QString airframeType);
virtual bool throwConfigError(int typeInt);
private slots:
void ccpmSwashplateUpdate(); void ccpmSwashplateUpdate();
void ccpmSwashplateRedraw(); void ccpmSwashplateRedraw();
void UpdateMixer(); void UpdateMixer();
@ -128,15 +124,11 @@ private slots:
void SwashLvlCancelButtonPressed(); void SwashLvlCancelButtonPressed();
void SwashLvlFinishButtonPressed(); void SwashLvlFinishButtonPressed();
// void UpdateCCPMOptionsFromUI();
// void UpdateCCPMUIFromOptions();
void SetUIComponentVisibilities(); void SetUIComponentVisibilities();
void enableSwashplateLevellingControl(bool state); void enableSwashplateLevellingControl(bool state);
void setSwashplateLevel(int percent); void setSwashplateLevel(int percent);
void SwashLvlSpinBoxChanged(int value); void SwashLvlSpinBoxChanged(int value);
virtual void refreshValues() {}; // Not used
}; };
#endif // CONFIGccpmWIDGET_H #endif // CONFIGCCPMWIDGET_H

View File

@ -29,6 +29,8 @@
#include "ui_airframe_custom.h" #include "ui_airframe_custom.h"
#include "uavobjectmanager.h"
#include "mixersettings.h" #include "mixersettings.h"
#include <QDebug> #include <QDebug>
@ -47,103 +49,103 @@ QStringList ConfigCustomWidget::getChannelDescriptions()
QStringList channelDesc; QStringList channelDesc;
for (int i = 0; i < (int)VehicleConfig::CHANNEL_NUMELEM; i++) { for (int i = 0; i < (int)VehicleConfig::CHANNEL_NUMELEM; i++) {
channelDesc.append(QString("-")); channelDesc.append("-");
} }
// get the gui config data // get the gui config data
GUIConfigDataUnion configData = getConfigData(); GUIConfigDataUnion configData = getConfigData();
customGUISettingsStruct custom = configData.custom; customGUISettingsStruct custom = configData.custom;
if (custom.Motor1 > 0 && custom.Motor1 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Motor1 > 0 && custom.Motor1 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Motor1 - 1] = QString("Motor1"); channelDesc[custom.Motor1 - 1] = "Motor1";
} }
if (custom.Motor2 > 0 && custom.Motor2 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Motor2 > 0 && custom.Motor2 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Motor2 - 1] = QString("Motor2"); channelDesc[custom.Motor2 - 1] = "Motor2";
} }
if (custom.Motor3 > 0 && custom.Motor3 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Motor3 > 0 && custom.Motor3 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Motor3 - 1] = QString("Motor3"); channelDesc[custom.Motor3 - 1] = "Motor3";
} }
if (custom.Motor4 > 0 && custom.Motor4 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Motor4 > 0 && custom.Motor4 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Motor4 - 1] = QString("Motor4"); channelDesc[custom.Motor4 - 1] = "Motor4";
} }
if (custom.Motor5 > 0 && custom.Motor5 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Motor5 > 0 && custom.Motor5 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Motor5 - 1] = QString("Motor5"); channelDesc[custom.Motor5 - 1] = "Motor5";
} }
if (custom.Motor6 > 0 && custom.Motor6 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Motor6 > 0 && custom.Motor6 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Motor6 - 1] = QString("Motor6"); channelDesc[custom.Motor6 - 1] = "Motor6";
} }
if (custom.Motor7 > 0 && custom.Motor7 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Motor7 > 0 && custom.Motor7 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Motor7 - 1] = QString("Motor7"); channelDesc[custom.Motor7 - 1] = "Motor7";
} }
if (custom.Motor8 > 0 && custom.Motor8 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Motor8 > 0 && custom.Motor8 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Motor8 - 1] = QString("Motor8"); channelDesc[custom.Motor8 - 1] = "Motor8";
} }
if (custom.RevMotor1 > 0 && custom.RevMotor1 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.RevMotor1 > 0 && custom.RevMotor1 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.RevMotor1 - 1] = QString("RevMotor1"); channelDesc[custom.RevMotor1 - 1] = "RevMotor1";
} }
if (custom.RevMotor2 > 0 && custom.RevMotor2 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.RevMotor2 > 0 && custom.RevMotor2 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.RevMotor2 - 1] = QString("RevMotor2"); channelDesc[custom.RevMotor2 - 1] = "RevMotor2";
} }
if (custom.RevMotor3 > 0 && custom.RevMotor3 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.RevMotor3 > 0 && custom.RevMotor3 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.RevMotor3 - 1] = QString("RevMotor3"); channelDesc[custom.RevMotor3 - 1] = "RevMotor3";
} }
if (custom.RevMotor4 > 0 && custom.RevMotor4 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.RevMotor4 > 0 && custom.RevMotor4 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.RevMotor4 - 1] = QString("RevMotor4"); channelDesc[custom.RevMotor4 - 1] = "RevMotor4";
} }
if (custom.RevMotor5 > 0 && custom.RevMotor5 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.RevMotor5 > 0 && custom.RevMotor5 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.RevMotor5 - 1] = QString("RevMotor5"); channelDesc[custom.RevMotor5 - 1] = "RevMotor5";
} }
if (custom.RevMotor6 > 0 && custom.RevMotor6 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.RevMotor6 > 0 && custom.RevMotor6 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.RevMotor6 - 1] = QString("RevMotor6"); channelDesc[custom.RevMotor6 - 1] = "RevMotor6";
} }
if (custom.RevMotor7 > 0 && custom.RevMotor7 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.RevMotor7 > 0 && custom.RevMotor7 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.RevMotor7 - 1] = QString("RevMotor7"); channelDesc[custom.RevMotor7 - 1] = "RevMotor7";
} }
if (custom.RevMotor8 > 0 && custom.RevMotor8 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.RevMotor8 > 0 && custom.RevMotor8 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.RevMotor8 - 1] = QString("RevMotor8"); channelDesc[custom.RevMotor8 - 1] = "RevMotor8";
} }
if (custom.Servo1 > 0 && custom.Servo1 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Servo1 > 0 && custom.Servo1 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Servo1 - 1] = QString("Servo1"); channelDesc[custom.Servo1 - 1] = "Servo1";
} }
if (custom.Servo2 > 0 && custom.Servo2 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Servo2 > 0 && custom.Servo2 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Servo2 - 1] = QString("Servo2"); channelDesc[custom.Servo2 - 1] = "Servo2";
} }
if (custom.Servo3 > 0 && custom.Servo3 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Servo3 > 0 && custom.Servo3 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Servo3 - 1] = QString("Servo3"); channelDesc[custom.Servo3 - 1] = "Servo3";
} }
if (custom.Servo4 > 0 && custom.Servo4 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Servo4 > 0 && custom.Servo4 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Servo4 - 1] = QString("Servo4"); channelDesc[custom.Servo4 - 1] = "Servo4";
} }
if (custom.Servo5 > 0 && custom.Servo5 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Servo5 > 0 && custom.Servo5 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Servo5 - 1] = QString("Servo5"); channelDesc[custom.Servo5 - 1] = "Servo5";
} }
if (custom.Servo6 > 0 && custom.Servo6 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Servo6 > 0 && custom.Servo6 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Servo6 - 1] = QString("Servo6"); channelDesc[custom.Servo6 - 1] = "Servo6";
} }
if (custom.Servo7 > 0 && custom.Servo7 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Servo7 > 0 && custom.Servo7 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Servo7 - 1] = QString("Servo7"); channelDesc[custom.Servo7 - 1] = "Servo7";
} }
if (custom.Servo8 > 0 && custom.Servo8 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Servo8 > 0 && custom.Servo8 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Servo8 - 1] = QString("Servo8"); channelDesc[custom.Servo8 - 1] = "Servo8";
} }
if (custom.Accessory0 > 0 && custom.Accessory0 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Accessory0 > 0 && custom.Accessory0 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory0 - 1] = QString("Accessory0"); channelDesc[custom.Accessory0 - 1] = "Accessory0";
} }
if (custom.Accessory1 > 0 && custom.Accessory1 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Accessory1 > 0 && custom.Accessory1 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory1 - 1] = QString("Accessory1"); channelDesc[custom.Accessory1 - 1] = "Accessory1";
} }
if (custom.Accessory2 > 0 && custom.Accessory2 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Accessory2 > 0 && custom.Accessory2 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory2 - 1] = QString("Accessory2"); channelDesc[custom.Accessory2 - 1] = "Accessory2";
} }
if (custom.Accessory3 > 0 && custom.Accessory3 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Accessory3 > 0 && custom.Accessory3 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory3 - 1] = QString("Accessory3"); channelDesc[custom.Accessory3 - 1] = "Accessory3";
} }
if (custom.Accessory4 > 0 && custom.Accessory4 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Accessory4 > 0 && custom.Accessory4 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory4 - 1] = QString("Accessory4"); channelDesc[custom.Accessory4 - 1] = "Accessory4";
} }
if (custom.Accessory5 > 0 && custom.Accessory5 <= VehicleConfig::CHANNEL_NUMELEM) { if (custom.Accessory5 > 0 && custom.Accessory5 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory5 - 1] = QString("Accessory5"); channelDesc[custom.Accessory5 - 1] = "Accessory5";
} }
return channelDesc; return channelDesc;
} }
@ -157,10 +159,10 @@ ConfigCustomWidget::ConfigCustomWidget(QWidget *parent) :
m_aircraft->customMixerTable->setEditTriggers(QAbstractItemView::NoEditTriggers); m_aircraft->customMixerTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
// Put combo boxes in line one of the custom mixer table: // Put combo boxes in line one of the custom mixer table:
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
UAVObjectField *field = mixer->getField(QString("Mixer1Type")); UAVObjectField *field = mixer->getField("Mixer1Type");
QStringList list = field->getOptions(); QStringList list = field->getOptions();
for (int i = 0; i < (int)VehicleConfig::CHANNEL_NUMELEM; i++) { for (int i = 0; i < (int)VehicleConfig::CHANNEL_NUMELEM; i++) {
QComboBox *qb = new QComboBox(m_aircraft->customMixerTable); QComboBox *qb = new QComboBox(m_aircraft->customMixerTable);
@ -179,6 +181,11 @@ ConfigCustomWidget::~ConfigCustomWidget()
delete m_aircraft; delete m_aircraft;
} }
QString ConfigCustomWidget::getFrameType()
{
return "Custom";
}
void ConfigCustomWidget::setupUI(QString frameType) void ConfigCustomWidget::setupUI(QString frameType)
{ {
Q_UNUSED(frameType); Q_UNUSED(frameType);
@ -190,11 +197,11 @@ void ConfigCustomWidget::registerWidgets(ConfigTaskWidget &parent)
parent.addWidget(m_aircraft->customMixerTable); parent.addWidget(m_aircraft->customMixerTable);
parent.addWidget(m_aircraft->customThrottle1Curve->getCurveWidget()); parent.addWidget(m_aircraft->customThrottle1Curve->getCurveWidget());
parent.addWidget(m_aircraft->customThrottle1Curve); parent.addWidget(m_aircraft->customThrottle1Curve);
// There is no MixerSettings.Curve1Source (i.e. it is always Throttle)
// parent.addWidgetBinding("MixerSettings", "Curve1Source", m_aircraft->curve1SourceCombo);
parent.addWidget(m_aircraft->customThrottle2Curve->getCurveWidget()); parent.addWidget(m_aircraft->customThrottle2Curve->getCurveWidget());
parent.addWidget(m_aircraft->customThrottle2Curve); parent.addWidget(m_aircraft->customThrottle2Curve);
// TODO why is curve2SourceCombo registered twice ?
parent.addWidgetBinding("MixerSettings", "Curve2Source", m_aircraft->curve2SourceCombo); parent.addWidgetBinding("MixerSettings", "Curve2Source", m_aircraft->curve2SourceCombo);
parent.addWidget(m_aircraft->curve2SourceCombo);
} }
void ConfigCustomWidget::resetActuators(GUIConfigDataUnion *configData) void ConfigCustomWidget::resetActuators(GUIConfigDataUnion *configData)
@ -234,15 +241,14 @@ void ConfigCustomWidget::resetActuators(GUIConfigDataUnion *configData)
/** /**
Helper function to refresh the UI widget values Helper function to refresh the UI widget values
*/ */
void ConfigCustomWidget::refreshWidgetsValues(QString frameType) void ConfigCustomWidget::refreshWidgetsValuesImpl(UAVObject *obj)
{ {
Q_ASSERT(m_aircraft); Q_UNUSED(obj);
setupUI(frameType); UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("SystemSettings"));
UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("SystemSettings")));
Q_ASSERT(system); Q_ASSERT(system);
QPointer<UAVObjectField> field = system->getField(QString("AirframeType"));
QPointer<UAVObjectField> field = system->getField("AirframeType");
// Do not allow table edit until AirframeType == Custom // Do not allow table edit until AirframeType == Custom
// First save set AirframeType to 'Custom' and next modify. // First save set AirframeType to 'Custom' and next modify.
@ -252,7 +258,7 @@ void ConfigCustomWidget::refreshWidgetsValues(QString frameType)
m_aircraft->customMixerTable->setEditTriggers(QAbstractItemView::AllEditTriggers); m_aircraft->customMixerTable->setEditTriggers(QAbstractItemView::AllEditTriggers);
} }
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
getChannelDescriptions(); getChannelDescriptions();
@ -314,21 +320,18 @@ void ConfigCustomWidget::refreshWidgetsValues(QString frameType)
} }
/** void ConfigCustomWidget::updateObjectsFromWidgetsImpl()
Helper function to
*/
QString ConfigCustomWidget::updateConfigObjectsFromWidgets()
{ {
UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("SystemSettings"))); UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("SystemSettings"));
Q_ASSERT(system); Q_ASSERT(system);
QPointer<UAVObjectField> field = system->getField(QString("AirframeType")); QPointer<UAVObjectField> field = system->getField("AirframeType");
// Do not allow changes until AirframeType == Custom // Do not allow changes until AirframeType == Custom
// If user want to save custom mixer : first set AirframeType to 'Custom' without changes and next modify. // If user want to save custom mixer : first set AirframeType to 'Custom' without changes and next modify.
if (field->getValue().toString() == "Custom") { if (field->getValue().toString() == "Custom") {
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
@ -438,7 +441,6 @@ QString ConfigCustomWidget::updateConfigObjectsFromWidgets()
} }
setConfigData(configData); setConfigData(configData);
} }
return "Custom";
} }
/** /**

View File

@ -29,17 +29,13 @@
#include "cfg_vehicletypes/vehicleconfig.h" #include "cfg_vehicletypes/vehicleconfig.h"
#include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h"
#include "uavobject.h"
#include <QWidget>
#include <QList> #include <QList>
#include <QItemDelegate> #include <QItemDelegate>
class Ui_CustomConfigWidget; class Ui_CustomConfigWidget;
class QWidget;
class ConfigCustomWidget : public VehicleConfig { class ConfigCustomWidget : public VehicleConfig {
Q_OBJECT Q_OBJECT
@ -49,22 +45,24 @@ public:
ConfigCustomWidget(QWidget *parent = 0); ConfigCustomWidget(QWidget *parent = 0);
~ConfigCustomWidget(); ~ConfigCustomWidget();
virtual void refreshWidgetsValues(QString frameType); virtual QString getFrameType();
virtual QString updateConfigObjectsFromWidgets();
protected: protected:
void showEvent(QShowEvent *event); void showEvent(QShowEvent *event);
void resizeEvent(QResizeEvent *event); void resizeEvent(QResizeEvent *event);
virtual void refreshWidgetsValuesImpl(UAVObject *obj);
virtual void updateObjectsFromWidgetsImpl();
virtual void registerWidgets(ConfigTaskWidget &parent);
virtual void setupUI(QString frameType);
private: private:
Ui_CustomConfigWidget *m_aircraft; Ui_CustomConfigWidget *m_aircraft;
virtual void registerWidgets(ConfigTaskWidget &parent); void resetActuators(GUIConfigDataUnion *configData);
virtual void resetActuators(GUIConfigDataUnion *configData);
private slots: bool throwConfigError(int numMotors);
virtual void setupUI(QString airframeType);
virtual bool throwConfigError(int numMotors);
}; };
class SpinBoxDelegate : public QItemDelegate { class SpinBoxDelegate : public QItemDelegate {

View File

@ -29,6 +29,8 @@
#include "ui_airframe_fixedwing.h" #include "ui_airframe_fixedwing.h"
#include "uavobjectmanager.h"
#include "mixersettings.h" #include "mixersettings.h"
#include "systemsettings.h" #include "systemsettings.h"
#include "actuatorsettings.h" #include "actuatorsettings.h"
@ -50,7 +52,7 @@ QStringList ConfigFixedWingWidget::getChannelDescriptions()
QStringList channelDesc; QStringList channelDesc;
for (int i = 0; i < (int)ConfigFixedWingWidget::CHANNEL_NUMELEM; i++) { for (int i = 0; i < (int)ConfigFixedWingWidget::CHANNEL_NUMELEM; i++) {
channelDesc.append(QString("-")); channelDesc.append("-");
} }
// get the gui config data // get the gui config data
@ -58,51 +60,51 @@ QStringList ConfigFixedWingWidget::getChannelDescriptions()
fixedGUISettingsStruct fixedwing = configData.fixedwing; fixedGUISettingsStruct fixedwing = configData.fixedwing;
if (configData.fixedwing.FixedWingPitch1 > 0) { if (configData.fixedwing.FixedWingPitch1 > 0) {
channelDesc[configData.fixedwing.FixedWingPitch1 - 1] = QString("FixedWingPitch1"); channelDesc[configData.fixedwing.FixedWingPitch1 - 1] = "FixedWingPitch1";
} }
if (configData.fixedwing.FixedWingPitch2 > 0) { if (configData.fixedwing.FixedWingPitch2 > 0) {
channelDesc[configData.fixedwing.FixedWingPitch2 - 1] = QString("FixedWingPitch2"); channelDesc[configData.fixedwing.FixedWingPitch2 - 1] = "FixedWingPitch2";
} }
if (configData.fixedwing.FixedWingRoll1 > 0) { if (configData.fixedwing.FixedWingRoll1 > 0) {
channelDesc[configData.fixedwing.FixedWingRoll1 - 1] = QString("FixedWingRoll1"); channelDesc[configData.fixedwing.FixedWingRoll1 - 1] = "FixedWingRoll1";
} }
if (configData.fixedwing.FixedWingRoll2 > 0) { if (configData.fixedwing.FixedWingRoll2 > 0) {
channelDesc[configData.fixedwing.FixedWingRoll2 - 1] = QString("FixedWingRoll2"); channelDesc[configData.fixedwing.FixedWingRoll2 - 1] = "FixedWingRoll2";
} }
if (configData.fixedwing.FixedWingYaw1 > 0) { if (configData.fixedwing.FixedWingYaw1 > 0) {
channelDesc[configData.fixedwing.FixedWingYaw1 - 1] = QString("FixedWingYaw1"); channelDesc[configData.fixedwing.FixedWingYaw1 - 1] = "FixedWingYaw1";
} }
if (configData.fixedwing.FixedWingYaw2 > 0) { if (configData.fixedwing.FixedWingYaw2 > 0) {
channelDesc[configData.fixedwing.FixedWingYaw2 - 1] = QString("FixedWingYaw2"); channelDesc[configData.fixedwing.FixedWingYaw2 - 1] = "FixedWingYaw2";
} }
if (configData.fixedwing.FixedWingThrottle > 0) { if (configData.fixedwing.FixedWingThrottle > 0) {
channelDesc[configData.fixedwing.FixedWingThrottle - 1] = QString("FixedWingThrottle"); channelDesc[configData.fixedwing.FixedWingThrottle - 1] = "FixedWingThrottle";
} }
if (fixedwing.Accessory0 > 0 && fixedwing.Accessory0 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) { if (fixedwing.Accessory0 > 0 && fixedwing.Accessory0 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
channelDesc[fixedwing.Accessory0 - 1] = QString("Accessory0-1"); channelDesc[fixedwing.Accessory0 - 1] = "Accessory0-1";
} }
if (fixedwing.Accessory1 > 0 && fixedwing.Accessory1 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) { if (fixedwing.Accessory1 > 0 && fixedwing.Accessory1 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
channelDesc[fixedwing.Accessory1 - 1] = QString("Accessory1-1"); channelDesc[fixedwing.Accessory1 - 1] = "Accessory1-1";
} }
if (fixedwing.Accessory2 > 0 && fixedwing.Accessory2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) { if (fixedwing.Accessory2 > 0 && fixedwing.Accessory2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
channelDesc[fixedwing.Accessory2 - 1] = QString("Accessory2-1"); channelDesc[fixedwing.Accessory2 - 1] = "Accessory2-1";
} }
if (fixedwing.Accessory3 > 0 && fixedwing.Accessory3 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) { if (fixedwing.Accessory3 > 0 && fixedwing.Accessory3 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
channelDesc[fixedwing.Accessory3 - 1] = QString("Accessory3-1"); channelDesc[fixedwing.Accessory3 - 1] = "Accessory3-1";
} }
if (fixedwing.Accessory0_2 > 0 && fixedwing.Accessory0_2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) { if (fixedwing.Accessory0_2 > 0 && fixedwing.Accessory0_2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
channelDesc[fixedwing.Accessory0_2 - 1] = QString("Accessory0-2"); channelDesc[fixedwing.Accessory0_2 - 1] = "Accessory0-2";
} }
if (fixedwing.Accessory1_2 > 0 && fixedwing.Accessory1_2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) { if (fixedwing.Accessory1_2 > 0 && fixedwing.Accessory1_2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
channelDesc[fixedwing.Accessory1_2 - 1] = QString("Accessory1-2"); channelDesc[fixedwing.Accessory1_2 - 1] = "Accessory1-2";
} }
if (fixedwing.Accessory2_2 > 0 && fixedwing.Accessory2_2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) { if (fixedwing.Accessory2_2 > 0 && fixedwing.Accessory2_2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
channelDesc[fixedwing.Accessory2_2 - 1] = QString("Accessory2-2"); channelDesc[fixedwing.Accessory2_2 - 1] = "Accessory2-2";
} }
if (fixedwing.Accessory3_2 > 0 && fixedwing.Accessory3_2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) { if (fixedwing.Accessory3_2 > 0 && fixedwing.Accessory3_2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
channelDesc[fixedwing.Accessory3_2 - 1] = QString("Accessory3-2"); channelDesc[fixedwing.Accessory3_2 - 1] = "Accessory3-2";
} }
return channelDesc; return channelDesc;
@ -131,7 +133,7 @@ ConfigFixedWingWidget::ConfigFixedWingWidget(QWidget *parent) :
m_aircraft->planeShape->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_aircraft->planeShape->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// Set default model to "Aileron" // Set default model to "Aileron"
connect(m_aircraft->fixedWingType, SIGNAL(currentIndexChanged(QString)), this, SLOT(setupUI(QString))); connect(m_aircraft->fixedWingType, SIGNAL(currentIndexChanged(QString)), this, SLOT(frameTypeChanged(QString)));
m_aircraft->fixedWingType->setCurrentIndex(m_aircraft->fixedWingType->findText("Aileron")); m_aircraft->fixedWingType->setCurrentIndex(m_aircraft->fixedWingType->findText("Aileron"));
setupUI(m_aircraft->fixedWingType->currentText()); setupUI(m_aircraft->fixedWingType->currentText());
} }
@ -141,6 +143,21 @@ ConfigFixedWingWidget::~ConfigFixedWingWidget()
delete m_aircraft; delete m_aircraft;
} }
QString ConfigFixedWingWidget::getFrameType()
{
QString frameType = "FixedWing";
// All airframe types must start with "FixedWing"
if (m_aircraft->fixedWingType->currentText() == "Aileron") {
frameType = "FixedWing";
} else if (m_aircraft->fixedWingType->currentText() == "Elevon") {
frameType = "FixedWingElevon";
} else { // "Vtail"
frameType = "FixedWingVtail";
}
return frameType;
}
/** /**
Virtual function to setup the UI Virtual function to setup the UI
*/ */
@ -152,11 +169,11 @@ void ConfigFixedWingWidget::setupUI(QString frameType)
planeimg = new QGraphicsSvgItem(); planeimg = new QGraphicsSvgItem();
planeimg->setSharedRenderer(renderer); planeimg->setSharedRenderer(renderer);
UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("SystemSettings"))); UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("SystemSettings"));
Q_ASSERT(system); Q_ASSERT(system);
QPointer<UAVObjectField> field = system->getField(QString("AirframeType")); QPointer<UAVObjectField> field = system->getField("AirframeType");
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
if (frameType == "FixedWing" || frameType == "Aileron") { if (frameType == "FixedWing" || frameType == "Aileron") {
@ -317,7 +334,7 @@ void ConfigFixedWingWidget::resetRcOutputs(GUIConfigDataUnion *configData)
void ConfigFixedWingWidget::updateRcCurvesUsed() void ConfigFixedWingWidget::updateRcCurvesUsed()
{ {
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
@ -343,13 +360,11 @@ void ConfigFixedWingWidget::updateRcCurvesUsed()
/** /**
Virtual function to refresh the UI widget values Virtual function to refresh the UI widget values
*/ */
void ConfigFixedWingWidget::refreshWidgetsValues(QString frameType) void ConfigFixedWingWidget::refreshWidgetsValuesImpl(UAVObject *obj)
{ {
Q_ASSERT(m_aircraft); Q_UNUSED(obj);
setupUI(frameType); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings")));
Q_ASSERT(mixer); Q_ASSERT(mixer);
QList<double> curveValues; QList<double> curveValues;
@ -390,6 +405,7 @@ void ConfigFixedWingWidget::refreshWidgetsValues(QString frameType)
// Get mixing values for GUI sliders (values stored onboard) // Get mixing values for GUI sliders (values stored onboard)
m_aircraft->elevonSlider3->setValue(getMixerValue(mixer, "RollDifferential")); m_aircraft->elevonSlider3->setValue(getMixerValue(mixer, "RollDifferential"));
QString frameType = getFrameType();
if (frameType == "FixedWingElevon" || frameType == "Elevon") { if (frameType == "FixedWingElevon" || frameType == "Elevon") {
m_aircraft->elevonSlider1->setValue(getMixerValue(mixer, "MixerValueRoll")); m_aircraft->elevonSlider1->setValue(getMixerValue(mixer, "MixerValueRoll"));
m_aircraft->elevonSlider2->setValue(getMixerValue(mixer, "MixerValuePitch")); m_aircraft->elevonSlider2->setValue(getMixerValue(mixer, "MixerValuePitch"));
@ -402,12 +418,10 @@ void ConfigFixedWingWidget::refreshWidgetsValues(QString frameType)
/** /**
Virtual function to update the UI widget objects Virtual function to update the UI widget objects
*/ */
QString ConfigFixedWingWidget::updateConfigObjectsFromWidgets() void ConfigFixedWingWidget::updateObjectsFromWidgetsImpl()
{ {
QString airframeType = "FixedWing";
// Save the curve (common to all Fixed wing frames) // Save the curve (common to all Fixed wing frames)
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
@ -421,19 +435,14 @@ QString ConfigFixedWingWidget::updateConfigObjectsFromWidgets()
// Set the throttle curve // Set the throttle curve
setThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, m_aircraft->fixedWingThrottle->getCurve()); setThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, m_aircraft->fixedWingThrottle->getCurve());
// All airframe types must start with "FixedWing" QString frameType = getFrameType();
if (m_aircraft->fixedWingType->currentText() == "Aileron") { if (m_aircraft->fixedWingType->currentText() == "Aileron") {
airframeType = "FixedWing"; setupFrameFixedWing(frameType);
setupFrameFixedWing(airframeType);
} else if (m_aircraft->fixedWingType->currentText() == "Elevon") { } else if (m_aircraft->fixedWingType->currentText() == "Elevon") {
airframeType = "FixedWingElevon"; setupFrameElevon(frameType);
setupFrameElevon(airframeType);
} else { // "Vtail" } else { // "Vtail"
airframeType = "FixedWingVtail"; setupFrameVtail(frameType);
setupFrameVtail(airframeType);
} }
return airframeType;
} }
/** /**
@ -443,11 +452,11 @@ QString ConfigFixedWingWidget::updateConfigObjectsFromWidgets()
Returns False if impossible to create the mixer. Returns False if impossible to create the mixer.
*/ */
bool ConfigFixedWingWidget::setupFrameFixedWing(QString airframeType) bool ConfigFixedWingWidget::setupFrameFixedWing(QString frameType)
{ {
// Check coherence: // Check coherence:
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(airframeType)) { if (throwConfigError(frameType)) {
return false; return false;
} }
@ -465,7 +474,7 @@ bool ConfigFixedWingWidget::setupFrameFixedWing(QString airframeType)
setConfigData(config); setConfigData(config);
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
resetMotorAndServoMixers(mixer); resetMotorAndServoMixers(mixer);
@ -519,11 +528,11 @@ bool ConfigFixedWingWidget::setupFrameFixedWing(QString airframeType)
/** /**
Setup Elevon Setup Elevon
*/ */
bool ConfigFixedWingWidget::setupFrameElevon(QString airframeType) bool ConfigFixedWingWidget::setupFrameElevon(QString frameType)
{ {
// Check coherence: // Check coherence:
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(airframeType)) { if (throwConfigError(frameType)) {
return false; return false;
} }
@ -538,7 +547,7 @@ bool ConfigFixedWingWidget::setupFrameElevon(QString airframeType)
setConfigData(config); setConfigData(config);
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
resetMotorAndServoMixers(mixer); resetMotorAndServoMixers(mixer);
@ -602,11 +611,11 @@ bool ConfigFixedWingWidget::setupFrameElevon(QString airframeType)
/** /**
Setup VTail Setup VTail
*/ */
bool ConfigFixedWingWidget::setupFrameVtail(QString airframeType) bool ConfigFixedWingWidget::setupFrameVtail(QString frameType)
{ {
// Check coherence: // Check coherence:
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(airframeType)) { if (throwConfigError(frameType)) {
return false; return false;
} }
@ -621,7 +630,7 @@ bool ConfigFixedWingWidget::setupFrameVtail(QString airframeType)
setConfigData(config); setConfigData(config);
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
resetMotorAndServoMixers(mixer); resetMotorAndServoMixers(mixer);
@ -802,8 +811,6 @@ void ConfigFixedWingWidget::setupRcOutputs(QList<QString> rcOutputList)
void ConfigFixedWingWidget::enableControls(bool enable) void ConfigFixedWingWidget::enableControls(bool enable)
{ {
ConfigTaskWidget::enableControls(enable);
if (enable) { if (enable) {
setupUI(m_aircraft->fixedWingType->currentText()); setupUI(m_aircraft->fixedWingType->currentText());
} }
@ -812,7 +819,7 @@ void ConfigFixedWingWidget::enableControls(bool enable)
/** /**
This function displays text and color formatting in order to help the user understand what channels have not yet been configured. This function displays text and color formatting in order to help the user understand what channels have not yet been configured.
*/ */
bool ConfigFixedWingWidget::throwConfigError(QString airframeType) bool ConfigFixedWingWidget::throwConfigError(QString frameType)
{ {
// Initialize configuration error flag // Initialize configuration error flag
bool error = false; bool error = false;
@ -830,15 +837,15 @@ bool ConfigFixedWingWidget::throwConfigError(QString airframeType)
if (combobox->currentText() == "None") { if (combobox->currentText() == "None") {
int size = combobox->style()->pixelMetric(QStyle::PM_SmallIconSize); int size = combobox->style()->pixelMetric(QStyle::PM_SmallIconSize);
QPixmap pixmap(size, size); QPixmap pixmap(size, size);
if ((airframeType == "FixedWingElevon") && (i > 2)) { if ((frameType == "FixedWingElevon") && (i > 2)) {
pixmap.fill(QColor("green")); pixmap.fill(QColor("green"));
// Rudders are optional for elevon frame // Rudders are optional for elevon frame
combobox->setToolTip(tr("Rudders are optional for Elevon frame")); combobox->setToolTip(tr("Rudders are optional for Elevon frame"));
} else if (((airframeType == "FixedWing") || (airframeType == "FixedWingVtail")) && (i == 2)) { } else if (((frameType == "FixedWing") || (frameType == "FixedWingVtail")) && (i == 2)) {
pixmap.fill(QColor("green")); pixmap.fill(QColor("green"));
// Second aileron servo is optional for FixedWing frame // Second aileron servo is optional for FixedWing frame
combobox->setToolTip(tr("Second aileron servo is optional")); combobox->setToolTip(tr("Second aileron servo is optional"));
} else if ((airframeType == "FixedWing") && (i > 3)) { } else if ((frameType == "FixedWing") && (i > 3)) {
pixmap.fill(QColor("green")); pixmap.fill(QColor("green"));
// Second elevator and rudders are optional for FixedWing frame // Second elevator and rudders are optional for FixedWing frame
combobox->setToolTip(tr("Second elevator servo is optional")); combobox->setToolTip(tr("Second elevator servo is optional"));

View File

@ -29,11 +29,6 @@
#include "cfg_vehicletypes/vehicleconfig.h" #include "cfg_vehicletypes/vehicleconfig.h"
#include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h"
#include "uavobject.h"
#include <QList> #include <QList>
class Ui_FixedWingConfigWidget; class Ui_FixedWingConfigWidget;
@ -50,31 +45,33 @@ public:
ConfigFixedWingWidget(QWidget *parent = 0); ConfigFixedWingWidget(QWidget *parent = 0);
~ConfigFixedWingWidget(); ~ConfigFixedWingWidget();
virtual void refreshWidgetsValues(QString frameType); virtual QString getFrameType();
virtual QString updateConfigObjectsFromWidgets();
protected:
void resizeEvent(QResizeEvent *);
void showEvent(QShowEvent *);
virtual void enableControls(bool enable);
virtual void refreshWidgetsValuesImpl(UAVObject *obj);
virtual void updateObjectsFromWidgetsImpl();
virtual void registerWidgets(ConfigTaskWidget &parent);
virtual void setupUI(QString frameType);
private: private:
Ui_FixedWingConfigWidget *m_aircraft; Ui_FixedWingConfigWidget *m_aircraft;
QGraphicsSvgItem *planeimg; QGraphicsSvgItem *planeimg;
virtual void registerWidgets(ConfigTaskWidget &parent); void resetActuators(GUIConfigDataUnion *configData);
virtual void resetActuators(GUIConfigDataUnion *configData); void resetRcOutputs(GUIConfigDataUnion *configData);
virtual void resetRcOutputs(GUIConfigDataUnion *configData);
bool setupFrameFixedWing(QString airframeType); bool setupFrameFixedWing(QString frameType);
bool setupFrameElevon(QString airframeType); bool setupFrameElevon(QString frameType);
bool setupFrameVtail(QString airframeType); bool setupFrameVtail(QString frameType);
void setupRcOutputs(QList<QString> rcOutputList); void setupRcOutputs(QList<QString> rcOutputList);
void updateRcCurvesUsed(); void updateRcCurvesUsed();
protected: bool throwConfigError(QString frameType);
void enableControls(bool enable);
void resizeEvent(QResizeEvent *);
void showEvent(QShowEvent *);
private slots:
virtual void setupUI(QString airframeType);
virtual bool throwConfigError(QString airframeType);
}; };
#endif // CONFIGFIXEDWINGWIDGET_H #endif // CONFIGFIXEDWINGWIDGET_H

View File

@ -29,6 +29,8 @@
#include "ui_airframe_ground.h" #include "ui_airframe_ground.h"
#include "uavobjectmanager.h"
#include "mixersettings.h" #include "mixersettings.h"
#include "systemsettings.h" #include "systemsettings.h"
#include "actuatorsettings.h" #include "actuatorsettings.h"
@ -51,23 +53,23 @@ QStringList ConfigGroundVehicleWidget::getChannelDescriptions()
QStringList channelDesc; QStringList channelDesc;
for (int i = 0; i < (int)ConfigGroundVehicleWidget::CHANNEL_NUMELEM; i++) { for (int i = 0; i < (int)ConfigGroundVehicleWidget::CHANNEL_NUMELEM; i++) {
channelDesc.append(QString("-")); channelDesc.append("-");
} }
// get the gui config data // get the gui config data
GUIConfigDataUnion configData = getConfigData(); GUIConfigDataUnion configData = getConfigData();
if (configData.ground.GroundVehicleSteering1 > 0) { if (configData.ground.GroundVehicleSteering1 > 0) {
channelDesc[configData.ground.GroundVehicleSteering1 - 1] = QString("GroundSteering1"); channelDesc[configData.ground.GroundVehicleSteering1 - 1] = "GroundSteering1";
} }
if (configData.ground.GroundVehicleSteering2 > 0) { if (configData.ground.GroundVehicleSteering2 > 0) {
channelDesc[configData.ground.GroundVehicleSteering2 - 1] = QString("GroundSteering2"); channelDesc[configData.ground.GroundVehicleSteering2 - 1] = "GroundSteering2";
} }
if (configData.ground.GroundVehicleThrottle1 > 0) { if (configData.ground.GroundVehicleThrottle1 > 0) {
channelDesc[configData.ground.GroundVehicleThrottle1 - 1] = QString("GroundMotor1"); channelDesc[configData.ground.GroundVehicleThrottle1 - 1] = "GroundMotor1";
} }
if (configData.ground.GroundVehicleThrottle2 > 0) { if (configData.ground.GroundVehicleThrottle2 > 0) {
channelDesc[configData.ground.GroundVehicleThrottle2 - 1] = QString("GroundMotor2"); channelDesc[configData.ground.GroundVehicleThrottle2 - 1] = "GroundMotor2";
} }
return channelDesc; return channelDesc;
} }
@ -88,8 +90,10 @@ ConfigGroundVehicleWidget::ConfigGroundVehicleWidget(QWidget *parent) :
m_aircraft->groundShape->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_aircraft->groundShape->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// Set default model to "Car (Turnable)" // Set default model to "Car (Turnable)"
connect(m_aircraft->groundVehicleType, SIGNAL(currentIndexChanged(QString)), this, SLOT(setupUI(QString)));
m_aircraft->groundVehicleType->setCurrentIndex(m_aircraft->groundVehicleType->findText("Car (Turnable)")); m_aircraft->groundVehicleType->setCurrentIndex(m_aircraft->groundVehicleType->findText("Car (Turnable)"));
connect(m_aircraft->groundVehicleType, SIGNAL(currentIndexChanged(QString)), this, SLOT(frameTypeChanged(QString)));
setupUI(m_aircraft->groundVehicleType->currentText()); setupUI(m_aircraft->groundVehicleType->currentText());
} }
@ -98,6 +102,25 @@ ConfigGroundVehicleWidget::~ConfigGroundVehicleWidget()
delete m_aircraft; delete m_aircraft;
} }
QString ConfigGroundVehicleWidget::getFrameType()
{
QString frameType = "GroundVehicleCar";
// All frame types must start with "GroundVehicle"
if (m_aircraft->groundVehicleType->currentText() == "Boat (Differential)") {
frameType = "GroundVehicleDifferentialBoat";
} else if (m_aircraft->groundVehicleType->currentText() == "Boat (Turnable)") {
frameType = "GroundVehicleBoat";
} else if (m_aircraft->groundVehicleType->currentText() == "Car (Turnable)") {
frameType = "GroundVehicleCar";
} else if (m_aircraft->groundVehicleType->currentText() == "Tank (Differential)") {
frameType = "GroundVehicleDifferential";
} else {
frameType = "GroundVehicleMotorcycle";
}
return frameType;
}
/** /**
Virtual function to setup the UI Virtual function to setup the UI
*/ */
@ -111,9 +134,9 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
m_vehicleImg = new QGraphicsSvgItem(); m_vehicleImg = new QGraphicsSvgItem();
m_vehicleImg->setSharedRenderer(renderer); m_vehicleImg->setSharedRenderer(renderer);
UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("SystemSettings"))); UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("SystemSettings"));
Q_ASSERT(system); Q_ASSERT(system);
QPointer<UAVObjectField> frameTypeSaved = system->getField(QString("AirframeType")); QPointer<UAVObjectField> frameTypeSaved = system->getField("AirframeType");
m_aircraft->differentialSteeringSlider1->setEnabled(false); m_aircraft->differentialSteeringSlider1->setEnabled(false);
m_aircraft->differentialSteeringSlider2->setEnabled(false); m_aircraft->differentialSteeringSlider2->setEnabled(false);
@ -129,7 +152,6 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
if (frameType == "GroundVehicleBoat" || frameType == "Boat (Turnable)") { if (frameType == "GroundVehicleBoat" || frameType == "Boat (Turnable)") {
// Boat // Boat
m_vehicleImg->setElementId("boat"); m_vehicleImg->setElementId("boat");
setComboCurrentIndex(m_aircraft->groundVehicleType, m_aircraft->groundVehicleType->findText("Boat (Turnable)"));
m_aircraft->gvMotor1ChannelBox->setEnabled(true); m_aircraft->gvMotor1ChannelBox->setEnabled(true);
m_aircraft->gvMotor2ChannelBox->setEnabled(true); m_aircraft->gvMotor2ChannelBox->setEnabled(true);
@ -160,20 +182,16 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
} }
} else if ((frameType == "GroundVehicleDifferential") || (frameType == "Tank (Differential)") || } else if ((frameType == "GroundVehicleDifferential") || (frameType == "Tank (Differential)") ||
(frameType == "GroundVehicleDifferentialBoat") || (frameType == "Boat (Differential)")) { (frameType == "GroundVehicleDifferentialBoat") || (frameType == "Boat (Differential)")) {
bool is_Boat = frameType.contains("Boat"); bool isBoat = frameType.contains("Boat");
if (is_Boat) { if (isBoat) {
// Boat differential // Boat differential
m_vehicleImg->setElementId("boat_diff"); m_vehicleImg->setElementId("boat_diff");
setComboCurrentIndex(m_aircraft->groundVehicleType,
m_aircraft->groundVehicleType->findText("Boat (Differential)"));
m_aircraft->gvSteering1Label->setText("First rudder"); m_aircraft->gvSteering1Label->setText("First rudder");
m_aircraft->gvSteering2Label->setText("Second rudder"); m_aircraft->gvSteering2Label->setText("Second rudder");
} else { } else {
// Tank // Tank
m_vehicleImg->setElementId("tank"); m_vehicleImg->setElementId("tank");
setComboCurrentIndex(m_aircraft->groundVehicleType,
m_aircraft->groundVehicleType->findText("Tank (Differential)"));
m_aircraft->gvSteering1Label->setText("Front steering"); m_aircraft->gvSteering1Label->setText("Front steering");
m_aircraft->gvSteering2Label->setText("Rear steering"); m_aircraft->gvSteering2Label->setText("Rear steering");
} }
@ -181,7 +199,6 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
m_aircraft->gvMotor1ChannelBox->setEnabled(true); m_aircraft->gvMotor1ChannelBox->setEnabled(true);
m_aircraft->gvMotor2ChannelBox->setEnabled(true); m_aircraft->gvMotor2ChannelBox->setEnabled(true);
m_aircraft->gvMotor1Label->setText("Left motor"); m_aircraft->gvMotor1Label->setText("Left motor");
m_aircraft->gvMotor2Label->setText("Right motor"); m_aircraft->gvMotor2Label->setText("Right motor");
@ -202,8 +219,8 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
initMixerCurves(frameType); initMixerCurves(frameType);
// If new setup, set sliders to defaults and set curves values // If new setup, set sliders to defaults and set curves values
if ((!is_Boat && (frameTypeSaved->getValue().toString() != "GroundVehicleDifferential")) || if ((!isBoat && (frameTypeSaved->getValue().toString() != "GroundVehicleDifferential")) ||
(is_Boat && (frameTypeSaved->getValue().toString() != "GroundVehicleDifferentialBoat"))) { (isBoat && (frameTypeSaved->getValue().toString() != "GroundVehicleDifferentialBoat"))) {
m_aircraft->differentialSteeringSlider1->setValue(100); m_aircraft->differentialSteeringSlider1->setValue(100);
m_aircraft->differentialSteeringSlider2->setValue(100); m_aircraft->differentialSteeringSlider2->setValue(100);
m_aircraft->groundVehicleThrottle1->initLinearCurve(5, 0.8, 0.0); m_aircraft->groundVehicleThrottle1->initLinearCurve(5, 0.8, 0.0);
@ -212,7 +229,6 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
} else if (frameType == "GroundVehicleMotorcycle" || frameType == "Motorcycle") { } else if (frameType == "GroundVehicleMotorcycle" || frameType == "Motorcycle") {
// Motorcycle // Motorcycle
m_vehicleImg->setElementId("motorbike"); m_vehicleImg->setElementId("motorbike");
setComboCurrentIndex(m_aircraft->groundVehicleType, m_aircraft->groundVehicleType->findText("Motorcycle"));
m_aircraft->gvMotor1ChannelBox->setEnabled(false); m_aircraft->gvMotor1ChannelBox->setEnabled(false);
m_aircraft->gvMotor2ChannelBox->setEnabled(true); m_aircraft->gvMotor2ChannelBox->setEnabled(true);
@ -244,7 +260,6 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
} else { } else {
// Car // Car
m_vehicleImg->setElementId("car"); m_vehicleImg->setElementId("car");
setComboCurrentIndex(m_aircraft->groundVehicleType, m_aircraft->groundVehicleType->findText("Car (Turnable)"));
m_aircraft->gvMotor1ChannelBox->setEnabled(true); m_aircraft->gvMotor1ChannelBox->setEnabled(true);
m_aircraft->gvMotor2ChannelBox->setEnabled(true); m_aircraft->gvMotor2ChannelBox->setEnabled(true);
@ -284,8 +299,6 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
void ConfigGroundVehicleWidget::enableControls(bool enable) void ConfigGroundVehicleWidget::enableControls(bool enable)
{ {
ConfigTaskWidget::enableControls(enable);
if (enable) { if (enable) {
setupUI(m_aircraft->groundVehicleType->currentText()); setupUI(m_aircraft->groundVehicleType->currentText());
} }
@ -315,13 +328,15 @@ void ConfigGroundVehicleWidget::resetActuators(GUIConfigDataUnion *configData)
/** /**
Virtual function to refresh the UI widget values Virtual function to refresh the UI widget values
*/ */
void ConfigGroundVehicleWidget::refreshWidgetsValues(QString frameType) void ConfigGroundVehicleWidget::refreshWidgetsValuesImpl(UAVObject *obj)
{ {
setupUI(frameType); Q_UNUSED(obj);
QString frameType = getFrameType();
initMixerCurves(frameType); initMixerCurves(frameType);
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
GUIConfigDataUnion config = getConfigData(); GUIConfigDataUnion config = getConfigData();
@ -354,7 +369,7 @@ void ConfigGroundVehicleWidget::refreshWidgetsValues(QString frameType)
*/ */
void ConfigGroundVehicleWidget::initMixerCurves(QString frameType) void ConfigGroundVehicleWidget::initMixerCurves(QString frameType)
{ {
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
@ -376,7 +391,7 @@ void ConfigGroundVehicleWidget::initMixerCurves(QString frameType)
} }
} }
// Setup all Throttle2 curves for all types of airframes // Setup all Throttle2 curves for all types of frames
getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE2, &curveValues); getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE2, &curveValues);
if (isValidThrottleCurve(&curveValues)) { if (isValidThrottleCurve(&curveValues)) {
@ -396,36 +411,27 @@ void ConfigGroundVehicleWidget::initMixerCurves(QString frameType)
/** /**
Virtual function to update the UI widget objects Virtual function to update the UI widget objects
*/ */
QString ConfigGroundVehicleWidget::updateConfigObjectsFromWidgets() void ConfigGroundVehicleWidget::updateObjectsFromWidgetsImpl()
{ {
QString airframeType = "GroundVehicleCar";
// Save the curve (common to all ground vehicle frames) // Save the curve (common to all ground vehicle frames)
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
// set the throttle curves // set the throttle curves
setThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, m_aircraft->groundVehicleThrottle1->getCurve()); setThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, m_aircraft->groundVehicleThrottle1->getCurve());
setThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE2, m_aircraft->groundVehicleThrottle2->getCurve()); setThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE2, m_aircraft->groundVehicleThrottle2->getCurve());
// All airframe types must start with "GroundVehicle" QString frameType = getFrameType();
if (m_aircraft->groundVehicleType->currentText() == "Boat (Differential)") { if (m_aircraft->groundVehicleType->currentText() == "Boat (Differential)") {
airframeType = "GroundVehicleDifferentialBoat"; setupGroundVehicleDifferential(frameType);
setupGroundVehicleDifferential(airframeType);
} else if (m_aircraft->groundVehicleType->currentText() == "Boat (Turnable)") { } else if (m_aircraft->groundVehicleType->currentText() == "Boat (Turnable)") {
airframeType = "GroundVehicleBoat"; setupGroundVehicleTurnable(frameType);
setupGroundVehicleTurnable(airframeType);
} else if (m_aircraft->groundVehicleType->currentText() == "Car (Turnable)") { } else if (m_aircraft->groundVehicleType->currentText() == "Car (Turnable)") {
airframeType = "GroundVehicleCar"; setupGroundVehicleTurnable(frameType);
setupGroundVehicleTurnable(airframeType);
} else if (m_aircraft->groundVehicleType->currentText() == "Tank (Differential)") { } else if (m_aircraft->groundVehicleType->currentText() == "Tank (Differential)") {
airframeType = "GroundVehicleDifferential"; setupGroundVehicleDifferential(frameType);
setupGroundVehicleDifferential(airframeType);
} else { } else {
airframeType = "GroundVehicleMotorcycle"; setupGroundVehicleMotorcycle(frameType);
setupGroundVehicleMotorcycle(airframeType);
} }
return airframeType;
} }
/** /**
@ -433,11 +439,11 @@ QString ConfigGroundVehicleWidget::updateConfigObjectsFromWidgets()
Returns False if impossible to create the mixer. Returns False if impossible to create the mixer.
*/ */
bool ConfigGroundVehicleWidget::setupGroundVehicleMotorcycle(QString airframeType) bool ConfigGroundVehicleWidget::setupGroundVehicleMotorcycle(QString frameType)
{ {
// Check coherence: // Check coherence:
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(airframeType)) { if (throwConfigError(frameType)) {
return false; return false;
} }
@ -451,7 +457,7 @@ bool ConfigGroundVehicleWidget::setupGroundVehicleMotorcycle(QString airframeTyp
setConfigData(config); setConfigData(config);
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
resetMotorAndServoMixers(mixer); resetMotorAndServoMixers(mixer);
@ -483,12 +489,12 @@ bool ConfigGroundVehicleWidget::setupGroundVehicleMotorcycle(QString airframeTyp
Returns False if impossible to create the mixer. Returns False if impossible to create the mixer.
*/ */
bool ConfigGroundVehicleWidget::setupGroundVehicleDifferential(QString airframeType) bool ConfigGroundVehicleWidget::setupGroundVehicleDifferential(QString frameType)
{ {
// Check coherence: // Check coherence:
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(airframeType)) { if (throwConfigError(frameType)) {
return false; return false;
} }
@ -501,7 +507,7 @@ bool ConfigGroundVehicleWidget::setupGroundVehicleDifferential(QString airframeT
setConfigData(config); setConfigData(config);
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
resetMotorAndServoMixers(mixer); resetMotorAndServoMixers(mixer);
@ -531,11 +537,11 @@ bool ConfigGroundVehicleWidget::setupGroundVehicleDifferential(QString airframeT
Returns False if impossible to create the mixer. Returns False if impossible to create the mixer.
*/ */
bool ConfigGroundVehicleWidget::setupGroundVehicleTurnable(QString airframeType) bool ConfigGroundVehicleWidget::setupGroundVehicleTurnable(QString frameType)
{ {
// Check coherence: // Check coherence:
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(airframeType)) { if (throwConfigError(frameType)) {
return false; return false;
} }
@ -550,7 +556,7 @@ bool ConfigGroundVehicleWidget::setupGroundVehicleTurnable(QString airframeType)
setConfigData(config); setConfigData(config);
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
resetMotorAndServoMixers(mixer); resetMotorAndServoMixers(mixer);
@ -568,7 +574,7 @@ bool ConfigGroundVehicleWidget::setupGroundVehicleTurnable(QString airframeType)
channel = m_aircraft->gvMotor2ChannelBox->currentIndex() - 1; channel = m_aircraft->gvMotor2ChannelBox->currentIndex() - 1;
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_REVERSABLEMOTOR); setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_REVERSABLEMOTOR);
if (airframeType == "GroundVehicleCar") { if (frameType == "GroundVehicleCar") {
// Car: Throttle2 curve for 2nd motor // Car: Throttle2 curve for 2nd motor
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 127); setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 127);
} else { } else {
@ -584,7 +590,7 @@ bool ConfigGroundVehicleWidget::setupGroundVehicleTurnable(QString airframeType)
/** /**
This function displays text and color formatting in order to help the user understand what channels have not yet been configured. This function displays text and color formatting in order to help the user understand what channels have not yet been configured.
*/ */
bool ConfigGroundVehicleWidget::throwConfigError(QString airframeType) bool ConfigGroundVehicleWidget::throwConfigError(QString frameType)
{ {
// Initialize configuration error flag // Initialize configuration error flag
bool error = false; bool error = false;
@ -595,7 +601,7 @@ bool ConfigGroundVehicleWidget::throwConfigError(QString airframeType)
pixmap.fill(QColor("red")); pixmap.fill(QColor("red"));
if ((airframeType == "GroundVehicleCar") || (airframeType == "GroundVehicleBoat")) { // Car if ((frameType == "GroundVehicleCar") || (frameType == "GroundVehicleBoat")) { // Car
if (m_aircraft->gvMotor1ChannelBox->currentText() == "None" if (m_aircraft->gvMotor1ChannelBox->currentText() == "None"
&& m_aircraft->gvMotor2ChannelBox->currentText() == "None") { && m_aircraft->gvMotor2ChannelBox->currentText() == "None") {
m_aircraft->gvMotor1ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes m_aircraft->gvMotor1ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
@ -615,7 +621,7 @@ bool ConfigGroundVehicleWidget::throwConfigError(QString airframeType)
m_aircraft->gvSteering1ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes m_aircraft->gvSteering1ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
m_aircraft->gvSteering2ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes m_aircraft->gvSteering2ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
} }
} else if (airframeType.contains("GroundVehicleDifferential")) { // differential Tank and Boat } else if (frameType.contains("GroundVehicleDifferential")) { // differential Tank and Boat
if (m_aircraft->gvMotor1ChannelBox->currentText() == "None" if (m_aircraft->gvMotor1ChannelBox->currentText() == "None"
|| m_aircraft->gvMotor2ChannelBox->currentText() == "None") { || m_aircraft->gvMotor2ChannelBox->currentText() == "None") {
m_aircraft->gvMotor1ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes m_aircraft->gvMotor1ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
@ -629,7 +635,7 @@ bool ConfigGroundVehicleWidget::throwConfigError(QString airframeType)
// Always reset // Always reset
m_aircraft->gvSteering1ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes m_aircraft->gvSteering1ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
m_aircraft->gvSteering2ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes m_aircraft->gvSteering2ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
} else if (airframeType == "GroundVehicleMotorcycle") { // Motorcycle } else if (frameType == "GroundVehicleMotorcycle") { // Motorcycle
if (m_aircraft->gvMotor2ChannelBox->currentText() == "None") { if (m_aircraft->gvMotor2ChannelBox->currentText() == "None") {
m_aircraft->gvMotor2ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes m_aircraft->gvMotor2ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
error = true; error = true;
@ -651,7 +657,7 @@ bool ConfigGroundVehicleWidget::throwConfigError(QString airframeType)
} }
if (error) { if (error) {
m_aircraft->gvStatusLabel->setText(QString("<font color='red'>ERROR: Assign all necessary channels</font>")); m_aircraft->gvStatusLabel->setText("<font color='red'>ERROR: Assign all necessary channels</font>");
} }
return error; return error;
} }

View File

@ -30,11 +30,6 @@
#include "cfg_vehicletypes/vehicleconfig.h" #include "cfg_vehicletypes/vehicleconfig.h"
#include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h"
#include "uavobject.h"
class Ui_GroundConfigWidget; class Ui_GroundConfigWidget;
class QWidget; class QWidget;
@ -49,29 +44,32 @@ public:
ConfigGroundVehicleWidget(QWidget *parent = 0); ConfigGroundVehicleWidget(QWidget *parent = 0);
~ConfigGroundVehicleWidget(); ~ConfigGroundVehicleWidget();
virtual void refreshWidgetsValues(QString frameType); virtual QString getFrameType();
virtual void initMixerCurves(QString frameType); virtual void initMixerCurves(QString frameType);
virtual QString updateConfigObjectsFromWidgets();
protected: protected:
void enableControls(bool enable);
void resizeEvent(QResizeEvent *); void resizeEvent(QResizeEvent *);
void showEvent(QShowEvent *); void showEvent(QShowEvent *);
virtual void enableControls(bool enable);
virtual void refreshWidgetsValuesImpl(UAVObject *obj);
virtual void updateObjectsFromWidgetsImpl();
virtual void registerWidgets(ConfigTaskWidget &parent);
virtual void setupUI(QString frameType);
private: private:
Ui_GroundConfigWidget *m_aircraft; Ui_GroundConfigWidget *m_aircraft;
QGraphicsSvgItem *m_vehicleImg; QGraphicsSvgItem *m_vehicleImg;
virtual void registerWidgets(ConfigTaskWidget &parent); void resetActuators(GUIConfigDataUnion *configData);
virtual void resetActuators(GUIConfigDataUnion *configData);
bool setupGroundVehicleTurnable(QString airframeType); bool setupGroundVehicleTurnable(QString frameType);
bool setupGroundVehicleDifferential(QString airframeType); bool setupGroundVehicleDifferential(QString frameType);
bool setupGroundVehicleMotorcycle(QString airframeType); bool setupGroundVehicleMotorcycle(QString frameType);
private slots: bool throwConfigError(QString frameType);
virtual void setupUI(QString airframeType);
virtual bool throwConfigError(QString airframeType);
}; };
#endif // CONFIGGROUNDVEHICLEWIDGET_H #endif // CONFIGGROUNDVEHICLEWIDGET_H

View File

@ -29,6 +29,8 @@
#include "ui_airframe_multirotor.h" #include "ui_airframe_multirotor.h"
#include "uavobjectmanager.h"
#include "mixersettings.h" #include "mixersettings.h"
#include "systemsettings.h" #include "systemsettings.h"
#include "actuatorsettings.h" #include "actuatorsettings.h"
@ -45,7 +47,7 @@
#include <math.h> #include <math.h>
#include <QMessageBox> #include <QMessageBox>
const QString ConfigMultiRotorWidget::CHANNELBOXNAME = QString("multiMotorChannelBox"); const QString ConfigMultiRotorWidget::CHANNELBOXNAME = "multiMotorChannelBox";
QStringList ConfigMultiRotorWidget::getChannelDescriptions() QStringList ConfigMultiRotorWidget::getChannelDescriptions()
{ {
@ -53,7 +55,7 @@ QStringList ConfigMultiRotorWidget::getChannelDescriptions()
QStringList channelDesc; QStringList channelDesc;
for (int i = 0; i < (int)ConfigMultiRotorWidget::CHANNEL_NUMELEM; i++) { for (int i = 0; i < (int)ConfigMultiRotorWidget::CHANNEL_NUMELEM; i++) {
channelDesc.append(QString("-")); channelDesc.append("-");
} }
// get the gui config data // get the gui config data
@ -62,70 +64,70 @@ QStringList ConfigMultiRotorWidget::getChannelDescriptions()
// Octocopter X motor definition // Octocopter X motor definition
if (multi.VTOLMotorNNE > 0 && multi.VTOLMotorNNE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorNNE > 0 && multi.VTOLMotorNNE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorNNE - 1] = QString("VTOLMotorNNE"); channelDesc[multi.VTOLMotorNNE - 1] = "VTOLMotorNNE";
} }
if (multi.VTOLMotorENE > 0 && multi.VTOLMotorENE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorENE > 0 && multi.VTOLMotorENE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorENE - 1] = QString("VTOLMotorENE"); channelDesc[multi.VTOLMotorENE - 1] = "VTOLMotorENE";
} }
if (multi.VTOLMotorESE > 0 && multi.VTOLMotorESE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorESE > 0 && multi.VTOLMotorESE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorESE - 1] = QString("VTOLMotorESE"); channelDesc[multi.VTOLMotorESE - 1] = "VTOLMotorESE";
} }
if (multi.VTOLMotorSSE > 0 && multi.VTOLMotorSSE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorSSE > 0 && multi.VTOLMotorSSE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorSSE - 1] = QString("VTOLMotorSSE"); channelDesc[multi.VTOLMotorSSE - 1] = "VTOLMotorSSE";
} }
if (multi.VTOLMotorSSW > 0 && multi.VTOLMotorSSW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorSSW > 0 && multi.VTOLMotorSSW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorSSW - 1] = QString("VTOLMotorSSW"); channelDesc[multi.VTOLMotorSSW - 1] = "VTOLMotorSSW";
} }
if (multi.VTOLMotorWSW > 0 && multi.VTOLMotorWSW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorWSW > 0 && multi.VTOLMotorWSW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorWSW - 1] = QString("VTOLMotorWSW"); channelDesc[multi.VTOLMotorWSW - 1] = "VTOLMotorWSW";
} }
if (multi.VTOLMotorWNW > 0 && multi.VTOLMotorWNW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorWNW > 0 && multi.VTOLMotorWNW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorWNW - 1] = QString("VTOLMotorWNW"); channelDesc[multi.VTOLMotorWNW - 1] = "VTOLMotorWNW";
} }
if (multi.VTOLMotorNNW > 0 && multi.VTOLMotorNNW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorNNW > 0 && multi.VTOLMotorNNW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorNNW - 1] = QString("VTOLMotorNNW"); channelDesc[multi.VTOLMotorNNW - 1] = "VTOLMotorNNW";
} }
// End OctocopterX // End OctocopterX
if (multi.VTOLMotorN > 0 && multi.VTOLMotorN <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorN > 0 && multi.VTOLMotorN <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorN - 1] = QString("VTOLMotorN"); channelDesc[multi.VTOLMotorN - 1] = "VTOLMotorN";
} }
if (multi.VTOLMotorNE > 0 && multi.VTOLMotorNE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorNE > 0 && multi.VTOLMotorNE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorNE - 1] = QString("VTOLMotorNE"); channelDesc[multi.VTOLMotorNE - 1] = "VTOLMotorNE";
} }
if (multi.VTOLMotorNW > 0 && multi.VTOLMotorNW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorNW > 0 && multi.VTOLMotorNW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorNW - 1] = QString("VTOLMotorNW"); channelDesc[multi.VTOLMotorNW - 1] = "VTOLMotorNW";
} }
if (multi.VTOLMotorS > 0 && multi.VTOLMotorS <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorS > 0 && multi.VTOLMotorS <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorS - 1] = QString("VTOLMotorS"); channelDesc[multi.VTOLMotorS - 1] = "VTOLMotorS";
} }
if (multi.VTOLMotorSE > 0 && multi.VTOLMotorSE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorSE > 0 && multi.VTOLMotorSE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorSE - 1] = QString("VTOLMotorSE"); channelDesc[multi.VTOLMotorSE - 1] = "VTOLMotorSE";
} }
if (multi.VTOLMotorSW > 0 && multi.VTOLMotorSW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorSW > 0 && multi.VTOLMotorSW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorSW - 1] = QString("VTOLMotorSW"); channelDesc[multi.VTOLMotorSW - 1] = "VTOLMotorSW";
} }
if (multi.VTOLMotorW > 0 && multi.VTOLMotorW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorW > 0 && multi.VTOLMotorW <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorW - 1] = QString("VTOLMotorW"); channelDesc[multi.VTOLMotorW - 1] = "VTOLMotorW";
} }
if (multi.VTOLMotorE > 0 && multi.VTOLMotorE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.VTOLMotorE > 0 && multi.VTOLMotorE <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.VTOLMotorE - 1] = QString("VTOLMotorE"); channelDesc[multi.VTOLMotorE - 1] = "VTOLMotorE";
} }
if (multi.TRIYaw > 0 && multi.TRIYaw <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.TRIYaw > 0 && multi.TRIYaw <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.TRIYaw - 1] = QString("Tri-Yaw"); channelDesc[multi.TRIYaw - 1] = "Tri-Yaw";
} }
if (multi.Accessory0 > 0 && multi.Accessory0 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.Accessory0 > 0 && multi.Accessory0 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.Accessory0 - 1] = QString("Accessory0"); channelDesc[multi.Accessory0 - 1] = "Accessory0";
} }
if (multi.Accessory1 > 0 && multi.Accessory1 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.Accessory1 > 0 && multi.Accessory1 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.Accessory1 - 1] = QString("Accessory1"); channelDesc[multi.Accessory1 - 1] = "Accessory1";
} }
if (multi.Accessory2 > 0 && multi.Accessory2 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.Accessory2 > 0 && multi.Accessory2 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.Accessory2 - 1] = QString("Accessory2"); channelDesc[multi.Accessory2 - 1] = "Accessory2";
} }
if (multi.Accessory3 > 0 && multi.Accessory3 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { if (multi.Accessory3 > 0 && multi.Accessory3 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.Accessory3 - 1] = QString("Accessory3"); channelDesc[multi.Accessory3 - 1] = "Accessory3";
} }
return channelDesc; return channelDesc;
@ -170,7 +172,7 @@ ConfigMultiRotorWidget::ConfigMultiRotorWidget(QWidget *parent) :
// Set default model to "Quad X" // Set default model to "Quad X"
m_aircraft->multirotorFrameType->setCurrentIndex(m_aircraft->multirotorFrameType->findText("Quad X")); m_aircraft->multirotorFrameType->setCurrentIndex(m_aircraft->multirotorFrameType->findText("Quad X"));
connect(m_aircraft->multirotorFrameType, SIGNAL(currentIndexChanged(QString)), this, SLOT(setupUI(QString))); connect(m_aircraft->multirotorFrameType, SIGNAL(currentIndexChanged(QString)), this, SLOT(frameTypeChanged(QString)));
// Connect the multirotor motor reverse checkbox // Connect the multirotor motor reverse checkbox
connect(m_aircraft->MultirotorRevMixerCheckBox, SIGNAL(clicked(bool)), this, SLOT(reverseMultirotorMotor())); connect(m_aircraft->MultirotorRevMixerCheckBox, SIGNAL(clicked(bool)), this, SLOT(reverseMultirotorMotor()));
@ -184,6 +186,38 @@ ConfigMultiRotorWidget::~ConfigMultiRotorWidget()
delete m_aircraft; delete m_aircraft;
} }
QString ConfigMultiRotorWidget::getFrameType()
{
QString frameType = "QuadX";
if (m_aircraft->multirotorFrameType->currentText() == "Quad +") {
frameType = "QuadP";
} else if (m_aircraft->multirotorFrameType->currentText() == "Quad X") {
frameType = "QuadX";
} else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter") {
frameType = "Hexa";
} else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter X") {
frameType = "HexaX";
} else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter H") {
frameType = "HexaH";
} else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter Y6") {
frameType = "HexaCoax";
} else if (m_aircraft->multirotorFrameType->currentText() == "Octocopter") {
frameType = "Octo";
} else if (m_aircraft->multirotorFrameType->currentText() == "Octocopter X") {
frameType = "OctoX";
} else if (m_aircraft->multirotorFrameType->currentText() == "Octocopter V") {
frameType = "OctoV";
} else if (m_aircraft->multirotorFrameType->currentText() == "Octo Coax +") {
frameType = "OctoCoaxP";
} else if (m_aircraft->multirotorFrameType->currentText() == "Octo Coax X") {
frameType = "OctoCoaxX";
} else if (m_aircraft->multirotorFrameType->currentText() == "Tricopter Y") {
frameType = "Tri";
}
return frameType;
}
void ConfigMultiRotorWidget::setupUI(QString frameType) void ConfigMultiRotorWidget::setupUI(QString frameType)
{ {
Q_ASSERT(m_aircraft); Q_ASSERT(m_aircraft);
@ -407,7 +441,7 @@ void ConfigMultiRotorWidget::resetRcOutputs(GUIConfigDataUnion *configData)
void ConfigMultiRotorWidget::updateRcCurvesUsed() void ConfigMultiRotorWidget::updateRcCurvesUsed()
{ {
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
@ -433,13 +467,11 @@ void ConfigMultiRotorWidget::updateRcCurvesUsed()
/** /**
Helper function to refresh the UI widget values Helper function to refresh the UI widget values
*/ */
void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType) void ConfigMultiRotorWidget::refreshWidgetsValuesImpl(UAVObject *obj)
{ {
Q_ASSERT(m_aircraft); Q_UNUSED(obj);
setupUI(frameType); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings")));
Q_ASSERT(mixer); Q_ASSERT(mixer);
QList<double> curveValues; QList<double> curveValues;
@ -457,6 +489,7 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType)
GUIConfigDataUnion config = getConfigData(); GUIConfigDataUnion config = getConfigData();
multiGUISettingsStruct multi = config.multi; multiGUISettingsStruct multi = config.multi;
QString frameType = getFrameType();
if (frameType == "QuadP") { if (frameType == "QuadP") {
// Motors 1/2/3/4 are: N / E / S / W // Motors 1/2/3/4 are: N / E / S / W
setComboCurrentIndex(m_aircraft->multiMotorChannelBox1, multi.VTOLMotorN); setComboCurrentIndex(m_aircraft->multiMotorChannelBox1, multi.VTOLMotorN);
@ -583,11 +616,11 @@ void ConfigMultiRotorWidget::updateMotorsPositionLabels(QStringList motorLabels)
} }
/** /**
Helper function to update the UI widget objects Function to update the UI widget objects
*/ */
QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets() void ConfigMultiRotorWidget::updateObjectsFromWidgetsImpl()
{ {
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
@ -601,26 +634,19 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
// Curve is also common to all quads: // Curve is also common to all quads:
setThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, m_aircraft->multiThrottleCurve->getCurve()); setThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, m_aircraft->multiThrottleCurve->getCurve());
QString airframeType;
QList<QString> motorList; QList<QString> motorList;
if (m_aircraft->multirotorFrameType->currentText() == "Quad +") { if (m_aircraft->multirotorFrameType->currentText() == "Quad +") {
airframeType = "QuadP";
setupQuad(true); setupQuad(true);
} else if (m_aircraft->multirotorFrameType->currentText() == "Quad X") { } else if (m_aircraft->multirotorFrameType->currentText() == "Quad X") {
airframeType = "QuadX";
setupQuad(false); setupQuad(false);
} else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter") { } else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter") {
airframeType = "Hexa";
setupHexa(true); setupHexa(true);
} else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter X") { } else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter X") {
airframeType = "HexaX";
setupHexa(false); setupHexa(false);
} else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter H") { } else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter H") {
airframeType = "HexaH";
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(6)) { if (throwConfigError(6)) {
return airframeType; return;
} }
motorList << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorSE" << "VTOLMotorSW" << "VTOLMotorW" << "VTOLMotorNW"; motorList << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorSE" << "VTOLMotorSW" << "VTOLMotorW" << "VTOLMotorNW";
setupMotors(motorList); setupMotors(motorList);
@ -647,11 +673,9 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
setupMultiRotorMixer(hMixer); setupMultiRotorMixer(hMixer);
m_aircraft->mrStatusLabel->setText(tr("Configuration OK")); m_aircraft->mrStatusLabel->setText(tr("Configuration OK"));
} else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter Y6") { } else if (m_aircraft->multirotorFrameType->currentText() == "Hexacopter Y6") {
airframeType = "HexaCoax";
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(6)) { if (throwConfigError(6)) {
return airframeType; return;
} }
motorList << "VTOLMotorNW" << "VTOLMotorW" << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorS" << "VTOLMotorSE"; motorList << "VTOLMotorNW" << "VTOLMotorW" << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorS" << "VTOLMotorSE";
setupMotors(motorList); setupMotors(motorList);
@ -671,11 +695,9 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
setupMultiRotorMixer(mixerMatrix); setupMultiRotorMixer(mixerMatrix);
m_aircraft->mrStatusLabel->setText(tr("Configuration OK")); m_aircraft->mrStatusLabel->setText(tr("Configuration OK"));
} else if (m_aircraft->multirotorFrameType->currentText() == "Octocopter") { } else if (m_aircraft->multirotorFrameType->currentText() == "Octocopter") {
airframeType = "Octo";
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(8)) { if (throwConfigError(8)) {
return airframeType; return;
} }
motorList << "VTOLMotorN" << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorSE" << "VTOLMotorS" << "VTOLMotorSW" motorList << "VTOLMotorN" << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorSE" << "VTOLMotorS" << "VTOLMotorSW"
<< "VTOLMotorW" << "VTOLMotorNW"; << "VTOLMotorW" << "VTOLMotorNW";
@ -702,11 +724,9 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
setupMultiRotorMixer(mixerMatrix); setupMultiRotorMixer(mixerMatrix);
m_aircraft->mrStatusLabel->setText(tr("Configuration OK")); m_aircraft->mrStatusLabel->setText(tr("Configuration OK"));
} else if (m_aircraft->multirotorFrameType->currentText() == "Octocopter X") { } else if (m_aircraft->multirotorFrameType->currentText() == "Octocopter X") {
airframeType = "OctoX";
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(8)) { if (throwConfigError(8)) {
return airframeType; return;
} }
motorList << "VTOLMotorNNE" << "VTOLMotorENE" << "VTOLMotorESE" << "VTOLMotorSSE" << "VTOLMotorSSW" << "VTOLMotorWSW" motorList << "VTOLMotorNNE" << "VTOLMotorENE" << "VTOLMotorESE" << "VTOLMotorSSE" << "VTOLMotorSSW" << "VTOLMotorWSW"
<< "VTOLMotorWNW" << "VTOLMotorNNW"; << "VTOLMotorWNW" << "VTOLMotorNNW";
@ -733,11 +753,9 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
setupMultiRotorMixer(mixerMatrix); setupMultiRotorMixer(mixerMatrix);
m_aircraft->mrStatusLabel->setText(tr("Configuration OK")); m_aircraft->mrStatusLabel->setText(tr("Configuration OK"));
} else if (m_aircraft->multirotorFrameType->currentText() == "Octocopter V") { } else if (m_aircraft->multirotorFrameType->currentText() == "Octocopter V") {
airframeType = "OctoV";
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(8)) { if (throwConfigError(8)) {
return airframeType; return;
} }
motorList << "VTOLMotorN" << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorSE" << "VTOLMotorS" << "VTOLMotorSW" motorList << "VTOLMotorN" << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorSE" << "VTOLMotorS" << "VTOLMotorSW"
<< "VTOLMotorW" << "VTOLMotorNW"; << "VTOLMotorW" << "VTOLMotorNW";
@ -758,11 +776,9 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
setupMultiRotorMixer(mixerMatrix); setupMultiRotorMixer(mixerMatrix);
m_aircraft->mrStatusLabel->setText(tr("Configuration OK")); m_aircraft->mrStatusLabel->setText(tr("Configuration OK"));
} else if (m_aircraft->multirotorFrameType->currentText() == "Octo Coax +") { } else if (m_aircraft->multirotorFrameType->currentText() == "Octo Coax +") {
airframeType = "OctoCoaxP";
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(8)) { if (throwConfigError(8)) {
return airframeType; return;
} }
motorList << "VTOLMotorN" << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorSE" << "VTOLMotorS" << "VTOLMotorSW" motorList << "VTOLMotorN" << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorSE" << "VTOLMotorS" << "VTOLMotorSW"
<< "VTOLMotorW" << "VTOLMotorNW"; << "VTOLMotorW" << "VTOLMotorNW";
@ -782,11 +798,9 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
setupMultiRotorMixer(mixerMatrix); setupMultiRotorMixer(mixerMatrix);
m_aircraft->mrStatusLabel->setText(tr("Configuration OK")); m_aircraft->mrStatusLabel->setText(tr("Configuration OK"));
} else if (m_aircraft->multirotorFrameType->currentText() == "Octo Coax X") { } else if (m_aircraft->multirotorFrameType->currentText() == "Octo Coax X") {
airframeType = "OctoCoaxX";
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(8)) { if (throwConfigError(8)) {
return airframeType; return;
} }
motorList << "VTOLMotorNW" << "VTOLMotorN" << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorSE" << "VTOLMotorS" motorList << "VTOLMotorNW" << "VTOLMotorN" << "VTOLMotorNE" << "VTOLMotorE" << "VTOLMotorSE" << "VTOLMotorS"
<< "VTOLMotorSW" << "VTOLMotorW"; << "VTOLMotorSW" << "VTOLMotorW";
@ -806,15 +820,13 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
setupMultiRotorMixer(mixerMatrix); setupMultiRotorMixer(mixerMatrix);
m_aircraft->mrStatusLabel->setText(tr("Configuration OK")); m_aircraft->mrStatusLabel->setText(tr("Configuration OK"));
} else if (m_aircraft->multirotorFrameType->currentText() == "Tricopter Y") { } else if (m_aircraft->multirotorFrameType->currentText() == "Tricopter Y") {
airframeType = "Tri";
// Show any config errors in GUI // Show any config errors in GUI
if (throwConfigError(3)) { if (throwConfigError(3)) {
return airframeType; return;
} }
if (m_aircraft->triYawChannelBox->currentText() == "None") { if (m_aircraft->triYawChannelBox->currentText() == "None") {
m_aircraft->mrStatusLabel->setText(tr("<font color='red'>ERROR: Assign a Yaw channel</font>")); m_aircraft->mrStatusLabel->setText(tr("<font color='red'>ERROR: Assign a Yaw channel</font>"));
return airframeType; return;
} }
motorList << "VTOLMotorNW" << "VTOLMotorNE" << "VTOLMotorS"; motorList << "VTOLMotorNW" << "VTOLMotorNE" << "VTOLMotorS";
setupMotors(motorList); setupMotors(motorList);
@ -850,7 +862,6 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
m_aircraft->mrStatusLabel->setText(tr("Configuration OK")); m_aircraft->mrStatusLabel->setText(tr("Configuration OK"));
} }
return airframeType;
} }
void ConfigMultiRotorWidget::setYawMixLevel(int value) void ConfigMultiRotorWidget::setYawMixLevel(int value)
@ -920,7 +931,7 @@ void ConfigMultiRotorWidget::updateAirframe(QString frameType)
*/ */
void ConfigMultiRotorWidget::setupQuadMotor(int channel, double pitch, double roll, double yaw) void ConfigMultiRotorWidget::setupQuadMotor(int channel, double pitch, double roll, double yaw)
{ {
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
@ -945,7 +956,7 @@ void ConfigMultiRotorWidget::setupRcOutputs(QList<QString> rcOutputList)
GUIConfigDataUnion configData = getConfigData(); GUIConfigDataUnion configData = getConfigData();
resetRcOutputs(&configData); resetRcOutputs(&configData);
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
int curveAccessory0 = m_aircraft->rcOutputCurveBox1->currentIndex(); int curveAccessory0 = m_aircraft->rcOutputCurveBox1->currentIndex();
@ -956,7 +967,7 @@ void ConfigMultiRotorWidget::setupRcOutputs(QList<QString> rcOutputList)
foreach(QString rc_output, rcOutputList) { foreach(QString rc_output, rcOutputList) {
int index = rcList.takeFirst()->currentIndex(); int index = rcList.takeFirst()->currentIndex();
if (rc_output == QString("Accessory0")) { if (rc_output == "Accessory0") {
configData.multi.Accessory0 = index; configData.multi.Accessory0 = index;
if (index) { if (index) {
setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY0); setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY0);
@ -966,7 +977,7 @@ void ConfigMultiRotorWidget::setupRcOutputs(QList<QString> rcOutputList)
setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127); setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
} }
} }
} else if (rc_output == QString("Accessory1")) { } else if (rc_output == "Accessory1") {
configData.multi.Accessory1 = index; configData.multi.Accessory1 = index;
if (index) { if (index) {
setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY1); setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY1);
@ -976,7 +987,7 @@ void ConfigMultiRotorWidget::setupRcOutputs(QList<QString> rcOutputList)
setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127); setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
} }
} }
} else if (rc_output == QString("Accessory2")) { } else if (rc_output == "Accessory2") {
configData.multi.Accessory2 = index; configData.multi.Accessory2 = index;
if (index) { if (index) {
setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY2); setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY2);
@ -986,7 +997,7 @@ void ConfigMultiRotorWidget::setupRcOutputs(QList<QString> rcOutputList)
setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127); setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
} }
} }
} else if (rc_output == QString("Accessory3")) { } else if (rc_output == "Accessory3") {
configData.multi.Accessory3 = index; configData.multi.Accessory3 = index;
if (index) { if (index) {
setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY3); setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY3);
@ -1018,38 +1029,38 @@ void ConfigMultiRotorWidget::setupMotors(QList<QString> motorList)
foreach(QString motor, motorList) { foreach(QString motor, motorList) {
int index = mmList.takeFirst()->currentIndex(); int index = mmList.takeFirst()->currentIndex();
if (motor == QString("VTOLMotorN")) { if (motor == "VTOLMotorN") {
configData.multi.VTOLMotorN = index; configData.multi.VTOLMotorN = index;
} else if (motor == QString("VTOLMotorNE")) { } else if (motor == "VTOLMotorNE") {
configData.multi.VTOLMotorNE = index; configData.multi.VTOLMotorNE = index;
} else if (motor == QString("VTOLMotorE")) { } else if (motor == "VTOLMotorE") {
configData.multi.VTOLMotorE = index; configData.multi.VTOLMotorE = index;
} else if (motor == QString("VTOLMotorSE")) { } else if (motor == "VTOLMotorSE") {
configData.multi.VTOLMotorSE = index; configData.multi.VTOLMotorSE = index;
} else if (motor == QString("VTOLMotorS")) { } else if (motor == "VTOLMotorS") {
configData.multi.VTOLMotorS = index; configData.multi.VTOLMotorS = index;
} else if (motor == QString("VTOLMotorSW")) { } else if (motor == "VTOLMotorSW") {
configData.multi.VTOLMotorSW = index; configData.multi.VTOLMotorSW = index;
} else if (motor == QString("VTOLMotorW")) { } else if (motor == "VTOLMotorW") {
configData.multi.VTOLMotorW = index; configData.multi.VTOLMotorW = index;
} else if (motor == QString("VTOLMotorNW")) { } else if (motor == "VTOLMotorNW") {
configData.multi.VTOLMotorNW = index; configData.multi.VTOLMotorNW = index;
// OctoX // OctoX
} else if (motor == QString("VTOLMotorNNE")) { } else if (motor == "VTOLMotorNNE") {
configData.multi.VTOLMotorNNE = index; configData.multi.VTOLMotorNNE = index;
} else if (motor == QString("VTOLMotorENE")) { } else if (motor == "VTOLMotorENE") {
configData.multi.VTOLMotorENE = index; configData.multi.VTOLMotorENE = index;
} else if (motor == QString("VTOLMotorESE")) { } else if (motor == "VTOLMotorESE") {
configData.multi.VTOLMotorESE = index; configData.multi.VTOLMotorESE = index;
} else if (motor == QString("VTOLMotorSSE")) { } else if (motor == "VTOLMotorSSE") {
configData.multi.VTOLMotorSSE = index; configData.multi.VTOLMotorSSE = index;
} else if (motor == QString("VTOLMotorSSW")) { } else if (motor == "VTOLMotorSSW") {
configData.multi.VTOLMotorSSW = index; configData.multi.VTOLMotorSSW = index;
} else if (motor == QString("VTOLMotorWSW")) { } else if (motor == "VTOLMotorWSW") {
configData.multi.VTOLMotorWSW = index; configData.multi.VTOLMotorWSW = index;
} else if (motor == QString("VTOLMotorWNW")) { } else if (motor == "VTOLMotorWNW") {
configData.multi.VTOLMotorWNW = index; configData.multi.VTOLMotorWNW = index;
} else if (motor == QString("VTOLMotorNNW")) { } else if (motor == "VTOLMotorNNW") {
configData.multi.VTOLMotorNNW = index; configData.multi.VTOLMotorNNW = index;
} }
} }
@ -1196,7 +1207,7 @@ bool ConfigMultiRotorWidget::setupHexa(bool pLayout)
*/ */
bool ConfigMultiRotorWidget::setupMultiRotorMixer(double mixerFactors[8][3]) bool ConfigMultiRotorWidget::setupMultiRotorMixer(double mixerFactors[8][3])
{ {
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("MixerSettings"));
Q_ASSERT(mixer); Q_ASSERT(mixer);
resetMotorAndServoMixers(mixer); resetMotorAndServoMixers(mixer);
@ -1289,7 +1300,7 @@ bool ConfigMultiRotorWidget::throwConfigError(int numMotors)
if (error) { if (error) {
m_aircraft->mrStatusLabel->setText( m_aircraft->mrStatusLabel->setText(
QString(tr("<font color='red'>ERROR: Assign all %1 motor channels</font>")).arg(numMotors)); tr("<font color='red'>ERROR: Assign all %1 motor channels</font>").arg(numMotors));
} }
return error; return error;
} }
@ -1317,8 +1328,6 @@ void ConfigMultiRotorWidget::resizeEvent(QResizeEvent *event)
void ConfigMultiRotorWidget::enableControls(bool enable) void ConfigMultiRotorWidget::enableControls(bool enable)
{ {
ConfigTaskWidget::enableControls(enable);
if (enable) { if (enable) {
setupEnabledControls(m_aircraft->multirotorFrameType->currentText()); setupEnabledControls(m_aircraft->multirotorFrameType->currentText());
} }

View File

@ -29,11 +29,6 @@
#include "cfg_vehicletypes/vehicleconfig.h" #include "cfg_vehicletypes/vehicleconfig.h"
#include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h"
#include "uavobject.h"
#include <QList> #include <QList>
class Ui_MultiRotorConfigWidget; class Ui_MultiRotorConfigWidget;
@ -51,22 +46,26 @@ public:
ConfigMultiRotorWidget(QWidget *parent = 0); ConfigMultiRotorWidget(QWidget *parent = 0);
~ConfigMultiRotorWidget(); ~ConfigMultiRotorWidget();
virtual void refreshWidgetsValues(QString frameType); virtual QString getFrameType();
virtual QString updateConfigObjectsFromWidgets();
protected: protected:
void showEvent(QShowEvent *event); void showEvent(QShowEvent *event);
void resizeEvent(QResizeEvent *event); void resizeEvent(QResizeEvent *event);
void enableControls(bool enable);
virtual void enableControls(bool enable);
virtual void refreshWidgetsValuesImpl(UAVObject *obj);
virtual void updateObjectsFromWidgetsImpl();
virtual void registerWidgets(ConfigTaskWidget &parent);
virtual void setupUI(QString frameType);
private: private:
Ui_MultiRotorConfigWidget *m_aircraft; Ui_MultiRotorConfigWidget *m_aircraft;
QGraphicsSvgItem *quad; QGraphicsSvgItem *quad;
bool invertMotors; bool invertMotors;
virtual void registerWidgets(ConfigTaskWidget &parent); void resetActuators(GUIConfigDataUnion *configData);
virtual void resetActuators(GUIConfigDataUnion *configData); void resetRcOutputs(GUIConfigDataUnion *configData);
virtual void resetRcOutputs(GUIConfigDataUnion *configData);
bool setupQuad(bool pLayout); bool setupQuad(bool pLayout);
bool setupHexa(bool pLayout); bool setupHexa(bool pLayout);
@ -82,10 +81,9 @@ private:
void updateMotorsPositionLabels(QStringList motorLabels); void updateMotorsPositionLabels(QStringList motorLabels);
void setupEnabledControls(QString multiRotorType); void setupEnabledControls(QString multiRotorType);
private slots: bool throwConfigError(int numMotors);
virtual void setupUI(QString airframeType);
virtual bool throwConfigError(int numMotors);
private slots:
void reverseMultirotorMotor(); void reverseMultirotorMotor();
}; };

View File

@ -38,7 +38,7 @@
#include <QPushButton> #include <QPushButton>
#include <QPointer> #include <QPointer>
VehicleConfig::VehicleConfig(QWidget *parent) : ConfigTaskWidget(parent) VehicleConfig::VehicleConfig(QWidget *parent) : ConfigTaskWidget(parent, Child)
{ {
// Generate lists of mixerTypeNames, mixerVectorNames, channelNames // Generate lists of mixerTypeNames, mixerVectorNames, channelNames
channelNames << "None"; channelNames << "None";
@ -105,19 +105,21 @@ void VehicleConfig::setConfigData(GUIConfigDataUnion configData)
} }
} }
void VehicleConfig::setupUI(QString frameType) QString VehicleConfig::getFrameType()
{ {
Q_UNUSED(frameType); return "None";
} }
void VehicleConfig::refreshWidgetsValues(QString frameType) void VehicleConfig::frameTypeChanged(QString frameType)
{ {
Q_UNUSED(frameType); setupUI(frameType);
} }
QString VehicleConfig::updateConfigObjectsFromWidgets() void VehicleConfig::enableControls(bool enable)
{ {
return NULL; Q_UNUSED(enable);
// do nothing. no need to call parent.
} }
void VehicleConfig::refreshWidgetsValuesImpl(UAVObject *obj) void VehicleConfig::refreshWidgetsValuesImpl(UAVObject *obj)
@ -128,17 +130,16 @@ void VehicleConfig::refreshWidgetsValuesImpl(UAVObject *obj)
void VehicleConfig::updateObjectsFromWidgetsImpl() void VehicleConfig::updateObjectsFromWidgetsImpl()
{} {}
void VehicleConfig::resetActuators(GUIConfigDataUnion *configData)
{
Q_UNUSED(configData);
}
void VehicleConfig::registerWidgets(ConfigTaskWidget &parent) void VehicleConfig::registerWidgets(ConfigTaskWidget &parent)
{ {
Q_UNUSED(parent); Q_UNUSED(parent);
} }
void VehicleConfig::setupUI(QString frameType)
{
Q_UNUSED(frameType);
}
// NEW STYLE: Loop through the widgets looking for all widgets that have "ChannelBox" in their name // NEW STYLE: Loop through the widgets looking for all widgets that have "ChannelBox" in their name
// The upshot of this is that ALL new ComboBox widgets for selecting the output channel must have "ChannelBox" in their name // The upshot of this is that ALL new ComboBox widgets for selecting the output channel must have "ChannelBox" in their name
// FOR WHATEVER REASON, THIS DOES NOT WORK WITH ChannelBox. ChannelBo is sufficiently accurate // FOR WHATEVER REASON, THIS DOES NOT WORK WITH ChannelBox. ChannelBo is sufficiently accurate

View File

@ -29,11 +29,11 @@
#define VEHICLECONFIG_H #define VEHICLECONFIG_H
#include "../uavobjectwidgetutils/configtaskwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h"
#include "uavobject.h"
#include "actuatorcommand.h" #include "actuatorcommand.h"
class UAVDataObject;
typedef struct { typedef struct {
uint VTOLMotorN : 4; uint VTOLMotorN : 4;
uint VTOLMotorS : 4; uint VTOLMotorS : 4;
@ -157,22 +157,22 @@ typedef union {
customGUISettingsStruct custom; customGUISettingsStruct custom;
} GUIConfigDataUnion; } GUIConfigDataUnion;
class ConfigTaskWidget; class ConfigVehicleTypeWidget;
/* /*
* This class handles vehicle specific configuration UI and associated logic. * This class handles vehicle specific configuration UI and associated logic.
* *
* VehicleConfig derives from ConfigTaskWidget but is not a top level ConfigTaskWidget. * VehicleConfig derives from ConfigTaskWidget but is not a top level ConfigTaskWidget.
* VehicleConfig objects are nested within the ConfigVehicleConfigWidget and have particularities: * VehicleConfig objects are nested within the ConfigVehicleTypeWidget and have particularities:
* - bindings are added to the parent (i.e. ConfigVehicleConfigWidget) * - bindings are added to the parent (i.e. ConfigVehicleConfigWidget)
* - auto bindings are not supported * - auto bindings are not supported
* - as a consequence things like dirty state management are bypassed and delegated to the parent class. * - as a consequence things like dirty state management are bypassed and delegated to the parent class.
*
* It does not use the "dirty" state management directly and registers its relevant widgets with ConfigTaskWidget to do so.
*/ */
class VehicleConfig : public ConfigTaskWidget { class VehicleConfig : public ConfigTaskWidget {
Q_OBJECT Q_OBJECT
friend ConfigVehicleTypeWidget;
public: public:
/* Enumeration options for ThrottleCurves */ /* Enumeration options for ThrottleCurves */
@ -220,10 +220,7 @@ public:
VehicleConfig(QWidget *parent = 0); VehicleConfig(QWidget *parent = 0);
~VehicleConfig(); ~VehicleConfig();
virtual void registerWidgets(ConfigTaskWidget &parent); virtual QString getFrameType();
virtual void refreshWidgetsValues(QString frameType);
virtual QString updateConfigObjectsFromWidgets();
double getMixerValue(UAVDataObject *mixer, QString elementName); double getMixerValue(UAVDataObject *mixer, QString elementName);
void setMixerValue(UAVDataObject *mixer, QString elementName, double value); void setMixerValue(UAVDataObject *mixer, QString elementName, double value);
@ -249,16 +246,18 @@ protected:
double getCurveMin(QList<double> *curve); double getCurveMin(QList<double> *curve);
double getCurveMax(QList<double> *curve); double getCurveMax(QList<double> *curve);
virtual void enableControls(bool enable);
virtual void refreshWidgetsValuesImpl(UAVObject *obj); virtual void refreshWidgetsValuesImpl(UAVObject *obj);
virtual void updateObjectsFromWidgetsImpl(); virtual void updateObjectsFromWidgetsImpl();
virtual void registerWidgets(ConfigTaskWidget &parent);
virtual void setupUI(QString frameType);
protected slots:
void frameTypeChanged(QString frameType);
private: private:
static UAVObjectManager *getUAVObjectManager(); static UAVObjectManager *getUAVObjectManager();
virtual void resetActuators(GUIConfigDataUnion *configData);
private slots:
virtual void setupUI(QString airframeType);
}; };
#endif // VEHICLECONFIG_H #endif // VEHICLECONFIG_H

View File

@ -283,7 +283,7 @@ void ConfigGadgetWidget::tabAboutToChange(int index, bool *proceed)
if (ans == QMessageBox::No) { if (ans == QMessageBox::No) {
*proceed = false; *proceed = false;
} else { } else {
wid->setDirty(false); wid->clearDirty();
} }
} }
} }

View File

@ -43,7 +43,7 @@ static const int MAX_CHANNEL_NUM = 250;
static const int MIN_CHANNEL_RANGE = 10; static const int MIN_CHANNEL_RANGE = 10;
static const float FREQUENCY_STEP = 0.040; static const float FREQUENCY_STEP = 0.040;
ConfigOPLinkWidget::ConfigOPLinkWidget(QWidget *parent) : ConfigTaskWidget(parent, false), statusUpdated(false) ConfigOPLinkWidget::ConfigOPLinkWidget(QWidget *parent) : ConfigTaskWidget(parent, OPLink), statusUpdated(false)
{ {
m_oplink = new Ui_OPLinkWidget(); m_oplink = new Ui_OPLinkWidget();
m_oplink->setupUi(this); m_oplink->setupUi(this);

View File

@ -30,6 +30,7 @@
#include "ui_airframe.h" #include "ui_airframe.h"
#include "configgadgetfactory.h" #include "configgadgetfactory.h"
#include "uavobjectmanager.h"
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include "systemsettings.h" #include "systemsettings.h"
@ -144,10 +145,9 @@ ConfigVehicleTypeWidget::ConfigVehicleTypeWidget(QWidget *parent) : ConfigTaskWi
m_aircraft->aircraftType->addTab(tr("Helicopter")); m_aircraft->aircraftType->addTab(tr("Helicopter"));
m_aircraft->aircraftType->addTab(tr("Ground")); m_aircraft->aircraftType->addTab(tr("Ground"));
m_aircraft->aircraftType->addTab(tr("Custom")); m_aircraft->aircraftType->addTab(tr("Custom"));
// switchAirframeType(0);
// Connect aircraft type selection dropbox to callback function // Connect aircraft type selection dropbox to callback function
connect(m_aircraft->aircraftType, SIGNAL(currentChanged(int)), this, SLOT(switchAirframeType(int))); connect(m_aircraft->aircraftType, SIGNAL(currentChanged(int)), this, SLOT(frameTypeChanged(int)));
} }
/** /**
@ -158,10 +158,32 @@ ConfigVehicleTypeWidget::~ConfigVehicleTypeWidget()
// Do nothing // Do nothing
} }
void ConfigVehicleTypeWidget::switchAirframeType(int index) void ConfigVehicleTypeWidget::frameTypeChanged(int index)
{ {
m_aircraft->airframesWidget->setCurrentWidget(getVehicleConfigWidget(index)); VehicleConfig *vehicleConfig = getVehicleConfigWidget(index);
setDirty(true);
if (vehicleConfig) {
// switch tab
m_aircraft->airframesWidget->setCurrentWidget(vehicleConfig);
// enable controls
enableControls(isConnected());
// flag vehicle config as dirty (frame type was changed...)
setDirty(true);
}
}
void ConfigVehicleTypeWidget::enableControls(bool enable)
{
ConfigTaskWidget::enableControls(enable);
// forward call to selected vehicle config
VehicleConfig *vehicleConfig = (VehicleConfig *)m_aircraft->airframesWidget->currentWidget();
if (vehicleConfig) {
vehicleConfig->enableControls(enable);
}
} }
/** /**
@ -173,54 +195,33 @@ void ConfigVehicleTypeWidget::refreshWidgetsValuesImpl(UAVObject *obj)
{ {
Q_UNUSED(obj); Q_UNUSED(obj);
if (!allObjectsUpdated()) { if (obj) {
// single object was updated, skip...
return; return;
} }
// Get the Airframe type from the system settings: // update current vehicle tab
UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("SystemSettings"))); QString ft = frameType();
Q_ASSERT(system); int category = frameCategory(ft);
UAVObjectField *field = system->getField(QString("AirframeType"));
Q_ASSERT(field);
// At this stage, we will need to have some hardcoded settings in this code
QString frameType = field->getValue().toString();
// Always update custom tab from others airframe settings : debug/learn hardcoded mixers
int category = frameCategory("Custom");
m_aircraft->aircraftType->setCurrentIndex(category); m_aircraft->aircraftType->setCurrentIndex(category);
VehicleConfig *vehicleConfig = getVehicleConfigWidget(category); VehicleConfig *vehicleConfig = getVehicleConfigWidget(category);
if (vehicleConfig) { if (vehicleConfig) {
vehicleConfig->refreshWidgetsValues("Custom"); vehicleConfig->setupUI(ft);
vehicleConfig->refreshWidgetsValuesImpl(obj);
} }
// Switch to Airframe currently used // update custom tab from others frame settings (to debug/learn hard coded mixers)
category = frameCategory(frameType); if (ft != "Custom") {
int customCategory = frameCategory("Custom");
if (frameType != "Custom") { VehicleConfig *vehicleConfig = getVehicleConfigWidget(customCategory);
m_aircraft->aircraftType->setCurrentIndex(category);
VehicleConfig *vehicleConfig = getVehicleConfigWidget(category);
if (vehicleConfig) { if (vehicleConfig) {
vehicleConfig->refreshWidgetsValues(frameType); vehicleConfig->setupUI("Custom");
vehicleConfig->refreshWidgetsValuesImpl(obj);
} }
} }
field = system->getField(QString("VehicleName")); // update vehicle name
Q_ASSERT(field); QString name = vehicleName();
QString name;
for (uint i = 0; i < field->getNumElements(); ++i) {
QChar chr = field->getValue(i).toChar();
if (chr != 0) {
name.append(chr);
} else {
break;
}
}
m_aircraft->nameEdit->setText(name); m_aircraft->nameEdit->setText(name);
} }
@ -233,27 +234,90 @@ void ConfigVehicleTypeWidget::refreshWidgetsValuesImpl(UAVObject *obj)
*/ */
void ConfigVehicleTypeWidget::updateObjectsFromWidgetsImpl() void ConfigVehicleTypeWidget::updateObjectsFromWidgetsImpl()
{ {
// Airframe type defaults to Custom
QString airframeType = "Custom";
VehicleConfig *vehicleConfig = (VehicleConfig *)m_aircraft->airframesWidget->currentWidget(); VehicleConfig *vehicleConfig = (VehicleConfig *)m_aircraft->airframesWidget->currentWidget();
// frame type defaults to Custom
QString ft = "Custom";
if (vehicleConfig) { if (vehicleConfig) {
airframeType = vehicleConfig->updateConfigObjectsFromWidgets(); vehicleConfig->updateObjectsFromWidgetsImpl();
ft = vehicleConfig->getFrameType();
} }
// set the airframe type // save frame type
UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("SystemSettings"))); setFrameType(ft);
// save vehicle name
QString name = m_aircraft->nameEdit->text();
setVehicleName(name);
// update custom tab from others frame settings (to debug/learn hard coded mixers)
if (ft != "Custom") {
int customCategory = frameCategory("Custom");
VehicleConfig *vehicleConfig = getVehicleConfigWidget(customCategory);
if (vehicleConfig) {
vehicleConfig->setupUI("Custom");
vehicleConfig->refreshWidgetsValuesImpl(NULL);
}
}
}
QString ConfigVehicleTypeWidget::frameType()
{
UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("SystemSettings"));
Q_ASSERT(system); Q_ASSERT(system);
UAVObjectField *field = system->getField(QString("AirframeType")); UAVObjectField *field = system->getField("AirframeType");
if (field) {
field->setValue(airframeType);
}
field = system->getField(QString("VehicleName"));
Q_ASSERT(field); Q_ASSERT(field);
QString name = m_aircraft->nameEdit->text();
return field->getValue().toString();
}
void ConfigVehicleTypeWidget::setFrameType(QString frameType)
{
UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("SystemSettings"));
Q_ASSERT(system);
UAVObjectField *field = system->getField("AirframeType");
Q_ASSERT(field);
if (field) {
field->setValue(frameType);
}
}
QString ConfigVehicleTypeWidget::vehicleName()
{
UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("SystemSettings"));
Q_ASSERT(system);
UAVObjectField *field = system->getField("VehicleName");
Q_ASSERT(field);
QString name;
for (uint i = 0; i < field->getNumElements(); ++i) {
QChar chr = field->getValue(i).toChar();
if (chr != 0) {
name.append(chr);
} else {
break;
}
}
return name;
}
void ConfigVehicleTypeWidget::setVehicleName(QString name)
{
UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject("SystemSettings"));
Q_ASSERT(system);
UAVObjectField *field = system->getField("VehicleName");
Q_ASSERT(field);
for (uint i = 0; i < field->getNumElements(); ++i) { for (uint i = 0; i < field->getNumElements(); ++i) {
if (i < (uint)name.length()) { if (i < (uint)name.length()) {
field->setValue(name.at(i).toLatin1(), i); field->setValue(name.at(i).toLatin1(), i);
@ -261,10 +325,6 @@ void ConfigVehicleTypeWidget::updateObjectsFromWidgetsImpl()
field->setValue(0, i); field->setValue(0, i);
} }
} }
// call refreshWidgetsValues() to reflect actual saved values
// TODO is this needed ?
refreshWidgetsValues();
} }
int ConfigVehicleTypeWidget::frameCategory(QString frameType) int ConfigVehicleTypeWidget::frameCategory(QString frameType)
@ -302,13 +362,6 @@ VehicleConfig *ConfigVehicleTypeWidget::getVehicleConfigWidget(int frameCategory
if (!m_vehicleIndexMap.contains(frameCategory)) { if (!m_vehicleIndexMap.contains(frameCategory)) {
// create config widget // create config widget
vehicleConfig = createVehicleConfigWidget(frameCategory); vehicleConfig = createVehicleConfigWidget(frameCategory);
// add config widget to UI
int index = m_aircraft->airframesWidget->insertWidget(m_aircraft->airframesWidget->count(), vehicleConfig);
m_vehicleIndexMap[frameCategory] = index;
// and enable controls (needed?)
updateEnableControls();
} }
int index = m_vehicleIndexMap.value(frameCategory); int index = m_vehicleIndexMap.value(frameCategory);
vehicleConfig = (VehicleConfig *)m_aircraft->airframesWidget->widget(index); vehicleConfig = (VehicleConfig *)m_aircraft->airframesWidget->widget(index);
@ -340,9 +393,13 @@ VehicleConfig *ConfigVehicleTypeWidget::createVehicleConfigWidget(int frameCateg
break; break;
} }
if (vehicleConfig) { if (vehicleConfig) {
// bind config widget "field" to this ConfigTaskWodget // bind config widget "field" to this ConfigTaskWidget
// this is necessary to get "dirty" state management // this is necessary to get "dirty" state management
vehicleConfig->registerWidgets(*this); vehicleConfig->registerWidgets(*this);
// add config widget to UI
int index = m_aircraft->airframesWidget->insertWidget(m_aircraft->airframesWidget->count(), vehicleConfig);
m_vehicleIndexMap[frameCategory] = index;
} }
return vehicleConfig; return vehicleConfig;
} }

View File

@ -61,6 +61,7 @@ public:
~ConfigVehicleTypeWidget(); ~ConfigVehicleTypeWidget();
protected: protected:
virtual void enableControls(bool enable);
virtual void refreshWidgetsValuesImpl(UAVObject *obj); virtual void refreshWidgetsValuesImpl(UAVObject *obj);
virtual void updateObjectsFromWidgetsImpl(); virtual void updateObjectsFromWidgetsImpl();
@ -72,14 +73,19 @@ private:
// Maps a frame category to its index in the m_aircraft->airframesWidget QStackedWidget // Maps a frame category to its index in the m_aircraft->airframesWidget QStackedWidget
QMap<int, int> m_vehicleIndexMap; QMap<int, int> m_vehicleIndexMap;
QString frameType();
void setFrameType(QString frameType);
int frameCategory(QString frameType); QString vehicleName();
void setVehicleName(QString name);
static int frameCategory(QString frameType);
VehicleConfig *getVehicleConfigWidget(int frameCategory); VehicleConfig *getVehicleConfigWidget(int frameCategory);
VehicleConfig *createVehicleConfigWidget(int frameCategory); VehicleConfig *createVehicleConfigWidget(int frameCategory);
private slots: private slots:
void switchAirframeType(int index); void frameTypeChanged(int index);
}; };
#endif // CONFIGVEHICLETYPEWIDGET_H #endif // CONFIGVEHICLETYPEWIDGET_H

View File

@ -27,8 +27,12 @@
*/ */
#include "outputcalibrationpage.h" #include "outputcalibrationpage.h"
#include "ui_outputcalibrationpage.h" #include "ui_outputcalibrationpage.h"
#include "systemalarms.h" #include "systemalarms.h"
#include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
const QString OutputCalibrationPage::MULTI_SVG_FILE = QString(":/setupwizard/resources/multirotor-shapes.svg"); const QString OutputCalibrationPage::MULTI_SVG_FILE = QString(":/setupwizard/resources/multirotor-shapes.svg");

View File

@ -49,34 +49,48 @@
#include <QUrl> #include <QUrl>
#include <QWidget> #include <QWidget>
ConfigTaskWidget::ConfigTaskWidget(QWidget *parent, bool autopilot) : QWidget(parent), ConfigTaskWidget::ConfigTaskWidget(QWidget *parent, ConfigTaskType configType) : QWidget(parent),
m_currentBoardId(-1), m_isConnected(false), m_isWidgetUpdatesAllowed(true), m_isDirty(false), m_refreshing(false), m_currentBoardId(-1), m_isConnected(false), m_isWidgetUpdatesAllowed(true), m_isDirty(false), m_refreshing(false),
m_wikiURL("Welcome"), m_saveButton(NULL), m_outOfLimitsStyle("background-color: rgb(255, 0, 0);"), m_realtimeUpdateTimer(NULL) m_wikiURL("Welcome"), m_saveButton(NULL), m_outOfLimitsStyle("background-color: rgb(255, 0, 0);"), m_realtimeUpdateTimer(NULL)
{ {
m_autopilot = autopilot; m_configType = configType;
m_pluginManager = ExtensionSystem::PluginManager::instance(); m_pluginManager = ExtensionSystem::PluginManager::instance();
m_objectUtilManager = m_pluginManager->getObject<UAVObjectUtilManager>(); m_objectUtilManager = m_pluginManager->getObject<UAVObjectUtilManager>();
UAVSettingsImportExportFactory *importexportplugin = m_pluginManager->getObject<UAVSettingsImportExportFactory>();
connect(importexportplugin, SIGNAL(importAboutToBegin()), this, SLOT(invalidateObjects()));
m_saveButton = new SmartSaveButton(this); if (m_configType != Child) {
connect(m_saveButton, SIGNAL(preProcessOperations()), this, SLOT(updateObjectsFromWidgets())); UAVSettingsImportExportFactory *importexportplugin = m_pluginManager->getObject<UAVSettingsImportExportFactory>();
connect(m_saveButton, SIGNAL(saveSuccessfull()), this, SLOT(clearDirty())); connect(importexportplugin, SIGNAL(importAboutToBegin()), this, SLOT(invalidateObjects()));
connect(m_saveButton, SIGNAL(beginOp()), this, SLOT(disableObjectUpdates()));
connect(m_saveButton, SIGNAL(endOp()), this, SLOT(enableObjectUpdates()));
if (m_autopilot) { m_saveButton = new SmartSaveButton(this);
connect(m_saveButton, SIGNAL(beginOp()), this, SLOT(disableObjectUpdates()));
connect(m_saveButton, SIGNAL(preProcessOperations()), this, SLOT(updateObjectsFromWidgets()));
connect(m_saveButton, SIGNAL(endOp()), this, SLOT(enableObjectUpdates()));
connect(m_saveButton, SIGNAL(saveSuccessful()), this, SLOT(saveSuccessful()));
}
switch (m_configType) {
case AutoPilot:
{
// connect to telemetry manager // connect to telemetry manager
TelemetryManager *tm = m_pluginManager->getObject<TelemetryManager>(); TelemetryManager *tm = m_pluginManager->getObject<TelemetryManager>();
connect(tm, SIGNAL(connected()), this, SLOT(onConnect())); connect(tm, SIGNAL(connected()), this, SLOT(onConnect()));
connect(tm, SIGNAL(disconnected()), this, SLOT(onDisconnect())); connect(tm, SIGNAL(disconnected()), this, SLOT(onDisconnect()));
} else { break;
}
case OPLink:
{
// connect to oplink manager // connect to oplink manager
OPLinkManager *om = m_pluginManager->getObject<OPLinkManager>(); OPLinkManager *om = m_pluginManager->getObject<OPLinkManager>();
connect(om, SIGNAL(connected()), this, SLOT(onConnect())); connect(om, SIGNAL(connected()), this, SLOT(onConnect()));
connect(om, SIGNAL(disconnected()), this, SLOT(onDisconnect())); connect(om, SIGNAL(disconnected()), this, SLOT(onDisconnect()));
break;
}
case Child:
default:
// do nothing
break;
} }
} }
@ -239,6 +253,7 @@ void ConfigTaskWidget::setWidgetBindingObjectEnabled(QString objectName, bool en
Q_ASSERT(object); Q_ASSERT(object);
bool isRefreshing = m_refreshing;
m_refreshing = true; m_refreshing = true;
foreach(WidgetBinding * binding, m_widgetBindingsPerObject.values(object)) { foreach(WidgetBinding * binding, m_widgetBindingsPerObject.values(object)) {
@ -252,7 +267,7 @@ void ConfigTaskWidget::setWidgetBindingObjectEnabled(QString objectName, bool en
} }
} }
m_refreshing = true; m_refreshing = isRefreshing;
} }
bool ConfigTaskWidget::isComboboxOptionSelected(QComboBox *combo, int optionValue) bool ConfigTaskWidget::isComboboxOptionSelected(QComboBox *combo, int optionValue)
@ -305,13 +320,25 @@ bool ConfigTaskWidget::isConnected() const
{ {
bool connected = false; bool connected = false;
if (m_autopilot) { switch (m_configType) {
case AutoPilot:
{
TelemetryManager *tm = m_pluginManager->getObject<TelemetryManager>(); TelemetryManager *tm = m_pluginManager->getObject<TelemetryManager>();
connected = tm->isConnected(); connected = tm->isConnected();
} else { break;
}
case OPLink:
{
OPLinkManager *om = m_pluginManager->getObject<OPLinkManager>(); OPLinkManager *om = m_pluginManager->getObject<OPLinkManager>();
connected = om->isConnected(); connected = om->isConnected();
break;
} }
case Child:
default:
// do nothing
break;
}
return connected; return connected;
} }
@ -328,7 +355,7 @@ void ConfigTaskWidget::bind()
void ConfigTaskWidget::onConnect() void ConfigTaskWidget::onConnect()
{ {
if (m_autopilot) { if (m_configType == AutoPilot) {
m_currentBoardId = m_objectUtilManager->getBoardModel(); m_currentBoardId = m_objectUtilManager->getBoardModel();
} }
@ -343,7 +370,7 @@ void ConfigTaskWidget::onConnect()
refreshWidgetsValues(); refreshWidgetsValues();
setDirty(false); clearDirty();
} }
void ConfigTaskWidget::onDisconnect() void ConfigTaskWidget::onDisconnect()
@ -365,6 +392,7 @@ void ConfigTaskWidget::refreshWidgetsValues(UAVObject *obj)
return; return;
} }
bool isRefreshing = m_refreshing;
m_refreshing = true; m_refreshing = true;
QList<WidgetBinding *> bindings = obj == NULL ? m_widgetBindingsPerObject.values() : m_widgetBindingsPerObject.values(obj); QList<WidgetBinding *> bindings = obj == NULL ? m_widgetBindingsPerObject.values() : m_widgetBindingsPerObject.values(obj);
@ -381,7 +409,7 @@ void ConfigTaskWidget::refreshWidgetsValues(UAVObject *obj)
// call specific implementation // call specific implementation
refreshWidgetsValuesImpl(obj); refreshWidgetsValuesImpl(obj);
m_refreshing = false; m_refreshing = isRefreshing;
} }
void ConfigTaskWidget::updateObjectsFromWidgets() void ConfigTaskWidget::updateObjectsFromWidgets()
@ -396,6 +424,14 @@ void ConfigTaskWidget::updateObjectsFromWidgets()
updateObjectsFromWidgetsImpl(); updateObjectsFromWidgetsImpl();
} }
void ConfigTaskWidget::saveSuccessful()
{
// refresh values to reflect saved values
refreshWidgetsValues(NULL);
clearDirty();
// in case of failure to save we do nothing, config stays "dirty" (unsaved changes are kept)
}
void ConfigTaskWidget::helpButtonPressed() void ConfigTaskWidget::helpButtonPressed()
{ {
QString url = m_helpButtons.value((QPushButton *)sender(), QString()); QString url = m_helpButtons.value((QPushButton *)sender(), QString());
@ -407,8 +443,8 @@ void ConfigTaskWidget::helpButtonPressed()
void ConfigTaskWidget::addApplyButton(QPushButton *button) void ConfigTaskWidget::addApplyButton(QPushButton *button)
{ {
m_saveButton->addApplyButton(button);
button->setVisible(expertMode()); button->setVisible(expertMode());
m_saveButton->addApplyButton(button);
} }
void ConfigTaskWidget::addSaveButton(QPushButton *button) void ConfigTaskWidget::addSaveButton(QPushButton *button)
@ -444,7 +480,6 @@ bool ConfigTaskWidget::shouldObjectBeSaved(UAVObject *object)
return true; return true;
} }
void ConfigTaskWidget::widgetsContentsChanged() void ConfigTaskWidget::widgetsContentsChanged()
{ {
QWidget *emitter = ((QWidget *)sender()); QWidget *emitter = ((QWidget *)sender());
@ -499,9 +534,9 @@ void ConfigTaskWidget::widgetsContentsChanged()
setDirty(true); setDirty(true);
} }
void ConfigTaskWidget::clearDirty() bool ConfigTaskWidget::isDirty()
{ {
setDirty(false); return m_isConnected ? m_isDirty : false;
} }
void ConfigTaskWidget::setDirty(bool value) void ConfigTaskWidget::setDirty(bool value)
@ -512,13 +547,9 @@ void ConfigTaskWidget::setDirty(bool value)
m_isDirty = value; m_isDirty = value;
} }
bool ConfigTaskWidget::isDirty() void ConfigTaskWidget::clearDirty()
{ {
if (m_isConnected) { m_isDirty = false;
return m_isDirty;
} else {
return false;
}
} }
void ConfigTaskWidget::disableObjectUpdates() void ConfigTaskWidget::disableObjectUpdates()
@ -624,8 +655,8 @@ void ConfigTaskWidget::addAutoBindings()
QVariant info = widget->property("objrelation"); QVariant info = widget->property("objrelation");
if (info.isValid()) { if (info.isValid()) {
bindingStruct uiRelation; BindingStruct uiRelation;
uiRelation.buttonType = none; uiRelation.buttonType = None;
uiRelation.scale = 1; uiRelation.scale = 1;
uiRelation.index = -1; uiRelation.index = -1;
uiRelation.elementName = QString(); uiRelation.elementName = QString();
@ -656,15 +687,15 @@ void ConfigTaskWidget::addAutoBindings()
} }
} else if (prop == "button") { } else if (prop == "button") {
if (value == "save") { if (value == "save") {
uiRelation.buttonType = save_button; uiRelation.buttonType = SaveButton;
} else if (value == "apply") { } else if (value == "apply") {
uiRelation.buttonType = apply_button; uiRelation.buttonType = ApplyButton;
} else if (value == "reload") { } else if (value == "reload") {
uiRelation.buttonType = reload_button; uiRelation.buttonType = ReloadButton;
} else if (value == "default") { } else if (value == "default") {
uiRelation.buttonType = default_button; uiRelation.buttonType = DefaultButton;
} else if (value == "help") { } else if (value == "help") {
uiRelation.buttonType = help_button; uiRelation.buttonType = HelpButton;
} }
} else if (prop == "buttongroup") { } else if (prop == "buttongroup") {
foreach(QString s, value.split(",")) { foreach(QString s, value.split(",")) {
@ -674,34 +705,34 @@ void ConfigTaskWidget::addAutoBindings()
uiRelation.url = str.mid(str.indexOf(":") + 1); uiRelation.url = str.mid(str.indexOf(":") + 1);
} }
} }
if (uiRelation.buttonType != none) { if (uiRelation.buttonType != None) {
QPushButton *button = NULL; QPushButton *button = NULL;
switch (uiRelation.buttonType) { switch (uiRelation.buttonType) {
case save_button: case SaveButton:
button = qobject_cast<QPushButton *>(widget); button = qobject_cast<QPushButton *>(widget);
if (button) { if (button) {
addSaveButton(button); addSaveButton(button);
} }
break; break;
case apply_button: case ApplyButton:
button = qobject_cast<QPushButton *>(widget); button = qobject_cast<QPushButton *>(widget);
if (button) { if (button) {
addApplyButton(button); addApplyButton(button);
} }
break; break;
case default_button: case DefaultButton:
button = qobject_cast<QPushButton *>(widget); button = qobject_cast<QPushButton *>(widget);
if (button) { if (button) {
addDefaultButton(button, uiRelation.buttonGroup.at(0)); addDefaultButton(button, uiRelation.buttonGroup.at(0));
} }
break; break;
case reload_button: case ReloadButton:
button = qobject_cast<QPushButton *>(widget); button = qobject_cast<QPushButton *>(widget);
if (button) { if (button) {
addReloadButton(button, uiRelation.buttonGroup.at(0)); addReloadButton(button, uiRelation.buttonGroup.at(0));
} }
break; break;
case help_button: case HelpButton:
button = qobject_cast<QPushButton *>(widget); button = qobject_cast<QPushButton *>(widget);
if (button) { if (button) {
addHelpButton(button, WIKI_URL_ROOT + m_wikiURL); addHelpButton(button, WIKI_URL_ROOT + m_wikiURL);
@ -816,10 +847,10 @@ void ConfigTaskWidget::reloadButtonClicked()
connect(m_realtimeUpdateTimer, SIGNAL(timeout()), eventLoop, SLOT(quit())); connect(m_realtimeUpdateTimer, SIGNAL(timeout()), eventLoop, SLOT(quit()));
connect(objper, SIGNAL(objectUpdated(UAVObject *)), eventLoop, SLOT(quit())); connect(objper, SIGNAL(objectUpdated(UAVObject *)), eventLoop, SLOT(quit()));
QList<objectComparator> temp; QList<ObjectComparator> temp;
foreach(WidgetBinding * binding, bindings) { foreach(WidgetBinding * binding, bindings) {
if (binding->isEnabled() && binding->object()) { if (binding->isEnabled() && binding->object()) {
objectComparator value; ObjectComparator value;
value.objid = binding->object()->getObjID(); value.objid = binding->object()->getObjID();
value.objinstid = binding->object()->getInstID(); value.objinstid = binding->object()->getInstID();
if (temp.contains(value)) { if (temp.contains(value)) {

View File

@ -100,13 +100,16 @@ class UAVOBJECTWIDGETUTILS_EXPORT ConfigTaskWidget : public QWidget {
Q_OBJECT Q_OBJECT
public: public:
ConfigTaskWidget(QWidget *parent = 0, bool autopilot = true); enum ConfigTaskType { AutoPilot, OPLink, Child };
ConfigTaskWidget(QWidget *parent = 0, ConfigTaskType configType = AutoPilot);
virtual ~ConfigTaskWidget(); virtual ~ConfigTaskWidget();
void bind(); void bind();
bool isDirty(); bool isDirty();
void setDirty(bool value); void setDirty(bool value);
void clearDirty();
virtual bool shouldObjectBeSaved(UAVObject *object); virtual bool shouldObjectBeSaved(UAVObject *object);
@ -176,23 +179,21 @@ protected:
return m_currentBoardId; return m_currentBoardId;
} }
bool expertMode() const; bool expertMode() const;
virtual void enableControls(bool enable);
virtual QString mapObjectName(const QString objectName); virtual QString mapObjectName(const QString objectName);
virtual UAVObject *getObject(const QString name, quint32 instId = 0); virtual UAVObject *getObject(const QString name, quint32 instId = 0);
virtual void buildOptionComboBox(QComboBox *combo, UAVObjectField *field, int index, bool applyLimits); virtual void buildOptionComboBox(QComboBox *combo, UAVObjectField *field, int index, bool applyLimits);
void updateEnableControls();
bool isConnected() const;
virtual void enableControls(bool enable);
virtual void refreshWidgetsValuesImpl(UAVObject *) {}; virtual void refreshWidgetsValuesImpl(UAVObject *) {};
virtual void updateObjectsFromWidgetsImpl() {}; virtual void updateObjectsFromWidgetsImpl() {};
bool isConnected() const;
void updateEnableControls();
protected slots: protected slots:
void setWidgetBindingObjectEnabled(QString objectName, bool enabled); void setWidgetBindingObjectEnabled(QString objectName, bool enabled);
void clearDirty();
virtual void widgetsContentsChanged(); virtual void widgetsContentsChanged();
// void populateWidgets();
void refreshWidgetsValues(UAVObject *obj = NULL); void refreshWidgetsValues(UAVObject *obj = NULL);
void updateObjectsFromWidgets(); void updateObjectsFromWidgets();
@ -205,36 +206,38 @@ private slots:
void objectUpdated(UAVObject *object); void objectUpdated(UAVObject *object);
void invalidateObjects(); void invalidateObjects();
void saveSuccessful();
void defaultButtonClicked(); void defaultButtonClicked();
void reloadButtonClicked(); void reloadButtonClicked();
void helpButtonPressed(); void helpButtonPressed();
private: private:
struct objectComparator { struct ObjectComparator {
quint32 objid; quint32 objid;
quint32 objinstid; quint32 objinstid;
bool operator==(const objectComparator & lhs) bool operator==(const ObjectComparator & lhs)
{ {
return lhs.objid == this->objid && lhs.objinstid == this->objinstid; return lhs.objid == this->objid && lhs.objinstid == this->objinstid;
} }
}; };
enum buttonTypeEnum { none, save_button, apply_button, reload_button, default_button, help_button }; enum ButtonTypeEnum { None, SaveButton, ApplyButton, ReloadButton, DefaultButton, HelpButton };
struct bindingStruct { struct BindingStruct {
QString objectName; QString objectName;
QString fieldName; QString fieldName;
QString elementName; QString elementName;
int index; int index;
QString url; QString url;
buttonTypeEnum buttonType; ButtonTypeEnum buttonType;
QList<int> buttonGroup; QList<int> buttonGroup;
double scale; double scale;
bool haslimits; bool haslimits;
}; };
// indicates if this is an "autopilot" widget (CC3D, Revolution, ...) or an OPLink widget // indicates if this is an "autopilot" widget (CC3D, Revolution, ...), an OPLink widget or a Child widget (for vehicle config)
// TODO the logic that this flag controls should be moved to derived classes // TODO the logic that this flag controls should be moved to derived classes
bool m_autopilot; ConfigTaskType m_configType;
// only valid for "autopilot" widgets // only valid for "autopilot" widgets
int m_currentBoardId; int m_currentBoardId;

View File

@ -139,20 +139,18 @@ void SmartSaveButton::processOperation(QPushButton *button, bool save)
} }
} }
} }
emit endOp();
if (!error) {
emit saveSuccessful();
}
if (button) { if (button) {
button->setEnabled(true); button->setEnabled(true);
} if (!error) {
if (!error) {
if (button) {
button->setIcon(QIcon(":/uploader/images/dialog-apply.svg")); button->setIcon(QIcon(":/uploader/images/dialog-apply.svg"));
} } else {
emit saveSuccessfull();
} else {
if (button) {
button->setIcon(QIcon(":/uploader/images/process-stop.svg")); button->setIcon(QIcon(":/uploader/images/process-stop.svg"));
} }
} }
emit endOp();
} }
void SmartSaveButton::setObjects(QList<UAVDataObject *> list) void SmartSaveButton::setObjects(QList<UAVDataObject *> list)

View File

@ -57,7 +57,7 @@ public:
signals: signals:
void preProcessOperations(); void preProcessOperations();
void saveSuccessfull(); void saveSuccessful();
void beginOp(); void beginOp();
void endOp(); void endOp();