diff --git a/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui b/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui index 7b8bbb11c..55df54cfd 100644 --- a/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui +++ b/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui @@ -525,28 +525,38 @@ Typical value is 50% for + or X configuration on quads. 9 - + QLayout::SetMaximumSize - - QFormLayout::AllNonFixedFieldsGrow - - 10 + 0 - - + + - + 0 0 + + + 80 + 0 + + + + Select output channel for Accessory0 RcInput + + + + + 90 - 16 + 0 @@ -557,7 +567,7 @@ font: bold 12px; margin:1px; - RC Input + Accessory1 Qt::AlignCenter @@ -625,8 +635,37 @@ margin:1px; - - + + + + + 0 + 0 + + + + + 90 + 16 + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + RC Input + + + Qt::AlignCenter + + + + + 0 @@ -640,30 +679,7 @@ margin:1px; - Select output channel for Accessory0 RcInput - - - - - - - - 90 - 0 - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - Accessory1 - - - Qt::AlignCenter + Select output channel for Accessory2 RcInput @@ -709,22 +725,44 @@ margin:1px; - - - - - 0 - 0 - - - - - 80 - 0 - - + + - Select output channel for Accessory2 RcInput + RcOutput curve + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + Curve + + + Qt::AlignCenter + + + + + + + Select output curve for Accessory0 RcInput + + + + + + + Select output curve for Accessory1 RcInput + + + + + + + Select output curve for Accessory2 RcInput diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp index ac95e4a30..ac2c3b800 100644 --- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp @@ -131,6 +131,13 @@ ConfigMultiRotorWidget::ConfigMultiRotorWidget(QWidget *parent) : populateChannelComboBoxes(); + QStringList mixerCurveList; + mixerCurveList << "Curve1" << "Curve2"; + m_aircraft->rcOutputCurveBox1->addItems(mixerCurveList); + m_aircraft->rcOutputCurveBox2->addItems(mixerCurveList); + m_aircraft->rcOutputCurveBox3->addItems(mixerCurveList); + + // Setup the Multirotor picture in the Quad settings interface m_aircraft->quadShape->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_aircraft->quadShape->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -162,6 +169,7 @@ ConfigMultiRotorWidget::ConfigMultiRotorWidget(QWidget *parent) : m_aircraft->multiThrottleCurve->setXAxisLabel(tr("Input")); m_aircraft->multiThrottleCurve->setYAxisLabel(tr("Output")); + updateEnableControls(); } @@ -333,6 +341,9 @@ void ConfigMultiRotorWidget::registerWidgets(ConfigTaskWidget &parent) parent.addWidget(m_aircraft->rcOutputChannelBox1); parent.addWidget(m_aircraft->rcOutputChannelBox2); parent.addWidget(m_aircraft->rcOutputChannelBox3); + parent.addWidget(m_aircraft->rcOutputCurveBox1); + parent.addWidget(m_aircraft->rcOutputCurveBox2); + parent.addWidget(m_aircraft->rcOutputCurveBox3); } void ConfigMultiRotorWidget::resetActuators(GUIConfigDataUnion *configData) @@ -366,16 +377,31 @@ void ConfigMultiRotorWidget::resetRcOutputs(GUIConfigDataUnion *configData) void ConfigMultiRotorWidget::resetMixers() { UAVDataObject *mixer = dynamic_cast(getObjectManager()->getObject(QString("MixerSettings"))); - Q_ASSERT(mixer); for (int channel = 0; channel < (int)ConfigMultiRotorWidget::CHANNEL_NUMELEM; channel++) { - setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_DISABLED); - setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 0); - setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 0); - setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, 0); - setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, 0); - setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, 0); + resetMixerVector(mixer, channel); + } +} + +void ConfigMultiRotorWidget::updateRcCurvesUsed() +{ + UAVDataObject *mixer = dynamic_cast(getObjectManager()->getObject(QString("MixerSettings"))); + Q_ASSERT(mixer); + + setComboCurrentIndex(m_aircraft->rcOutputCurveBox1, VehicleConfig::MIXER_THROTTLECURVE1); + setComboCurrentIndex(m_aircraft->rcOutputCurveBox2, VehicleConfig::MIXER_THROTTLECURVE1); + setComboCurrentIndex(m_aircraft->rcOutputCurveBox3, VehicleConfig::MIXER_THROTTLECURVE1); + + for (int channel = 0; channel < (int)ConfigMultiRotorWidget::CHANNEL_NUMELEM; channel++) { + QString mixerType = getMixerType(mixer, channel); + if (mixerType == "Accessory0" && getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2)) { + setComboCurrentIndex(m_aircraft->rcOutputCurveBox1, VehicleConfig::MIXER_THROTTLECURVE2); + } else if (mixerType == "Accessory1" && getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2)) { + setComboCurrentIndex(m_aircraft->rcOutputCurveBox2, VehicleConfig::MIXER_THROTTLECURVE2); + } else if (mixerType == "Accessory2" && getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2)) { + setComboCurrentIndex(m_aircraft->rcOutputCurveBox3, VehicleConfig::MIXER_THROTTLECURVE2); + } } } @@ -498,6 +524,8 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType) setComboCurrentIndex(m_aircraft->rcOutputChannelBox2, multi.Accessory1); setComboCurrentIndex(m_aircraft->rcOutputChannelBox3, multi.Accessory2); + updateRcCurvesUsed(); + // Now, read mixing values stored on board and applies values on sliders. m_aircraft->mrPitchMixLevel->setValue(getMixerValue(mixer, "MixerValuePitch")); m_aircraft->mrRollMixLevel->setValue(getMixerValue(mixer, "MixerValueRoll")); @@ -877,26 +905,41 @@ void ConfigMultiRotorWidget::setupRcOutputs(QList rcOutputList) UAVDataObject *mixer = dynamic_cast(getObjectManager()->getObject(QString("MixerSettings"))); Q_ASSERT(mixer); + int curveAccessory0 = m_aircraft->rcOutputCurveBox1->currentIndex(); + int curveAccessory1 = m_aircraft->rcOutputCurveBox2->currentIndex(); + int curveAccessory2 = m_aircraft->rcOutputCurveBox3->currentIndex(); + foreach(QString rc_output, rcOutputList) { int index = rcList.takeFirst()->currentIndex(); - if (rc_output == QString("Accessory0")) { configData.multi.Accessory0 = index; if (index) { setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY0); - setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 127); + if (curveAccessory0) { + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2 , 127); + } else { + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1 , 127); + } } } else if (rc_output == QString("Accessory1")) { configData.multi.Accessory1 = index; if (index) { setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY1); - setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 127); + if (curveAccessory1) { + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2 , 127); + } else { + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1 , 127); + } } } else if (rc_output == QString("Accessory2")) { configData.multi.Accessory2 = index; if (index) { setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY2); - setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 127); + if (curveAccessory2) { + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2 , 127); + } else { + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1 , 127); + } } } } diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.h b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.h index 8140903d8..488fd5cce 100644 --- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.h +++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.h @@ -77,7 +77,7 @@ private: void setupQuadMotor(int channel, double roll, double pitch, double yaw); void setYawMixLevel(int); - + void updateRcCurvesUsed(); void updateAirframe(QString multiRotorType); void setupEnabledControls(QString multiRotorType);